Лабораторная 1 ( Понятно,да?)
.pdfЛАБОРАТОРНАЯ РАБОТА 1.
ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ И РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ
Цель работы: Научить создавать, редактировать и выполнять простейшие про граммы, реализующие линейную и алгоритмическую структуру "ветвление" (содержащую операторы If then. else и Case) на языке Pascal в диалоговом режиме. Знать алгоритмы: обмена содержимым ячеек, выбор наибольшего (наименьшего) и вычисление полиномов по схеме Горнера.
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Структура программы
Программа на языке Pascal состоит из заголовка, раздела описаний и раздела опе раторов.
PROGRAM Имя; |
|
Заголовок |
label |
раздел меток |
программы |
|
||
const |
раздел констант |
|
type |
раздел типов |
|
var |
раздел переменных |
Раздел описаний |
PROCEDURE |
раздел процедур |
|
FUNCTION |
раздел функций |
|
BEGIN : |
|
|
Оператор1, |
|
Раздел |
Оператор 2, |
|
|
|
|
операторов |
Оператор n |
|
(тело |
END. |
|
программы) |
|
|
Заголовок программы содержит служебное слово PROGRAM, имя программы, задаваемое программистом. Заканчивается заголовок символом "; " (точка с запятой).
Раздел описаний предназначен для объявления всех встречающихся в программе данных и их характеристик (имена данных, их тип, возможные значения). Этот раздел содержит следующие подразделы: объявление меток, констант, типов, переменных, объявление процедур и функций. Порядок расположения разделов не важен и описания могут повторяться.
Объявление процедур и функций является одним разделом. Следует заметить, что не все перечисленные разделы обязательны в программе. В простых программах могут потребоваться, например, только разделы описания констант и переменных. После каждого описания ставится символ ";".
Раздел операторов ("тело" программы) заключается в операторные скобки вида. BEGIN ("начать") и END ("окончить"), при этом после служебного слова END обязательно ставится точка. В разделе операторов записывается последо вательность исполняемых операторов, и каждый выражает действие, которое необходимо выполнить. Исполняемые операторы отделяются друг от друга символом ";".
Пример простой программы, которая вводит два числа с клавиатуры дисплея,
складывает их и выводит сумму на экран.
program SUMMA; |
заголовок программы |
|
var X,Y,Z: integer; |
описание переменных |
|
begin |
начало программы |
|
|
read(X,Y); |
ввод значений Х и Y |
|
Z := X + Y; |
присваивание суммы |
|
write (Z); |
вывод результата |
end. |
конец программы |
Хороший стиль программирования требует: (1) записывать слова PROGRAM, BEGIN, END с одинаковой позиции строки; (2) по отношению к ним описания и операторы принято сдвигать вправо на 3 символа. Желательно сдвиг делать на одинаковое количество позиций от края или по отношению к предыдущему сдвигу.
Имена и зарезервированные слова
Текст программы записывается при помощи латинских букв, цифр и знаков. Буквы допускаются прописные и строчные.
Особую роль в тексте программы играют имена и зарезервированные слова. Имена применяют для обозначения программ, переменных и других объектов, определенных в программе. Имя может состоять из любого количества букв или цифр, но должно начинаться с буквы. В имя можно включать знак подчеркивания, который здесь считается буквой. В программе SUMMA есть четыре имени: SUMMA, X, Y, Z. Часто, используют осмысленные имена в своих программах. Это всегда полезно, а в
сложных программах совершенно необходимо. Вот еще несколько примеров имен: Flower, TU_104, pascal. Неправильные имена: 1APL, DATA 1.
Зарезервированные слова применяют для обозначения операторов, описания переменных, заголовка программы и других элементов языка Паскаль. Их нельзя использовать в качестве имен и во всех программах они имеют одинаковый смысл. Зарезервированными словами в программе SUMMA являются слова program, var, begin, end.
Константы и переменные
Данные, которыми оперирует программа, могут быть определены в ней как неизменные, либо как способные изменять свое значение. Первые называются
константами, а вторые переменными. И переменные и константы |
размещаются |
в ячейках памяти компьютера. В программе переменные должны |
быть описаны |
в предложении VAR (от слова VARIABLE — переменная), а константы — в предложении CONST.
Константы это данные, значения которых не изменяются в процессе работы программы. Константы "узнаются" компьютером по форме их записи. В языке Pascal используются константы трех видов числовые, булевские и символьные. Например.
Const |
|
Min=32767; |
Целая константа. |
z=1E5; |
Вещественная константа. |
x=3.0; |
Вещественная константа |
Symbols='PASCAL'; Строковая константа
Значения переменных, в отличие от констант, могут изменяться во время выпол нения программы. Переменные "узнаются" компьютером по именам (идентификато рам), более того с каждой переменной программы связывается одна и только одна ее характеристика, называемая типом.
Тип это множество значений переменной вместе с множеством операций, кото рые можно выполнять над элементами этого множества.
Приписывая переменной некоторый тип, мы тем самым явно определяем (а) множество значений, которые можно присвоить этой переменной, (б) множество операций, с помощью которых можно манипулировать ее значениями и (с) размер ячейки для хранения значения в ОЗУ.
Все типы данных делятся на три группы: (1) простейшие, или скалярные (к скалярным типам данных относятся типы данных таких величин, значения которых не содержат составных частей, т е. простейшие типы: целочисленный, вещественный, логический, символьный, перечисляемый, интервальный (тип диапазон) и ссылочный),
(2) структурированные (структурированный тип данных, или структуры данных,
в своей основе имеет один или несколько скалярных типов данных. К ним относятся: строки, массивы, множества, записи, файлы.), (3) процедурные и типа Object (этим типам данных трудно поставить в соответствие данные в обычном понимании этого слова). Понимание работы с этими типами данных требует наличие определенного опыта и навыков программирования. Простейшие типы данных, кроме вещественных, называются также порядковыми. Порядковые типы данных позволяют навести соответствие между ними и возрастающим рядом целых чисел. Рассмотрим некоторые скалярные (простейшие) типы данных:
1. Целые числа без знака.
а) Тип Byte. Диапазон значений – 0 ...255. Размер ячейки в ОЗУ – 1 байт. б) Тип Word. Диапазон значений 0 ..65535. Размер ячейки в ОЗУ – 2 байта.
2. Целые числа со знаком. Тип Integer. Диапазон значений – 32768 ..32767.
а) Тип ShortInt. Диапазон значений – 128 ..127. Размер ячейки в ОЗУ – 2 байта. б) Тип LongInt. Диапазон значений – 2147483648 ..2147483647. Размер ячейки в
ОЗУ – 4 байта.
Над данными типа Byte, Word, Integer (и ShortInt, LongInt) допустимы сле дующие операции:
сравнения (=,<>,<,<=,>,>=);
+ (сложение); |
+ (одноместный (унарный) плюс); |
- (вычитание); |
- (одноместный (унарный) минус); |
* (умножение); |
DIV (деление на цело); |
MOD (получение остатка от деления на цело);
ShL (логический сдвиг влево), ShR (логический сдвиг вправо).
При логическом сдвиге биты, оказавшиеся за пределами разрядной сетки кода, отбрасываются, а вместо недостающих устанавливаются нули
3. Вещественные числа.
а) Тип Real. Диапазон значений – 2.9Е-39..1.7Е38. Данные имеют точность до одиннадцати значащих цифр. Размер ячейки в ОЗУ – 6 байт.
б) Тип Single. Диапазон значений – 1.5Е-45..3.4Е38 Данные имеют точность до восьми значащих цифр. Размер ячейки в ОЗУ – 4 байт.
с) Тип Double. Диапазон значений – 5.0Е-324..1.7E308 Данные имеют точность до шестнадцати значащих цифр. Размер ячейки в ОЗУ – 10 байт.
д) Extended и е) Comp. Познакомится самостоятельно по HELP. Над данными типа Real допустимы следующие операции:
сравнения (=,<>,<,<=,>,>=);
+ (сложение), + (одноместный (унарный) плюс); - (вычитание), - (одноместный (унарный) минус);
*(умножение), / (деление для вещественных чисел).
5.Символы. Тип Char. Данные определяет множество символов с кодами ASCII Над
данными типа Char допустимы операции сравнения (=,<>,<,<=,>,>=)
6. Данные типа Boolean. Могут принимать два значения TRUE и FALSE. Над данны ми типа Boolean допустимы следующие операции сравнения (=,<>,<,<=,>,>=), AND (логическое И), OR (логическое ИЛИ), ХОR (логическое исключающее ИЛИ), NOT (логическое отрицание)
Заметим, что ниже Вам встретятся и другие простейшие типы данных, не включенные в приведенную классификацию
Встроенные константы
В языке Pascal есть ряд констант, к значениям которых можно обращаться без предварительного определения Их называют встроенными (или зарезервированными) Перечислим некоторые из них
Maxint: Integer возвращает число 32767, наибольшее значение типа Integer;
Pi: Real возвращает число π=3.14159265358...
Встроенные функции
Odd (A: Integer):Boolean возвращает TRUE, если значение А нечетно; Int (X: Real):Real возвращает целую часть аргумента;
Round (X: Real):Integer возвращает результат округления аргумента до бли жайшего целого;
Trunc (X: Real):Integerвозвращает целую часть аргумента; Frac (X: Real):Real возвращает дробную часть аргумента; Abs (X: Real):Realвозвращает абсолютное значение аргумента;
Abs (X: Integer):Integerвозвращает абсолютное значение аргумента; Random (A: Integer):Integerвозвращает случайное число из интервала [0,А); UpCase (A: Cnar):Charпревращает строчные буквы латинского алфавита в со
ответствующие им прописные;
Ord (X:порядковый тип):Integer возвращает порядковый номер аргумента
X;
Pred (X:порядковый тип):тип сохраняется - возвращает значение,
предшествующее X. К наименьшему значению не применима.
Succ (X:порядковый тип):тип сохраняется - возвращает значение,
следующее за X. К наибольшему значению не применима.
Chr (A: Byte):Char возвращает символ, ASCII код которого равен А; Sqr (X: Real):Real возвращает квадрат аргумента;
Sqr (X: Integer):Integerвозвращает квадрат аргумента;
Sqrt (X: Real):Real возвращает квадратный корень аргумента; Eхр (X: Real):Real возвращает экспоненту аргумента;
Ln (X: Real):Real возвращает логарифм аргумента; Sin (X: Real):Real возвращает синус аргумента; Cos (X: Real):Real возвращает косинус аргумента;
АгсТаn (X: Real):Real возвращает арктангенс аргумента.
Для вычисления значений других функций следует пользоваться тождествами
ArcSin(x)=ArcTan (x/Sqrt(1-x*x)) ArcCos(x)=PI/2 АгсТап (x/Sqrt(1 x*x)) ArcCtg(x)=PI/2-ArcTan (x) Logba=Ln(a)/Ln(b)
ax=Exp(x*Ln(a)) (а>0)
Процедуры ввода-вывода данных
Для организации ввода и вывода информации в языке программирования Pascal служат четыре процедуры Read и ReadLn, Write и WriteLn Эти процедуры являются "встроенными" в язык Pascal, поэтому для того, чтобы ввести информацию в оперативную память компьютера для ее дальнейшей обработки, программисту не надо писать специальную программу, а всего лишь нужно правильно обратиться к процедуре Read или ReadLn Соответственно, чтобы вывести информацию на дисплей из оперативной памяти компьютера, необходимо вызвать процедуру Write или WriteLn
1. Процедуре ввода информации.
Процедуры ввода (или чтения информации) Read или ReadLn обеспечивают ввод числовых данных, символов, строк и т.д. для последующей их обработки программой
Синтаксис процедуры Read и ReadLn
Read (X, Y);
ReadLn (X, Y);
где X, Y переменные, описанные в разделе описания переменных
Отметим, что указанные процедуры Read и ReadLn аналогичны, единственное отличие заключается в том, что после ввода значений переменных, указанных в списке процедуры ReadLn, ввод значений переменных, указанных в списке следующей проце дуры ReadLn, будет производится с новой строки. Этого не происходит в ходе выпол нения процедуры Read, т.е. ввод осуществляется на той же строке. Таким образом, процедура ReadLn не только вводит значения указанных переменных, но еще и переводит курсор на новую строку. Это позволяет делать суфикс Ln
2. Процедура вывода информации.
Процедуры вывода (или записи информации) Write или WriteLn обеспечивают вывод числовых данных, символов, строк на дисплей. В отличии от процедуры ввода процедура вывода WriteLn может не иметь параметров. В этом случае процедура WriteLn обеспечивает лишь перевод курсора на следующую строку Синтаксис процедуры Write и WriteLn
Write (X, Y);
или "Слепой" вывод значений переменных
WriteLn (X, Y);
Write (X+Y);
или |
Вывод значения выражения |
WriteLn (X+Y); |
|
Write (X:6:2); |
|
или |
Форматированный вывод значения переменной |
WriteLn (X:6:2); |
|
Write ( ‘Фраза’ ); |
|
или |
Вывод некоторой фразы на дисплей |
WriteLn (‘Фраза’); |
|
Write (‘Фраза’,Y); |
|
или |
Вывод фразы и значения переменной на экран, |
WriteLn ( ‘Фраза’, Y); |
"слепой" вывод значения переменной, |
где 1) X, Y переменные, значения которых нужно вывести на экран;
2)'Фраза' некоторый пояснительный текст, который обычно сопровождает значение переменной (обязательно в апострофах!),
3)Х:6: 2 указывается формат значения переменной. Это значит, что всего 6 сим волов, отводится под значение переменной X, причем после десятичной точки будет выведено на экран 2 символа. Это так называемый форматированный вывод числа с фиксированной точкой.
**) Более подробно о вводе и форматном выводе в приложении 1
Оператор присваивания
Оператор присваивания ( := ) предписывает выполнить выражение, заданное в его правой части, и присвоит результат переменной, имя которой указано в левой его части Переменная и выражение должны быть совместимы по типу. Его синтаксис
Y:=3;
Х:=‘Строка’;
Р:= V1;
Summa:= V2;
где 1) X,Y,P,Summa имена переменных, описанных в разделе описания переменных,
2)2, ‘Строка’ некоторые значения,
3)V1, V2; выражения, значения которых нужно вычислить
Арифметические выражения
Арифметические выражения строятся из имен переменных, констант, знаков операций и круглых скобок так, как это принято в математике. При вычислении их значений раньше выполняются операции *, /, DIV, MOD, а затем + и -. Операции одинакового старшинства выполняются слева направо.
Преобразование типов
Целое значение можно преобразовать в вещественное, присвоив вещественной переменной целое выражение. Например:
А := 3 + 5.
Противоположное преобразование выполняется при помощи стандартных функций:
TRUNC(X) целая часть аргумента,
ROUND(X), аргумент, округленный до ближайшего целого.
Пустой оператор
Пустой оператор не обозначается и не вызывает никаких действий пустой опе ратор это просто символ ";" (точка с запятой). В программе операторы отделяются друг от друга символом "точка с запятой" (;) Поэтому точку с запятой часто называют разделителем. Если разделитель между двумя операторами отсутствует, то это приве дет к возникновению ошибки, поскольку компилятор часто не может "понять", что же хотел сказать автор программы. Пусть, например, записано
х :=1 У:=2;
Несмотря на то, что операторы присваивания записаны на разных строчках, ком пилятор будет воспринимать эту запись как
х:=1у:=2;
Витоге получается "оператор", в котором используются два знака присваивания
инеправильный идентификатор 1у (идентификатор не может начинаться с цифры).
Составной оператор
Составной оператор представляет собой группу из произвольного числа опера торов, отделенных друг от друга точкой с запятой, и ограниченную операторными скобками зарезервированными словами в языке Pascal begin и end
begin S1; S2; .. Sn end;
Поэтому приведенный оператор можно мысленно представить в таком виде (S1; S2; .. Sn). Составной оператор используется в том случае, если необходимо выпол нить последовательность операторов внутри какойлибо конструкции как единое целое.
Операторы условного перехода (If, Case)
Операторы условного перехода позволяют выбрать для исполнения один из не скольких операторовкомпонентов в зависимости от условия
1 Оператор If.
Его синтаксис
If A
then ST1 else ST2;
где 1) А – булевская переменная или выражение (возвращающее TRUE или
FALSE),
2) ST1, ST2 операторы (возможно пустые или составные).
Если значение переменной или вычисленного выражения А TRUE, то выполняется оператор ST1, если значение А FALSE, то выполняется оператор ST2.
Затем, в обоих случаях управление передается следующему оператору программы.
Допускается и краткая форма условного оператора:
If A then ST;
где: 1) А булевское переменная или выражение, 2) ST оператор (возможно составной)
Если значение А TRUE, то выполняется оператор ST. Если значение А FALSE, то управление передается оператору, следующему за оператором If.
В качестве условия применяют сравнения: =, <>, <=, >=, >, <. Слева и справа
от знака сравнения записывают арифметические выражения. Обычно при написании программы не рекомендуется использовать многократно вложенные друг в друга условные операторы программа становится громоздкой и трудно понимаемой.
Примеры. if Х <> 0 then |
if Х < 0 then Х := -X |
Z:=Y/X else |
|
write('0шибка!') |
|
Считается, что число уровней вложения не должно превышать двухтрех. Но как быть, если необходимо проверять достаточно много условий и в зависимости от них выполнять те или иные действия? Для этих целей в языке Pascal существует специальный оператор выбора Case.
2. Оператор выбора Case.
Его синтаксис
Case N of
M1, .. , Mn: ST1; K1, .. , Кm: ST2;
…………..
D1, .. , Ds: STi;
End;
где: 1) Case ("случай") служебное слово,
2)N переменная, называемая селектором или переключателем;
3)Мi, Кi, … метки (i=1,2, ), которые отличаются по смыслу от меток, описывае мых в разделе Label;
4)ST1, ST2, STi – операторы.
Отметим, что переключатель и метки должны быть одного и того же скалярного типа (но не типа Real!).
Оператор Case передает управление тому оператору ST1, с одной из меток которо го совпало значение селектора N, а затем на следующий за End оператор. Если значе ние селектора N не совпало ни с одной из меток, то исполняется оператор, следующий за зарезервированным словом End.
Сложные условия
Сложные условия составляются из простых при помощи логических операций:
AND |
(и), |
NOT (не). |
OR |
(или), |
XOR (исключающее или) |
Примеры сложных условий:
а) (0 < A) AND (А <= 1), б) (X = 0) OR (ABS(X) < 5), в) NOT (X = Y).
Сложные условия могут служить частями еще более сложных и т.д. Истинность любого условия можно вычислить при помощи таблиц значений логических операций:
ложь AND ложь = ложь |
ложь OR ложь = ложь |
ложь AND истина = ложь |
ложь OR истина = истина |
истина AND ложь = ложь |
истина OR ложь = истина |
истина AND истина = истина |
истина OR истина = истина |
истина |
NOT истина = ложь |
NOT ложь = истина |
ВОПРОС. Каково значение сложного условия (X>5)AND(X<X+1)?
Тип BOOLEAN (логический)
Каждое сравнение вырабатывает одно из двух значений: TRUE (истина) либо FALSE (ложь). Например, сравнение 5 < 3 вырабатывает значение FALSE, сравнение 2 + 3 < = 5 вырабатывает значение TRUE.
TRUE и FALSE — константы логического типа. Логические переменные должны быть описаны предложением:
VAR имя : BOOLEAN;
Над логическими значениями можно выполнять логические операции: AND, OR,
NOT.
ВОПРОС. А и В — логические переменные. Всегда ли равнозначны логические выражения not (A or В) и not A and not В ?
Величины логического типа можно присваивать, выводить, но нельзя вводить оператором READ. Например:
Х := TRUE: Y := 5 > 3; IF NOT X THEN ...
Из переменных, констант, сравнений, логических операций и скобок можно строить логические выражения. Сложные условия как раз и являются логическими выражениями.
Обратите внимание (!!!), при вычислении логического выражения операции вы-
полняются в следующем порядке: NOT, AND, OR, сравне-ния, арифметические операции. Если нужно изменить порядок выполнения операций, применяют скобки.
ДЕМОНСТРАЦИОННЫЕ ПРИМЕРЫ
Пример 1.
Вывести на экран дисплея предложение "Это наша первая программа на языке
Pascal
PROGRAM Primer_1; BEGIN
WriteLn ( ‘Это наша первая программа на языке Pascal’ ); END.
Пример 2.
Демонстрация операций над данными типа Byte
PROGRAM Рrimmer_2; |
|
|
var x:Byte; |
{ Первый аргумент } |
|
у: Byte; |
{ Второй аргумент } |
|
z: Byte; |
{ Результат операции } |
|
BEGIN |
|
|
Write ( ‘Введите значения двух переменных типа Byte’); Read(x,y); |
||
z:=х+у; WriteLn ('x + у |
->‘,z); |
|
z:=х-у; WriteLn (‘x - у |
-> ',.z); |
z:=х*у; WriteLn ('x * у ->‘ ,z); |
|
||
z:=х DIV 2; WriteLn (‘x DIV 2 ->‘ ,z); |
|||
z:=x MOD 2; WriteLn (‘x MOD 2 ->‘ ,z); |
|||
z:=x ShL 2; WriteLn (‘x ShL 2 ->‘,z); |
|||
z:=y ShR 1; WriteLn (‘у SnR 1 ->‘ ,z); |
|||
WriteLn (‘ x=y |
-> ‘,x=y); |
|
|
WriteLn ( ‘x<>y |
-> ',x<>y); |
|
|
WriteLn (‘x>=y |
-> ‘ x>=y) |
|
|
END. |
|
|
|
Пример 3. |
|
|
|
Демонстрация операций над данными типа Word. |
|||
PROGRAM Primer_3; |
|
|
|
var x:Word; |
{ Первый аргумент |
} |
|
у: Word; |
{ Второй аргумент |
}; |
|
z: Word; |
{ Результат операции} |
BEGIN |
|
|
|
|
Write (‘Введите значения двух переменных типа Word |
'); Read (x,y); |
|||
z:=х+у; WriteLn (‘х + у |
->‘,z); |
|
|
|
z:=х-у; WriteLn (‘х - у |
-> ‘,z); |
|
|
|
z:=х*у; WriteLn (‘х * у |
->‘,z); |
|
|
|
z:=х Div 2; WriteLn (‘ х DIV 2 ->‘ ,z); |
|
|
||
z:=x MOD 2; WriteLn (‘x MOD 2 ->‘,z); |
|
|||
z:=x ShL 2; WriteLn (‘x ShL 2 -> ‘,z); |
|
|
||
z:=y ShR 1; WriteLn (‘у ShR 1 ->‘,z); |
|
|
||
WriteLn (‘ x=y |
>‘,x=y); |
|
|
|
WriteLn (‘ x<>y |
->‘, x<>y); |
|
|
|
WriteLn ('x>=y |
-> ‘,x>=y) |
|
|
|
END. |
|
|
|
|
Пример 4. |
|
|
|
|
Демонстрация операций над типом Integer. |
|
|||
PROGRAM Prlmer_4; |
|
|
|
|
var x:Integer; |
{ Первый аргумент |
} |
|
|
у: Integer; |
{ Второй аргумент |
} |
|
|
z:Integer; |
{ Результат операции } |
|
||
BEGIN |
|
|
|
|
Write(‘ Введите значения двух переменных типа Integer |
‘); Read (x,y); |
|||
z:=х+у; WriteLn ('х + у >‘ ,z); |
|
|
||
z:=х-у; WriteLn ('х - у > ‘,z); |
|
|
||
z:=х*у; WriteLn (‘ х * у >‘, z); |
|
|
z:=х DIV 2; WriteLn (‘х DIV 2 ->‘,z); z:=x MOD 2; WriteLn ('x MOD 2 ->‘,z); z:=x ShL 2; WriteLn (‘x ShL 2 -> ',z); z:=y ShR 1; WriteLn (‘у ShR 1 -> ‘,z); WriteLn ('x=y -> ‘,x=y);
WriteLn (‘ x<>y -> ‘,x<>y);
WriteLn ( ‘x>=y > ‘,x>=y) END.
Пример 5.