Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
массивы.DOC
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
269.31 Кб
Скачать

1.1.2. Стандартная обработка одномерных массивов

Пример простейшей Паскаль-программы

program Sum_1mas; {Cуммирование элементов одномерного массива}

var

a : array [1..10] of integer; {Объявление массива a из 10 элементов }

i, s : integer;

begin

writeln('Вводите 10 чисел'); {Ввод одномерного массива}

for i:=1 to 10 do readln(a[i]);

s:=0;

for i:=1 to 10 do s:=s+a[i]; {Суммирование одномерного массива}

writeln('исходный массив'); {Вывод одномерного массива }

for i:=1 to 10 do write(a[i], ' ');

writeln;

writeln('ответ ', s); {Вывод результата}

end.

Перед Вами как раз текст программы, написанной на языке программирования ПАСКАЛЬ, которая решает для нашего клоуна задачу подсчета высоты "пирамиды" из бочонков. Эта же самая программа решает и большое множество других задач, в которых, в конечном счете, нужно сложить 10 чисел. Например: 10 друзей решили сделать подарок своему любимому певцу Майклу Джексону. Каждый разбил свою копилку и внес свой денежный вклад на общее дело. Сколько денег собрали друзья?

А Вы можете придумать такую задачку, чтобы для ее решения нужно было сложить 10 чисел?

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

Но посмотрим внимательно на текст программы. Наша первая задача - выяснить и постараться запомнить назначение всех ключевых слов и знаков препинания, использованных в программе. Да-да и знаков препинания тоже. Ведь программа предназначена для компьютера, а для него точка - это один символ, запятая - другой. И он просто неправильно поймет программу, если Вы перепутаете их местами.

Итак - начинается программа всегда со слова PROGRAM, за которым через пробел следует имя программы - Sum_1mas в данном примере. Вообще имя программы должно состоять латинских (!) букв или цифр, общее количество которых должно быть меньше либо равно 8. Можно также использовать в имени программы символ подчеркивания "_". За именем программы обязательно стоит точка с запятой ";". Обратите внимание также - что символ ";" завершает почти каждую строку программы. И забывание этого символа -одна из наиболее распространенных ошибок начинающего программиста. Да, но если символ ";" стоит не всегда, то тогда как разобраться: когда его ставить, а когда нет ?

Глядя на текст программы, мы пока можем сказать, когда его нельзя ставить:

  • - после слов: VAR BEGIN - там не стоит никаких символов вообще

  • - после слова END в последней строчке программы - здесь стоит символ "." (точка). И всегда должен стоять он и только он!

Ну а во всех остальных случаях будем ставить символ ";" в конце строки, до тех пор, пока не узнаем новых правил по этому поводу.

Особо нужно обратить внимание на комментарии к программе - это все, что находится между символами "{" и "}" (т.е. открывающей и закрывающей фигурной скобками). Комментарии не принимаются во внимание компьютером, однако могут быть полезны человеку, который пишет и читает программу, поясняя для чего служит (или что делает) та или иная строка программы.

В нашей программе в комментариях написано, что программа суммирует элементы одномерного массива, для чего она сначала объявляет все, что будет использовать. А именно: массив из 10 чисел, который в программе получил имя A, а также 2 переменных I и S. Переменная I будет использоваться для того, чтобы помнить и изменять номер обрабатываемого элемента. А переменная S будет использоваться для хранения суммы элементов массива, которые мы уже сложили. Далее в комментариях написано: одномерный массив вводится, его элементы суммируются, затем выводится сам массив и, наконец, выводится полученный результат суммирования.

Вы можете задать справедливый вопрос: а зачем выводить исходный массив? Мы ведь его сами и вводили, мы знаем, какие там числа. Нам нужно было выводить только результат!

В данной программе вывод исходного массива был сделан по следующим причинам:

1) Что бы показать, как нужно выводить одномерный массив, если в этом возникнет необходимость.

2) На начальном этапе обучения программирования Вы, возможно, совершите какие-то ошибки. Так вот их поиск будет облегчен, если прямо перед Вашими глазами будут находиться одновременно и те числа, которые Вы ввели, и то, что Ваша программа вычислила в качестве ответа для них. Вы также можете ошибиться и в самих операторах ввода.

Ну а теперь вернемся к чтению собственно программы. Как Вы уже успели заметить, она написана в основном на английском языке. При этом программист при написании программы на языке ПАСКАЛЬ в любом месте может пользоваться как маленькими, так и большими буквами (или даже перемежать их в рамках одного слова). С точки зрения программы на языке ПАСКАЛЬ, большие и маленькие буквы НЕ РАЗЛИЧАЮТСЯ. Т.е. begin, BEGIN или даже BeGiN - это одно и то же слово! В связи с этим, в дальнейшем тексте, для его большей наглядности и читабельности, мы будем придерживаться следующих правил: имена переменных и массивов непосредственно в тексте программы будут писаться маленькими буквами, а тексте пояснений - большими, чтобы визуально выделять имена переменные и массивы в тексте пояснений.

Попробуем детально проанализировать нашу программу построчно:

program Sum_1mas;

Эта строка, как мы уже договорились, определяет начало программы и ее название Sum_1mas.

var

Эта строка - сокращение от английского слова VARIABLE - что означает в переводе "ПЕРЕМЕННАЯ". Эта строка должна присутствовать во всех Ваших программах вслед за словом PROGRAM.

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

а :array [1..10] of integer;

означает, что в данной программе будет использоваться имя A для обозначения массива (ARRAY) из 10 чисел, которые нумеруются от 1 до 10 ([1..10]). При этом числа будут целыми (OF INTEGER), или, как еще говорят в программировании, целого типа.

i,s : integer;

А эта строка обозначает, что имена I и S будут использоваться для обозначения двух переменных - тоже целого типа (INTEGER).

begin

Буквальный перевод этого слова, конечно, известен - НАЧАЛО. Да, именно отсюда начинается "исполняемая" часть программы, где мы пишем распоряжения компьютеру на выполнение конкретных действий.

writeln('Вводите 10 чисел');

Write - по английски обозначает "ПИСАТЬ". В данном контексте имеется ввиду, что все, что расположено между символами ' и ' необходимо вывести на экран. Т.е., в данном случае, мы приказываем компьютеру вывести на свой экран текст

Вводите 10 чисел

Зачем нам это нужно? Затем, что бы человек, который будет работать потом с нашей программой, знал, чего от него ждет наша программа, когда он ее запустит на выполнение, и ей потребуется, что бы он ввел исходные данные.

WriteLN ?

LN - это сокращение от английского слова LINE, т.е. СТРОКА и наличие этих букв обозначает, что, после завершения вывода этого текста нужно переместить курсор к началу следующей строки.

Для справки : курсор - это специальный символ (знак подчеркивания или прямоугольник), который указывает позицию экрана, в которую будет выводится очередной символ.

for i:=1 to 10 do readln(a[i]);

Эта строка в программе как раз и обеспечивает ввод в объявленный нами массив A с клавиатуры 10 чисел.

Дословно эта строчка читается так:

Для I от 1 до 10 делать читать A[i]

Т.о., компьютер, повинуясь этой строчке нашей программы, ждет, пока мы наберем на клавиатуре число и нажмем клавишу "Ввод" ("Enter"). Это число он занесет в элемент массива A[1], т.е. первый элемент массива A. Потом компьютер ждет, пока мы наберем на клавиатуре второе число, что бы занести его в A[2] и так далее, до 10-го элемента, который он занесет в A[10].

s:=0;

Вспомним, что переменную S мы завели, что бы накапливать там сумму введенных чисел. Понятно, что начальное значение этой переменной, т.е. значение переменной S пока мы не начали складывать, должно быть равно 0.

Это как раз и обеспечивается данным оператором.

А дословно он читается так:

В переменную S занести число 0.

Или так:

Переменной S присвоить значение 0.

for i:=1 to 10 do s:=s+a[i];

Дословно эта строка читается так:

Для I от 1 до 10 делать

новое значение переменной S вычислить как результат сложения старого значения переменной S и элемента массива A[i]

Или, по другому, ее можно читать и так :

Для I от 1 до 10 делать

взять старое значение переменной S, прибавить к нему значение элемента A[i] и занести полученную сумму обратно в переменную S.

И вот это - единственная строчка в программе, которая и решает непосредственно поставленную задачу - т.е. последовательно суммирует введенные 10 чисел в переменной S, добавляя туда сначала значение A[1] - т.е. первого элемента массива A (т.е первого числа, которое мы ввели с клавиатуры), потом значение A[2] - т.е. второго элемента массива A (т.е второго числа, которое мы ввели с клавиатуры), потом значение A[3] - т.е. третьего элемента массива A (т.е третьего числа, которое мы ввели с клавиатуры), и так далее, наконец, значение A[10] - т.е. десятого элемента массива A (т.е десятого числа, которое мы ввели с клавиатуры).

После завершения выполнения этой строки в переменной S находится искомый результат - требуемая нам сумма!

writeln('исходный массив');

Эта строка обеспечивает вывод на экран текста: исходный массив и нужна она для того, что бы человек, который будет запускать нашу программу, знал что за числа сейчас будут выводится (числа исходного массива в данном случае)

for i:=1 to 10 do write(a[i], ' ');

