задача: Поиск среднего арифметического максимального и минимального элементов одномерного массива из 10 элементов.
окно программы вот:
Ошибка при нажатии на кнопку вот:
Текст обработчика кнопки вот:
procedure TForm1.btn1Click(Sender: TObject);
const
n=10;
type mas=array[1..100] of Integer;
var a:mas;
max,min,i:Integer;
sr:Real;
begin
for i:=1 to n do
a:=strtoint(strngrd1.Cells[i,0]);
max:=a[1];
min:=a[1];
for i:=1 to n do begin
if a>=max then max:=a; end;
for i:=1 to n do begin
if a<=min then min:=a; end;
sr:=(min+max)/2;
mmo1.Lines.Add(floattostrf(sr,ffgeneral,6,4));
end;
1. первый цикл фор было бы логичнее начать с 2, а не с 1
2.введи проверку заполненности ячеек перед использованием strtoint()
Зачем массив объявлять до 100, если нужно всего 10 значений? Даже Москва, говорят, нерезиновая, что уж об оперативке говорить.. .
Затем в цикле присваиваем каждый элемент отдельно
aх [ i ]:=strtoint(strngrd1.Cells[i,0]);
Не могу сейчас запустить дельфи, но помнится вроде в индексах таблицы сначала идет номер строки, а потом номер столбца. Так что, мне кажется, должно быть strngrd1.Cells[0,i] , а не strngrd1.Cells[i,0]
Остальное вроде должно работать.
Еще можно заметить, (но для выполнения это не принципиально) , что можно убрать в данном блоке
бегин и енд, ведь внутри только одна команда, хотя и сложная. Но одна
for i:=1 to n do begin
if a>=max then max:=a; end;
Перед a:=strtoint(strngrd1.Cells[i,0]); стоит можно ли преобразовать strngrd1.Cells[i,0] к Integer, используя TryStrToInt.
вай какая гадость написана, как оно вообще компилиться. Ну КАК вы в массив присваиваете одно значение а? Я про a:=strtoint(strngrd1.Cells[i,0]); тут же надо чтобы было var a:integer; и тип обьявлять не надо он здесь вообще ну никак не нужен
const n=10;
var a:integer;
max,min,i:Integer;
sr:Real;
begin
max:=0;min:=0;
for i:=1 to n do begin
a:=strtoint(strngrd1.Cells[i,0]);
if a>=max then max:=a;
if a<=min then min:=a;
end;
sr:=(min+max)/2;
mmo1.Lines.Add(floattostrf(sr,ffgeneral,6,4));
end;
ошибка возникает потому что ты пытаешься преобразовать пустую строку из ячейки стринггрид в целое число. решение - заполнить на старте программы ячейки нулями и в обработчике события OnKeyPress стринггрид игнорить все кроме цифр
procedure TForm1.strngrd1KeyPress(Sender: TObject; var Key: Char);
begin
if not(key in ['0'..'9',#08]) then key:=#0;
end;
на самом деле все делается проще, подключите модуль Math в секции Uses и делайте так:
procedure TForm1.btn1Click(Sender: TObject);
var
mas: array of integer;
z: integer;
sr: real;
begin
//устанавливаем длинну массива
SetLength(mas,strngrd1.ColCount);
//забираем значения из strngrd1
for z:=0 to high(mas) do
mas[z]:=strtoint(strngrd1.Cells[z,0]);
sr:=(minintvalue(mas)+maxintvalue(mas))/2;
mmo1.Lines.Add(floattostrf(sr,ffgeneral,6,4));
end;
если не ошибаюсь вы внутри цикла, когда бьерете число из ячеек, то преобразуете в ИНТЕГЕР, а вводите скорее всего дробь