Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2011, 19:48   #1
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию Паскаль. Массивы.

Есть задание:
Найти произведение двух макс. и двух мин. положительных непарных элементов массива A(25);
Написал код:
Код:
PROGRAM lab_6;
  USES CRT;
  CONST N = 25;
  TYPE IND = 1..N;
            MAS = ARRAY[IND] OF INTEGER;
VAR X:MAS; imx,imn,I:INTEGER;
        A:BOOLEAN; P:CHAR;
BEGIN  CLRSCR;
  WRITELN(' ÓÂÅIJÒÜ ',N,' ×ÈÑÅË');
  FOR I:=1 TO N DO READ(x[I]);
  WRITE(' ':20, 'ÂÈÕ²ÄÍÈÉ ÌÀÑÈÂ');
  FOR I:=1 TO N DO
  WRITE(x[I]:4);WRITELN;
imx:=1; imn:=1;
for i:=1 to n do
begin
    if (x[i]>x[imx]) and (x[i] MOD 2 <> 0)  then imx:=i;
    if (x[i]<x[imn]) and (x[i] MOD 2 <> 0) then imn:=i;
end;
writeln('Ìàêñèìàëüíûé= ',x[imx],' Ìèíèìàëüíûé= ',x[imn]);
writeln('Ïðîèçâåäåíèå= ',x[imx]*x[imn]);
readln;
end.
Нужна помощь в поиске вторых минимальных и максимальных значений.
Интересует алгоритм поиска.
iCaesy вне форума Ответить с цитированием
Старый 08.10.2011, 20:31   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
program Project1;
var
  MAS : ARRAY[1..25] OF INTEGER;
  i : integer;
  min1, min2 : integer;
  max1, max2 : integer;

begin
 // =============== ЗАПОЛНЕНИЕ ===================
 Randomize;
  for i:=1 to 25 do
  begin
   mas[i]:=round(random*1000-500);
   write (mas[i],' ');
  end;
  writeln(' ');
 
// ==================================

  min1 := MaxInt;  min2 := MaxInt;
  max1 := -MaxInt; max2 := -MaxInt;

  for i:=1 to 25 do
  if mas[i] mod 2 = 1 then
  begin
    if mas[i]>max1 then max1:=mas[i];
    if mas[i]<min1 then min1:=mas[i];
  end;
  writeln(' ');
  writeln(max1,' ', min1);

  for i:=1 to 25 do
  if mas[i] mod 2 = 1 then
  begin
    if (mas[i]>max2) and (mas[i]<max1) then max2:=mas[i];
    if (mas[i]<min2) and (mas[i]>min1) then min2:=mas[i];
  end;
  writeln(max2,' ', min2);
  readln;
end.
Ссори но остальные элементы Вашего кода не понятны, так как подписаны ДОС кодировкой )
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 08.10.2011, 20:38   #3
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Ой спасибо)

Код:
 min1 := MaxInt;  min2 := MaxInt;
  max1 := -MaxInt; max2 := -MaxInt;
Если можно, прокомментируйте что мы тут делаем...

Последний раз редактировалось Stilet; 09.10.2011 в 11:38.
iCaesy вне форума Ответить с цитированием
Старый 08.10.2011, 23:28   #4
Danko
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 13
По умолчанию

Цитата:
Если можно, прокомментируйте что мы тут делаем...
Здесь идет присвоение переменным min1 и min2 максимального целочисленного значения (грубо говоря - плюс бесконечность), а переменным max1 и max2 -минимального (минус бесконечность).

P.S. MaxInt = 32767, MinInt = -32768
Danko вне форума Ответить с цитированием
Старый 09.10.2011, 11:29   #5
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Спасибо
10 символов
iCaesy вне форума Ответить с цитированием
Старый 09.10.2011, 12:50   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы думаете, что это абсолютно ПРАВИЛЬНОЕ решение? ну-ну..
заполните массив одинаковым значением (ну, например, так:
Код:
  for i:=1 to 25 do
  begin
   mas[i]:= 11;
и посмотрите, что выдаст программа..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2011, 12:58   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
заполните массив
Сергей, это тже раздел не для промышленных программ, а для обучения азам. Если писать промышленный вариант, то автор темы получит заведомую двойку по простой причине.
Препод всегд знает кто чем дышыт. Если заведомо известный троечник приносит код, который написан с учётом всех "защит от дебила", как Вы думаете, какая реакция будет у препода?
Кстате, вопрос к Вам Сергей, что бы вы поставили этому человеку и как отреагировали ? )))
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 09.10.2011, 14:40   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Если писать промышленный вариант, то автор темы получит заведомую двойку по простой причине.
Препод всегд знает кто чем дышыт. Если заведомо известный троечник приносит код, который написан с учётом всех "защит от дебила", как Вы думаете, какая реакция будет у препода?
Ну ни фига себе философия.. Сам пишешь "для обучения азам" а на деле - фальсифицируешь сдачу работы? Жуть..

Кроме той ошибки, на которую указал Серж, у тебя еще ошибка в определении нечетных чисел.. Скажешь - тоже маскировка под двоечника? н-да..
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 09.10.2011, 14:46   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
у тебя еще ошибка в определении нечетных чисел
Посмотри внимательно где ошибка. Если не получится сразу, попробуй на бумажке расписать что анализируется в коде, что такое mod , какое значение будет при делении на 2 нечётного и чётного числа.

изменил пост. )
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 09.10.2011 в 15:23.
JUDAS вне форума Ответить с цитированием
Старый 09.10.2011, 15:14   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

JUDAS, во-первых, зачем хамить то?!

Цитата:
Сообщение от JUDAS
Сергей, это тже раздел не для промышленных программ, а для обучения азам. Если писать промышленный вариант, то автор темы получит заведомую двойку по простой причине.
Препод всегд знает кто чем дышыт. Если заведомо известный троечник приносит код, который написан с учётом всех "защит от дебила", как Вы думаете, какая реакция будет у препода?
Кстате, вопрос к Вам Сергей, что бы вы поставили этому человеку и как отреагировали ? )))
во-вторых, элементарную ошибку в логике Вы пытаетесь оправдать тем, что это НЕ ПРОМЫШЛЕННЫЙ вариант. При чём здесь "промышленность"? В том, что Вы для стуеднтов пишет абы как, чтобы только сдать, ну и пусть не для всех исходных чисел код работает, это же неважно, да?
Мой пример, если Вы не поняли, иллюстрирует ошибку в вашем коде: когда среди чисел обнаружится ДВА одинаковых минимальных и/или ДВА ОДИНАКОВЫХ максимальных числа, то Ваш код не найдёт второе минимальное и/или максимальное значение. Исправить эту ошибку - элементарно. Думаю, что если Вы немного подумаете, то найдёте, как это сделать. (автор темы вопросов не задаёт, если у него возникнет потребность, я приведу решение, лишённое этого недостатка.

теперь по поводу отстатка от деления на 2. Признаюсь честно, мне потребовалось пройтись в отладчике, чтобы увидеть, почему программа правильно работает и отбрасывает не только положительные, но и отрицательные числа... (ну да, не сообразил я сразу, что остаток от деления на два будет иметь тот же знак, что и исходное число, т.е. для отрицательных чисел это будет -1, что, безусловно, не проходит на условие равенства единице). А Вы уверены, что Ваша такая "оптимизация" понятна студенту?
конечно же, строчка вида
if odd(mas[i]) and (mas[i]>=0) then ...
это уже "промышленная" реализация...

Цитата:
Сообщение от JUDAS
Кстате, вопрос к Вам Сергей, что бы вы поставили этому человеку и как отреагировали ? )))
если бы работа сдавалась письменно (без защиты), то, скорее всего тройку (за то, что одинаковые числа неправильно учитываются). Если же была личная защита, то я на 100% уверен, что человек не смог бы объяснить, где здесь выбираются ТОЛЬКО положительные числа. Для того, чтобы убедится, что он не понимает решение, я бы предложил ему переделать код, чтобы найти то же самое (мин/макс) но для ОТРИЦАТЕЛЬНЫХ ЧЁТНЫХ чисел. Если бы он справился, то получил бы чётвёрку (а может, после доп.вопроса - и пятёрку). Если не справился - двойку.
Всё просто...

Последний раз редактировалось Serge_Bliznykov; 09.10.2011 в 15:19.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы Паскаль! Денис999 Помощь студентам 3 24.05.2010 19:39
Паскаль.массивы. aigulia Помощь студентам 7 22.04.2010 18:57
паскаль. массивы Scliffer Помощь студентам 1 22.04.2010 18:43
массивы.паскаль Лида200915 Помощь студентам 1 22.09.2009 01:37