Решение задачи № 2 из главы 15 -- Поиск двух максимумов в массиве
Primary tabs
Решение задачи № 2 из главы 15
Пользователь вводит массив целых чисел из 7 элементов. Найдите из них два самых больших числа и выведите их на экран.
const
n = 7;
type
mass = array [1..n] of integer;
var
A : mass;
i , max, max1: integer;
begin
randomize; // запускаем процедуру генератора случайных чисел
for i := 1 to n do // циклом заполняем массив данными
begin
A[i] := random(11); // присваиваем очередному элементу значение из диапазона 0...10
write(A[i], ' '); // выводим в строку перечень данных массива через пробел
end;
max := 0; // не стал этому имени присваивать значение 1-го элемента массива
max1 := 0; // не стал этому имени присваивать значение i-го элемента массива, т.к. могут быть ошибки
for i:= 1 to n do // цикл для нахождения макс. элемента массива
begin
if A[i] > max then
max := A[i];
end;
for i:= 1 to n do // цикл для нахождения предпосл. макс. элем. массива
begin
if A[i] = max then
//max := A[i] // при условии истинности при отсутствии действий оператор if работает
else
if A[i] > max1 then
max1 := A[i];
end;
writeln;
writeln('Макс элемент : ', max); // выводим результат
writeln('Предпосл макс элемент : ', max1); // выводим результат
end.
- Log in to post comments
- 18970 reads
vedro-compota
Mon, 01/28/2019 - 14:10
Permalink
оформление
добавьте обратную ссылку на урок и исправьте ключевые слова
_____________
матфак вгу и остальная классика =)
vedro-compota
Mon, 01/28/2019 - 14:30
Permalink
оформление
уберите эту фразу из цитаты -- в цитате должно быть только то что написано кем-то или вами где-то выше (ранее)
_____________
матфак вгу и остальная классика =)
vedro-compota
Mon, 01/28/2019 - 14:31
Permalink
не стал этому имени
какие именно ошибки могут быть?
_____________
матфак вгу и остальная классика =)
Laven
Mon, 01/28/2019 - 14:41
Permalink
При тестировании были
При тестировании были неверные результаты при том, что остальная часть кода не менялась. Поэтому решил обнулить значение этих переменных на всякий случай. Хотя, итак, до этого, они имели значение "0".
Изначально в коде было написано так:
Почему были неверные результаты - пока не успел разобраться.
vedro-compota
Mon, 01/28/2019 - 14:48
Permalink
почему НЕ ноль (не подходит) при поиске максимума
ноль приводит к тому, что есть у вас массив будет полностью отрицательным, то программа даст неверные ответ (понятно почему)?
_____________
матфак вгу и остальная классика =)
Laven
Mon, 01/28/2019 - 15:38
Permalink
потому что нуль при
потому что нуль при отрицательных данных в массиве будет самым максимальным значением?
vedro-compota
Mon, 01/28/2019 - 15:47
Permalink
потому что нуль при
да, именно поэтому по умолчанию (при поиске максимума или минимума) берут реальные значения из множестве просматриваемых данных (в данном случае из массива)
_____________
матфак вгу и остальная классика =)
vedro-compota
Tue, 01/29/2019 - 08:05
Permalink
Неточно, и все варианты рассмотрены
перепишите под использование оператора if в неполной форме (без else)
Вы так и не измените значение по умолчанию, а это неправильно.
Т.е. вполне может быть так, что оба максимума будут одинаковыми, например, для набора чисел:
_____________
матфак вгу и остальная классика =)
Laven
Mon, 02/25/2019 - 23:03
Permalink
Уточненное решение задачи
const n = 7; type mass = array [1..n] of integer; var A : mass; i , x, max, max1: integer; begin randomize; // запускаем процедуру генератора случайных чисел for i := 1 to n do // циклом заполняем массив данными begin A[i] := random(11); // присваиваем очередному элементу значение из диапазона 0...10 write(A[i], ' '); // выводим в строку перечень данных массива через пробел end; max := A[1]; // x := 1; max1 := A[1]; // for i:= 1 to n do // цикл для нахождения макс. элемента массива begin if A[i] > max then // если текущее значение больше чем max, то begin max := A[i]; // max присваиваем это значение x := i; // и заносим позицию этого элемента end; end; for i := x to n - 1 do // исключаем элемент с макс значением в массиве a[i] := a[i + 1]; // присваиваем содержание i+1 элемента массива содержанию i-ого элемента (заменяем значение массива) for i:= 1 to n - 1 do // цикл для нахождения макс. элемента массива begin if ((A[i] > max1) and (max <> A[i])) then // если текущее значение больше чем max1, то max1 := A[i]; // max1 присваиваем это значение end; writeln; writeln('Максимальный элемент : ', max); // выводим результат writeln('Предпосл макс элемент : ', max1); // выводим результат end.vedro-compota
Mon, 03/25/2019 - 23:05
Permalink
именование
либо дайте переменным (тем что не просто счетчики) понятные имена, либо прокомментируйте назначение каждой. Напр. тут с ходу не ясно какой максимум у вас больший - max или max1
_____________
матфак вгу и остальная классика =)
Laven
Tue, 03/26/2019 - 15:40
Permalink
Исправил
const n = 7; type mass = array [1..n] of integer; var A : mass; i , x, max, max1: integer; // max - максимальное значения числового ряда, max1 - предпоследнее макс знач числ ряда begin randomize; // запускаем процедуру генератора случайных чисел for i := 1 to n do // циклом заполняем массив данными begin A[i] := random(11); // присваиваем очередному элементу значение из диапазона 0...10 write(A[i], ' '); // выводим в строку перечень данных массива через пробел end; max := A[1]; // присваиваем переменной max содержание первого элемента массива x := 1; // присвоено значение на тот случай, если max = A[1] max1 := A[1]; // присваиваем переменной max1 содержание первого элемента массива for i:= 1 to n do // цикл для нахождения макс. элемента массива begin if A[i] > max then // если текущее значение больше чем max, то begin max := A[i]; // max присваиваем это значение x := i; // и заносим позицию этого элемента end; end; for i := x to n - 1 do // исключаем элемент с макс значением в массиве a[i] := a[i + 1]; // присваиваем содержание i+1 элемента массива содержанию i-ого элемента (заменяем значение массива) for i:= 1 to n - 1 do // цикл для нахождения макс. элемента массива begin if ((A[i] > max1) and (max <> A[i])) then // если текущее значение больше чем max1, то max1 := A[i]; // max1 присваиваем это значение end; writeln; writeln('Максимальный элемент : ', max); // выводим результат writeln('Предпосл макс элемент : ', max1); // выводим результат end.vedro-compota
Thu, 03/28/2019 - 22:45
Permalink
альтернативное решение
хорошо, это работает, но теперь попробуем без:
(тем более что вы не совсем исключили, а просто сдвинули массив и стали просматировать его не до конца, хотя это тоже конечно, приём).
просто обнаружьте второй максимум за второй проход массива - подумайте как это сделать.
_____________
матфак вгу и остальная классика =)