- •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. Условия задач для самостоятельного решения
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.
А придумать задачи, которые решаются подсчетом элементов, обладающих заданным свойством, сможете? Попробуйте!
