Массивы. Найти максимум среди чисел. [РЕШЕНО]

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Массивы. Найти максимум среди чисел. [РЕШЕНО]

Сообщение Nio » 13.11.2011 21:29:33

Ребят, помогите поправить программу. Бьюсь 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.
Последний раз редактировалось Nio 16.11.2011 01:49:51, всего редактировалось 2 раз(а).
Nio
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.11.2011 20:42:35

Re: Массивы. Подскажите где ошибка.

Сообщение Padre_Mortius » 13.11.2011 22:29:47

Код: Выделить всё
if a[i]<d then max:=d;

В этой строке знак сравнения в другую сторону нужно поставить, ну и операторные скобки (begin..end) перенести в цикл for
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Массивы. Подскажите где ошибка.

Сообщение Oleg_D » 13.11.2011 22:33:14

Код: Выделить всё
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];

Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Массивы. Подскажите где ошибка.

Сообщение Nio » 13.11.2011 23:13:52

Спасибо, очень помогли, особая благодирность 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.
Nio
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.11.2011 20:42:35

Re: Массивы. Подскажите где ошибка.

Сообщение informat » 14.11.2011 06:11:43

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.
Тут уже дело не только в программе, а в условии задачи.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Массивы. Подскажите где ошибка.

Сообщение Oleg_D » 14.11.2011 09:28:21

И еще лишний 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, - тогда бы программа верно работала. Но промахнулись :)
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Массивы. Подскажите где ошибка.

Сообщение dunin » 14.11.2011 10:35:52

Oleg_D писал(а):И еще лишний begin-end вот здесь:
...

ИМХО "бегинэнды" лишними не бывают :)
Иногда втыкаю в код просто для удобочитаемости.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Массивы. Подскажите где ошибка.

Сообщение Nio » 14.11.2011 10:36:41

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;


Хотя, это не повлияло на результаты выполнения программы и так и так дает один и тот же результат.
Nio
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.11.2011 20:42:35

Re: Массивы. Подскажите где ошибка.

Сообщение Oleg_D » 14.11.2011 12:04:49

Разумеется, что теперь не влияет. Но вот исправленный 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]

Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Массивы. Подскажите где ошибка.

Сообщение Nio » 14.11.2011 16:34:00

Если использовать это выражение, ответ будет все равно 0, при таком раскладе:

massiv n=5
-88 -8 -18 0 2
max= 0
Nio
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.11.2011 20:42:35

Re: Массивы. Подскажите где ошибка.

Сообщение Oleg_D » 14.11.2011 17:04:50

Nio писал(а):Если использовать это выражение, ответ будет все равно 0, при таком раскладе:
massiv n=5
-88 -8 -18 0 2
max= 0

В данном случае 0 - правильный результат, если в УСЛОВИИ подразумевается алгебраический максимум, а не по модулю.
Разумеется, что начальным значением надо взять max:= 0-MaxInt
где MaxInt - системная константа.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Массивы. Подскажите где ошибка.

Сообщение informat » 15.11.2011 06:41:06

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];

Если каких числе может не оказаться, нужно добавить ещё условие чтобы за край не выйти.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Массивы. Подскажите где ошибка.

Сообщение Nio » 15.11.2011 17:21:43

Уточнил задачу. Имелся ввиду алгебраический максимум. Значит если нет положительных чисел на 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

чего-то мне по началу показалось это задание простым, а на деле не все так просто получается. Фигня какая-то...
Последний раз редактировалось Nio 15.11.2011 23:02:45, всего редактировалось 1 раз.
Nio
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.11.2011 20:42:35

Re: Массивы. Подскажите где ошибка.

Сообщение Oleg_D » 15.11.2011 23:02:36

Текст условия и Ваш код - в студию!
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Массивы. Подскажите где ошибка.

Сообщение Padre_Mortius » 15.11.2011 23:11:04

Nio, ну так добавьте еще условие при котором будет проверяться нужная ситуация
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru