
- •1. Программирование на Паскале 8
- •1.1. Основные операторы языка и простейшие алгоритмы 8
- •1. Программирование на Паскале
- •1.1. Основные операторы языка и простейшие алгоритмы
- •1.1.1. Введение в программирование
- •1.1.2. Стандартная обработка одномерных массивов
- •Поиск максимального и минимального элементов
- •Поиск элементов, обладающих заданным свойством
- •Сортировка элементов одномерного массива
- •1.1.3. Стандартная обработка двумерных массивов Двумерный массив и его части
- •Индексы элементов двумерного массива
- •Индексы строки и столбца двумерного массива
- •Перенос простейших алгоритмов на двумерные массивы
- •Обьявление, ввод и вывод двумерного массива
- •Методические указания по решению задач 10,11,14,19-21
- •1.1.4. Как разрабатывать нестандартные алгоритмы и программы
- •Долгий путь к алгоритму
- •1.2. Ручная прокрутка
- •Методические указания по решению задач 6,8,16-18,22-24
- •1.3. Условия задач для самостоятельного решения
Поиск максимального и минимального элементов
...
s:=a[1]; {Поиск максимального элемента }
for i:=2 to 10 do
if a[i]>s then s:=a[i];
...
s:=a[1]; {Поиск минимального элемента }
for i:=2 to 10 do
if a[i]<s then s:=a[i];
...
Пусть одномерный массив A[i] содержит числа - рост 10 учеников в сантиметрах. Требуется найти рост самого высокого из учеников.
По обыкновению, рассмотрим задачу построчно.
s:=a[1];
Вначале в переменной S запоминаем рост первого ученика
for i:=2 to 10 do
Для всех остальных учеников от 2-го до 10-го делать
if a[i]>s then s:=a[i];
Если рост текущего (I-того) ученика больше чем тот, что мы помним в переменной S, то в S занести это большее значение.
Таким образом, когда эта процедура будет проделана для всех учеников, в переменной S окажется значение, соответствующее максимальному из всех, которые были введены в массив A.
А если требуется найти не максимальный, а минимальный элемент (т.е. рост самого маленького ученика), что тогда нужно изменить в данном алгоритме?
Верно - вместо знака ">" (больше) поставить знак "<" в операторе IF, получим:
s:=a[1]; {Поиск минимального элемента }
for i:=2 to 10 do
if a[i]<s then s:=a[i];
А если, например, в задаче 4 требуется найти разность наибольшего и наименьшего элементов, что тогда делать?
Завести разные переменные для максимального и минимального элементов:
max:=a[1]; {Поиск минимального элемента }
for i:=2 to 10 do
if a[i]>max then max:=a[i];
min:=a[1]; {Поиск минимального элемента }
for i:=2 to 10 do
if a[i]<min then min:=a[i];
s:=max-min;
Конечно, надо не забыть добавить объявление этих переменных
Var
i,s,MAX,MIN :integer;
...
Замечание: одновременный поиск максимального и минимального элементов в одномерном массиве можно было записать немного короче так:
max:=a[1]; min:=a[1];
for i:=2 to 10 do
begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
s:=max-min;
В данном случае, когда внутри оператора FOR мы хотим выполнить 2 (или более) оператора IF, необходимо использовать так называемые операторные скобки BEGIN END. Такую последовательность операторов
BEGIN оператор1; оператор 2; ... ; END; принято называть составным оператором.
Обратите внимание на сдвиги вправо, отражающие вложенность выполнения операторов.
Поиск элементов, обладающих заданным свойством
i:=1; {Поиск элементов равных заданному например – 3}
while (i<=10) and (a[i]<>3) do i:=i+1;
if i>10
then writeln('3 нет ')
else writeln('первая 3 имеет индекс ',i);
Пусть у нас A[i] содержит оценки по информатике 10 учеников. Требуется выяснить имеется ли среди них хоть один ученик, имеющий тройку.
Конечно, можно было воспользоваться алгоритмом подсчета элементов, обладающих заданным свойством :
s:=0;
for i:=1 to 10 do
if a[i]=3 then s:=s+1;
if s=0
then writeln ('троечников нет')
else writeln ('троечник есть');
Правда в таком варианте нам не удается выяснить, а кто именно троечник (т.е. какой номер элемента, равного 3)?
Можно подправить предыдущий алгоритм следующим образом:
s:=0;
for i:=1 to 10 do
if a[i]=3 then begin s:=s+1; k:=i; end;
if s=0
then writeln ('троечников нет')
else writeln ('троечник есть, его номер',k);
Но основной недостаток такого подхода заключается в том, что мы вынуждены просматривать все элементы массива, хотя ответ на свой вопрос мы могли узнать уже после просмотра первого элемента - если он и оказался троечником. В случае 10 элементов в массиве это может и не трагедия, а если элементов в массиве 10 миллионов?
На этот случай в языке программирования ПАСКАЛЬ и предусмотрен оператор WHILE, используемый в данном алгоритме:
i:=1; {Поиск элементов равных заданному например – 3}
while (i<=10) and (a[i]<>3) do i:=i+1;
if i>10
then writeln('3 нет ')
else writeln('первая 3 имеет индекс ',i);
По обыкновению рассмотрим алгоритм построчно:
i:=1;
I присваиваем значение 1. I у нас будет переменная, в которой хранится номер текущего элемента массива A.
while (i<=10) and (a[i]<>3) do i:=i+1;
Буквально это читается так: Пока (i<=10) и (a[i]<>3) делать i:=i+1. А применительно к нашей задаче : Пока (массив не кончился) и (текущий элемент в массиве не тот, что мы ищем) (т.е. элемент не обладает нужным нам свойством) делать – взять следующий элемент. Из этого оператора ПОКА программа может выйти одним из двух способов:
в процессе прибавления 1 к I (взятия следующих элементов) так и не нашлось нужного нам элемента
нужный элемент нашелся при некотором i
if i>10
then writeln('3 нет ')
else writeln('первая 3 имеет индекс ',i);
Как раз по причине 2-х вариантов следом и стоит оператор IF (ЕСЛИ) анализирующий, как именно закончился оператор ПОКА, и выдающий нам соответствующее сообщение.
Еще раз отметим, что основное достоинство такого способа обработки массива заключается в том, что поиск будет прекращен сразу, как только нужный элемент будет найден.