Страница 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
Код: Выделить всё
if a[i]<d then max:=d;

В этой строке знак сравнения в другую сторону нужно поставить, ну и операторные скобки (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!
Вот чувствовал ведь - истина, где-то рядом! :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!
Вот чувствовал ведь - истина, где-то рядом! :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:36:41
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 17:21:43
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, ну так добавьте еще условие при котором будет проверяться нужная ситуация