Дословно эта строка читается так: Для I от 1 до 10 делать

вывести на экран A[i], а потом символ пробел (' ')

Обратите внимание на то, что используется оператор WRITE, а не WRITELN (как это было ранее). При этом курсор НЕ переводится к началу следующей строки, а остается за последним выведенным символом, таким образом числа массива A выводятся одно за другим в одной строке, а что бы они не "слиплись", мы разделяем их, выводя после каждого числа символ пробел (' ').

Если бы мы использовали оператор WRITELN, то числа выводились бы в столбик - а это, в нашем случае, менее наглядно.

writeln;

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

writeln('ответ ‘,s);

Понятно, что это оператор мы используем, что бы дать понять, что далее мы намерены сообщить результат работы нашей программы.

end.

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

Ну вот мы и разобрали первую простейшую программу на ПАСКАЛЕ. А что измениться в программе, когда Вы будете писать другие программы, обрабатывающие одномерные массивы?

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

А менять от программы к программе необходимо только ту часть, которая собственно занимается расчетами.

Например, что нужно изменить в нашей программе, если мы захотим не сложить, а перемножить введенные числа ?

Безусловно, Вы догадались, что изменить нужно всего лишь 2 символа: + на * и 0 на 1 получив при этом следующую расчетную часть:

s:=1; {Перемножение элементов}

for i:=1 to 10 do s:=s*a[i]; {одномерного массива}

Ну а программа, которая будет перемножать, а не складывать введенные числа будет выглядеть так:

program Mul_1mas; {Перемножение элементов одномерного массива}

var {Обьявление}

a : array [1..10] of integer; {массива a из 10 элементов}

i, s : integer;

begin

writeln('Вводите 10 чисел'); {поясняющий текст}

for i:=1 to 10 do readln(a[i]); {Ввод одномерного массива}

s:=1;

for i:=1 to 10 do s:=s*a[i]; {Перемножение элементов одномерного массива}

writeln('исходный массив'); {Поясняющий текст}

for i:=1 to 10 do write(a[i], ' '); {Вывод одномерного массива}

writeln;

writeln('ответ',s); {результат}

end.

Таким образом, при разработке программ главное - придумать ее расчетную часть или - как иногда говорят - составить алгоритм работы программы. Для большого количества задач такие алгоритмы уже давно составлены, и вместо того, чтобы "изобретать велосипед", достаточно изучить и запомнить такие алгоритмы, что, собственно, и предлагается сделать Вам в следующем пункте.

Простейшие алгоритмы на одномерном массиве:

s:=0; {Подсчет элементов равных заданному например – 5}

for i:=1 to 10 do

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

...

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

...

i:=1; {Поиск элементов равных заданному например – 3}

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

if i>10

then writeln('3 нет ')

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

...

Давайте рассмотрим их по порядку

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

s:=0; {Подсчет элементов равных заданному например – 5}

for i:=1 to 10 do

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

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

По заведенной у нас традиции, рассмотрим алгоритм построчно:

s:=0;

Начальное значение количества отличников по информатике устанавливаем в 0.

for i:=1 to 10 do {Для I от 1 до 10 делать}

Обратите внимание в программе SUM_1MAS что именно делать (читать элемент с клавиатуры или выводить его на экран) мы писали в той же самой строке. А в этот раз - в следующей и поэтому в конце этой строки НЕ СТАВИТСЯ символ ";" ! Еще очень важно обратить внимание на то, что следующая строка пишется со сдвигом вправо на 2 позиции относительно предыдущей строки. Таким образом, мы сообщаем себе и всем, кто потом будет читать нашу программу, что эта строка не сама по себе, а является продолжением предыдущей строки.

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

Если A[i] равно 5 то увеличить значение S на 1.

Более подробно это можно прочитать следующим образом: если i-тый элемент массива A равен 5, то новое значение переменной S надо сформировать, сложив старое значение S с 1. Или, возвращаясь к нашей задаче об отличниках, если очередной ученик имеет оценку 5, то его надо посчитать. Ведь увеличение на 1 это и есть подсчет.

А как посчитать количество троечников?

s:=0;

for i:=1 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 (Если) можно использовать следующие знаки сравнения:

= равно

> больше

< меньше

>= больше либо равно

<= меньше либо равно

<> не равно

Например, сколько человек имеют в качестве оценки не 5?

s:=0;

for i:=1 to 10 do

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

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

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

s:=0;

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;

Уверен, что теперь Вы можете решить любую задачу, в которой нужно посчитать количество элементов в одномерном массиве, обладающих каким-то свойством. Например, задачи 1 и 5 из приведенных в пункте 1.1.5.

А придумать задачи, которые решаются подсчетом элементов, обладающих заданным свойством, сможете? Попробуйте!