Справочник от Автор24
Поделись лекцией за скидку на Автор24

Информатика. Turbo Pascal

  • ⌛ 2004 год
  • 👀 326 просмотров
  • 📌 244 загрузки
  • 🏢️ ГОУ ВПО «Братский государственный технический университет»
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Информатика. Turbo Pascal» doc
Министерство образования РФ ГОУ ВПО «Братский государственный технический университет» С.Г. Ким М.Ю. Шелепова Информатика. Turbo Pascal Учебное пособие Братск 2004 УДК 681.3 Информатика. Turbo Pascal: Учебное пособие / Сост. С.Г. Ким, М.Ю. Шелепова. – Братск: ГОУ ВПО «БрГТУ», 2004. – 67 с. Пособие включает авторский лекционный курс по системе программирования Turbo Pascal. Рецензент Алпатов Ю.Н., д-р техн. наук, профессор. Печатается по решению издательско-библиотечного совета Введение Данное учебное пособие является дополнением к теоретическому курсу дисциплин «Информатика», «Программное обеспечение ПЭВМ», «Технология программирования», «Языки и системы программирования» и в то же время может рассматриваться как своего рода самоучитель . С его помощью можно самостоятельно освоить программирование на языке Turbo Pascal и ознакомиться с работой в интегрированной инструментальной среде. Пособие не только позволит работать в среде Turbo Pascal, но и научит пользоваться инструментами, прилагаемыми к нему. Оно содержит многие полезные и практические приемы программирования. Предыдущий опыт программирования не обязателен, единственное, что требуется, – общее представление о работе на компьютере и навыки начинающего пользователя. Каждая глава учебного пособия посвящена определенному аспекту процесса разработки приложений. Чтобы узнать что-то новое, незачем читать пособие от корки до корки. Просто можно сразу перейти к нужному разделу. Данное пособие предназначено для студентов следующих специальностей: ИС и Т, ПО, ЭС, ЭП. 1. Интегрированная инструментальная оболочка (ИИО). Базовый сеанс 1.1. Вызов ИИО Turbo Pascal (TP) включает: компилятор однопроходной, генерирующий исполнение файла; отладчик программ, позволяющий транслировать программу в режиме пошагового исполнения, расставлять контрольные точки, просматривать выражения и модифицировать переменные; интерактивный полноэкранный текстовый редактор, вызывающий из своей среды компилятор и отладчик; систему помощи; библиотеку программных модулей; компановщик объектных модулей; компановщик оверлейных модулей. Меню Имя файла Рабочая зона Рис. 1. Вид экрана после вызова TP 1.2. Меню Меню активизируется нажатием клавиши [F10]. Пункты меню: File – позволяет выполнять все основные операции с файлами (создавать, загружать имеющиеся, сохранять, печатать); команда выхода из TP; Edit – позволяет выполнять все основные операции редактирования текста (копировать, вставлять, удалять фрагменты); Search (TP 7.0) – поиск и замена фрагментов языка; Run – позволяет запускать программу, находящуюся в рабочей зоне; а также пошагово выполнять эту программу; Compile – позволяет компилировать программу из рабочей зоны; Debug – содержит команды, облегчающие поиск ошибок в программе (точки остановки, окно отладки, окно используемых подпрограмм, окно регистров, окно выходных результатов и др.); Tools (7.0) – позволяет выполнять некоторые программы, не выходя из ИИО; Options – позволяет установить необходимые для работы параметры компилятора и ИИО; Help – позволяет получить имеющуюся в системе справочную информацию; Window – основные операции с окнами (открытие, закрытие, перемещение, изменение размера); [Esc] – выход из подчиненного меню или выход в рабочую зону. Все пункты меню дублируются с помощью «горячих» клавиш. 2. Элементы и конструкции языка TP 2.1. Элементы языка 2.1.1. Алфавит • латинские прописные и строчные буквы (русские буквы в комментариях и в процедурах вывода); • арабские цифры; • шестнадцатеричные цифры: 0–9, a–f или A–F; • специальные символы: + - * / = . : ; ‘ , < > [ ] { } ^ @ $ # • сюда же относятся пары символов, которые воспринимаются как единое целое: <> <= >= := (* *) – вместо { }, (. .) – вместо [ ]; • зарезервированные слова: And – и Array – массив Begin – начало Case – вариант Const – константа Div – деление нацело Do – делать Downto – уменьшать Else – иначе End – конец File- файл For – для Function – функция Goto – переход If – если Until – до In – в Label – метка Mod – остаток от деления Of – из Not – не Then – тогда Or – или Procedure – процедура Set – множество Record – запись Repeat – повторить String – строка To – к Type – тип Uses – обращение Var – переменные While – пока With – с, вместе с 2.1.2. Идентификаторы Идентификаторы – это имена констант, переменных, меток, типов, объектов, процедур, функций, модулей и программ. Идентификатор – это последовательность букв и цифр, первый символ обязательно буква. Идентификаторы могут иметь любую длину, но значащими являются первые 63 символа. Идентификаторы не должны совпадать со служебными словами. Пример: А. Правильные: A ALPHA _beta date_27_sep_39 В. Неправильные: 2program (начинается с цифры) block#1 (содержит спец. символ) mod (зарезервированное слово) betta 27 (содержит пробел) 2.2. Простейшие конструкции языка К простейшим конструкциям языка относятся: константы, переменные, выражения. 2.2.1. Константы В качестве констант в TP могут быть использованы целые, вещественные и шестнадцатеричные числа, логические константы, символы, строки символов. • целые числа: (-2147483648; +2147483647); • вещественные числа имеют две формы представления: естественную – форма с фиксированной запятой (0.5, -3.16, 7.0) и нормальную – с плавающей запятой (3.14Е5); • логическая константа: False – ложь < True – истина; • символьная константа – это любой символ, заключенный в апострофы (‘F’, ‘1’); • строковая константа – любая последовательность символов (кроме символа возврата коретки – CR), заключенная в апострофы (‘Группа’, ‘ANL’). 2.2.2. Переменные Переменная имеет уникальное имя, свой тип. Может изменять значение в процессе выполнения программы. 2.2.3. Выражения Выражение состоит из элементов (операндов) и знаков операций, а тип его значений определяется типом операндов и видом примененных к ним операций. Элементами (операндами) выражения являются: константы, переменные и обращения к функциям. Пример: у (a+b)*c sin(t) – арифметические a>2 (a>4) and (a<10) – логические 2.2.3.1. Операции Виды операции приведены по убыванию приоритета: • унарные: not – логическое отрицание, @ – взятие адреса; • мультипликативные - *, /, div – целочисленное деление (пример: 17 div 8), mod – остаток от деления (пример: 5 mod 3), and – “и”, shl, shr – циклический сдвиг влево/вправо; • аддитивные: +, -, or (“или”), xor (исключающее “или”); • отношения: in (вхождение во множество), <, >, =, <=, >=, <>. 2.2.3.2. Математические функции и процедуры А. Функции: Abs(x) – Exp(x) – ex Cos(x) – cosx Ln(x) – lnx Sin(x) – sinx Pi – Arctan(x) – arctgx Sqr(x) – Sqrt(x) – x2 Random(x) – случайное целое число [0, x] Trunc(x) – отбрасывание дробной части числа Х, тип longint Frac(x) – дробная часть числа Х Int(x) – целая часть числа Х Round(x) – округление до ближайшего целого Random – случайное вещественное число (0, 1) Б. Процедуры: Inc(x, y) – увеличивает X на Y (Inc(x) – увеличение на 1) Dec(x,y) – уменьшение числа X на Y (dec(x) – уменьшение на 1) Randomize – изменение начального значения датчика случайных чисел. 2.3. Структура программы Любой блок (программная единица) состоит из двух разделов: раздел описаний и раздел исполняемых операторов. В разделе описаний объявляются идентификаторы типов, объектов, констант, переменных, а также метки, процедуры и функции. Описанию типов и объектов предшествует зарезервированное слово Type, описанию констант – Const, переменных – Var, меток – Label. Заголовок программы задается идентификатором. Знак ; используется для указания конца оператора или описания. Оператор Uses позволяет подключать к программе стандартные модули или модули, созданные пользователем. После слова Uses указываются через запятую имена модулей. Стандартный модуль System – содержит основные процедуры и функции ТР, не требует указания в операторе Uses, т. к. подключается к любой программе автоматически. Crt – содержит процедуры и функции для работы в текстовом режиме экрана. Graph – содержит процедуры и функции для работы с графикой. Раздел исполняемых операторов заключается в так называемые «операторные скобки» – Begin….End. В конце программы ставится точка. Пробел используется как разделитель, но его нельзя использовать в именах. Длина строки до 249 символов, однако рекомендуется до 126 символов, т. к. компилятор не рассматривает более длинные строки. Остальные позиции с 127 по 249 можно использовать для размещения комментариев в программе. Пример: Program PM; {заголовок} Uses crt; {подключение модуля Crt} Type {объявление типов} Bigtype = set of ‘0’ ..’9’; Strtype = string[40]; Const {объявление констант} N = 100; Eps = 1e-9; Var {объявление переменных} X,y: real; St: strtype; Label {объявление меток} Lb1,lb2; Begin <раздел выполняемых операторов> End. 2.3.1. Комментарии Комментарии – произвольный текст, ограниченный с двух сторон парой символов { и } – фигурными скобками или ( * и * ). 2.4. Типы данных Тип данных определяет множество допустимых значений, которые принимает тот или иной объект, а также множество допустимых операций, применимых к нему. 2.4.1. Простые типы данных Простые типы данных подразделяются на следующие группы: • целые типы: shortint, integer, longint, byte, word; • вещественные типы: real, single, double, extende, comp; • символьный тип: char – значениями символьного типа являются символы из множества ASCII (American Standard Code For Information Interchange – американский стандартный код для обмена информацией). Каждому символу приписывается целое число 0…255. Функция Ord возвращает код символа. Пример: Ord(‘A’) = 65; Chr(65) = ‘A’- возвращает символ по заданному коду; • логический тип: boolean – имеется два значения булевского типа: true – истина > false – ложь. Значения занимают 1 байт памяти; (1) (0) • перечисляемый тип задается перечислением значений, которые он может получать. Каждое значение именуется идентификатором и располагается в списке, обрамленном круглыми скобками. Пример: Var A: (red, yellow, green); C: (left, up, right, down); B: (on, off); • ограниченный тип (тип-диапазон) – это подмножество своего базового типа. Базовый тип – любой порядковый тип, кроме типа-диапазона. Пример: 1 .. 100 -100 ..100 ‘0’.. ‘9’ ‘A’ .. ‘Z’. Рис. ? 2.5. Преобразование типов. Совместимость типов 2.5.1.Стандартные функции преобразования типов Odd(x), x – целое: true, если х – нечетный; false, если х – четный. Trunc(x), x – вещественное: целая часть аргумента (дробная часть отбрасывается). Round(x), x – вещественное: ближайшее целое. Ord(x), x – порядковое: порядковый номер аргумента в данном типе (нумерация с 0). Chr(x), x [0,255]: символ с кодом х. 2.5.2. Объявление переменных и констант в программе Переменные Формат: А. Без предварительного описания типа Var < переменные >: тип; Var < список переменных >: тип; Пример: Var A: longint; B1, b2, b3: integer; Б. С предварительным описанием типа Type < имя типа > = < описание типа > Var < переменная >: < имя типа >; Type Diap = -20 .. 20; Var c: Diap; Константы А. Нетипизированные: Const < имя константы > = значение; Пример: Const A = 5; c = ‘х’; В = 7.5; Б. Типизированные: Const < имя константы: тип > = значение; Пример: Const A: integer = 5; B: real = 7.5; C: char = ‘*’; 3. Операторы Turbo Pascal Различают простые и структурированные операторы. К простым операторам относятся: оператор присваивания, оператор перехода, оператор ввода-вывода данных. Структурированные операторы включают в себя другие операторы. Такими операторами являются условный оператор, оператор выбора, операторы цикла, составной оператор. 3.1. Ввод – вывод данных Для ввода – вывода в ТР используются специальные стандартные процедуры: Read[ln] (список переменных); Write[ln] [(список вывода)]; Список вывода: константы, переменные, выражения. Пример: программа вводит два целых числа и выводит их частное. Program primer; Var N1, n2: integer; {n1, n2 – вводимые числа} X: real; {x - результат} Begin Write (‘введите n1 = ’); {сообщение о требуемом значении} Readln (n1); {ввод значения для n1} Write (‘введите n2 = ’); {сообщение о требуемом значении} Readln (n2): {ввод значения n2} X:= n1/n2; {вычисляется частное n1 и n2} Writeln (‘n1 = ’, n1, ‘n2 = ’, n2); {вывод значений n1 и n2} Writeln (‘n1/n2 = ’, x : 8 : 2); {вывод значения x с заданным форматом} End. 3.1.1. Ввод данных с клавиатуры Формат: Read < список переменных >; Readln < список переменных >; Выполнение (порядок ввода): • выполнение программы приостанавливается; • в окне результатов (пользователя) высвечивается приглашающий курсор (__); • вводимые значения разделяются пробелом или Enter; • вводится столько значений, сколько переменных, указанных в списке ввода; • при вводе надо следить за соответствием типов вводимых значений и соответствующих им переменных. Окончание ln означает, что после ввода последнего значения курсор перейдет в следующую строку экрана. 3.1.2. Вывод данных Формат: Write (список вывода); Writeln (список вывода); • список вывода может отсутствовать; • Writeln; – переводит курсор на следующую строку; • суффикс ln означает, что после вывода последнего значения из списка курсор перейдет в следующую строку экрана; • числовые константы и переменные можно выводить в заданном формате или без него (по умолчанию). Для целых констант: Write[ln] (<переменные>: <поле>); где поле – число позиций (знакомест), отводимых под число на экране. Пример: Writeln (x: 6); Для вещественных констант: Write[ln] (<переменные>: <поле>: <дробная часть>); где поле – число позиций, отводимых под число на экране (с учетом + и .) Дробная часть – число позиций, отводимых под дробную часть. Пример: Writeln (B: 8: 2); 3.1.3. Вывод данных на печать Для вывода данных на печать существует два способа: 1. Сделать копию экрана результатов – это возможно , если все данные помещаются на экран. Действия: • открыть окно результатов (Alt + F5); • нажать клавишу PrintScreen (Shift + PrintScreen). 2. Вывод на принтер задается в самом операторе Write. Действия: • в операторе Uses указать имя стандартного модуля Printer; • в начале списка вывода оператора Write указать имя файловой переменной Lst. Этот способ позволяет распечатать данные, даже если они не помещаются на экран, а также позволяет осуществлять печать выбранных данных. Пример: Program pr2; Uses Crt, Printer; Const A = 5.2; B = 7.6; Begin Clrscr; {очистка экрана} Writeln (‘a=’ , a: 7: 2); {вывод на экран} Writeln (lst, ‘b= ’ , b: 8: 1); {вывод на печать} End. 3.2. Возможности модуля Crt Модуль Crt содержит константы, переменные, процедуры и функции, управляющие текстовым режимом работы экрана. • Процедура отображения на экране текстового окна: Window (x1, y1, x2, y2); где x1, y1, x2, y2 (word) – координаты окна. Отсчитываются от левого верхнего угла экрана, имеющего координаты (1, 1). 1 <= x1 <= x2 <= xmax = 40 (80); 1 <= y1 <= y2 <= ymax = 25(43;50) Окно становится текущим. Курсор перемещается в пределах окна. Остальная часть будет недоступной («невидимой»). • Переменные, содержащие координаты верхнего левого и правого нижних углов текущего окна: WindMin;WindMax: word. • Процедура очистки экрана (окна): Clrscr. После очистки курсор устанавливается в точку с координатами (1, 1). • Процедура установки курсора в позицию с координатами (x, y): GotoXY(x, y), x, y: word. • Функции определения текущих координат курсора: WhereX; WhereY: word. • Управление цветом: а) установка цвета фона: TextBackGround(цвет); б) установка цвета символов: TextColor(цвет). Цвет – константа, задающая цвет. Можно использовать имя константы или ее значение. 3.3. Оператор присваивания Формат: < переменная >: = < выражение>; Необходимо следить за соответствием типов переменной и выражения. В идеале все должно совпадать. Исключение: Real: = Integer. Кроме вычислений оператор присваивания можно использовать для ввода значений переменных: а: = 2.5; Оператор позволяет заменить текущее значение переменной новым значением, вычисленным на базе текущего значения: X: = x + 3 – это свойство оператора присваивания используется при накоплении суммы, произведения и количества. 3.4. Оператор перехода. Составной оператор Формат оператора перехода: Goto < метка >; < метка > – любой идентификатор или целое число без знака. Метка должна быть описана в разделе описаний и должна встречаться в программе. Метка располагается перед помечаемым оператором и отделяется от него двоеточием. Можно использовать несколько меток перед оператором. Пример: ………………………. Label Loop lb1, lb2; {описание меток} Begin ………………………. Goto lb1; ………………………. Loop: < оператор >; {указана метка} ………………………. Lb1: lb2: < оператор >; {указаны метки} ………………………. Goto lb2; ………………………. Составной оператор – это последовательность любых операторов, заключенных в операторные скобки. Операторные скобки – зарезервированные слова Begin…end. Операторы в составном операторе разделяются ; . Формат: Begin < оператор 1>; < оператор 2 >; ………………. < оператор N >; End; 3.5. Условные операторы Существует два типа условных операторов: • оператор if…then…else предусмотрен для случаев, когда требуется выбрать одну из двух возможностей; • оператор case позволяет выбирать из любого числа возможностей. 3.5.1. Условный оператор Формат: If < условие > Then < оператор 1 > [ Else < оператор 2 >]; < условие > – логическое выражение типа Boolean. Выполнение: если условие имеет значение true, то выполняется оператор 1 и далее осуществляется переход на следующий оператор программы; если имеет значение false, то выполняется оператор 2 и далее осуществляется переход на следующий оператор программы. Пример 1: определить принадлежность точки с координатами (x, y) заштрихованной области. y 3 -9 9 x -3 Program oblast; Uses crt; Var X,y: real; Begin Clrscr; Writeln (‘введите x и y’); Readln (x, y); If (x<=9) and (x>=-9) and (y<=3) and (y>=1/3*x) Then Writeln (‘точка (‘, x, ’;’ , y, ’) принадлежит области’) Else Writeln (‘точка (‘, x, ’;’ , y, ’) не принадлежит области’); End. Пример 2: из заданных трех чисел найти максимальное. Program max; Uses crt; Var X, y, z, max: real; Begin Clrscr; Writeln (‘введите x, y, z’); Readln (x, y, z); writeln (‘x=’, x); If (xz) then max: = y else if x>z then max: = x else max: = z; writeln (‘max = ’, max : 8 : 2); end. 3.5.2.Оператор выбора Оператор варианта (выбора) позволяет выполнить один из нескольких операторов в зависимости от значения некоторого выражения, называемого селектором. Формат: Case < ключ (селектор) > of < метка 1 >: < оператор 1 >; < метка 2 >: < оператор 2 >; …………………………………. < метка n >: < оператор n >; [else < оператор >;] end; Сначала вычисляется значение выражения < ключ >, а затем в последовательности операторов отыскивается такой, которому предшествует константа, равная вычисленному значению. Найденный оператор выполняется, после чего оператор выбора завершает свою работу. Если в списке выбора не будет найдена константа, соответствующая вычисленному значению ключа, управление передается оператору, стоящему после слова else. Пример 1 ………………….. case nomer of 2: y: = g; 4: y: = g * x; 6: y: = g * sqrt(abs(x)); 8: y: = g * exp(x) + h; 10 .. 12: y: = g * sqr(sin(x) + h); end; Пример 2 Program otvet; Var Ch: char; Begin Readln(ch); Case ch of ‘n’, ‘N’: writeln(‘нет’); ‘y’, ‘Y’: writeln(‘да’); end; end. 3.6. Операторы организации циклов В ТР существуют следующие циклические структуры: • с предусловием «Пока»; • с постусловием «До»; • с заданным (определенным параметром). Для организации цикла предусмотрены следующие правила: • параметру цикла присвоить начальное значение; • наличие тела цикла; • условие завершения или продолжения цикла; • изменение параметра цикла; • возможность управлять циклом. Параметр цикла – это переменная, изменяющаяся в цикле. Тело цикла – основная часть. 3.6.1. Оператор цикла с предусловием Формат: While < условие > Do < оператор >; < оператор > – простой или структурированный оператор; < условие > – условие продолжение цикла (любое логическое выражение). Если условие истинно (True), то выполняется < оператор >, иначе оператор While прекращает работу и управление передается дальше по программе. Пример 1. Вычислить y = , x с [xn, xk] с шагом h. Program Tabul; Var Xn, xk, h, a, x, y: real; Begin Writeln (‘xn, xk, h, a’); {ввод исходных данных} Readln (xn, xk, h, a); X: = xn; {параметру цикла присваивается начальное значение} While x<=xk do {условие продолжения цикла} Begin Y: = a*a*a / (a*a + x*x); Writeln (x, y); X: = x + h; {изменение параметра цикла с шагом h} End; End. Пример 2. Даны числа a, b (a > 1) и надо вычислить все члены последовательности a1, a2 , a3 , ………… и их количество, которые меньше b. Program stepeni; Var A, b, c: real; Kol: integer; Begin Writeln (‘a, b’); readln (a,b); c: = a; kol: = 1; while c < b do begin writeln (c); c:= c*a; kol: = kol + 1; end; writeln (‘их количество = ’, kol); end. 3.6.2. Оператор цикла с постусловием Формат: Repeat < тело цикла > Until < условие >; < тело цикла > – последовательность любых операторов; < условие > – условие завершения цикла (любое логическое выражение). Тело цикла выполняется до тех пор, пока условие не примет значение True. Пример 1. Вывести на печать значения переменной у до тех пор, пока не попадется значение больше 20. Program post; Var Y, I: integer; Begin I: = 1; Repeat Y: = random (i); Writeln (‘y = ’, y); I: = I + 2; Until y > 20; End. 3.6.3. Оператор цикла с известным числом повторений Формат: For < переменная >: = < нз > {to/downto} < кз > do < оператор >; < переменная > – параметр цикла, переменная порядкового типа; < нз > – начальное значение параметра; < кз > – конечное значение параметра; < оператор > – любой оператор ТР. Шаг изменения параметра равен 1 (to) или –1 (downto). Пример 1. Вычислить и вывести на печать значения функции у = , при х [0, 3] с шагом 0.2. Program tab; Var Xn, xk, h, x, y: real; I, n: integer; Begin Write (‘xn, xk, h’); Readln (xn, xk, h); N: = trunc ((xk – xn) / h) + 1; {вычисляется количество повторений} X: = xn; For I: = 1 to n do Begin Y: = sqrt (x + 1) / (2 + x * x); Writeln (‘x = ’ , x : 4 : 1, ‘y = ’ , y : 6 : 2); X: = x + h; End; End. Пример 2. Найти произведение отрицательных целых чисел от –1 до заданного N (N < 0). Program sum; Var I, n: integer; P: longint; Begin Writeln (‘введите n < 0’); Readln (n); P: = 1; For I: = -1 downto n do P: = p * 1; Writeln (‘произведение = ’, p : 8 ); End. 3.6.4. Вложенные циклы При организации вложенных циклических структур необходимо обращать внимание на следующие правила: 1. Параметры циклов должны быть различны; 2. Вложенный цикл целиком находится в теле внешнего цикла (первым закрывается вложенный цикл); 3. Уровень вложенности не ограничен; 4. Параметр вложенного цикла изменяется быстрее. 4. Обработка массивов 4.1. Описание массива Массив – упорядоченная совокупность однотипных элементов. К любому элементу массива обеспечивается доступ указанием его порядкового номера. Основные характеристики массива: имя, размер, размерность, тип элементов. Пример: Х (10) – состоит из 10 элементов: x [1], x [2], …….., x [10]. Размер массива – 10, размерность – 1. A (10, 20) – состоит из 200 элементов (10 строк и 20 столбцов). Размер массива – 200, размерность – 2. Существует два способа описания массива: 1. С предварительным описанием типа: Type < имя типа > = array [< список индексных типов >] of < тип >; var < переменная >: < имя типа >; < имя типа > – правильный идентификатор; array, of – зарезервированные слова; < список индексных типов > – один или несколько индексных типов, разделенных запятыми; < тип > – любой тип TP. В качестве индексных типов в ТР можно использовать любые порядковые типы (целый, логический, символьный, перечисляемый, тип-диапазон), кроме Longint и типов-диапазонов с базовым типом Longint. Пример: Type Digit = array [0 .. 9] of char; ……………………………. Var D: digit; ………………………….. begin d [2]: = ‘!’ {второй элемент массива d} 2. Определить переменную как массив можно и непосредственно при описании этой переменной, без предварительного описания типа массива: Var < переменная >: array [< список индексных типов >] of < тип >; Пример: Var A, b: array [1 .. 10 ] of real; …………………………… begin b [9]: = 16.2; {девятый элемент массива b} Обычно в качестве индексного типа используется тип-диапазон. Так как < тип >, идущий за словом Of – любой тип ТР, то он может и быть, в частности, и другим массивом. Пример 1: Type Mat = array [0 .. 5] of array [-2 .. 2] of array [char] of integer; Пример 2: Var A: array [1 .. 2, 1 .. 2] of integer; ………………………………… begin a [1, 1]: = 1; a [2, 1]: = 2; a [1, 2]: = 3; a [2, 2]: = 4; Элементы массива в памяти ПК следуют друг за другом так, что наиболее быстро меняется самый правый индекс массива, т.е. по примеру 2 в памяти последовательно будут расположены значения 1, 3, 2, 4. Максимально занимает объем в памяти 64 Кбайта. В ТР можно одним оператором присваивания передать все значения элементов одного массива другому массиву того эквивалентного типа. 4.2. Ввод – вывод массива Для ввода элементов массива существует два способа: • ввод с клавиатуры: For I: = 1 to 10 do Begin Write (‘введите х [’ , I : 2, ‘ ] = ‘); Readln (x [i]); End; • задание элементов с помощью датчика случайных чисел на интервале [a, b]: (b - a) * random + a – вещественное число; Trunc ((b – a + 1) * random + a) – целое число. Целые числа в диапазоне [-100, 100]: for I: = 1 to n do x [i]: = trunc (201 * random – 100); Для двумерного массива: • ввод с клавиатуры; • ввод с помощью датчика случайных чисел. for I: = 1 to n do for j: = 1 to k do x [I, j]: = (b - a) * random + a; Вывод элементов массива: Пример 1: Writeln (‘массив х’); For I: = 1 to n do Write (x [i] : 3); {вывод элементов в строку} Writeln; {перевод курсора в следующую строку} Пример 2: Writeln (‘Матрица х’); For I: = 1 to n do Begin For j: = 1 to k do Write (x [I, j] : 8 : 2); Writeln; End; Writeln; End. 4.3. Типовая задача нахождения суммы, количества и произведения элементов массива Пример. В одномерном массиве а(25), элементы которого лежат в диапазоне [-16, 8] подсчитать произведение элементов кратных 3, среднее арифметическое положительных элементов. Program massiv; Uses srt; Const n = 25; Var a : array [1 .. n] of real; P, sum, sa : real; I, k: integer; Begin Clrscr; For I: = 1 to n do Begin A[i]: = -16 + 24 * random; Write (a[i] : 6 : 2); End; Writeln; P: = 1; For I : = 1 to n do If Trunc(a[i]) mod 3 = 0 then p: = p * a[i]; Writeln (‘произведение p = ’ , p : 10 : 2); Sum: = 0; k: = 0; For I: = 1 to n do If a[i] > 0 then Begin Sum: = sum + a[i]; K: = k + 1; End; Sa: = sum / k; Writeln (‘среднее арифметическое sa = ’ , sa : 8 :2); End. 4.4. Нахождение максимального и минимального значений массива 1. В качестве начального значения переменной max (при поиске максимального элемента) присваивается заведомо малое число, например max = -1e + 10, а в качестве начального значения переменной min (при поиске минимального элемента) присваивается заведомо большое число, например min = 10E10. 2. Иначе начальным значением в том и в другом случаях принимается первый элемент массива, удовлетворяющий условиям поиска. Пример: В одномерном массиве а(25) найти максимальный элемент и его порядковый номер. ………………….. мах: = a[1]; nmax = 1; for I: = 1 to n do if a[i] > max then begin max: = a[i]; nmax: = I; end; writeln (‘max элемент = ’ , max : 6 : 2); writeln (‘его номер = ’ , nmax : 2); end. 4.5. Формирование нового массива из заданного Пример: из заданного массива а(20) сформировать массив z, в который переписать по порядку элементы массива а, которые удовлетворяют условию < 5. Program novmass; Uses crt; Const n = 20; Type Mass = array[1 .. n] of integer; Var A, z: mass; I, k: integer; Begin Clrscr; Writeln (‘исходный массив’); For I: = 1 to n do Begin A[i]: = round (-20 + 40 * random); {элементы в диапазоне [-20, 20]} Write (a[i] : 4); End; Writeln; K: = 0; For I: = 1 to n do If abs (a[i]) < 5 then Begin K: = k + 1; Z[k]: = a[i]; End; Writeln (‘новый массив’); For I: = 1 to k do Write (z[i] : 4); Writeln; End. 4.6. Сортировка элементов массива методом обмена «пузырька» Задача сортировки массива заключается в том, чтобы переставить элементы массива таким образом, чтобы после перестановки они были упорядочены по возрастанию или убыванию. A1 < = A2 < = A3 < = …. < = An (по возрастанию) A1 > = A2 > = A3 > = …. > = Аn (по убыванию) Количество итераций для сортировки n – 1. Пример: сортировка массива А(12) по убыванию. Program obmen; Uses crt; Const n = 12; Var A: array[1 .. n] of real; I, k: integer; C: real; Begin Clrscr; Writeln (‘исходный массив’); For I: = 1 to n do Begin A [i]: = -70 + random (80); Write (a[i] : 6 : 2); End; Writeln; For k: = 1 to n – 1 do {к – номер итерации} For I: = 1 to n – 1 do If a[i] < a[I + 1] then {сравниваются два соседних элемента} Begin C: = a[i]; a[i]: = a[I + 1]; a[I + 1]: = c; {перестановка элементов} End; Writeln (‘отсортированный массив’); For I: = 1 to n do Write (a[i] : 6 : 2); Writeln; End. 4.7. Обработка двумерных массивов Пример 1. Задан двумерный массив В(n, m). Найти сумму элементов каждого четного столбца. Program matriza; Uses crt; Const n = 4; m = 7; Var b: array [1 .. n, 1.. m] of integer; I, j, s: integer; Begin Clrscr; Writeln (‘исходная матрица’); For I: = 1 to n do Begin For j: = 1 to m do Begin B[I, j]: = random (99); Write (b[I, j] : 4); End; Writeln; End; Writeln (‘сумма в четных столбцах’); J: = 2; {j – номер столбца} Repeat S: = 0; For I: = 1 to n do S: = s + b[I, j]; Writeln (s : 6); {выводится сумма для каждого четного столбца} J: = j + 2; {изменяется номер столбца} Until j > m; End. 5. Обработка данных символьного и строкового типов 5.1. Символьный тип (Char) Тип данных Char обозначает множество символов кода ASCII. Один символ требует для своего представления 1 байт. Константы такого типа заключаются в апострофы (‘c’ ‘a’ ‘!’). Таблица ? Стандартные функции для типа char Функция Тип аргумента Тип результата Действие Ord (x) Char Byte Номер символа х в кодовой таблице Chr (x) Byte Char Символ из кодовой таблицы с номером х Upcase (x) Char Char Заменяет на большую букву (только латинские) Pred (x) Char Char Символ, предшествующий в кодовой таблице символу х Succ (x) Char Char Символ, следующий в кодовой таблице за символом х При отсутствии предыдущего или последующего символов значения функций Pred и Succ не определены. Пример 1: Ord (‘a’) = 97 ord (‘5’) = 53 Chr (63) = ‘?’ chr (97) = ‘a’ Пример 2: Var Y, x: char; ………………. X: = ‘b’; Y: = pred (x); Вместо самого символа в функциях ord, pred и succ можно указывать его код (порядковый номер) с предшествующим знаком #. Пример: Pred (‘b’) => ‘a’ аналогично записи Pred (#66) => ‘a’. Над данными типа Char можно выполнять только 2 операции: • присваивание; • сравнение (сравниваются не символы, а их коды). Пример: Var X, y, z: char; …………….. begin x: = ‘a’; y: = ‘b’; z: = ‘a’; Можно создавать одномерные массивы, состоящие из элементов символьного типа. Если в качестве индекса символьного массива используется ограниченный целый тип и нижняя граница равна 1, то такие массивы называются строками. Пример: Var S: array [1 .. 11] of char; ………………………… begin s: = ‘Наша строка’; 5.2. Строковые типы (string) Для обработки последовательностей символов в среде ТР введено понятие строки символов и соответствующий тип – строка. Он во многом похож на одномерный массив символов Array [0 .. n] of char, Однако, в отличие от него количество символов в строке может меняться от 0 до N, где N – максимальное количество символов в строке. Значение N определяется объявлением типа string [n] и может быть любой константой порядкового типа, но не более 255. Если N – не указано, то длина строки принимается максимально возможной, т. е. N = 255. Пример 1: Type L1 = string [60]; Name = string [20]; Var A: L1; {А – строка с максимальной длиной 60 символов} B, c: name; Пример 2: Const n = 10; Var Gr: string [10]; Fi: string; {строка с максимальной длиной 255 символов} St: string [n]; К любому символу в строке можно обратиться точно так же, как к элементу одномерного массива: gr [1]: = ‘b’. Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки, поэтому строка занимает в памяти n + 1 байт, где n – это количество символов в строке. Стандартные функции обработки строк 1. Length (st) – дает длину строки st. Результатом является целая величина. 2. Функция сцепления (конкатенации). «+» или concat (st1, [, st2, …, stk]) – возвращает сроку, представляющую собой сцепление строк st1, st2, …, stk. Если длина сцепленной строки превысит максимально допустимую длину строки, то «лишние» символы отбрасываются. Пример: St: = concat (‘12’, ‘345’); {строка st содержит ‘12345’} St: = ‘12’ + ‘345’ 3. Функция Copy (st, p, n)- копирует фрагмент некоторой строки в другую строку. St – строка; p, n – выражения целого типа. Выполнение: из строки st, начиная с позиции p, копируется n символов. Если p > length (st), то копируется 0 символов. Если p + n > length (st), то из строки st копируются лишь имеющиеся символы. Пример: St1: = copy (‘Аэрофлот’, 5, 4); {st1 содержит ‘флот’} 4. Процедура delete (st, p, n) – удаляет фрагменты из строки. Выполнение: в строке st, начиная с позиции p, удаляется n символов. Пример: St: = ‘Аэрофлот’; Delete (St, 1, 4); {строка st содержит ‘флот’} 5. Процедура Insert (st, s, p) – вставляет строку st в строку s, начиная с позиции p. Если p > длины, то фрагмент будет дописан к строке. Если длина новой строки > ранее объявленной, то «лишние» символы отбрасываются. Пример: S: = ‘345’; Insert (‘-’, s, 2); {строка s содержит ‘3 - 45’} 6. Функция pos (s1, st) – отыскивает в строке st первое вхождение строки s1 и возвращает номер позиции этого вхождения. Если строка s1 в строке st не найдена, то результат равен 0. Пример: K: = pos (‘ф’, ‘флот’); {k: = 1 - целое} 7. Процедура Str (x, st) – преобразует число х в строку символов st. Пример: Str (3.14, st); {строка st содержит ‘3.14’} 8. Процедура Val (st, x, code) – преобразует строку символов st, состоящую из цифр в некоторое числовое значение, которое присваивается переменной х. Если нет ошибок, то Code = 0, иначе Code принимает значение, равное номеру ошибочного символа. Ведущие пробелы в строке st должны отсутствовать. Пример: St: = ‘-128.43’ Val (st, x, c); {x = -128.43} 9. Операции отношения: <, >, >=, <=, =, <> выполняются над двумя строками посимвольно, слева направо с учетом кодировки символов. Пример 1. Распечатать символы с кодами (номерами в кодовой таблице) от 1 до 255. Program s1; Uses crt; Var S: char; I: integer; Begin Clrscr; For I: = 1 to 255 do Begin S: = chr (i); Write (‘nom = ’ , I : 2, ‘sim = ’, s : 2, ‘ ’); End; End. Пример 2. Подсчитать количество вхождений какой-либо буквы в заданной строке. Program s2; Uses crt; Var S: string; A: char; I, k: integer; Begin Clrscr; Writeln (‘введите строку’); Readln (s); Writeln (‘введите букву’); Readln (a); K: = 0; For I: = 1 to length (s) do If copy (s, I, 1) = a then k:= k + 1; Writeln (‘в тексте’ , k : 2, ‘ букв’ , a); End. Пример 3. Подсчитать сумму цифр заданного числа. Program s3; Uses crt; Var S: string; N: longint; I, sum, c: integer; Begin Clrscr; Writeln (‘введите число’); Readln (n); Str (n, s); {число преобразуется в строку S} Sum: = 0; For I: = 1 to length (s) do Begin Val (s [i], m, c); {символ строки S преобразуется в число} Sum: = sum + m; End; Writeln (‘сумма = ’ , sum : 3); End. Пример 4. Удалить из строки все ведомые пробелы. Program s4; Uses crt; Var St: string [10]; I: word; Begin Clrscr; Writeln (‘введите строку’); Readln (st); I: = 10; While (st [i] = ‘ ’) and (I <> 0) do Begin Dec (i); {уменьшает I на единицу} St [0]: = chr (i); End; Writeln (‘строка без ведомых пробелов’ , st); End. Пример 5. Выделение слов из текста. Просматривая каждый символ текста и, проверяя, является ли он буквой. Если буква, то слово еще не закончилось и мы наращиваем значение переменной, обозначающей длину слова. Если символ – пробел, это значит слово закончилось и наращивается значение счетчика слов. X – текст (string) D – длина текста (byte) P – длина отдельного слова (byte) I – текущий номер символа в тексте S – один текущий символ текста S1 = Ord (S) (byte) – код символа V – слово в тексте K – счетчик слов Program s5; Uses crt; Var X: string [255]; D, p: byte; Begin Clrscr; D: = length (x); P: = 0; k: = 0; For I: = 1 to d do S: = copy (x, I, 1); {I-й символ текста} S1 : = ord (s) {код символа} If (s1>= 128) and (s1<= 175) or (s1>= 224) and (s1<= 239) or (s1 = 240) or (s1 = 241) then p: = p + 1 else k:= k + 1; v: = copy (x, I - p, p); {выделение слов из текста} writeln (v); {вывод слова на экран} p: = 0; End; End. 6. Множества (set) и записи (record) 6.1. Множества Множества – это наборы однотипных логически связанных объектов. Количество элементов, входящих в множество, меняется в пределах от 0 до 256. Описание типа множество: < имя типа > = Set of < базовый тип >, где < базовый тип > – это любой порядковый тип, кроме Word, Integer, Longint. Пример: Type digchar = set of ‘0’ … ‘9’; Dig = set of 0 .. 9; Var S1, s2, s3: digchar; {множества могут содержать символы от ‘0’ до ‘9’} S4, s5, s6: dig; {могут содержать числа от 0 до 9} Для ввода (задания) множества используется так называемый конструктор множества: список элементов множества через запятую; список обрамляется квадратными скобками. Пример: S1: = [‘1’, ‘2’, ‘3’ ]; S2: = [‘3’, ‘2’, ‘1’]; S3: = [‘2’, ‘3’]; S4: = [0 .. 3, 6]; S5: = [4, 3 + 2]; S6: = [3 .. 9]; Над множествами определены следующие операции: * – пересечение множеств (s4*s6 содержит [3,6], s4*s5 – пустое множество); + – объединение множеств (s4+s5 содержит [0, 1, 2, 3, 4, 5, 6]); - – разность множеств (элементы первого, которые не принадлежат второму, s6-s5 содержит [3, 6, 7, 8, 9]); = – проверка эквивалентности (true, если А = В); <> – проверка неэквивалентности (true, если A <> B); <= – проверка вхождения (true, если A <= B); >= – проверка вхождения (true, если A >= B); IN – проверка принадлежности. Первый элемент – выражение, второй – множество, оба одного типа (9 in S6 – результат True). Приоритет операций: 1. * 2. +, - 3. in, =, <>, >=, <= 6.2. Записи Записи удобны при обработке взаимосвязанных (по смыслу) разнородных данных. Широкое распространение получило табличное представление данных. Запись – комбинация фиксированного числа объектов (компонентов) разного типа, объединенных в упорядоченное множество. Структура записи: Поле 1 Поле 2 ……………….. Поле n Составляющие запись объекты (компоненты) называются полями. Любое поле имеет свое имя. Формат: Type < имя типа > = record < Поле 1 >: < тип >; < поле 2 >: < тип >; …………………..; < поле n >: < тип >; end; var < переменная >: < имя типа>; < имя массива >: array [1 .. 100] of < имя типа >; {массив записей} Пример: Type prym = record H, w: real; End; Var Pr: prym; Для обработки доступна как вся запись целиком, так и ее отдельные поля. При обращении к отдельным полям указывается имя всей записи и имя отдельного поля, а между ними «точка» (составное имя: запись. поле). Пример: Pr. H : = 6.5 ; readln (Pr. W); writeln (Pr. H, Pr. W); Для сложных (вложенных) значений, т.е. когда поле является, в свою очередь, тоже записью, приходится дополнять составное имя. Пример 1: Var C: record Name: record {поле является записью} F: string; I: string; O: string; End; Year: word; End; Пример 2. Создать массив записей о студентах. Запись содержит следующую информацию: фамилию (Fam), имя (Im), отчество (Ot), год рождения (God), специальность (Spec) и размер стипендии (Stip). Program zap; Uses crt; Type z: = record Fam: string [20]; Im: string [15]; Ot: string [15]; God: integer; Spec: string [10]; Stip: real; End; Var M: array [1 .. 5] of z; I: integer; Begin {ввод записей} For I: = 1 to 5 do Begin Write (‘введите фамилию’); Readln (m [i]. Fam); Write (‘введите имя’); Readln (m [i]. Im); Write (‘введите отчество’); Readln (m [i]. Ot); Write (‘введите год рождения’); Readln (m [i]. God); Write (‘введите специальность’); Readln (m [i]. Spec); Write (‘введите размер стипендии’); Readln (m [i]. Stip); end; {печать массива записей} for I: = 1 to 5 do begin write (‘запись N’, I : 3); writeln (m [i]. Fam, m [i]. Im, m [i]. Ot, m [i]. God, m [i]. Spec, m [i]. Stip); end; Чтобы упростить доступ к полям записи при неоднократном обращении к одной и той же записи, используется оператор присоединения With. Этот оператор позволяет использовать вместо составных имен непосредственно имена полей. Формат: With < запись > do Begin < операторы обработки полей > end; Пример: {ввод записей} for I: = 1 to 5 do with m [i] do begin write (‘фамилия’); readln (fam); write (‘имя’); readln (im); write (‘отчество’); readln (ot); write (‘год рождения’); readln (god); write (‘специальность’); readln (spec); write (‘размер стипендии’); readln (stip); end; Рассмотрим следующие задачи: 1. Найти количество студентов группы ВТ. 2. Найти сумму стипендий всех студентов. 3. Распечатать фамилии студентов с годом рождения не ранее 1976. 4. Распечатать всю информацию о студенте с максимальной стипендией. 5. Отсортировать записи в алфавитном порядке фамилий. 6. Отсортировать записи по размеру стипендии. 1. {Найти количество студентов группы ВТ} k: = 0; for I: = 1 to 5 do if m [i].spec = ‘ВТ’ then k: = k + 1; writeln (‘количество….’, k : 5); 2. {общая сумма стипендии} s: = 0; for I: = 1 to 5 do s: = s + m [i].stip; writeln (‘общая s’, s : 10 : 2); 3. {Фамилии студентов, родившихся не ранее 1976 года} writeln (‘фамилии студентов, родившихся не ранее 1976 года’); for I: = 1 to 5 do if m [i].god >= 1976 then writeln (m [i].fam); 4. {Информация о студенте с максимальной стипендией} max: = m [1].stip; n: =1; for I: = 2 to 5 do if m [i].stip > max then begin max: = m [i].stip; n: = I; end. 5. {Отсортировать информацию в алфавитном порядке фамилий} for l: = 1 to 4 do for I: = 1 to 5 do if m [i].fam > m [I + 1].fam then begin {перестановка записей целиком} p: = m [i]; {переменная p - запись} m [i]: = m [I + 1]; m [I + 1]: = p; end; writeln (‘отсортированные записи’); for I: = 1 to 5 do begin write (m [i].fam); end; 6. Аналогично П.5, изменится только условие: m [i].stip < m [I + 1].stip. 6.3. Записи с вариантами Вариантная часть содержит несколько альтернатив, в каждой из которых в круглых скобках задается список полей, присущих данному варианту. Списку предшествует метка, являющаяся конкретным значением поля, которое является критерием выбора вариантов. Пример: Type Person = record Surname, name, adress: string [20]; Past + index: string [6]; Telephone: string [12]; Case hobby: (computer, music) of {вариантное поле} Computer: (type_computer: string [20]; mbute: byte); Music: (instrument: array [1 .. 3] of string [10]); End; Начало вариантной части отмечается служебным словом Сase. Вариантная часть может быть только одна и задается в конце записи. 7. Файлы 7.1. Типы файлов Рассмотренные ранее типы данных не обеспечивают сохранность вводимой информации и полученных результатов для последующего использования их другими программами или этой же программой в другом сеансе работы. Для сохранения информации в языке ТР существует возможность определять файловый тип. Любой файл имеет три характерные особенности: 1. У него есть имя – программа может работать одновременно с несколькими файлами. 2. Он содержит компоненты одного типа (любой тип, кроме файлового). 3. Длина вновь создаваемого файла никак не оговаривается и ограничивается только емкостью устройств внешней памяти. В зависимости от способа объявления выделяются три вида файлов: 1. Типизированные (file of < тип >); 2. Текстовые (text); 3. Нетипизированные (file). С каждой переменной файлового типа связано понятие текущего указателя файла. Текущий указатель можно принимать как скрытую переменную (неявно описанную вместе с файловой переменной), которая обозначает (указывает на) конкретный элемент файла. Пример: описание переменной вида Var f: file of integer; понимается как список любого количества целых чисел, расположенных на некотором ВЗУ (например, МД). Как правило, все действия с файлом (чтение, запись) производятся поэлементно, причем в этих действиях участвует элемент файла, который обозначается текущим указателем файла. Все элементы типизированного файла считаются пронумерованными; начальный элемент имеет нулевой номер. Заметим, что один и тот же внешний файл в различных программах или даже в различных частях программы может интерпретироваться по разному, например, как последовательность целых чисел или как последовательность символов, или как последовательность некоторых записей и т. д. 7.1.1. Установочные и завершающие операции В эту группу входят четыре операции, реализованные в виде стандартных процедур: Assign, Reset, Rewrite, Flush, Close. Рассмотрим эти операции: 1. Assign (< ф.п. >, < имя файла или л.у. >); < ф.п. > – файловая переменная (идентификатор); < имя файла или л.у. > – текстовое выражение, содержащее имя файла или логическое устройство. Пример: Assign (f, ‘d: \mydir\myfile.dat’); Процедура предназначена для установки связи между конкретным физическим файлом на магнитном носителе и переменной файлового типа, которая будет являться представителем этого файла в программе. 2. Reset (< ф.п. >); Rewrite (< ф.п. >); < ф.п. > – файловая переменная, связанная ранее процедурой Assign с уже существующим файлом или логическим устройством. Процедуры предназначены для открытия файлов. Под открытием понимается поиск файла на внешнем носителе, образование специальных системных буферов для обмена с ним и установка текущего указателя файла на его начало (т.е. на нулевой элемент). Разница между этими двумя процедурами заключается в начальных действиях с файлами. Процедура Reset предполагает, что инициируемый файл уже есть, в противном случае возникает ошибка. Процедура Rewrite допускает, что открываемый файл может еще не существовать; в этом случае она создает заданный файл. Если же файл существует, то Rewrite очищает его. 3. Flush (< ф.п. >); Используется для завершения обменов с файлами без его закрытия. Очищает внутренний буфер файла и, таким образом, гарантирует сохранность всех последних изменений файла на диске. Процедура игнорируется, если файл был инициирован для чтения процедурой Reset. Эта процедура имеет смысл, если с файлом проводились операции записи, и используется редко, т. к. процедура Close производит такие же действия. 4. Close (< ф.п. >); Завершает действия с файлом, который указывается в качестве параметра. При этом ликвидируются внутренние буфера, образованные при открытии этого файла. После этого файловую переменную можно связать посредством процедуры Assign с каким-либо другим дисковым файлом. 7.1.2. Операции ввода-вывода В эту группу входят две операции (процедуры), которые собственно, и реализуют действия по чтению информации из файла и записи информации в файл. 1. Read (< ф.п.>, < список ввода >); Данная процедура предназначена для чтения значений из файла в оперативную память. < ф.п. > – имя файловой переменной, к которой была применена одна из операций открытия (Reset или Rewrite); < список ввода > – список переменных, в которые будут помещены читаемые из файла значения. Тип этих переменных должен совпадать с типом компонентов файла. Выполнение процедуры Read происходит следующим образом. Начиная с текущей позиции указателя файла будут последовательно читаться значения, содержащиеся в файле. Каждое прочитанное значение будет присваиваться очередной переменной из списка ввода. После каждого акта чтения указатель файла смещается на следующую позицию. Если в процессе выполнения процедуры Read текущий указатель файла будет установлен на позицию, не содержащую информации, т. е. будет достигнут конец файла, то чтение будет прекращено, процедура Read завершается и возникает ситуация «конец файла». Возникновение этой ситуации можно проверить с помощью внутренней функции (Eof). 2. Write (< ф.п. >, < список вывода >); Данная процедура позволяет записывать в файл информацию из программы. Значение очередного выражения из списка вывода помещается в файл в место, отмеченное текущим указателем. После этого текущий указатель будет продвинут на одну позицию и действия повторятся для следующего выражения из списка вывода. 3. Eof (< ф.п. >); Логическая функция (boolean), тестирующая конец файла. Возвращает True, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении – файл исчерпан. 7.1.3. Специальные операции К ним относятся: Erase, Rename, Chdir, Mkdir, Rmdir, Getdir, IOResult. Данная группа операций предназначена для действий с элементами файловой системы – каталогами и файлами. 1. Rename (< ф.п. >, < новое имя >); < новое имя > – строковое выражение. Переименовывает файл. Перед выполнением процедуры необходимо закрыть файл процедурой Close. 2. Erase (< ф.п. >) – уничтожает файл. Перед выполнение процедуры файл необходимо закрыть. 3. Getdir (< устройство >, < каталог >); < устройство > – выражение типа Word, содержащее номер устройства (0 – устройство по умолчанию, 1 – диск А, 2 – диск В и т. д.); < каталог > – переменная типа String, в которой возвращается путь к текущему каталогу на указанном диске. Данная процедура позволяет определить имя текущего каталога. 4. Mkdir (< каталог >) – создает новый каталог < каталог > – выражение типа String, задающее путь к каталогу. Последним именем пути указывается имя создаваемого каталога. 5. Rmdir (< каталог >) – удаляет каталог. Удаляемый каталог должен быть пустым. 6. IOResult – функция, тип результата Word. Возвращает условный признак последней операции ввода-вывода. Если операция завершилась успешно, функция возвращает 0. Однако данная функция становится доступной только при отключенном автоконтроле ошибок ввода-вывода. Директива компилятора {$I -} отключает, а директива {$I + } включает автоконтроль. Если автоконтроль включен, то при обнаружении ошибки выполнение программы прекращается, а на экран выводится краткое сообщение, содержащее условный номер ошибки. Если автоконтроль отключен, то при обнаружении ошибки все последующие обращения к вводу-выводу блокируются, пока не будет вызвана функция IOResult. 7.2. Типизированные файлы Типизированные файлы – совокупность компонентов одинаковой длины и структуры. В конце файла – Eof. Нумерация компонентов с 0. Доступ к информации прямой и последовательный. Длина любого компонента типизированного файла строго постоянна, что дает возможность организовывать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру). 7.2.1. Операции перемещения по файлу Seek (< ф.п. >, < N компонента >) – смещает текущий указатель файла к требуемому компоненту. Truncate (< ф.п. >) – отсечение от файла его хвостовой части, начинающейся от текущей позиции указателя включительно. Filesize (< ф.п. >) – функция возвращает общее число компонентов в файле. Filepos (< ф.п. >) – функция возвращает номер компонента, на который установлен текущий указатель. Пример. Записать корни из чисел от 1 до 5 в файл. Затем эти значения считать из файла и распечатать. Program ops; Var R: real; I: integer; Bul: file of real; Begin Assign (bul, ‘c:\tp\bul.dat’); Rewrite (bul); {открытие файла, создание нового} For I: = 1 to 5 do Begin R: = sqrt (i); Write (bul, r); {запись в файл} End; Close (bul); {закрытие файла} Reset (bul); {открытие существующего файла} For I: = 1 to 5 do Begin Read (bul, r); {чтение из файла} Writeln (r : 6 : 2); {вывод на экран} End; End. 7.2.2. Добавление записи в файл …………………………………… assign (f, ‘dos - файл’); reset (f); {открыть существующий файл} seek (f, filesize (f)); {указатель в конце файла} write (‘введите запись s :’, ‘ ’ : 2); readln (s); {ввод с клавиатуры} write (f, s); {запись в файл} close (f); …………………………………….. 7.3. Текстовые файлы Текстовые файлы – это совокупность строк разной длины; в конце каждой строки размещается специальный признак (маркер) – Eoln (конец строки), а в конце файла – Eof (конец файла). Доступ к строкам последовательный. 7.3.1. Начальные и завершающие операции Assign - связывание файловой переменной с физическим файлом на МД Reset – для чтения из файла Rewrite – для записи в файл (полное обновление) Close – закрыть файл Append – открытие файла для добавления новых строк в конец существующего файла Settextbuf (var f: text; var buf) – процедура, определяющая буфер для обмена с текстовыми файлами. Буфер располагается в самой программе. 7.3.2. Операции ввода-вывода При записи информации в файл: Write (< ф.п. >, < список вывода >); Writeln (< ф.п. >, < список вывода >); Writeln (< ф.п. >); < список вывода > – список переменных (1 или несколько), значения которых будут записаны в файл. Writeln в отличие от write добавляет в файл маркер Eoln, т. е. переходит к следующей строке текстового файла. < список вывода > может содержать переменные следующих типов: char [: m] string [: m] integer [: m] real [: m : n] boolean [: m] m и n – необязательные квалификаторы (целого типа); они определяют каким образом значение переменной будет записано в файл. Для char: выводится символ, определяемый переменной; если используется квалификатор m > 1, то перед символом выводится (m – 1) пробел. Пример: Var a: char; ………………….. a: = ‘f’; {в файл запишется символ ‘f’} write (TF, a); write (TF, a : 3); {в файл запишется ‘ f’} Для string: выводится определяемая переменной; если используется квалификатор m > L (где L – длина строки), то перед символьной строкой будет выведено (m - L) пробелов. Пример: Var b: string …………………. B: = ‘крот’ Write (TF, b); Write (TF, b : 4); Write (TF, b : 8); Для integer: выводится числовая строка, соответствующая значению переменной (перевод числа в числовую строку - автоматически), если используется квалификатор m > L (L – длина числовой строки), то перед строкой будет выведено (m - L) пробелов. Пример: Var C: integer; ………………….. c: = 45; write (TF, c); write (TF, c : 5); Для real: в файл выводится числовая строка следующего формата: < Знак числа >. < мантисса > < знак порядка числа > < порядок числа> Если квалификатор M > 18, то числу предшествует (m - 18) пробелов; M = 18 – эталонная строка; М < 18 – выводится m символов, причем сначала отбрасывается начальный пробел, затем округляется мантисса (минимальное количество цифр в мантиссе равно 2). Если квалификатор типа : m : n, то число выводится в естественной форме с n дробными цифрами. Пример: Var X, y: real; …………………. X: = 23.5; y: = 23. 456789; Write (TF, x); Write (TF, y : 10); Write (TF, y : 6 : 2); Write (TF, y : 6 : 0); Для boolean: в файл выводится последовательность в виде true или false, определяемая значением переменной. Если квалификатор m > L (L – длина выражения), то сначала выводится (m - L) пробелов. При считывании информации из файла: Read (< ф.п. >, < список ввода >); Readln (< ф.п. >, < список ввода >); Readln (< ф.п. >); < список ввода> – список переменных (1 или несколько), которым будет присвоена информация, считанная из файла. Readln в отличие от read после считывания списка осуществляет переход к началу следующей строки файла (оставшаяся часть строки пропускается). Пустой readln пропускает текущую строку в файле. Пример: Readln (f, x1, x2, x3); Readln (f, x4, x5); Read (f); 7.3.3. Корректировка файла Для изменения какой-либо записи в файле необходимо открыть 2 файла: старый файл, подлежащий изменению, и новый файл, в котором создается обновленная версия. 7.4. Нетипизированные (блочные) файлы Нетипизированные файлы – совокупность компонентов одинаковой длины, но в отличие от типизированных файлов произвольной структуры. Совместимы с любыми другими файлами. Компонентами файла являются блоки (порции) данных определенного размера. По умолчанию длина блока 128 байт. С помощью нетипизированных файлов можно организовывать эффективные операции ввода-вывода при работе с внешними файлами, т.к. позволяет организовывать доступ к любым дисковым файлам, независимо от их структуры; используются «быстрые» дисковые операции ввода-вывода. 1. Объявление: Var < ф.п. >: file; 2. Связывание файловой переменной с физическим файлом на МД: Assign (< ф.п. >, < ‘спецификация файла ’>); 3. Открытие нетипизированного файла: Reset (< ф.п. >, N); Rewrite (< ф.п.>, N); N: word – определяет размер компонентов файлов (<= 65535 байт). Если N – отсутствует, то по умолчанию размер равен 128 байт. Для обеспечения максимальной скорости обмена размер элемента файла должен быть кратным размеру физического сектора (кластера) диска 512 байт, 1024 байт. Для того, чтобы обеспечить полное чтение всего файла, нужно установить размер элемента равным 1 (иначе будут присутствовать неполные блоки). 4. Обмен информацией: используются процедуры BlockRead (< ф.п. >; < буфер >; < n1 >;< n2 >); BlockWrite (< ф.п. >, < буфер >, < n2 >[ , < n2 >]); < ф.п. > – имя нетипизированного файла (файловая переменная); < буфер > – переменная, которая участвует в обмене данными; < n1 > – число записей, обрабатываемых за один вызов; < n2 > – число фактически обработанных записей. Если n2 < n1, то ошибка ввода – вывода. В обеих процедурах нужно следить за тем, чтобы размер переменной-буфера был равен < размер > * n1, где < размер > - размер элемента, указанный в процедурах reset или rewrite. Дополнительно допускается использование процедур и функций seek, filesize и filepos для организации доступа к любой записи нетипизированного файла. 5. Закрытие (close < ф.п. >); Пример. Копирование файла. Исходному соответствует файловая переменная Filein, копии соответствует файловая переменная Fileout. Program filecopy; Const Recsize = 512; {размер буфера обмена} Var Fileout, filein: file; Buf: array [1 .. recsize] of char; {буфер обмена} Numwritten, numread: word; {фактически записанные и фактически считанные} Begin Assign (filein, ‘c: inform.doc’); reset (filein, 1); assign (fileout, ‘c: inform1. doc’); rewrite (fileout, 1); repeat blockread (filein, buf, recsize, numread); blockwrite (fileout, buf, numread, numwritten); until (numread = 0) or (numwritten <> numread); writeln (‘копирование закончено’); close (filein); close (fileout); end. 8. Процедуры и функции (подпрограммы) Процедуры и функции представляют относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именами. Отличие функции от процедуры: результатом исполнения подпрограммы-функции является некоторое одно значение, присваиваемое имени подпрограммы-функции. Процедура используется в тех случаях, когда необходимо получить несколько результатов. Подпрограмма представляет собой инструмент, с помощью которого любая программа была бы разделена на ряд относительно независимых друг от друга частей. Каждая подпрограмма должна быть описана в разделе описаний основной программы или в разделе описания другой подпрограммы: т. е. необходимо указать заголовок подпрограммы и тело. В заголовке объявляется имя подпрограммы и формальные параметры. Тело имеет структуру обычной программы на языке ТР, т.е. состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания подпрограммы низшего уровня и т. д. Все переменные, описанные внутри подпрограммы, называются локальными для этой подпрограммы. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней переменные, но и сохраняется доступ ко всем именам верхнего уровня, т. е. подпрограмме доступны только те объекты, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к подпрограмме. Имена, локализованные в подпрограмме, могут совпадать с ранее объявленными глобальными именами. В этом случае локальное имя как бы «закрывает» глобальное и делает его недоступным. 8.1. Подпрограмма-процедура Описание (объявление процедуры): Procedure < имя > (g1: t1; g2: t2; … ; var gi: ti; …..); < раздел описаний локальных имен > begin < операторы > end; < имя > – имя процедуры; gi – имена формальных параметров; ti – типы формальных параметров (простой тип, либо ранее описанный). Сначала указываются параметры-значения. Параметры, являющиеся результатом вычислений в процедуре, записываются после слова Var (параметры-переменные). Обращение к процедуре: < имя > (b1, b2, …); < имя > – имя вызываемой процедуры; bi – фактические параметры, которые должны соответствовать формальным по количеству, типу и порядку следования. При описании процедур различают параметры-значения и параметры-переменные. Параметры-значения определяют исходные данные для работы подпрограммы. При обращении фактический параметр может быть любым выражением, результат вычисления которого по типу совпадает с типом соответствующего формального параметра. Таким образом, параметр-значение получает от фактического параметра его значения. Параметры-переменные определяют выходные данные процедуры, которые передаются в вызывающую программу. Записываются после слова Var. Параметры-переменные получают от соответствующих фактических параметров их адреса, т.е. как бы сливаются с ними (одна ячейка памяти имеет два имени: имя фактического параметра и имя формального параметра-переменной). Типом любого формального параметра может быть только стандартный или ранее объявленный тип. Поэтому нельзя объявить процедуру следующим образом: Procedure s (a: array [1 .. 10] of real); Если в подпрограмму передается весь массив, то следует предварительно описать его тип, например: Type Mas = array [1 .. 10] of real; ……………………………… procedure s (a: mas); ……………………………… Так как строка является своеобразным массивом, то передача в подпрограмму осуществляется аналогично: Type Stroca = string [15]; ……………………….. procedure st (s: stroca); ……………………….. 8.2. Подпрограмма-функция Описание (объявление функции): Function < имя > (g1: t1; g2: t2; …..): tф; < раздел описаний локальных имен > begin < операторы > < имя >: = < вычисляемое значение >; {имени подпрограммы-функции присваивается возвращаемый результат} end; gi – имена формальных параметров; ti – типы параметров (стандартный или ранее описанный); tф – тип возвращаемого значения. Обращение к функции осуществляется в правой части оператора присваивания, где указывается имя вызываемой функции и фактические параметры: < переменная >: = < имя > (b1, b2, ….); 8.3. Примеры использования процедур и функций Пример 1. В одномерных массивах a и b подсчитать сумму положительных элементов и количество отрицательных элементов. Program pp; Const Z = 100; Type indmax = 1 .. z; Mas = array [indmax] of real; Var Na, nb, I, ka, kb: integer; Sa, sb: real; A, b: mas; Procedure vvod (m: integer; var c: mas); {подпрограмма ввода и вывода массива} var J: integer; Begin For j: = 1 to m do Begin C [j]: = random * 100 – 40; Write (c [j] : 6 : 1, ‘ ’); End; Writeln; End; Procedure sum (c: mas; m: indmax; var s: real); { подпрограмма подсчета суммы положительных элементов} var j: integer; begin s: = 0; for j: = 1 to m do if c [j] > 0 then s: = s + c [j]; end; function kol (c: mas; m: indmax): integer; {функция подсчета количества отрицательных элементов} var k, j: integer; begin k: = 0; for j: = 1 to m do if c [j] < 0 then k: = k + 1; kol: = k; {возвращаемое значение присваивается имени функции} end; begin {основная программа} writeln (‘введите размер массива а’); readln (na); vvod (na, a); {вызов процедуры vvod} sum (a, na, sa); {вызов процедуры sum} writeln (‘сумма положительных элементов массива a = ’ , sa : 6 : 1); ka: = kol (a, na); {вызов функции kol} writeln (‘количество отрицательных элементов массива а = ’ , ka : 3); writeln (‘введите размер массива b’); readln (nb); vvod (nb, b); sum (b, nb, sb); writeln (‘сумма положительных элементов массива b = ’ , sb : 6 : 1); kb: = kol (b, nb); writeln (‘количество отрицательных элементов массива b = ’ , kb : 3); end. Пример 2. Вычислить Z = am , m – целое, а – вещественное по формуле: Z = am = , учитываем, что 1/am = (1/a)m Program stepen; Uses crt; Var A,z: real; M: integer; Procedure st (n: integer; x: real; var y: real); Var I: integer; Begin Y: = 1; For I: = 1 to n do Y: = y * x; End; Begin Clrscr; Write (‘введите a и m’); readln (a, m); If m = 0 then z: = 1 Else If m > 0 then st (m, a, z) Else st (m, 1/a, z); Writeln (‘z = ’ , z : 10 : 4); End. Пример 3. В матрице A(n, n) подсчитать в каждой строке количество отрицательных элементов. Program podprog; Uses crt; Const n = 10; Type Mass = array [1 .. n, 1 .. n] of real; Mass1 = array [1 .. n] of integer; Var I, j: integer; A: mass; K: mass1; Procedure kol (x: mass, m: integer, var y: mass1); Var I, j: integer; Begin For I: = 1 to m do Begin Y [i]: = 0; For j: = 1 to m do If x [I, j] < 0 then y [i]: = y [i] + 1; End; End; Begin {основная} Clrscr; For I: = 1 to n Begin For j: = 1 to n Begin A [I, j]: = -100 + random (200); Write (a [I, j] : 6 : 2); End; Writeln; End; Writeln; Kol (a, n, k); {вызов процедуры} For j: = 1 to n do Write (k [j] : 4); Writeln; End. Список литературы 1. Зуев Е. А. Язык программирования Turbo Pascal 6.0, 7.0. – М.: Веста, Радио и связь, 1993. – 384 с.: ил. 2. Фараонов В. В. Турбо Паскаль (в 3 книгах). Книга 1. Основы Турбо Паскаля. – М.: Учебно-инженерный центр “МВТУ – Фесто дидактик”, 1992. – 304 с.: ил. 3. Немнюгин С. А.. Turbo Pascal. – СПб.: Издательство “Питер”, 2000. – 496 с.: ил. 4. Turbo Pascal 7.0. – К.: Торгово-издательское бюро ВНV, 1996. – 448 с: ил. 5. Федоренко Ю. Алгоритмы и программы на Turbo Pascal. Учебный курс. – СПб: Питер, 2001. – 240 с.: ил. 6. Дональд Алкок. Язык Паскаль в иллюстрациях / Пер. с англ. А.Ю. Медникова: под ред. А.Б. Ходулева. – М.: Мир, 1991. – 192 c. 7. Давыдов В. Г. Программирование и основы алгоритмизации: Учеб. пособие для вузов. – М.: Высшая школа, 2003. – 448 с. 8. Орлов С. А. Технологии разработки программного обеспечения. Разработка сложных программных систем: Учеб. пособие для вузов. – 2-е изд. – СПб.: Питер, 2003. – 473 с. 9. Вычислительная техника и программирование / Под ред. А.В. Петрова. М.: Высшая школа, 1990. 10. Климова Л. М. Pascal 7.0. Практическое программирование. Решение текстовых задач: Учебное пособие для вузов. – М.: КУДИЦ-ОБРАЗ. СОДЕРЖАНИЕ Введение 3 1. Интегрированная инструментальная оболочка (ИИО). Базовый сеанс 3 1.1. Вызов ИИО 3 1.2. Меню 4 2. Элементы и конструкции языка TP 5 2.1. Элементы языка 5 2.1.1. Алфавит 5 2.1.2. Идентификаторы 6 2.2. Простейшие конструкции языка 7 2.2.1. Константы 7 2.2.2. Переменные 7 2.2.3. Выражения 7 2.2.3.1. Операции 8 2.2.3.2. Математические функции и процедуры 8 2.3. Структура программы 8 2.3.1. Комментарии 10 2.4. Типы данных 10 2.4.1. Простые типы данных 10 2.5. Преобразование типов. Совместимость типов 12 2.5.1.Стандартные функции преобразования типов 12 2.5.2. Объявление переменных и констант в программе 12 3. Операторы Turbo Pascal 13 3.1. Ввод – вывод данных 13 3.1.1. Ввод данных с клавиатуры 14 3.1.2. Вывод данных 14 3.1.3. Вывод данных на печать 15 3.2. Возможности модуля Crt 16 3.3. Оператор присваивания 16 3.4. Оператор перехода. Составной оператор 17 3.5. Условные операторы 18 3.5.1. Условный оператор 18 3.5.2.Оператор выбора 19 3.6. Операторы организации циклов 20 3.6.1. Оператор цикла с предусловием 21 3.6.2. Оператор цикла с постусловием 22 3.6.3. Оператор цикла с известным числом повторений 23 3.6.4. Вложенные циклы 24 4. Обработка массивов 24 4.1. Описание массива 24 4.2. Ввод – вывод массива 26 4.3. Типовая задача нахождения суммы, количества и произведения элементов массива 27 4.4. Нахождение максимального и минимального значений массива 28 4.5. Формирование нового массива из заданного 29 4.6. Сортировка элементов массива методом обмена «пузырька» 30 4.7. Обработка двумерных массивов 31 5. Обработка данных символьного и строкового типов 32 5.1. Символьный тип (Char) 32 5.2. Строковые типы (string) 34 6. Множества (set) и записи (record) 39 6.1. Множества 39 6.2. Записи 40 6.3. Записи с вариантами 45 7. Файлы 46 7.1. Типы файлов 46 7.1.1. Установочные и завершающие операции 47 7.1.2. Операции ввода-вывода 48 7.1.3. Специальные операции 49 7.2. Типизированные файлы 50 7.2.1. Операции перемещения по файлу 50 7.2.2. Добавление записи в файл 51 7.3. Текстовые файлы 51 7.3.1. Начальные и завершающие операции 52 7.3.2. Операции ввода-вывода 52 7.3.3. Корректировка файла 54 7.4. Нетипизированные (блочные) файлы 55 8. Процедуры и функции (подпрограммы) 57 8.1. Подпрограмма-процедура 57 8.2. Подпрограмма-функция 59 8.3. Примеры использования процедур и функций 59 Список литературы 64 С.Г. Ким М.Ю. Шелепова Информатика. Turbo Pascal Учебное пособие Подписано в печать 28.09.04 Формат 60841/16 Печать трафаретная Уч.-изд.л. 4,19. Усл. печ. л. 4,19. Тираж 150 экз. Заказ Отпечатано в издательстве ГОУ ВПО «БрГТУ» 665709, Братск, ул. Макаренко, 40
«Информатика. Turbo Pascal» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot