Страница 1 из 2
Массивы. Найти максимум среди чисел. [РЕШЕНО]
Добавлено: 13.11.2011 21:29:33
Nio
Ребят, помогите поправить программу. Бьюсь 3-й день. Задача пустячная, но никак не могу дотумкать.
Задание.
Дан массив, найти максимум среди чисел, в десятичной системе счисления оканчивающихся на 8.
Код: Выделить всё
{найти максимум среди чисел, в десятичной системе счисления оканчивающихся на 8}
uses crt;
var
i,n,x,d,max:integer;
a:array[1..30]of integer;
begin
clrscr;
write('массив n=');
readln(n);
for i:=1 to n do
read(a[i]);
x:=0;
d:=0;
max:=0;
begin
for i:=1 to n do
if (a[i] mod 10 = 8) then x:=a[i];
d:=x;
if a[i]<d then max:=d;
end;
writeln('max= ',x);
Readkey
end.
Re: Массивы. Подскажите где ошибка.
Добавлено: 13.11.2011 22:29:47
Padre_Mortius
В этой строке знак сравнения в другую сторону нужно поставить, ну и операторные скобки (begin..end) перенести в цикл for
Re: Массивы. Подскажите где ошибка.
Добавлено: 13.11.2011 22:33:14
Oleg_D
Код: Выделить всё
for i:=1 to n do
if (a[i] mod 10 = 8) then x:=a[i]; <-- это выполняется в цикле for
d:=x; <-- а это и следующий оператор - за пределом цикла
if a[i]<d then max:=d;
Проще сделать без лишних переменных:
Код: Выделить всё
for i:=1 to n do if (a[i] mod 10 = 8) and (a[i]>max) then max:= a[i];
Re: Массивы. Подскажите где ошибка.
Добавлено: 13.11.2011 23:13:52
Nio
Спасибо, очень помогли, особая благодирность Oleg_D!
Вот чувствовал ведь - истина, где-то рядом!
В таком виде работает как надо:
Код: Выделить всё
{найти максимум среди чисел, в десятичной системе счисления оканчивающихся на 8}
uses crt;
var
i,n,max:integer;
a:array[1..30]of integer;
begin
clrscr;
write('массив n=');
readln(n);
for i:=1 to n do
read(a[i]);
begin
max:=0;
for i:=1 to n do
if (a[i] mod 10 = 8) and (a[i]>max) then max:=a[i]
end;
writeln('max= ',max);
Readkey
end.
Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 06:11:43
informat
Nio писал(а):Спасибо, очень помогли, особая благодирность Oleg_D!
Вот чувствовал ведь - истина, где-то рядом!
В таком виде работает как надо:
Код: Выделить всё
{найти максимум среди чисел, в десятичной системе счисления оканчивающихся на 8}
uses crt;
var
i,n,max:integer;
a:array[1..30]of integer;
begin
clrscr;
write('массив n=');
readln(n);
for i:=1 to n do
read(a[i]);
begin
max:=0;
for i:=1 to n do
if (a[i] mod 10 = 8) and (a[i]>max) then max:=a[i]
end;
writeln('max= ',max);
Readkey
end.
Есть ещё одна ошибка в этой программе. В условии не сказано, что числа будут положительные.
Значит возможен такой массив:
-8 -88 -888
Эта программа выдаст 0, которого не было вообще.
Ещё пример:
1 2 3 4 5 6 7
Выдаст 0.
Тут уже дело не только в программе, а в условии задачи.
Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 09:28:21
Oleg_D
И еще лишний begin-end вот здесь:
Код: Выделить всё
begin
max:=0;
for i:=1 to n do
if (a[i] mod 10 = 8) and (a[i]>max) then max:=a[i]
end;
Вероятно, Вы хотели вставить этот блок внутрь цикла for, - тогда бы программа верно работала. Но промахнулись

Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 10:35:52
dunin
Oleg_D писал(а):И еще лишний begin-end вот здесь:
...
ИМХО "бегинэнды" лишними не бывают

Иногда втыкаю в код просто для удобочитаемости.
Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 10:56:18
Nio
informat писал(а):Есть ещё одна ошибка в этой программе. В условии не сказано, что числа будут положительные.
Значит возможен такой массив:
-8 -88 -888
Эта программа выдаст 0, которого не было вообще.
...
Тут уже дело не только в программе, а в условии задачи.
Наверно, вы правы. Я почему-то исключил такой вариант, подумал, что раз максимум - значит больше 0, а то что с минусом (даже если на 8 оканчивается) - отбрасываем.
Добавлено спустя 7 минут 5 секунд:Oleg_D писал(а):И еще лишний begin-end вот здесь:
Код: Выделить всё
begin
max:=0;
for i:=1 to n do
if (a[i] mod 10 = 8) and (a[i]>max) then max:=a[i]
end;
Вероятно, Вы хотели вставить этот блок внутрь цикла for, - тогда бы программа верно работала. Но промахнулись

