Консультация № 182521
14.03.2011, 20:16
0.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Дана одномерный массив который введен в компонент Stringgrid.
Найти :
1)минимальный элемент среди отрицательных и поменять его с последним элементом, результат вывести в новый Stringgrd.
2) Сортировать исходный массив.
Есть программкаесть программка.
Помогите исправить ошибки. Почему не считается как нужно макс элемент среди отрицательных.

Обсуждение

Неизвестный
15.03.2011, 06:39
общий
Нужно исправить ваш код:
Код:
for i:=0 to n do
if (a[i]<0) then
begin
max:=a[i];
ii:=i;

if (a[i]< max) then
begin
max:=a[i];
ii:=i;
end;
end;

Жирным выделена ошибка - вы каждый раз при нахождении отрицательного элемента делаете его максимальным и следующее за ним сравнение теряет смысл.
Нужно сделать например так:
Код:
max:=0;
for i:=0 to n do
if (a[i]<0) and (a[i]< max) then
begin
max:=a[i];
ii:=i;
end;
if max=0 then begin
// отрицательных элементов в массиве нет, нужно что-то сделать, или ничего не делать
end;
Неизвестный
15.03.2011, 13:45
общий
Благодарю!! Была такая мысль...спасибо большое еще раз!
давно
Мастер-Эксперт
325460
1469
15.03.2011, 15:38
общий
почему ответом не оформили?
Об авторе:
to live is to die
Неизвестный
15.03.2011, 19:42
общий
это ответ
Здравствуйте, Иванов Илья!
procedure TForm1.Button1Click(Sender: TObject);
var
n, i, j, max, v, nMax :integer;
a:array[1..10] of integer;
begin
n:=strtoint(edit2.text);
stringGrid1.ColCount:=n;

for i:=1 to n do
a[i]:=strtoint(stringgrid1.cells[i-1,1]);

//Поиск максимального среди отрицателных;
max:= a[1];
for i:= 1 to n do
if a[i] <0 then
if a[i] > max then
begin
max:= a[i];
nMax:= i;
end;
//Перестановка элементов местами.
if max < 0 then
begin
v:= a[nMax];
a[nMax]:= a[n];
a[n]:= v;
end
else
ShowMessage('Отрицательных нет отрицательных элементов');

for i:=1 to n do //Вывод результата
stringgrid2.cells[i-1,1]:= IntToStr(a[i]);

//Сортировка исходного массива
for i:= 1 to n do
for j:= 1 to n-1 do
if a[j+1] < a[j] then
begin
v:= a[j];
a[j]:= a[j+1];
a[j+1]:= v;
end;

for i:=1 to n do //Вывод упорядоченного массива
stringgrid1.cells[i-1,1]:= IntToStr(a[i]);

label2.Caption:='Makc ='+inttostr(max);
end;
5
Неизвестный
16.03.2011, 15:32
общий
Цитата: 271861
for i:=0 to n do
if (a[i]<0) then
В коде есть такая ошибка: запись вызовет переполнение массива, так как мaсcив определен как a[1..10] Следовательно обращение к a[0] невозможно, так как это вызовет переполнение массива.
Неизвестный
16.03.2011, 15:44
общий
Верно. Я просто смотрел ошибку в алгоритме поиска элемента, а на остальное не обратил внимания. Потому и не стал ответ оформлять. Спасибо за комментарий.
Форма ответа