Лекции по программированию на Паскале
10. О П Е Р А Т О Р Ы В В О Д А И В Ы В О Д А Рассмотрим организацию ввода и вывода данных с терминального уст- ройства. Терминальное устройство - это устройство, с которым работает пользователь, обычно это экран (дисплей) и клавиатура. Для ввода и вывода данных используются стандартные процедуры ввода и вывода Read и Write, оперирующие стандартными последовательными файлами INPUT и OUTPUT. Эти файлы разбиваются на строки переменной длины, отделяемые друг от друга признаком конца строки. Конец строки задается нажатием кла- виши ENTER. Для ввода исходных данных используются операторы процедур ввода: Read(A1,A2,...AK); ReadLn(A1,A2,...AK); ReadLn; Первый из них реализует чтение К значений исходных данных и прис- ваивание этих значений переменным А1, А2, ..., АК. Второй оператор реализует чтение К значений исходных данных, пропуск остальных значе- ний до начала следующей строки, присваивание считанных значений пере- менным А1, А2, ..., АК. Третий оператор реализует пропуск строки ис- ходных данных. При вводе исходных данных происходит преобразование из внешней формы представления во внутреннюю, определяемую типом переменных. Пе- ременные, образующие список ввода, могут принадлежать либо к целому, либо к действительному, либо к символьному типам. Чтение исходных данных логического типа в языке ПАСКАЛЬ недопустимо. Операторы ввода при чтении значений переменных целого и действительного типа пропускает пробелы, предшествующие числу. В то же время эти операторы не пропускают пробелов, предшествующих значе- ниям символьных переменных, так как пробелы являются равноправными символами строк. Пример записи операторов ввода: var rV, rS: Real; iW, iJ: Integer; chC, chD: Char; ................ Read(rV, rS, iW, iJ); Read(chC, chD); Значения исходных данных могут отделяться друг от друга пробелами и нажатием клавиш табуляции и Enter. Для вывода результатов работы программы на экран используются операторы: Write(A1,A2,...AK); WriteLn(A1,A2,...AK); WriteLn; Первый из этих операторов реализует вывод значений переменных А1, А2,...,АК в строку экрана. Второй оператор реализует вывод значений переменных А1, А2, ..., АК и переход к началу следующей строки. Третий оператор реализует пропуск строки и переход к началу следующей строки. Переменные, составляющие список вывода, могут относиться к целому, действительному, символьному или булевскому типам. В качестве элемен- та списка вывода кроме имен переменных могут использоваться выражения и строки. Вывод каждого значения в строку экрана происходит в соот- ветствии с шириной поля вывода, определяемой конкретной реализацией языка. Форма представления значений в поле вывода соответствует типу пе- ременных и выражений: величины целого типа выводятся как целые деся- тичные числа, действительного типа - как действительные десятичные числа с десятичным порядком, символьного типа и строки - в виде сим- волов, логического типа - в виде логических констант TRUE и FALSE. Оператор вывода позволяет задать ширину поля вывода для каждого элемента списка вывода. В этом случае элемент списка вывода имеет вид А:К, где А - выражение или строка, К - выражение либо константа целого типа. Если выводимое значение занимает в поле вывода меньше позиций, чем К, то перед этим значением располагаются пробелы. Если выводимое значе- ние не помещается в ширину поля К, то для этого значения будет отве- дено необходимое количество позиций. Для величин действительного типа элемент списка вывода может иметь вид А:К:М, где А - переменная или выраже- ние действительного типа, К - ширина поля вывода, М - число цифр дробной части выводимого значения. К и М - выражения или константы целого типа. В этом случае действительные значения выводятся в форме десятичного числа с фиксированной точкой. Пример записи операторов вывода: . . . . . . . . . . . . var rA, rB: Real; iP,iQ:Integer; bR, bS: Boolean; chT, chV, chU, chW: Char; . . . . . . . . . . . . WriteLn(rA, rB:10:2); WriteLn(iP, iQ:8); WriteLn(bR, bS:8); WriteLn(chT, chV, chU, chW); 11. С Т Р У К Т У Р А П Р О Г Р А М М Ы Программа на языке ПАСКАЛЬ состоит из заголовка, разделов описаний и раздела операторов. Заголовок программы содержит имя программы, например: Program PRIM; Описания могут включать в себя раздел подключаемых библиотек (мо- дулей), раздел описания меток, раздел описания констант, раздел опи- сания типов, раздел описания переменных, раздел описания процедур и функций. Раздел описания модулей определяется служебным словом USES и со- держит имена подключаемых модулей (библиотек) как входящих в состав системы TURBO PASCAL, так и написанных пользователем. Раздел описания модулей должен быть первым среди разделов описаний. Имена модулей от- деляются друг от друга запятыми: uses CRT, Graph; Любой оператор в программе может быть помечен меткой. В качестве метки используются произвольные целые без знака, содержащие не более четырех цифр, либо имена. Метка ставится перед оператором и отделяет- ся от него двоеточием. Все метки, используемые в программе, должны быть перечислены в разделе описания меток, например: label 3, 471, 29, Quit; Описание констант позволяет использовать имена как синонимы конс- тант, их необходимо определить в разделе описаний констант: const K= 1024; MAX= 16384; В разделе описания переменных необходимо определить тип всех пере- менных, используемых в программе: var P,Q,R: Integer; A,B: Char; F1,F2: Boolean; Описание типов, прцедур и функций будет рассмотрено ниже. Отдель- ные разделы описаний могут отсутствовать, но следует помнить, что в ПАСКАЛЬ - программе должны быть обязательно описаны все компоненты программы. Раздел операторов представляет собой составной оператор, который содержит между служебными словами begin.......end последовательность операторов. Операторы отделяются друг от друга символом ;. Текст программы заканчивается символом точка. Кроме описаний и операторов ПАСКАЛЬ - программа может содержать комментарии, которые представляют собой произвольную последователь- ность символов, расположенную между открывающей скобкой комментариев { и закрывающей скобкой комментариев }. Текст ПАСКАЛЬ - программы может содержать ключи компиляции, кото- рые позволяют управлять режимом компиляции. Синтаксически ключи ком- пиляции записываются как комментарии. Ключ компиляции содержит символ $ и букву-ключ с последующим знаком + (включить режим) или - (выклю- чить режим). Например: {$E+} - эмулировать математический сопроцессор; {$F+} - формировать дальний тип вызова процедур и функций; {$N+} - использовать математический сопроцессор; {$R+} - проверять выход за границы диапазонов. Некоторые ключи компиляции могут содержать параметр, например: {$I имя файла} - включить в текст компилируемой программы назван- ный файл. Пример записи простой программы: Program TRIANG; var A, B, C, S, P: Real; begin Read(A,B,C); WriteLn(A,B,C); P:=(A+B+C)/2; S:=Sqrt(P*(P-A)*(P-B)*(P-C)); WriteLn('S=',S:8:3) end. 12. Б И Т О В А Я А Р И Ф М Е Т И К А Битовая или поразрядная арифметика введена в TURBO PASCAL для обеспечения возможности работы с двоичными разрядами (битами). Опера- ции битовой арифметики применимы только к целым типам. Первая группа операций - логические операции not, and, or и xor. Операция not является одноместной, она изменяет каждый бит целого числа на обратный. Операции and, or и xor - двуместные, операнды этих операций - целые величины одинаковой длины. Операции выполняются попарно над всеми двоичными разрядами операндов. Вторая группа операций - это операции сдвига влево shl и сдвига вправо shr: I shl N I shr N. Эти операции сдвигают двоичную последовательность значения I влево или вправо на N двоичных разрядов. При этом биты, уходящие за пределы разрядной сетки, теряются, а освободившиеся двоичные разряды заполня- ются нулями. При сдвиге вправо отрицательных значений освободившиеся разряды заполняются единицами. 13. О П Е Р А Т О Р П Е Р Е Х О Д А Обычно операторы в программе выполняются в том порядке, в каком они записаны. Оператор перехода прерывает естественный порядок выпол- нения программы и указывает, что дальнйшее выполнение должно продол- жаться, начиная с оператора, помеченного меткой, указанной в операто- ре перехода. Пример записи оператора перехода: goto 218; 14. Э Л Е М Е Н Т Ы С Т Р У К Т У Р Н О Г О П Р О Г Р А М М И Р О В А Н И Я Структуризованная программа (или подпрограмма) - это программа, составленная из фиксированного множества базовых конструкций. Расс- мотрим основные определения и способы образования этих конструкций в схемах алгоритмов. {} Из операций, развилок и слияний строятся базовые конструкции: сле- дование, ветвление, цикл. Применяя только эти три конструкции, можно реализовать алгоритм решения любой задачи. Конструкция, представляющая собой последовательное выполнение двух или более операций, называется следованием. Конструкция, состоящая из развилки, двух операций и слияния, назы- вается ветвлением. Одна из операций может отсутствовать. Конструкция, имеющая линии управления, ведущие к предидущим опера- циям или развилкам, называется циклом. Конструкции следование, ветвление и цикл можно представить как операции, так как они имеют единственный вход и единственный выход. Произвольную последовательность операций можно представить как одну операцию. Операция может быть реализована любым оператором языка ПАСКАЛЬ (простым или составным), либо группой операторов, за исключением опе- ратора перехода GOTO. В языке ПАСКАЛЬ количество базовых конструкций увеличено до шести, это: -следование; -ветвление; -цикл с предусловием; -цикл с постусловием; -цикл с параметром; -вариант. Далее рассмотрим, как эти базовые конструкции реализуются в языке ПАСКАЛЬ. 15. У С Л О В Н Ы Й О П Е Р А Т О Р {} Условный оператор в короткой форме работает по правилу: если бу- левское выражение B истинно, то выполняется оператор ОР1, далее вы- полняется оператор, следующий за условным. Если булевское выражение B ложно, то будет выполняться оператор, следующий за этим условным опе- ратором. 16. Ц И К Л С П Р Е Д У С Л О В И Е М{} 17. Ц И К Л С П О С Т У С Л О В И Е М{} 18. Ц И К Л С П А Р А М Е Т Р О М{} 19. О П Е Р А Т О Р Ы З А В Е Р Ш Е Н И Я Ц И К Л А Для всех операторов цикла выход из цикла осуществляется как вследствие естественного окончания оператора цикла, так и с помощью операторов перехода и выхода. В версии ТУРБО ПАСКАЛЬ 7.0 определены стандартные процедуры Break и Continue. Процедура Break выполняет безусловный выход из цикла. Проце- дура Continue обеспечивает переход к началу новой итерации цикла. 20. О П Е Р А Т О Р В А Р И А Н Т А{} 21. П Е Р Е Ч И С Л Я Е М Ы Й Т И П Д А Н Н Ы Х Перечисляемый тип представляет собой ограниченную упорядоченную последовательность скалярных констант, составляющих данный тип. Зна- чение каждой константы задается ее именем. Имена отдельных констант отделяются друг от друга запятыми, а вся совокупность констант, сос- тавляющих данный перечисляемый тип, заключается в круглые скобки. Программист объединяет в одну группу в соответствии с каким - либо признаком всю совокупность значений, составляющих перечисляемый тип. Например, перечисляемый тип Rainbow(РАДУГА) объединяет скалярные значения RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET (КРАСНЫЙ, ОРАНЖЕВЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ГОЛУБОЙ, СИНИЙ, ФИОЛЕТОВЫЙ). Пе- речисляемый тип Traffic_Light (СВЕТОФОР) объединяет скалярные значения RED, YELLOW, GREEN (КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ). Перечисляемый тип описывается в разделе описания типов, который начинается со служебного слова type, например: type Rainbow = (RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET); Каждое значение является константой своего типа и может принадле- жать только одному из перечисляемых типов, заданных в программе. Нап- ример, перечисляемый тип Traffic_Light не может быть определен в одной программе с типом Rainbow, так как оба типа содержат одинаковые конс- танты. Описание переменных, принадлежащих к скалярным типам, которые объ- явлены в разделе описания типов, производится с помощью имен типов. Например: type Traffic_Light= (RED, YELLOW, GREEN); var Section: Traffic_Light; Это означает, что переменная Section может принимать значения RED, YELLOW или GREEN. Переменные перечисляемого типа могут быть описаны в разделе описа- ния переменных, например: var Section: (RED, YELLOW, GREEN); При этом имена типов отсутствуют, а переменные определяются сово- купностью значений, составляющих данный перечисляемый тип. К переменным перечисляемого типа может быть применим оператор присваивания: Section:= YELLOW; Упорядоченная последовательность значений, составляющих перечисля- емый тип, автоматически нумеруется, начиная с нуля и далее через еди- ницу. Отсюда следует, что к перечисляемым переменным и константам мо- гут быть применены операции отношения и стандартные функции Pred, Succ, Ord. Переменные и константы перечисляемого типа не могут быть элемента- ми списка ввода или вывода. 22. И Н Т Е Р В А Л Ь Н Ы Й Т И П Д А Н Н Ы Х Отрезок любого порядкового типа может быть определен как интервальный или ограниченный тип. Отрезок задается диапазоном от минимального до максимального значения констант, разделенных двумя точками. В качестве констант мо- гут быть использованы константы, принадлежащие к целому, символьному, логическому или перечисляемому типам. Скалярный тип, на котором стро- ится отрезок, называется базовым типом. Минимальное и максимальное значения констант называются нижней и верхней границами отрезка, определяющего интервальный тип. Нижняя граница должна быть меньше верхней. {} Над переменными, относящимися к интервальному типу, могут выпол- няться все операции и применяться все стандартные функции, которые допустимы для соответствующего базового типа. При использовании в программах интервальных типов данных может осущест- вляться контроль за тем, чтобы значения переменных не выходили за границы, введенные для этих переменных в описании интервального типа. 23. М А С С И В Ы Массивы представляют собой ограниченную упорядоченную совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Тип компонент может быть любым, принятым в языке ПАСКАЛЬ, кроме файлового типа. Тип компонент называется базовым типом. Вся совокупность компонент определяется одним именем. Для обозна- чения отдельных компонент используется конструкция, называемая пере- менной с индексом или с индексами: A[5] S[k+1] B[3,5]. В качестве индекса может быть использовано выражение. Тип индексов может быть только интервальным или перечисляемым. Действительный и целый типы недопустимы. Индексы интервального типа, для которого ба- зовым является целый тип, могут принимать отрицательные, нулевое и положительные значения.{} В операторной части программы один массив может быть присвоен другому, если их типы иден- тичны, например: R1:=Z. Для ввода или вывода массива в список ввода или вывода помещается переменная с индексом, а операторы ввода или вывода выполняются в цикле. {} Первый индекс определяет номер строки, второй - номер столбца. Двумерные массивы хранятся в памяти ЭВМ по строкам. Инициализация массивов (присвоение начальных значений всем компо- нентам массивов) осуществляется двумя способами. Первый способ - с использованием типизированных констант, напри- мер: type Dim10= Array[1..10] of Real; const raM10: Dim10 = ( 0, 2.1, 4, 5.65, 6.1, 6.7, 7.2, 8, 8.7, 9.3 ); При инициализации двумерных массивов значения компонент каждого из входящих в него одномерных массивов записывается в скобках: type Dim3x2= Array[1..3,1..2] of Integer; const iaM3x2: Dim3x2= ( (1, 2) (3, 4) (5, 6) ); Второй способ инициализации - использование разновидности процеду- ры FillChar: FillChar( var V; NBytes: Word; B: Byte ); Эта процедура заполняет участок памяти однобайтовым значением. Напри- мер, для обнуления массива A[1..10] of Real можно записать: FillChar(A, 40, 0); или FillChar(A, SizeOf(A), 0); {} 24. С Т Р О К И Особое место в языке ПАСКАЛЬ занимают массивы символов. Стандарт- ный ПАСКАЛЬ допускает два способа хранения символьных массивов в па- мяти ЭВМ: распакованный и упакованный. Распакованные массивы символов хранятся в памяти ЭВМ по одному символу в машинном слове, упакованные - по одному символу в байте. При описании упакованного массива симво- лов используют служебное слово PACKED, например: var MAS: Packed Array[1..20] of Char; Описание распакованного массива символов имеет вид: var M: Array[1..20] of char; Для преобразования символьного массива из распакованной формы в упакованную и наоборот, из упакованной в распакованную, в язык ПАС- КАЛЬ введены две стандартные функции Pack, UnPack. Упакованный массив символов образует символьную строку. Символьная строка может быть либо строковой константой, либо строковой перемен- ной. Строковая константа, или строка, представляет собой совокупность символов, заключенную в апострофы. Строка - это элементарная конс- трукция языка ПАСКАЛЬ. Строковые константы могут входить в состав вы- ражений. Как и числовые константы, они могут быть описаны в разделе описания констант. Строковые переменные - это одномерные упакованные массивы симво- лов, для описания которых в TURBO PASCAL введен тип String. Например, если строка содержит до 30 символов, ее тип будет опре- делен как type s= String[30]; Длина строки не может содержать более, чем 255 символов. В TURBO PASCAL определено понятие строки переменной длины, в этом случае ее описание задается как type s= String; Тип String без указания длины совместим со всеми типами строк. Особенностью строковых переменных является то, что к ним можно об- ращаться как к скалярным переменным, так и к массивам. Во втором слу- чае применяется конструкция "переменная с индексом", что обеспечивает доступ к отдельным символам строки. При этом нижняя граница идекса равна 1. Отдельный символ строки совместим с типом Char. В памяти ЭВМ строка занимает количество байтов, на единицу большее ее длины. Нулевой байт строки содержит ее длину. Для строк определены операции присваивания, слияния (конкатенации) и сравнения. Для сравнения строк применяются все операции отношения. Сравнение строк происходит посимвольно, начиная с первого символа. Строки рав- ны, если имеют одинаковую длину и посимвольно эквивалентны. Строки могут быть элементами списка ввода - вывода, при этом запи- сывается имя строки без индекса. При вводе строковых переменных количество вводимых символов может быть меньше, чем длина строки. В этом случае вводимые символы разме- щаются с начала строки, а оставшиеся байты заполняются пробелами. Ес- ли количество вводимых символов превышает длину строки, лишние символы отбрасываются. Инициализация строк может производиться как с помощью типизирован- ных констант: const sName: String[9]= 'IBM PC/AT'; так и с использованием второй разновидности функции FillChar: FillChar( var V; NBytes: Word; C: Char ); например: FillChar(A, SizeOf(A), '0'); Для работы со строками в TURBO PASCAL включены процедуры и функ- ции, которые обеспечивают редактирование и преобразование строк. {}
Оставить комментарий
Комментарии
1.
+1 / -0
7 ноября 2010, 12:51:07
Огромное СПАСИБО!!!
2.
+1 / -0
18 сентября 2009, 14:46:51
Спасибо автору