Дана задача: создать стек из чисел, найдти среднее арифметическое и удалить елементы меньше его. C++ Builder6
Я написал программу но она правильно работает только в некоторых промежутках размера стека, например от 1 до 9- работает, от 10 до 19- не работает, от 20 до 29- работает и тд. Появляется ошибка Access violation at address вот код:
#include <vcl.h>
#pragma hdrstop
#include"stdlib.h"
#include "Unit1.h"
//--------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1* Form1;
//--------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner) {
}
//-------------------------------------------------------------------------
struct Stack {
int info;
Stack* next;
} * begin, * t;
//--------------------------------------
Stack* InStack(Stack*, int);
void View(Stack*);
void Del_All(Stack**);
int findAverage(Stack* p);
void __fastcall TForm1::Button1Click(TObject* Sender) {
int i, in, n = StrToInt(Edit1->Text);
if (begin != NULL) {
ShowMessage("Освободите память!");
return;
}
for (i = 1; i <= n; i++) {
in = random(20) - 10;
begin = InStack(begin, in);
}
Memo1->Lines->Add("создали " + IntToStr(n));
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject* Sender) {
int i, in, n = StrToInt(Edit1->Text);
for (i = 1; i <= n; i++) {
in = random(20) - 10;
begin = InStack(begin, in);
}
Memo1->Lines->Add("Добавили " + IntToStr(n) + " - òü.");
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject* Sender) {
if (!begin) {
ShowMessage("Стек пуст");
return;
}
Memo1->Lines->Add("элементы");
View(begin);
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject* Sender) {
if (begin != NULL) Del_All(&begin);
ShowMessage("память очищена");
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject* Sender) {
if (begin != NULL) Del_All(&begin);
Close();
}
//--------------------------------------------------------------------------
Stack* InStack(Stack* p, int in) {
Stack* t = new Stack;
t->info = in;
t->next = p;
return t;
}
void View(Stack* p) {
Stack* t = p;
while (t != NULL) {
Form1->Memo1->Lines->Add(" " + IntToStr(t->info));
t = t->next;
}
}
//----------------------------------------------
void Del_All(Stack** p) {
while (*p != NULL) {
t = *p;
*p = (*p)->next;
delete t;
}
}
//----------------------------------------------
int findAverage(Stack* p) {
int amount = 0, i = 0;
for (Stack* temp = p; temp; temp = temp->next, i++)
amount += temp->info;
return amount / i;
}
//--------------------------------------------------
Stack* del(Stack* p, int sum) {
Stack* head = p;
if (p == NULL)
return NULL;
Stack* t = new Stack;
t->next = head;
p = t;
while (p->next != NULL) {
if (p->next->info < sum) {
Stack* temp = p->next;
p->next = p->next->next;
delete temp;
} else { p = p->next; }
}
return t->next;
}
//-------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject* Sender) {
int a, b, n = StrToInt(Edit1->Text), i;
int avg;
avg = findAverage(begin);
del(begin, avg);
Memo1->Lines->Add("Среднее значение " + IntToStr(avg));
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Во входном потоке задано три вещественных числа a (a > 0), b (b < 0), x (-1 < x < 1)Значения исходных данных подобраны так, что выражение имеет смысл
Старый пират Пью спрятал свое золото, но для надежности не в одном месте, а частями в нескольких тайникахНо чтобы не забыть места хранения...
Дан линейный массив на N элементовВыполнить циклический сдвиг всех его элементов на один влево начиная с первого нулевого элемента