Основы программирования на языке Паскаль
Программирование на языке Паскаль: алфавит, решение задач, простейшие программы, разветвляющие программы, циклические программы, ввод-вывод, массивы, подпрограммы, строковые данные, записи, файлы, использование библиотеки CRT, графика в Паскале.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 30.03.2008 |
Размер файла | 211,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
160
161
Как работать с книгой
Внимательно прочитайте соответствующий раздел теории (одну главу), разберите все примеры, чтобы вам все было понятно, при этом, если у вас есть компьютер, наберите программы и запустите их на выполнение. Убедитесь в правильности полученных результатов. Для того чтобы изучить действие того или иного оператора в программе или фрагмента программы, можно "удалить" фрагмент, заключив его в комментарные скобки { фрагмент .... }. можно, наоборот, добавить в программу операторы writeln, readln для того, чтобы посмотреть промежуточные результаты. Экспериментируйте - это поможет вам в усвоении материала.
Если у вас нет компьютера, будьте сами "компьютером" и "выполняйте" операторы, записывая на листе бумаги результаты. Это поможет понять вам их работу.
Изучив материал, определите свой вариант и напишите соответствующую программу, проверьте ее на компьютере (или без него). Оформите отчет, сдайте на проверку преподавателю.
Если вы будете внимательно разбирать тексты программ, затем, заучив текст, попробуете его написать по памяти, проверить, исправить ошибки, запустить на компьютере, получить результаты, то вы научитесь программировать!
Помните: "не боги горшки обжигают!"
Удачи вам!
Автор.
1. Предварительные сведения
Смысл программирования состоит в том, что программист должен объяснить ЭВМ, какие действия машина должна выполнить, чтобы решить нужную задачу. Это объяснение должно быть сформулировано на доступном для ЭВМ языке и содержать указания, какие величины будут исходными для решения задачи, какие операции и в какой последовательности необходимо выполнить над входными величинами, чтобы получить результат и, наконец, в каком виде выдать результат. Алгоритм, записанный в терминах языка, понятного ЭВМ, называется программой.
Программа на языке Паскаль состоит из "заголовка" и "тела" программы, называемым блоком. В "заголовке" программы даётся имя и перечисляются её параметры (если это необходимо). Блок состоит из шести разделов, причем любой из них, кроме последнего, может быть пустым (т.е. отсутствовать). В определении блока разделы должны следовать в таком порядке: описание меток, определение констант, определение типов, описание переменных, описание процедур и функций, операторы.
1.1. Алфавит
Для написания программ на языке Паскаль можно применять следующие символы: буквы латинского алфавита a b c d...z (прописные), a b c d...z (строчные), знак подчеркивания. Прописные и строчные буквы взаимозаменяемы (эквивалентны) и используются для более рельефного написания программ;
цифры 0 1 2 3 4 5 6 7 8 9;
специальные знаки: + - * / = < > [ ] . , ( ) : ; ^ { } $ # @;
составные знаки :< = > = .. ( * * ) ( .. ).
Используя символы алфавита, мы можем записать алгоритм решения задачи на языке Паскаль. Следует отметить, что кроме приведенных выше символов в программе можно применять и буквы кириллицы, т.е. русский алфавит, однако в конструкциях языка эти буквы не могут быть использованы, они используются только для написания текстовых констант, соответствующих данным строкового типа, например: 'табл. 1'.
1.2. Решение задач
В первом приближении решение задачи на ЭВМ сводится: к вводу некоторых исходных данных в память машины и обработке их по заданному алгоритму; получению и выдаче пользователю результатов решения задачи в виде чисел, текстов, графиков таблиц и т.п. Алгоритм является перечнем тех действий, которые должна выполнять ЭВМ для получения результата. Ввод данных может производиться с различных устройств: с клавиатуры, канала связи, сканера (ввод текстов и рисунков),манипулятора типа "мышь”, “джойстик" и т.д.
Вывод осуществляется на устройства отображения - экран монитора, печатающее устройство, графопостроитель и т.д.
Вначале в ЭВМ вводится программа, содержащая описания исходных данных, перечня операторов, которые определяют порядок обработки этих данных и их преобразование в результаты (алгоритм).
Порядок решения задач:
1. Осмысливание природы задачи, определение исходных и выходных данных, а также формы выходных данных (чисел, текстов, рисунков, графиков, таблиц). Подбор или разработка математических методов преобразования исходных данных в выходные результаты.
2. Разработка алгоритма решения задачи. Здесь возможно описание алгоритма в любой удобной форме: либо в виде словесного описания с включением формул, либо в виде блок-схем, что особенно наглядно и удобно. например, блок-схема алгоритма, исследующего квадратное уравнение ax2+bx+c=0, показана на рис. 2.1.
3. Запись алгоритма с помощью средств алгоритмического языка Паскаль (написание программы).
4. Ввод программы в ЭВМ.
5. Компиляция программы, т.е. перевод алгоритма из терминов языка Паскаль во внутренний язык ЭВМ, поскольку алгоритмических языков - множество, а внутренний язык ЭВМ - один.
6. выполнение программы на ЭВМ: если она написана без ошибок, то на этом этапе ЭВМ, встретив оператор ввода исходных данных, запросит конкретные исходные данные для решения задачи, пользователь введет эти данные, машина их обработает и выдаст результат.
Не всегда решение получается с первого раза. Программа может содержать ошибки (неправильная запись операторов - синтаксические ошибки; не тот тип выделенных ячеек памяти, что вводимые данные, путаница в алгоритме; полученные данные не совпадают с результатами контрольного просчета и т.д.). В этом случае необходим процесс отладки программ и поиск ошибок. В Паскале имеется мощный отладчик, и ЭВМ может значительно помочь пользователю в поиске ошибок.
2. Простейшие программы
2.1. Оператор присваивания
Идентификатор: = выражение. Здесь идентификатор - имя переменной, переменная хранится в ячейке памяти с именем - идентификатор. тип ячейки памяти определен в разделе описаний. Выражение может быть арифметическим, логическим или каким-либо другим, в котором уже известны (определены) все входящие в его состав идентификаторы.
Замечание 1. Тип значения выражения и тип идентификатора должны совпадать, иначе error - ошибка.
Замечание 2. При наличии хотя бы одной ошибки программа не выполняется.
Пример. Пусть имеются ячейки памяти с именами a, b, c; ячейки таковы, что в них могут быть помещены величины только целого типа. достигается это описанием: Var a, d, c: integer, где Var - начало раздела описания переменных, a, b, c - идентификаторы. Integer означает целый, т.е. в разделе Var идентификаторы (имена) переменных определены как целые.
Работа описания: встретив такое описание, ЭВМ выдаёт три ячейки памяти с именами a, b, c, причем такие, чтобы туда могли быть помещены целые числа. Запишем оператор присваивания:
a: = c+b;
Работа оператора: машина должна иметь описание идентификаторов a, b, c.
кроме того, как сказано выше, в правой части оператора стоят величины, которым уже присвоены начальные значения. В этом случае машина извлечет из ячейки с её содержимое и из ячейки b содержимое, произведет операцию сложения и значение результата занесёт (присвоит) в ячейку a.
2.2. комментарии
Введем понятие комментария. Комментарий - это всё, что заключено между скобками { }. Символы, заключенные между этими скобками, не воспринимаются машиной, но выдаются пользователю. Комментарии используются пользователем для объяснения алгоритма.
2.3. Программа
Напишем программу вычисления a = c+b. Программа начинается с заголовка Program - имя программы; затем идут разделы описаний (до 5) и раздел операторов, который начинается словом Begin и заканчивается END. (end с точкой, точка - конец программы). Каждое описание и оператор заканчиваются символом ';'
Program Prim1; {заголовок программы}
Var a,b,c:integer; {раздел описания переменных, выделение}
{ячеек памяти для хранения целых величин}
BEGIN {начало раздела операторов}
c:=547; b:=42; {занесение в ячейки c и b начальных значений}
a:=c+b; {вычисление значения и выдача на}
writeln(a); {экран (write - писать) значения a}
END. {конец программы}.
Напоминаем, что тексты, заключённые в скобки { }, являются комментариями, не являются частью программы и могут быть опущены, таким образом, программа для ЭВМ имеет следующий вид:
Program Prim1;
Var
a,b,c:integer;
BEGIN
c:=547; b:=42;
a:=c+b;
writeln(a);
readln;
END.
Программа записывается в виде строк. Максимальная длина строки 255 символов, но не стоит делать строки длиннее строки экрана - 80 символов, иначе строки будут "прятаться" за пределами окна экрана , хотя строки и можно просмотреть, передвигая "окно" (рис. 2.2).
"Хорошее" расположение строк "Плохое" расположение строк
рис. 2.2
Каждую строку можно начинать не с первой позиции, чтобы программа была более читаемой.
2.4. Простейший ввод-вывод
В программе Prim1 мы задавали исходные данные с помощью оператора присваивания, что не всегда удобно, если одну и ту же программу нужно просчитывать с различными исходными данными. Для присвоения начальных значений можно использовать оператор readln (идентификатор, идентификатор,...,идентификатор); например, readln (c,b). встретив такой оператор, машина остановится и будет ждать, пока пользователь не наберет на клавиатуре значение с, нажмет клавишу "пробел”, наберет значение b и нажмет клавишу ENTER (ввод).значения величин c и b отобразятся на экране и после нажатия клавиши ENTER занесутся в ячейки памяти машины с именами с и b соответственно. тогда программа Prim1 примет вид:
Program Prim1a;
Var a, b, c : integer;
BEGIN readln (c,b);
a : = c+b;
writeln (a);
readln ;
END.
Замечание 1. Напомним, что машине безразлично, строчные или прописные буквы одинаковых слов end, end и end (но не для вас).
Замечание 2. Удобно ставить Readln перед END, так как после выполнения программы машина выдаёт на экран окно текста программы, а результат "прячется" за этим окном и, чтобы его посмотреть, необходимо убрать окно с программой с помощью нажатия клавиш. Если перед END имеется Readln, то программа не завершит работу, пока вы не нажмете клавишу ENTER, т.е. в данном случае на экран будет выведено значение а. Вы посмотрите результат и нажмете ENTER для входа в редактор языка Паскаль.
2.5. Арифметические выражения
Арифметическое выражение строится из объектов: арифметических (числовых) констант; идентификаторов переменных, описанных как числовые; функций, которые возвращают в результате их вычисления; арифметических значений этих объектов, соединённых между собой знаками арифметических операций и круглыми скобками. В качестве констант могут применяться арифметические константы, заданные в явном виде: 5; 5.35, -7.374 Е + 01 и т.п., а также имена констант, определённые в разделе const.
В качестве переменных используются переменные, определённые в разделе Var как byte, integer, real, и их разновидности, например, longinteger, и т.д., если им уже присвоены начальные значения.
В качестве функций могут применяться стандартные функции языка Паскаль, библиотечные функции и функции, написанные самим пользователем. Библиотечные функции доступны после подключения модулей библиотек. функции пользователя должны быть описаны в разделе function.
Основные стандартные функции Паскаля:
Обозначения: I - целочисленный тип; B - байтовый тип; R - вещественный тип; IBR - целочисленный, или байтовый, или вещественный типы.
ABS (IBR) - определение абсолютной величины аргумента типа i,b,r.
ARCTAN (IBR) - вычисление угла (в радианах), тангенс которого равен IBR.
Cos (IBR) , Sin (IBR).
Exp (IBR) - вычисление значения eIBR.
Ln (IBR) - натуральный логарифм IBR.Sgr (IBR) - возведение в квадрат IBR.
Sgrt (IBR) - вычисление корня квадратного из IBR.
Возведение в степень выполняется по формуле ar= exp (r *ln(a)) для положительных a либо организуется последовательное умножение на а r раз.Для отрицательных а возможен только второй способ.
Арифметические операции: +, -, - умножить; / - разделить; mod - нахождение остатка от деления: 11 mod 5, результат1; div - целочисленное деление (дробная часть отбрасывается) 11 div 5, результат 2. Арифметические "и" - аnd и "или" - or производят поразрядное булевское умножение или сложение целых значений операндов согласно таблицам:
A аnd B A or B
0 аnd 0 = 0 0 or 0 = 0
1 аnd 0 = 0 1 or 0 = 1
0 аnd 1 = 0 0 or 1 = 1
1 аnd 1 = 1 1 or 1 = 1
Пример: a: = 12 ; b: = 27.
Во внутреннем коде машины, в двоично-десятичной системе, цифры представляются в десятичной системе:
0000 = ноль
0001 = один
0010 = два
0011 = три
0100 = четыре
0101 = пять
0110 = шесть
0111 = семь
1000 = восемь
1001 = девять
Тогда 12 в десятичной системе эквивалентно 0001 0010 двоично-десятичной системы. напомним, что в двоично-десятичной системе каждая десятичная цифра представлена 4-значным двоичным кодом этой цифры. В этом случае 27 - 0010 0111.
А аnd B А or B
0001 0010 0001 0010
0010 0111 0010 0111
результат: 0000 0010 результат: 0011 0111
Результат преобразуется в десятичную форму 2 и 37 соответственно.
ХOR, исключающее "или", производит операцию согласно таблице
A xor B
1 xor 1 = 0
1 xor 0 = 0
0 xor 1 = 1
0 xor 0 = 0
Результат преобразуется в десятичную форму.
Циклический сдвиг: k shl N - сдвиг числа к влево на N позиций,
k shr N - сдвиг числа к вправо на N позиций,
k и N - целые.
Пример: 2 shl 7 = 256
0000 0000 0000 0010
0000 0001 0000 0000
0 единиц
0 двоек
0 четверок
0 восьмерок
0 шестнадцать
0 тридцать два
0 шестьдесят четыре
0 сто двадцать восемь
1 двести пятьдесят шесть
Пояснение: в любой позиционной системе счисления на первом месте справа в числе стоит количество оснований системы счисения в степени 0, на втором месте справа - количество оснований в степени 1, на третьем месте справа - количество оснований в степени 2 и т.д. так, для десятичной системы имеем:
3 2 4
количество единиц 100 * 4 = 4
количество десятков 101 * 2 = 20
количество сотен 102 * 3 = 300
сложим = 324
Для двоичной системы:
1 0 1 1 0 0 1
количество единиц 20 * 1 = 1
количество двоек 21 * 0 = 0
количество четверок 22 * 0 = 0
количество восьмерок 23 * 1 = 8
количество шестнадцаток 24 * 1 = 16
количество тридцать вторых 25 * 1 = 0
количество шестьдесят четверок 26 * 1 = 64
сложим = 89
т.е. десятичное 89 имеет изображение 1011001 в двоичной системе.
Для правильного написания арифметических выражений необходимо соблюдать следующие правила:
1. Запрещено последовательное появление знаков двух операций, т.е.
A + - B - неверно, A + (-B) - верно.
2. Порядок выполнения операций: /,,div, mod, and, or, shl, shr, -, +. Порядок может быть нарушен круглыми скобками, так как часть выражения, заключённая в круглые скобки, выполняется в первую очередь.
3. Если операции имеют одинаковый приоритет, то они выполняются последовательно.
4. Унарная операция имеет самый низкий приоритет, поэтому -A b интерпретируется как -(A b).
5. Не следует записывать выражения, не имеющие арифметического смысла, например, деление на выражение, равное 0.
6. Следует помнить, что операции / и имеют одинаковый приоритет, например, 18/23=27, а не 3. чтобы было 3, необходимо записать 18/(23).
2.6. Описания переменных.
Описания переменных зависят от типа данных, которые будут храниться в ячейках памяти, названных именами этих переменных.
Данные в Паскале могут быть следующих типов:
Данные
Скалярные Структурированные
массивы записи
Стандартные Определённые
пользователем строки файлы
целые логические интервальные множества
вещественные перечисляемые указатели
байтовые символьные
Каждому типу данных могут соответствовать константы. Количество элементов констант (цифр, букв) сильно зависит от конкретной конфигурации машины. Однако можно сказать, что для целого типа числа максимальное значение 32767, для вещественных, как минимум, - до 7 цифр мантиссы, для строковых - 255 символов и т.д.
Константы байтового типа - целые числа в диапазоне 0 - 255. Целые константы - набор цифр, возможно, со знаком + или -. Вещественные константы могут записываться в двух формах - с фиксированной точкой: 57.34;
-256.758 и с плавающей точкой: 5.734е+01 (эквивалент 57.34) и -2.56758е+02
(эквивалент -256.758).
Логических (булевских) констант всего две: TRUE и FALSE. принято, что в машинном коде TRUE=1, FALSE=0. знаковые константы представляют все символы алфавита плюс символы кириллицы, но не для того, чтобы символ стал константой, его нужно заключить в апострофы: А, 1, +, ? и т.д. Константы могут храниться в ячейках памяти, определенных какими-либо именами (идентификаторами).
Идентификатор - набор букв и цифр, первая из них - всегда буква, например А, ALP1, B2, GAMMA. Идентификаторы могут быть длиной до 255 символов, однако большинство компиляторов накладывает ограничение, т.е. длина имени не должна превышать восьми символов. Идентификатор в своем составе может содержать знак _ (подчерк).
Переменные могут быть описаны в разделе описания переменных Var. разделов описания может быть до пяти, лучше их располагать в следующем порядке: Label, Const, Type, Var, functuon и procedure.
Если данное будет изменяться (по величине) в процессе выполнения программы, то имя этого данного описывается в разделе Var с соответствующим атрибутом:
Байтовый тип - byte;
Целый тип - integer;
Вещественный тип - real;
Булевский тип - boolean;
Символьный тип - char и т.д.
Пример:
Var
k n:integer;
S,T,Z: char;
a,b,c: real;
L25,L3: boolean;
FAZA: byte;
В этом случае все описанные идентификаторы можно применять в программе. Работа этого раздела будет заключаться в том, что машина выделит две ячейки памяти с именами k и n. В ячейках могут храниться только целые числа: в ячейках с именами S,T,Z - по одному символу; в ячейках a,b,c - только величины типа вещественных чисел; в L25 и L3 -величины true и FALSE, а в ячейке с именем FAZA - только числа от 0 до 255. Если попытаться, например, в ячейку S поместить не символ, а число, то это приведет к ошибке, т.е. правильно S:= A; или S:= $; или S:= 1; однако неверно S:= 1 (1 - число в отличие от 1 - символа). Если в процессе выполнения программы данное не меняется, то его можно описать в разделе "Описания констант":
Const
A=36.74; B=true;
С=а;
Здесь тоже выделяются ячейки памяти с именами А,В,С для хранения заданных величин, которые не подлежат изменению.
Допустимо описание констант-выражений:
Const
М = (32.5 + 0.64) / 3.14;
Кроме того, машина "знает", чему равны константы е и ?.
Пример. Составить программу для вычисления выражения
, где величины R, а, S, L, K вводятся с клавиатуры.
Пусть k, l - целые числа, остальные - вещественные.
Program Prim2,
Var k,L:integer;
Y,R,a,S : real; {здесь для хранения результата y тоже}
{нужна ячейка памяти}
Begin writeln ('введите це', {выдача на экран текста, указанного в}
'лое k,L, действительные' {кавычках; обратите внимание на прави-}
'R,а,S'); {ло переноса текста в операторе writeln:}
{если нужно перенести текст, то ставится} {закрывающий апостроф, затем запятая,}
{новая строка вновь начинается с апострофа}
readln (k,L,R,a,S);
Y: = 1-l(l+sqr(r a/k))/(exp(2)/sqr(s) sqr(l+r a/l));
writeln (Y); readln;
END.
То же самое будет, если записать программу:
Program Prim2a;
Var k,L: integer, R,a,S:real;
Begin writeln ('введите целые k,L'); readln (k,L);
writeln ('введите вещественные r,S,a'); readln (R,S,a);
writeln(l-l/(l+sqr(ra/k))/(exp(2)/sqr(s)sqr(l+ra/l)),
readln; END.
Последний оператор writeln вначале вычислит арифметическое выражение, а затем выведет на экран его значение в виде числа. Если мы хотим, чтобы результат был в виде 'результат Y = число', то необходимо последний writeln написать в следующем виде:
writeln ('результат Y =',1-l/(l+sqr(ra/k))/exp(2)/sqr(s) sqr(l+ra/l)); тогда машина вначале выведет текст, взятый в апостроф, т.е. "результат Yi", а затем его значение.
2.7. Раздел описания типов
Помимо вышеперечисленных стандартных типов в Паскале могут быть применены типы, определенные пользователем, т.е. перечисляемые и интервальные типы. Перечисляемые типы задаются непосредственным перечислением всех значений, которые может принимать переменная данного типа. Описать типы, определенные пользователем, можно в разделе Var или предварительно в разделе Туре, а затем - в Var. рассмотрим оба варианта.
Пусть нам нужна переменная с именем season (сезон года). она может принимать значения winter (зима), spring (весна), summer (лето), autumn (осень), другие значения она принимать не может. Тогда нужно сделать следующее описание:
Var season: (winter, spring, summer, autumn).
Здесь тип season задан перечислением всех констант, которые могут быть занесены в ячейку памяти season. Попытка занести в ячейку season любое другое значение приведет к ошибке - "несоответствие типа".
Если переменных данного типа будет несколько, удобнее и нагляднее вначале определить тип в разделе Туре (описание типа), а затем в разделе Var сослаться на этот тип, и машина в Var выделит конкретные ячейки памяти для хранения данных указанного типа.
Например, необходимо определить, что Gi, G2, G3, G4 будут ячейками памяти, в которых могут храниться наименования газов Со, О, N, F, а в ячейках памяти Metall1, Metall2, Metall3 - наименования металлов Fе, Со, Na, Cu, Zn, тогда можно применить описание:
VAR GI, G2, G3, G4: (CO,O,N,F);
Metall1, Metall2, Metall3: (Fe,Co,Na,Cu,Zn).
Можно использовать и другое, более наглядное описание. вначале определить тип Gaz, Met, а затем на них сослаться:
Туре Gaz=(Co, О, N, F);
Met = (Fе, Со, Na, Cu, Zn);
Var GI, G2, G3, G4 : GAZ;
Metall1, Metall2, Metall3, Met;
Особенно удобно применение раздела Туре, если он находится во внешнем блоке, а ссылки на него идут во внутренних блоках (см. раздел "Блоки"). Тогда значительно экономится память, поскольку она может быть практически одной и той же в разных блоках.
При описании переменных перечисляемого типа данные внутри скобок являются константами, которые может принимать описываемая переменная. Над данными такого типа допустимо выполнять операции отношения и логические операции (см. далее). Например, для приведенного выше описания данного season будет истинным высказывание: "winter < spring".
При работе с данными перечисляемого типа можно применять стандартные функции Succ, Рred, Ord.
Succ (аргумент) возвращает значение, следующее за элементом, указанным как аргумент. Если следующего элемента нет (закончились), то это приводит к программному прерыванию (ошибке).
Рred (аргумент) возвращает предыдущее значение из перечня констант, из которых состоит данный тип.
Ord (аргумент) возвращает порядковый номер аргумента в списке констант, перечисленных в описании в виде целого числа. Элементы пронумерованы в порядке 0,1,2,..., т.е. первый элемент имеет номер 0.
Пример:
Туре month = ('jan','fab','mar','apr','may','jun','jul','aug','sep','ocf','nov','dec');
Var a,b,c,d,c,mes: month; f,h,g: integer;
Begin mes: =jul;
a: = Pred (mes); {в a находится 'jun'}
b: = Succ (mes); {в b находится 'aug'}
с: = Pred (pred(mes)); {в с находится 'mау'}
d: = Succ (succ(mes)); {в d находится 'sep'}
e: = Succ (pred(mes)); {в е находится 'jul'}
f: = Ord (mes); {в f находится 6}
h: = Ord (pred(mes)); {в h находится 5}
g: = Ord (succ(mes)); {в g находится 7}
END
Интервальный тип задается диапазоном изменения констант внутри какого-либо уже имеющегося перечисляемого или стандартного типа, кроме вещественного (integer, byte, booban, char). Значение первой константы должно быть меньше значения второй константы диапазона.
Туре
Dni = 1...31;
Litera = 'a',...,'z',
Var Rabdni,bolndni, vuhod: dni; {могут принимать значения 1-31}
im,ident: litera; {могут принимать значения 'A'-'Z'}
Выход за пределы диапазона вызывает программное прерывание.
Допускается задание диапазона именами констант:
Const min = 1; max = 31;
Туре Dni = min…max;
Var rabdni,boldni,vuhoddni:dni;
Для интервального типа также возможно применять функции Succ, Pred, Ord.
3. Разветвляющиеся программы
3.1. Общие положения
До сих пор мы рассматривали линейные программы, алгоритм которых можно было представить в виде блок-схемы (рис. 3.1)
Возможны случаи, когда программа ветвится в зависимости от какого-либо условия (см. рис. 3.2). Ветвление может быть двух направлений: по принципу условие верно - идти по одной ветви, условие ложно - по другой. В этом случае применяется оператор if. возможно ветвление сразу нескольких направлений: если k=l - идти по одной ветви, если k=2 - по другой, k=3 - по третьей и т.д. в этом случае удобнее применять оператор Case.
3.2. Оператор goto, раздел описания меток
Последовательное выполнение операторов в программе может быть нарушено оператором перехода. Общий вид оператора: goto метка; где метка - буква, либо цифра, либо набор букв и цифр, из которых первая - всегда буква, Например, М1, LI, NK. Метка, стоящая после goto, указывает, куда нужно пойти. Достигается это тем, что если в программе находится оператор goto метка; то в этой же программе обязательно имеется какой-либо оператор вида метка: оператор; который считается помеченным, и машина, встретив goto метка; не будет выполнять оператор, записанный после оператора goto метка; а перейдет к выполнению оператора метка: оператор;
Иллюстрация:
а: = b+с;
с: = sgrt (a+exp(b));
goto M1;
z: = x+y;
writeln (z);
M1: S: = P;
В случае, если бы не было оператора goto М1; все операторы выполнялись бы последовательно один за другим. здесь же после оператора с: =... стоит goto М1; следовательно, машина не будет выполнять z:=... и writeln..., а сразу после с: =... перейдет к выполнению оператора М: S: = Р;
Метки, применяемые в программе, должны быть описаны в разделе описания меток, который желательно ставить первым среди описаний. Выглядит раздел так: Label М1, М2, L, NK; т.е. после слова Label перечисляются через запятую все метки, которые будут применяться в данном блоке (программе). Заканчивается описание символом ';'.
Пример: составить программу, вычисляющую значения функции cos х, где начальное х = 0, следующее х = 0.01 и т.д.
Program Prim3; Label M; Var x:real; BEGIN x:=0; M: writeln('x=',x,'cos x = ',cos(x)); x:=x+0.01;
goto M; readln; END.
Программа будет работать следующим образом: х присвоится значение 0; writeln выведет на экран текст, который указан в первых кавычках х =, далее извлечет из ячейки х значение и выведет его на экран; затем снова выведет текст cos х =, затем вычислит значение cos х и выдаст его на экран, т.е. машина выведет первую строку в виде
x = 0.0000000000Е + 00 cos х = 9.9999999999Е - 01.
После этого возьмется то х, которое было извлечено из ячейки памяти х (прежнее значение х), т.е. 0.0, к нему прибавляется величина 0.01 и результат снова занесется в ячейку памяти х так, что в х будет 0.01, после этого оператор goto m; передаст управление оператору, помеченному меткой м, т.е. оператору writeln, и машина выдаст новую строку:
x = 1.0000000000Е - 02 cos х = 9.9995000041Е - 01;
- выполнит оператор
х: =x + 0.01, получит х = 0.02;
- выведет строку
x = 2.0000000000Е - 02 cos х = 9.9980000666Е - 01;
- сделает х = 0.03 и т.д., до бесконечности, так как в данном алгоритме окончание работы не предусмотрено. Для завершения работы следует применить оператор if.
3.3. Оператор if
Общий вид: If булевское выражение then оператор else оператор;
Работа оператора: вначале вычисляется булевское выражение, значение которого в конечном итоге может быть только TRUE или FALSE. Если булевское выражение TRUE, то выполняется оператор, следующий за словом then, а затем происходит переход к оператору, следующему за if. Если булевское выражение false, то выполняется оператор, следующий за словом else, затем происходит переход к оператору, следующему за оператором if.
Замечание: после оператора, следующего за then, перед else символ ';' не ставится, так как оператор if еще здесь не закончен, а ';' ставится после окончания оператора. Возможно применение сокращенного оператора if:
If булевское выражение then оператор;
Здесь, если булевское выражение true, выполняется оператор, следующий за словом then, и происходит переход к оператору, следующему за оператором if. Если булевское выражение false, то оператор if игнорируется (вообще не выполняется), а выполняется оператор, следующий за if.
Переделаем "бесконечную" программу п. 3.2. в такую, которая остановится тогда, когда х станет равным 0.1.
Program Prim4; Label M; Var x:real;
BEGIN x:=0;
M: writeln('x=',x,' cos x = ',cos(x));
x:=x+0.01;
if x<=0.1 then goto M; readln;
END.
Программа выдает результаты вычислений cos(x) для х = 0.01, 0.02, 0.03 и т.д., до 0.01.
В последней программе булевское выражение х < = 0.1. Какие бывают булевские выражения? Вообще говоря, булевское выражение после вычисления всегда истинно или ложно, т.е. TRUE или FALSE. Действительно, выражение х < = 0.1 может быть истинно, если х меньше или равно 0.1, и ложно - в противном случае. Вообще булевское выражение может строиться из булевских констант TRUE и FALSE; переменных булевского типа (в которых могут храниться TRUE или FALSE); обращений к функциям, которые возвращают TRUE или FALSE и отношений, соединенных между собой булевскими операциями и круглыми скобками.
Здесь следует расшифровать, что такое отношения и булевские операции. Примером отношения может быть приведенное выше х < = 0.01, т.е. в общем случае отношение - это два арифметических выражения, соединенных между собой операциями отношения. Операции отношения: = (равно), < > (неравно), > (больше), > = (больше или равно), < (меньше), < = (меньше или равно).
Пример отношений: а + b < = sin(c)
exp(p) > (cos(i) - a)/sgr(b).
Как мы уже говорили, эти отношения могут быть истинны или ложны в зависимости от конкретного значения величин, в них входящих, на момент вычисления.
Логические операции - это нам уже известные. Напомним, как они работают: or (или), and (и).
Имеется описание Var A,B: boobean;
Or - логическое сложение, читается как "или". Результат операций - истина, если или А, или В - истина, и ложь, если А и B ложны.
Например: А В А ог В
true true true
true false true
false true true
false false false
Замечание: данная операция аналогична арифметической OR, если TRUE заменить 1, а FALSE - 0.
АND - логическое умножение, читается "и". Результат операции - истина только тогда, когда и А, и В - истина, в остальных случаях результат - ложь.
А В A and B
true true true
true false false
false true false
false false false
Кроме того, удобно применять однокомпонентную операцию Not, которая вводится следующим образом: если А есть TRUE, то Not А есть FALSE и если А есть FALSE, то Not А есть TRUE.
С помощью этих операций можно построить условия любой сложности. Например, пусть необходимо решить задачу:
Напишем программу:
Program Prim5;
Var a,x:real;
BEGIN
writeln('введите а,х'); readln(a,x);
if (a>0) and (x>0) and (x<=0.5) then
writeln('z=',a*sqr(x)/sin(x)) else
if (a>0) and (x>=0.5) and (x<3) then
writeln('z=',exp(x)) else
if (a<=0) or (x<=0) then
writeln('z=',sqrt(a)*sqrt(x)/sin(x)) else
writeln('z=0');
readln; END.
Замечание: в последнем примере мы видим, что операторы if могут быть вложены друг в друга. Вкладывать их можно неограниченное количество раз, причем новый if может начинаться как после слова then, так и после слова else.
Еще один пример: пусть дана область (заштрихованная на рис. 3.3). Мы вводим с клавиатуры координаты точки. Машина должна определить, принадлежит ли данная точка этой области или нет.
Разобьем область рис. 3.3 на несколько простых:
1. Внутренняя часть сектора, ограниченного отрицательной частью оси OX, положительной OY и окружностью с центром в начале координат и радиусом, равным 2.
2. Прямоугольник, ограниченный осями OX, OY и прямыми x=4, y=2.
3. Прямоугольник, ограниченный осями OX, ОУ и прямыми x=-2, y=-4.
4. Внутренняя часть сектора, ограниченного положительной частью оси OX, отрицательной OY и окружностью с центром в начале координат и радиусом, равным 3.
5. Внутренняя часть квадрата, ограниченного прямыми линиями x=2, x=3, y=-3, y=-4.
6. Область, лежащая внутри окружности с центром x=5, y=-3 и
радиусом= 1,5.
Программа:
Program Prim6;
Label N,K,L;
Var x,y:real; f:char;
BEGIN N: writeln('введите координаты точки');
readln(x); writeln('x=',x);
readln(y); writeln('y=',y);
if (x<=0) and (y>=0) and (sqr(x)+sqr(y)<=4) {1-я область}
or (x>=0) and (x<4) and (y>=0) and (y<=2) {2- я область}
or (x<=0) and (x>=-2) and (y<=0) and (y>=-4) {3- я область}
or (x>=0) and (y<=0) and (sqr(x)+sqr(y)<=9) {4- я область}
or (x>=2) and (x<=3) and (y<=-3) and (y>=-4) {5- я область}
or (sqr(x-5)+sqr(y+3)<=2.25) {6- я область}
then writeln('точка с координатами х=',x,' y=',y, 'принадлежит области')
else writeln('точка с координатами х=',x,' y=',y, 'не принадлежит оласти);
L: writeln('будем ли ещё вводить координаты точки?, Y, N'); readln(f);
if (f='Y') or (f='y') then goto N else
if (f='N') or (f='n') then goto K else
writeln('неправильно нажали клавишу, попробуйте ещё раз'); goto L;
K: readln; End.
Замечание: для того, чтобы построить область, необходим здравый смысл и элементарные знания аналитической геометрии. Так, х>=0 определяет область (рис. 3.4)
x>=0 and x<=4 определяет полосу (рис. 3.5)
Вспомнив, что уравнение окружности с центром в начале координат x2+y2=r2, имеем x2+y24 (рис. 3.6),
x 0 является полуплоскостью (рис. 3.7),
y 0 определяет полуплоскость (рис. 3.8),
x 0 and y 0 есть квадрант (рис. 3.9)
и, наконец,
x 0 and y 0 and sqr(x)+sqr(y)4 есть сегмент (рис. 3.10)
3.4. Оператор case (оператор выбора)
Общий вид:
Case выражение - селектор of
Список констант выбора 1: оператор 1;
Список констант выбора 2: оператор 2 ;
- - - - - - - - - - - - - - - - - - - - - - - - - -
Список констант выбора n оператор n;
else оператор end;
Здесь выражение-селектор есть выражение, которое после выполнения имеет любое скалярное значение, кроме вещественного (типы данных; разд. 2.6.), т.е. выражение-селектор может быть байтового, целого, логического, символьного, перечисляемого и интервального типов.
Список констант выбора состоит из перечня констант, разделенных запятыми, либо из констант, заданных интервалом, либо из комбинаций перечня констант и интервалов. Тип констант в списках Case должен соответствовать типу выражения селектор. Значения констант в списках не должны повторяться.
Работа оператора. вначале вычисляется выражение-селектор, затем полученное значение сравнивается с константами выбора, и, если значение выражения-селектора совпадает с какой-либо константой выбора, то выполняется оператор, стоящий после списка констант, в котором есть константа, совпадающая со значением выражения-селектора. если значение выражения-селектора не совпадает ни с одной из констант выбора, то выполняется оператор, следующий за else. Else может в Case отсутствовать, тогда в случае несовпадения констант оператор Case игнорируется.
Примеры:
1. Селектор целого типа, список констант представлены перечнем констант:
Program Prim7;Var i,z:integer;BEGIN writeln('введите целое i'); readln(i);
Case i of
1,2,5: writeln('i=',i,' z=',i+10);
12,16: writeln('i=',i,' z=',i+100);
31,35,46: writeln('i=',i,' z=',i+1000);
else writeln('неправильно задано i'); end;
readln; END.
2. Селектор целого типа - список констант представлен диапазоном.
вводится целое i, определить, находится ли оно в диапазоне 1-10 или 11-100, или 101-1000, либо вне этих диапазонов.
Program Prim8;Var i:integer;BEGIN writeln('введите целое i'); readln(i); Case i of
1..10: writeln(' число в диапазоне 1-10');
11..100: writeln(' число в диапазоне 11-100');
101..1000: writeln(' число в диапазоне 101-1000');
else writeln(' число вне диапазона 1-1000'); end;
readln; END.
3. Селектор целого типа, список констант представлены перечнем констант и диапазоном:
Program Prim9; Var i:integer; x,m,a,b,c,d:real; BEGIN writeln('введите значение i'); readln(i); writeln('введите значения x,m,a,b,c,d');
readln(x,m,a,b,c,d);
Case i of
1,2,4,8,11..20,24,28,30: writeln('y=',(x+1)/(sqr(x)+2)-ln(m)+2a/b);
31,45..55: writeln('y=',(sqr(a)+m)/sqrt(b+m)-3ab/c+d);
58,60,63..76,78,93,100: writeln('y=',sqr(x)-ax+sqr(sin(ax)-exp(x))
/(1-ln(sqr(x)-exp(х/2))));
else writeln('неправильно задано i'); end;
readln; END.
4. Селектор знакового типа:
Program Prim10; Var name:char;
BEGIN writeln('введите шифр'); readln(name);
Case name of
'S','s': writeln(' факультет самолето- и вертолетостроения');
'D','d': writeln(' факультет авиадвигателестороения');
'Y','y': writeln(' факультет систем управления');
'L','l': writeln(' факультет летательных аппаратов');
'R','r': writeln(' факультет радиотехнический ');
'M','m': writeln(' факультет инженерно - менеджерский'); 'Z','z': writeln(' факультет заочного обучения');
else writeln('введенный шифр не соответствует ни одному ',
'из факультетов ХАИ'); end; readln; END. 5. Селектор перечисляемого типа:
Program Prim11; Var season:(winter,spring,summer,autumn); rez:integer;BEGIN season:=spring; Writeln('результат ord(season)=',ord(season)); case season of winter: writeln('winter');
Подобные документы
Международный стандарт на язык программирования Паскаль. Приемы объектно-ориентированного программирования в Турбо Паскале. Символы языка, его алфавит. Этапы разработки программы. Понятие алгоритмов и алгоритмизации. Структура программ на Паскале.
курсовая работа [29,8 K], добавлен 28.02.2010Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.
курсовая работа [254,0 K], добавлен 02.07.2011Особенности программирования на языке Паскаль в среде Турбо Паскаль. Линейные алгоритмы, процедуры и функции. Структура данных: массивы, строки, записи. Модульное программирование, прямая и косвенная рекурсия. Бинарный поиск, организация списков.
отчет по практике [913,8 K], добавлен 21.07.2012Язык программирования Турбо Паскаль. Запись алгоритма на языке программирования и отладка программы. Правила записи арифметических выражений. Стандартное расширение имени файла, созданного системным редактором. Составной оператор и вложенные условия.
курсовая работа [75,0 K], добавлен 21.03.2013Изучение основных конструкций и способов написания программ на языке Паскаль. Обзор принципов работы и интерфейса написанной программы. Обработка и модификация двумерных массивов. Файловые структуры данных. Текстовые файлы. Элементы машинной графики.
курсовая работа [761,7 K], добавлен 11.03.2015Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.
курсовая работа [1,0 M], добавлен 03.07.2011Освоение технологии структурного программирования и применения стандартных методов работы с одномерными массивами при разработке и создании программы на языке Турбо Паскаль. Разработка программы методом пошаговой детализации с помощью псевдокода.
реферат [276,9 K], добавлен 27.02.2008Алгоритмы, алфавит языка, структура программы, написанной на Турбо Паскале. Целые, вещественные, логические, символьные типы данных, их совместимость. Линейные алгоритмы, пустой и составной операторы, простейший ввод и вывод, разветвляющиеся алгоритмы.
курсовая работа [49,8 K], добавлен 03.11.2009Сравнительный анализ языков программирования высокого уровня Си и Паскаль. Реализация алгоритма обработки данных. Тестирование и отладка программы или пакета программ. Структура программы на языке Турбо Паскаль. Указатели и векторные типы данных.
курсовая работа [233,5 K], добавлен 14.12.2012Схема разбора арифметического и логического выражения. Внешняя спецификация конвертора и алгоритм перевода программ на языке Паскаль в текст на языке Си. Назначение подпрограмм, особенности констант и переменных. Код программы и ее тестирование.
курсовая работа [567,5 K], добавлен 03.07.2011