Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания.pdf
Скачиваний:
81
Добавлен:
13.02.2015
Размер:
1.2 Mб
Скачать

навливаем в 0.

Важно обратить внимание на то, что третья строка написана со сдвигом вправо на 2 позиции относительно предыдущей строки. Так отмечают, что эта строка существует не сама по себе, а является продолжением предыдущей.

If a[i]=5 then s:=s+1; Если A[i] равно 5, то увеличить значение S на 1. Более подробно это можно прочитать следующим образом: если 1-й элемент массива А равен 5, то новое значение переменной S надо сформировать, сложив старое значение S с 1.

Возвращаемся к задаче об отличниках: если очередной ученик имеет оценку 5, то его надо посчитать. Но ведь увеличение на 1 — это и есть подсчет.

Вопрос: как подсчитать количество троечников? s:=0;

for i:=l to 10 do

if a[i]=3 then s:=s+1;

Как подсчитать количество хорошистов и отличников? s:=0;

for i:=1 to 10 do

if a[i]>=4 then s:=s+1;

В операторе IF можно писать и более сложные условия, используя слова AND (и), OR (или) и скобки.

Например, пусть A[i] — массив оценок по информатике, a B[i] — массив оценок по математике. Как подсчитать количество учеников, которые имеют оценку 5 и по информатике и по математике?

s:=8;

for i:=1 to 10 do

if (a[i]=5) and (b[i]=5) then s:=s+1;

Как подсчитать количество учеников, которые имеют оценку 5 хотя бы по одному из этих предметов?

s:=0;

for i:=1 to 10 do

if (a[i]=5) or (b[i]=5) then s:=s+1;

Теперь вы можете решить любую задачу, в которой нужно подсчитать количество элементов в одномерном массиве, обладающих каким-то свойством, причем алгоритм будет работать для одномерных массивов любой размерности, нужно лишь изменить границы изменения параметра в цикле For. Таким образом, вы убедились, что знание одного алгоритма позволяет вам решить ряд задач, отличающихся только входными данными.

Поиск максимального и минимального элементов

Пусть одномерный массив А[i] содержит числа — рост 10 учеников в сантиметрах. Требуется найти рост самого высокого из учеников.

12

s:=a[1];

//Поиск

for i:=2 to 10 do

//максимального элемента

if a[i]>s then s:=a[i];

 

По обыкновению, рассмотрим задачу построчно.

s:=a[1]; Сначала в переменной S запоминаем рост первого ученика. for i:=2 to 10 do Для всех остальных учеников от 2-го до 10-го необ-

ходимо проделать следующие действия:

if a[i]>s then s:=a[i]; Если рост текущего (1-го) ученика больше, чем тот, что мы помним в переменной S, то в S надо занести это большее значение.

Таким образом, когда эта процедура будет проделана для всех учеников, в переменной S окажется значение, соответствующее максимальному из всех, которые были введены в массив А.

Другим вариантом решения подобной задачи будет следующий: for i:=1 to 10 do

if (i=1) or (a[i]>s) then s:=a[i];

В этом алгоритме нет необходимости задавать начальное значение переменной S, эту роль играет условие if (i=1) or (a[i]>s). Условие (i=1) выполняется всего один раз, после чего s будет равно a[1], на всех остальных шагах эта часть условия будет ложна, и будет проверяться лишь условие

(a[i]>s).

Для нахождения минимального элемента (то есть роста самого маленького ученика) нужно вместо знака > (больше) поставить знак < (меньше) в операторе IF. Тогда получим:

s:=a[1];

//Поиск

for i:=2 to 10 do

//минимального элемента

if a[i]<s then s:=a[i];

 

Если, например, в задаче требуется найти разность наибольшего и наименьшего элементов, что тогда делать?

Завести разные переменные для максимального и минимального элемен-

тов:

max:=a[1];

do

//Поиск

for

i:=2 to 10

//максимального элемента

 

if a[i]>max then max:=a[i];

min:=a[1];

do

//Поиск

for

i:=2 to 10

//минимального элемента

if a[i]<min then min:=a[i]; s:=max-min;

Одновременный поиск максимального и минимального элементов в одномерном массиве можно было записать немного короче:

max:=a[1]; min:=a[1];

13

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; принято называть составным оператором.

Поиск элементов, обладающих заданным свойством

Пусть у нас массив Aсодержит оценки по информатике 10 учеников. Требуется выяснить, имеется ли среди них хоть один ученик, имеющий тройку.

i:=1;

//Поиск элементов

while (i<=10) and (a[i]<>3) do i:=i+1;

//равных данному (3)

if i>10

 

then writeln('3 нет ')

 

else writeln('первая 3 имеет индекс ',i);

Рассмотрим алгоритм построчно:

i:=1; I присваиваем значение 1.I - переменная, в которой хранится номер текущего элемента массива А.

while (i<=10) and (a[i]<>3) do i:=i+1; Буквально это читается так: Пока (i<=10) и (a[i]<>3) делать i:=i+l.

А применительно к нашей задаче:

Пока (массив не кончился) и (текущий элемент в массиве не тот, что мы ищем) (то есть элемент не обладает нужным нам свойством) делать - взять следующий элемент.

Из этого оператора пока программа может выйти одним из двух способов:

-в процессе прибавления 1 к I (взятия следующих элементов) так и не нашлось нужного нам элемента;

-нужный элемент нашелся при некотором I.

if i >10 then writeln ('3 нет ') else writeln ('первая 3 имеет индекс ',i);

Как раз по причине двух вариантов следом за пока и стоит оператор IF (если), анализирующий, как именно он закончился, и выдающий нам соответствующее сообщение.

Отметим, что основное достоинство такого способа обработки массива заключается в том, что поиск будет прекращен сразу, как только нужный элемент будет найден.

14

Конечно, можно было воспользоваться алгоритмом подсчета элементов, обладающих заданным свойством:

S:=0;

for 1:=1 to 10 do

if a[i]=3 then s:=s+1; if s=0

then writeln ('троечников нет') else writeln ('троечник есть');

У такого варианта есть ряд минусов:

-будет осуществляться проход по всему массиву даже в случае что A[1]=3, что приведет к снижению производительности программы, представьте, что у вас в массиве несколько тысяч данных;

-нам не удастся выяснить, кто именно — троечник, то есть каков номер элемента, равного 3.

Далее приведен ряд алгоритмов работы с одномерными массивами без дополнительного описания.

Задача 1. Подсчет ненулевых элементов s:=0;

for i: =1 to 10 do

if а[i]<>0 then inc(s); writeln(s);

Задача 2. Подсчет элементов, абсолютная величина которых больше 7 s:=0;

for i:=1 to 10 do

if abs(a[i])>7 then inc(s); writeln(s);

Задача 3. Поиск элемента равного 7 i:=1;

while (i<=10) and (a[i]<>7) do i:=i+1;

if i>10 then writeln('нет') else writeln('да');

Задача 4. Попарно сравнить два массива и определить количество эле-

ментов когда a[i]>b[i], a[i]=b[i] и a[i]<b[i] s1:=0; s2:=0; s3:=0;

for i:=1 to 10 do begin

if a[i]>b[i] then inc(s1); if a[i]=b[i] then inc(s2); if a[i]<b[i] then inc(s3);

end;

15