А вот здесь, не совсем мне понятно про какой for идет речь 1 или 2-й? Т.е. вы предлагаете вообще убрать bedin ... end в цитате выше?
И еще вопросик, как теперь сделать проверку еще и на значения оканчивающиеся на 8 с минусом?
Сделать подпрограмму положительное/отрицательное, потом сравнить отрицательные и положительные на 8?
Добавлено спустя 12 минут 32 секунды:ну тут, кажется сообразил про какой for идет речь и внутрь какого цикла. Тогда действительно можно убрать bedin ... end.
Код: Выделить всё
for i:=1 to n do
begin
if (a[i] mod 10 = 8) and (a[i]>max) then max:=a[i]
end;
Хотя, это не повлияло на результаты выполнения программы и так и так дает один и тот же результат.
Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 12:04:49
Oleg_D
Разумеется, что теперь не влияет. Но вот исправленный 1-й вариант Вашей программы, тут begin-end внутри цикла.
Код: Выделить всё
uses crt;
var
i,n,x,d,max:integer;
a:array[1..30]of integer;
begin
clrscr;
write('массив n=');
readln(n);
for i:=1 to n do read(a[i]);
x:=0;
d:=0;
max:=0;
for i:=1 to n do
begin
if (a[i] mod 10 = 8) then x:=a[i];
if x>max then max:=x;
end;
writeln('max= ',x);
Readkey
end.
По поводу отрицательных чисел. Можно так изменить:
Код: Выделить всё
if (Abs(a[i]) mod 10 = 8) and (a[i]>max) then max:=a[i]
Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 16:34:00
Nio
Если использовать это выражение, ответ будет все равно 0, при таком раскладе:
massiv n=5
-88 -8 -18 0 2
max= 0
Re: Массивы. Подскажите где ошибка.
Добавлено: 14.11.2011 17:04:50
Oleg_D
Nio писал(а):Если использовать это выражение, ответ будет все равно 0, при таком раскладе:
massiv n=5
-88 -8 -18 0 2
max= 0
В данном случае 0 - правильный результат, если в УСЛОВИИ подразумевается алгебраический максимум, а не по модулю.
Разумеется, что начальным значением надо взять max:= 0-MaxInt
где MaxInt - системная константа.
Re: Массивы. Подскажите где ошибка.
Добавлено: 15.11.2011 06:41:06
informat
Oleg_D писал(а):Nio писал(а):Если использовать это выражение, ответ будет все равно 0, при таком раскладе:
massiv n=5
-88 -8 -18 0 2
max= 0
В данном случае 0 - правильный результат, если в УСЛОВИИ подразумевается алгебраический максимум, а не по модулю.
Разумеется, что начальным значением надо взять max:= 0-MaxInt
где MaxInt - системная константа.
А потом выяснится, что нужно задачу решать для Longint или real. И конечно, автор забудет исправить MaxInt.
Когда говорят, что это мелочь, я говорю: "Ага! А потом шатлы взрываются...".
Более универсальный способ - присвоить максимуму первый подходящий элемент массива.
Код: Выделить всё
i:=1;
while abs(a[i] mod 10) <> 8 do i:=i+1;
max:= a[i];
Если каких числе может не оказаться, нужно добавить ещё условие чтобы за край не выйти.
Re: Массивы. Подскажите где ошибка.
Добавлено: 15.11.2011 22:56:39
Nio
Уточнил задачу. Имелся ввиду алгебраический максимум. Значит если нет положительных чисел на 8, берется наибольшее с минусом, -8 в данном случае, если я все правильно понимаю. А если вообще нет чисел на 8, то можно вывести на экран вместо "max= 0" - "нет чисел на 8".
Сегодня буду пробовать править программу под это условие. Посмотрим, что из этого выйдет.
Добавлено спустя 5 часов 34 минуты 56 секунд:Oleg_D и informat ни один из ваших примеров не подходит или подходит, но при определенных данных массива, нет универсальности.
Пример Oleg_D: если взять max:= 0-MaxInt
массив n=5
-8 -88 5 6 1
max= -32767
а должно быть -8
Пример informat:
Код: Выделить всё
i:=1;
while abs(a[i] mod 10) <> 8 do i:=i+1;
max:= a[i];
массив n=5
-8 -88 2 0 8
omax= -8
а должно быть 8
чего-то мне по началу показалось это задание простым, а на деле не все так просто получается. Фигня какая-то...
Re: Массивы. Подскажите где ошибка.
Добавлено: 15.11.2011 23:02:36
Oleg_D
Текст условия и Ваш код - в студию!
Re: Массивы. Подскажите где ошибка.
Добавлено: 15.11.2011 23:11:04
Padre_Mortius
Nio, ну так добавьте еще условие при котором будет проверяться нужная ситуация