ПСм-1, 2011
НИС
Курс 1/2 семестра, 10 лекций, 10 практик, зачет.
Цель курса – ознакомление с программированием на примере языка CF Pascal
Уровень сложности – базовый, для начинающих.
Развитие навыка – в последующих модулях специальности (Python, C++)
Программирование – процесс разработки, создания и поддержки программного обеспечения ЭВМ.
Т. е. интеллектуальная деятельность, которая позволяет человеку организовывать работу некоторого программируемого устройства.
Программируемое устройство – устройство, которое может принимать, хранить и обрабатывать данные, выполняя определенный набор инструкций.
Совокупность средств преобразования информации включает:
Технические средства (hardware)
Программное обеспечение (software)
Математические методы, модели, алгоритмы (brainware)
Данные, принимаемые компьютером, называются входными данными. Компьютер может производить данные как результат выполнения операций, например, результат последовательности вычислений может быть распечатан. Данные, производимые компьютером, называют выходными данными или результатом решением задачи.
Программа представляет собой набор инструкций для выполнения над входными данными.
Таким образом, программирование – деятельность по решению задач связанных с преобразованием информации с помощью ЭВМ.
В это понятие входит анализ задачи, проектирование, разработка алгоритмов, выбор структур данных, непосредственное написание программы, отладка, тестирование, поддержка и т. д.
Этапы решения задачи
- постановка задачи;
- Требуется сформулировать, что дано и какой результат требуется. На этом этапе внутренняя организация программы не рассматривается, «черный ящик»
- Задача переводится на язык математических формул, уравнений, отношений Например, если нам требуется вычислить среднюю оценку за четверть, то это всегда будет сумма оценок деленная на их количество, не зависимо от последующей программной и аппаратной реализации
- Понятие 8-9 вв Точное предписание, определяющее набор действий исполнителя во время решения задачи
Алгоритм
Точное предписание, определяющее набор действий исполнителя во время решения задачи. Четко заданная последовательность действий, необходимая для решения задачи.
- Дискретность
- Алгоритм состоит из последовательности выполнения некоторых отдельных шагов. Для выполнения каждого шага алгоритма требуется конечный ненулевой отрезок времени.
- для каждого шага по набору исходных данных могут быть однозначно вычислены результаты выполнения шага алгоритма. Результаты не зависят от случайных факторов Алгоритм выдаёт один и тот же результат для одних и тех же исходных данных.
- Единственность толкования исполнителем правил выполнения действий и порядка их выполнения. Совокупность команд, которые данный исполнитель может выполнять – система команд исполнителя. Объекты (данные), над которыми исполнитель может выполнять действия – среда исполнителя.
- Для получения результата нужно выполнить конечное число шагов, т. е. исполнитель в некоторый момент времени останавливается. Требуемое число шагов зависит от входных данных.
- Входные данные для алгоритма могут выбираться из некоторого множества значений. Это свойство предполагает, что алгоритм должен быть применим для некоторого множества задач, отличающихся исходными данными. Пример: алгоритм сложения применим к любой паре натуральных чисел.
Благодаря свойствам алгоритма выполнение носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче.
Не все задачи имеют алгоритмическое решение
Задача может иметь несколько различных алгоритмических решений.
Программа — это детальное и законченное описание алгоритма средствами языка программирования.
Классификация языков программирования
ЭВМ не понимает и не может выполнять указаний, написанных человеческим языком.
Все данные, обрабатываемые ЭВМ представляются в двоичном виде – в виде нолей и единиц. Каждое действие, команда представляется в виде соответствующего кода. И даже самые элементарные для пользователя действия (например, ввод буквы с клавиатуры) на деле требуют выполнения массы команд внутри ЭВМ.
Современные программы не пишутся на уровне «машинных кодов», а создаются на более «высоком уровне».
А для перевода программы из «написанного на языке программирования» в форму понятную ЭВМ (машинные коды) используются специальные программы-трансляторы (компиляторы и интерпретаторы) – переводчики с языка программирования на язык команд ЭВМ.
И так же как с любым переводом не все, что вы напишете на языке программирования может быть переведено в машинные коды. Программа должна соответствовать определенным требованиям, чтобы быть «понято» транслятором и правильно исполненной.
Язык программирования – формальная знаковая система для записи программ. С четко заданными правилами записи команд.
СFPascal – подмножество языка Pascal, оперирующее только символьными данными (Character&File Pascal).
Pascal-программа (PP) – записанное множество операторов, заданное для выполнения компьютером, написанное на языке Pascal.
Pascal-машина (PM) – любая комбинация аппаратно-программных средств, способная выполнить Pascal-программу. В нашем случае – Turbo Pascal.
Структура программы.
PROGRAM PrintHello(INPUT, OUTPUT);
BEGIN
WRITELN (‘HELLO’);
END.
Данная программа имеет заголовок и оператор ВEGIN. Эти части есть в синтаксисе любой Паскаль-программы. Слова PROGRAM, INPUT, OUTPUT, BEGIN, WRITELN, END – стандартные, зарезервированные слова языка Pascal. Это означает, что по-другому их использовать нельзя.
Знаки пунктуации и скобки должны размещаться именно так как размещаются.
Стандартное слово WRITELN указывает Паскаль-машине вывести строку текста.
Стандартное слово INPUT – имя входных данных программы, которые в данном случае не используются
Стандартное слово OUTPUT – имя выходных данных программы, которые будут распечатаны как результат работы программы
Стандартные слова PROGRAM BEGIN END указывают Паскаль-машине границы исполняемой части программы. Точка символизирует конец программы.
Название программы – идентификатор, начинается с буквы, не содержит пробелов. Название программы не влияет на результат выполнения но оно должно быть достаточно информативным для других программистов, которые будут читать эту программу.
‘HELLO’ символьная строка, апострофы, расположенные внутри символьной строки, удваиваются.
Выражение – комбинация стандартных слов языка Паскаль, переменных, литералов, знаков пунктуации, допустимая синтаксисом языка Паскаль.
Оператор – комбинация выражений, допустимая синтаксисом языка Паскаль.
Правила оформления кода:
1) Единообразие регистра.
2) Все ключевые слова пишутся ЗАГЛАВНЫМИ БУКВАМИ
3) Имена переменных пишутся строчными буквами, первая буква каждого слова – прописная.
4) Вложенные блоки отделяются одним символом табуляции
5) Программа предваряется комментарием, описывающим ее назначение. Аналогично комментируются все ключевые моменты в программе.
В языке Pascal комментарием считается любой текст между символами { и }
{это комментарий}
Паскаль-программы выполняются Паскаль-машиной последовательно, в один момент времени может выполняться только один оператор. Паскаль-программы могут печатать символьные строки на одной и той же строке или на нескольких строках.
Новые идеи: оператор WRITE, таблица выполнения, продолжение печати на той же строке, новые строки
PROGRAM PrintHelloTwo(INPUT, OUTPUT);
BEGIN
WRITE(‘HE’);
WRITE(‘L’);
WRITELN(‘LO’)
END.
Данная программа демонстрирует последовательное выполнение, он выводит слово ‘HELLO’ по один-два символа. В программе встречается новое стандартное слово WRITE, с помощью которого задаются операторы WRITE. Оператор WRITE выводит данные в OUTPUT, но не закрывает строку текста, тогда как оператор WRITELN, рассмотренный нами на предыдущей лекции, выводит данные с закрытием строки, после предложения WRITELN данные будут выводиться на новой строке.
Шаги выполнения программы разделены точкой с запятой, этого достаточно, но мы разместили каждый оператор на отдельной строке для читаемости. Стандартные слова BEGIN и END не отделяются точкой с запятой от предложений заключенных внутри.
Опробуем определить OUTPUT для различных точек в последовательности выполнения программы:
WRITE(‘HE’);
OUTPUT: HE
WRITE(‘L’);
OUTPUT: HEL
WRITELN(‘LO’)
OUTPUT: HELLO
Одним из способов описания последовательного выполнения программы является таблица выполнения, построим ее для программы PrintHelloTwo
В таблице показаны строки программы, поэтому мы не пишем разделители.
OUTPUT | |
PROGRAM PrintHelloTwo(INPUT, OUTPUT) BEGIN WRITE(‘HE’) WRITE(‘L’) WRITELN(‘LO’) END. | _ _ HE_ HEL_ HELLO/_ HELLO |
После выполнения первой строчки программы создается OUTPUT для данных являющимися результатами выполнения программы. Мы будем изображать OUTPUT как строку символов, заканчивающуюся символом курсора, указывающего место, где будет напечатан следующий символ.
· В начале выполнения OUTPUT пуст, курсор в начале строки.
· Вторая строка со словом BEGIN не изменяет OUTPUT, как мы уже говорили, оператор BEGIN служит для задания границ выполнения.
· Третья строка с помощью оператора WRITE выводит символы ‘HE’ в OUTPUT в позицию курсора и сдвигает курсор на две позиции.
· Четвертая строка выводит в OUTPUT ‘L’ и сдвигает курсор на одну позицию.
· Аналогично, пятая строка выводит в OUTPUT ‘LO’ и закрывает строку и передвигает курсор. Закрытие строки мы показываем с помощью символа / - так будет изображаться в таблице выполнения маркер конца строки. Маркер конца строки – невидимый символ, результатом вывода которого в OUTPUT является появление новой строки.
· Последняя строка программы, слово END, прекращает выполнение программы и возможность вывода данных в OUTPUT. Курсор и маркер конца строки пропадают, в OUTPUT остается строка HELLO как результат выполнения программы.
Мы можем поместить другие строки внутри предложений WRITE и WRITELN и, соответственно, получим другой OUTPUT
PROGRAM PrintGreeting(INPUT, OUTPUT);
BEGIN
WRITE(‘HELLO’);
WRITE(‘ ’);
WRITELN(‘THERE’)
END.
OUTPUT: HELLO THERE
Кому-то может показаться странным, но пробел является таким же символом как, например ‘L’ и он может быть напечатан в OUTPUT. Построим таблицу выполнения для программы PrintGreeting
OUTPUT | |
PROGRAM PrintGreeting(INPUT, OUTPUT); BEGIN WRITE(‘HELLO’); WRITE(‘ ’); WRITELN(‘THERE’) END. | _ _ HELLO_ HELLLO _ HELLO THERE/_ HELLO THERE |
Программа VerticalGreeting выводит более одной строчки в OUTPUT
PROGRAM VerticalGreeting(INPUT, OUTPUT);
BEGIN
WRITELN(‘HELLO’);
WRITELN(‘THERE’)
END.
Таблица выполнения для программы VerticalGreeting
OUTPUT | |
PROGRAM VerticalGreeting(INPUT, OUTPUT) BEGIN WRITELN(‘HELLO’) WRITELN(‘THERE’) END | _ _ HELLO/_ HELLO/THERE/_ HELLO THERE |
OUTPUT в данном случае имеет два маркера конца строки, поскольку оператор WRITELN переводит курсор в начало новой строки, и он был использован дважды. После первого оператора WRITELN нет никакой возможности произвести вывод данных на первую строку, где напечатано HELLO.
Оператор WRITELN может быть использован без данных для того чтобы закрыть строку в OUTPUT. Таким образом с помощью оператора WRITELN мы можем разметить данные в OUTPUT на нескольких строках.
Работа со средой
Выход Alt-X
F2 – запись
F3 – открытие
F4 – отладка до курсора
F5 – полноэкранный режим
F6 – переключиться на следующее окно
F7 – пошаговая отладка (с входом в процедуры)
F8 – пошаговая отладка (без входа в процедуры)
F9 – откомпилировать программу, но не запускать
F10 – меню
Ctrl+F9 – откомпилировать и запустить.
Alt+F5 – переключиться на окно вывода результатов прогона
1.3. Символьные данные
Как правило, в программах требуется хранить, загружать и изменять данные в ходе работы. Для этого используются переменные. Данные загруженные в переменную могут быть скопированы в другие переменные, модифицированы или выведены в OUTPUT.
Новые идеи: оператор READ, VAR, символьные переменные, идентификаторы, декларативная часть, INPUT, оператор присваивания, оператор присваивания, символьные литералы, комментарии, аннотированный вывод, эхо ввода.
Переменная это некоторая область памяти имеющая имя и хранящая определенное значение, которое может меняться в ходе выполнения программы.
Переменные в языке программирования Pascal объявляются в декларативной части программы – до первого оператора BEGIN. Декларативная часть программы – начинается заголовком, который содержит стандартное слово VAR (VARiables). Далее следуют описания переменных, которые состоят из идентификаторов и стандартного слова CHAR, которое описывает тип данных переменной. Точка с запятой отделяет декларативную часть от предложения BEGIN.
PROGRAM Sample (INPUT, OUTPUT);
VAR
Ch: CHAR;
BEGIN
…..
Ключевое слово CHAR указывает на тип переменной – символьный. Тип переменной определяет какой вид и диапазон значений, которые она может принять.
Переменная с символьным значением может представлять один символ и занимает в памяти ЭВМ 1 байт.
Сh, в данном случае, - имя переменной. По этому имени мы можем обращаться к переменной в программе для того, чтобы сохранить в нее значение, считать или изменить его.
Обычно говорят, что в декларативной части мы описали переменную Ch типа CHAR.
Рассмотрим программу CopyChar
Вторая строка программы заключена в фигурные скобки. Это комментарий, он никак не влияет на выполнение программы Паскаль-машиной. Обычно в комментариях располагается информация, необходимая для понимания программы, например, другими программистами.
Наличие грамотных комментариев в программе является элементом хорошего стиля программирования.
PROGRAM CopyChar (INPUT, OUTPUT);
{Выводит первый символ из INPUT в OUTPUT}
VAR
Ch: CHAR;
BEGIN
READ(Ch);
WRITELN(Ch)
END.
INPUT: ABC
OUTPUT: A
В символьную переменную Ch могут быть загружены данные размером в один символ, не более. В программе CopyChar используется оператор READ, который загружает данные из INPUT в переменную Ch. Другими словами, в предложении READ переменной Ch присваивается значение первого доступного символа в INPUT.
Следующее далее оператор WRITELN помещает значение переменной Ch в OUTPUT. Как мы видим, оператор WRITELN способен выводить значение переменных в OUTPUT. В предыдущих примерах оператор WRITELN выводил символьные строки, заметьте, что Ch не заключено в апострофы.
Таблица выполнения для программы CopyChar
INPUT | OUTPUT | Ch | |
PROGRAM CopyChar (INPUT, OUTPUT) VAR Ch: CHAR BEGIN READ(Ch) WRITELN(Ch) END. | ABC ABC ABC ABC ABC | _ _ _ A/_ A | ? A A |
Таблица имеет новые столбцы, показывающие данные в INPUT и значение переменной Ch.
INPUT содержит символьную строку ABC до того как началось выполнение программы.
Курсор, изображенный символом подчеркивания, создается первой строкой программы, он отмечает первый символ входной последовательности ABC, который может быть считан программой.
Переменная Ch не существует до выполнения третьей строки программы, содержащей объявление переменной Ch. После выполнения третьей строчки программы переменная Ch создается, но ее значение неопределенно, там может быть любое символьное значение, поэтому мы обозначим его знаком вопроса.
Это не означает, что Ch принимает значение '?', мы используем знак вопроса как специальный символ аналогично специальному символу / для маркера конца строки.
Оператор READ(Ch); изменяет состояние INPUT и переменной Ch. В переменную Ch загружается из INPUT символ в позиции курсора (‘A’) и курсор в INPUT перемещается на одну позицию.
Оператор WRITELN выводит содержимое переменной Ch (‘A’) в OUTPUT и перемещает курсор на одну позицию. После выполнения последней строки курсоры в INPUT и OUTPUT пропадают, переменная Ch уничтожается.
Результаты выполнения программы – это изменение INPUT и OUTPUT. Конечно, в INPUT нет новых данных, но OUTPUT содержит результат выполнения программы. Переменная Ch не оставила никаких следов, потому что она существует только во время выполнения программы.
Попробуем проследить несколько вариантов выполнения CopyChar с различным входными данными.
INPUT: ABC
OUTPUT: A
INPUT: A
OUTPUT: A
INPUT: XAABB
OUTPUT: X
Теперь попробуем поменять местами предложения READ и WRITELN
PROGRAM Garbage (INPUT, OUTPUT);
{Писать ничего не прочитав - ошибка}
VAR
Ch: CHAR;
BEGIN
WRITELN(Ch);
READ(Ch)
END.
INPUT: ABC
OUTPUT: ?
INPUT: A
OUTPUT: ?
INPUT: XYZ
OUTPUT: ?
Символ знака вопроса в OUTPUT означает, что результат не определен и в OUTPUT может оказаться любой символ, поскольку при выполнении оператора WRITELN значение переменной Ch еще не определено. Неопределенные данные обычно называются мусором (Garbage).
Таблица выполнения для программы Garbage
INPUT | OUTPUT | Ch | |
PROGRAM Garbage (INPUT, OUTPUT) VAR Ch: CHAR BEGIN WRITELN(Ch) READ(Ch) END. | ABC ABC ABC ABC ABC | _ _ ?/_ ?/_ ? | ? ? A |
Ошибочная программа Garbage преподает нам очень важный урок. Паскаль-программа выполняет инструкции именно в той последовательности, в которой они написаны и программист должен быть аккуратен, чтобы данные не были использованы неправильно или потеряны, как в данном случает, где мы потеряли данные в INPUT и вывели ошибочные данные в OUTPUT.
Программа CopyTwice дает нам еще один пример работы Паскаль-машины, вроде бы как она должна копировать два символа из INPUT в OUTPUT, но этого не происходит.
PROGRAM CopyTwice (INPUT, OUTPUT);
{Ошибочная попытка скопировать два символа из INPUT в OUTPUT}
VAR
Ch: CHAR;
BEGIN
READ(Ch);
READ(Ch);
WRITE(Ch);
WRITELN(Ch)
END.
INPUT: ABC
OUTPUT: BB
INPUT: XXY
OUTPUT: XX
Если построить таблицу выполнения для программы CopyTwice, мы увидим, что первый символ из INPUT считанный в переменную Ch перекрывается вторым символом, считываемым второй инструкцией READ в ту же переменную, поэтому в OUTPUT дважды выводится одно и то же значение – второй символ в INPUT.
PROGRAM Copy2 (INPUT, OUTPUT);
{Копирует первые два символа из INPUT в OUTPUT}
VAR
Letter: CHAR;
BEGIN
READ(Letter);
WRITE(Letter);
READ(Letter);
WRITELN(Letter)
END.
INPUT: ZZ
OUTPUT:ZZ
INPUT:AZURE
OUTPUT:AZ
INPUT:3.14
OUTPUT:3.
В переменной Letter размещаются различные значения в разное время, и не всегда буквы, поэтому она демонстрирует не очень удачный подход к именованию переменных.
Программы могут использовать несколько переменных.
PROGRAM CopyReversed (INPUT, OUTPUT);
{Копирует первые два символа из INPUT в OUTPUT в обратном порядке}
VAR
Ch1, Ch2: CHAR;
BEGIN
READ(Ch1, Ch2);
WRITELN(Ch2, Ch1)
END.
INPUT:ZA
OUTPUT:AZ
INPUT:AZURE
OUTPUT:ZA
Когда в операторах READ WRITE встречается более чем один элемент данных, эти предложения ведут себя как последовательность операторов READ и WRITE с одним элементом данных. Вариантов компоновки операторов WRITE и READ может быть множество.
READ(Ch1, Ch2) эквивалентно READ(Ch1); READ(Ch2)
WRITELN(Ch1, Ch2) эквивалентно WRITE(Ch1); WRITE(Ch2); WRITELN
1.3.2. Оператор присвоения.
До этого момента переменные использовались для того, чтобы сохранять данные, прочитанные из INPUT. Единственный способ использования этих данных – вывод значения переменной в OUTPUT. Значения также могут быть скопированы из одной переменной в другую. Процесс копирования также называется присвоением и записывается с помощью оператора присвоения, который имеет следующую форму:
Name1 := Name2
Name1 := ‘x’
Где Name1 и Name2 переменные типа CHAR, описанные в разделе декларативной части программы, а ‘x’ – любой символ. Специальный сдвоенный символ := называется оператором присвоения.
В первой форме оператора присвоения значение переменной справа (Name2) становится новым значением переменной слева (Name1). Выполнение присваивания никак не влияет на значение переменной Name2.
Во второй форме оператора присваивания переменной Name1присваивается значение символьного литерала ‘x’.
Используя оператор присвоения мы можем предложить еще один вариант программы CopyReversed
PROGRAM CopyReversedTwo (INPUT, OUTPUT);
{Копирует первые два символа из INPUT в OUTPUT в обратном порядке}
VAR
In1, In2, Out1, Out2: CHAR;
BEGIN
READ(In1, In2);
Out1 := In2;
Out2 := In1;
WRITELN(Out1, Out2)
END.
INPUT:AZURE
OUTPUT:ZA
Таблица выполнения для программы CopyReversedTwo
INPUT | OUTPUT | In1 | In2 | Out1 | Out2 | |
PROGRAM CopyReversedTwo (INPUT, OUTPUT) VAR In1, In2, Out1, Out2: CHAR BEGIN READ(In1, In2) Out1 := In2 Out2 := In1 WRITELN(Out1, Out2) END | AZURE AZURE AZURE AZURE AZURE AZURE AZURE AZURE | _ _ _ _ _ ZA/_ ZA | ? A A A A | ? Z Z Z Z | ? ? Z Z Z | ? ? ? A A |
Аннотированный вывод и эхо ввода.
Аннотированный вывод – размещение в OUTPUT поясняющего теста.
Эхо ввода – копирование текста из INPUT в OUTPUT.
Использование этих двух подходов является хорошим стилем программирования, потому что позволяет упростить использование программы и сделать его более наглядным.
PROGRAM CopyAndShuffle (INPUT, OUTPUT);
{Копирует первые пять символов U, V, N, X, Y из INPUT в OUTPUT
в порядке U, X, V, Y, M}
VAR
In1, In2, In3, In4, In5: CHAR;
BEGIN
READ(In1, In2, In3, In4, In5);
WRITELN(‘INPUT DATA’);
WRITE(‘ ’);
WRITELN(In1, In2, In3, In4, In5);
WRITELN(‘SHUFFLED DATA’);
WRITE(‘ ’);
WRITELN(In1, In4, In2, In5, In3);
END.
INPUT :12345678
OUTPUT :INPUT DATA
12345
SHUFFLED DATA
14253
INPUT :BARE
OUTPUT :INPUT DATA
BARE
SHUFFLED DATA
BEAR
Лабораторная работа 1
1.1. Для следующей программы дайте имя, разместите правильно текст, оттранслируйте и определите входные и выходные данные (INPUT, OUTPUT):
PROGRAM .......(INPUT, OUTPUT);
BEGIN
WRITE ('Today is');
WRITE ('the first');
WRITE ('day of');
WRITE ('Septemer.');
END.
1.1.2 Следующую программу разместите по строкам, сделайте отступы. Оттранслируйте и определите выход (OUTPUT):
PROGRAM QUESTION(INPUT,
OUTPUT); BEGIN
WRITELN('ISN''T THIS EASY?')
END.
1.1.3 Сделайте из следующего текста программу, вставляя надлежащие знаки пунктуации. Полученную программу разместите по строкам, сделайте отступы.
Оттранслируйте и определите выход (OUTPUT):
PROGRAM GERMAN INPUT OUTPUT BEGIN WRITELN GUTEN TAG END
1.1.4 Напишите программу, выводящую на экран текст
Roses are red,
Violets are blue,
Others can program,
So can YOU.
2.1 Определите таблицу выполнения для программы:
PROGRAM Copy2(INPUT, OUTPUT);
{ Копирует первые два символа из INPUT в OUTPUT }
VAR
Letter1, Letter2:CHAR;
BEGIN
READ(Letter1);
READ(Letter2);
WRITE(Letter1);
READ(Letter1);
WRITE(Letter1);
WRITELN(Letter2)
END.
Если входными данными является Ваша фамилия.
2.2 Напишите программу, считывающую с клавиатуры три символа и выводящую их в обратном порядке. Используйте аннотированный вывод для пояснения работы программы.


