Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная 1 ( Понятно,да?)

.pdf
Скачиваний:
9
Добавлен:
12.02.2015
Размер:
382.93 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 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=­1E­5;

­Вещественная константа.

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.