МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ВОЛЖ...
7 downloads
245 Views
330KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ВОЛЖСКИЙ ГУМАНИТАРНЫЙ ИНСТИТУТ
Батхин А.Б., Мирецкий И.Ю.
РАБОТА С СОСТАВНЫМИ ТИПАМИ ДАННЫХ В СИСТЕМЕ TURBO PASCAL
Методические указания для студентов 1 и 2 курсов специальности "Прикладная математика"
ВОЛГОГРАД 1998
УДК 519.6
Составители: А.Б. Батхин, И.Ю. Мирецкий Рецензент к.ф.-м.н. доцент Лебедев В.Н. Печатается по решению учебно-методической комиссии (протокол N___ от___________ )
Работа с составными типами данных в системе Turbo Pascal: Методические указания для студентов 1 и 2 курсов специальности "Прикладная математика" / Сост. А.Б. Батхин, И.Ю. Мирецкий – Волгоград: Издательство ВолГУ, 1997. 33 с.
Изложены основные приемы работы с составными типами данных в системе Turbo Pascal. Рассмотрены примеры программ с использованием массивов, строк, множеств, записей, файлов. Приведены задания для самостоятельного выполнения. Цель методических указаний – научить студента использованию составных типов данных при написании программ на языке Pascal. Методические указания написаны в соответствии с курсом "Информатика" и "Практикум на ЭВМ".
Издательство Волгоградского государственного университета
1. Введение Все данные в Паскаль-программе характеризуются своими типами. Система Turbo Pascal поддерживает простые, составные (структурированные), ссылочные и процедурные типы данных. К составным относят следующие типы: •
регулярные (массивы),
•
строковые (строки),
•
множественные (множества),
•
комбинированные (записи),
•
файловые (файлы).
2. Регулярный тип 2.1. Объявление и использование массивов в Pascal-программе Любой объект массивового типа (массив) состоит из фиксированного числа компонент одного типа, который называют типом компонент. Доступ к компоненте массива осуществляется по имени переменой-массива, за которым в квадратных скобках следует индексное выражение (определяющее номер компоненты). При определении массива указываются тип компонент и тип индексов: <имя типа> = array [<список индексных типов>] of <тип>. Например, в объявлении type A = array [ T1 ] of T2; A – имя типа массива, Т1 – тип индекса (порядковый тип, обычно тип-диапазон), Т2 – любой тип. Определить переменную как массив можно и непосредственно при ее описании. Таким образом, верны следующие определения: var mas : A; mm : array [1..15] of real; Sick: packed array [Days] of Boolean; Поскольку тип компонент (Т2) может быть любым типом, то он может быть, в частности, массивом, например: var M1 : array [1..4] of array [1..20] of byte; Глубина вложенности в подобных конструкциях может быть любой; обычно при описании многомерных массивов используют более компактные объявления вида var M2 : array [1..4,1..20] of byte; В первом случае М1[i][j] обозначает J-ю компоненту I-й компоненты массива М1. Второй пример демонстрирует явное матричное представление массива M2; компонента М2[I,J] массива М2 находится в J-м столбце I-й строки этой матрицы. Если A и B - массивы одного типа, то допустимо присваивание
A:=B; При отладке программ с массивами не всегда удобно их компоненты каждый раз вводить заново с клавиатуры. Элементы массивов можно хранить в виде файлов на диске или (если позволяют тип данных и логика программы) задавать случайным образом. 2.2. Примеры программ с массивами Пример 1. Ввод и обработка данных (одномерный массив) program massiv; const n=1000; var vector: array [1..n] of real; s:real; i:integer; begin for i:=1 to n do read(vector[i]);{ввод данных с клавиатуры} {"случайное" заполнение массива:} {randomize; for i:=1 to n do vector[i]:=random} s:=0 for i:=n downto 1 do s:=s+vector[i]*vector[n-i+1]; write(' s=',s) end. Пример 2. Работа с многомерным массивом (матрицей) program simmat; const n=10; var mat: array [1..n,1..n] of integer; smat, asmat: array [1..n,1..n] of real; i,j:integer; begin
{блок чтения исходной матрицы}
for i:=1 to n do for j:=1 to n do readln(mat[i,j]); {блок расчета} for i:=1 to n do for j:=1 to n do begin smat[i,j]:=(mat[i,j]+mat[j,i])/2; asmat[i,j]:=(mat[i,j]-mat[j,i])/2; smat[j,i]:=smat[i,j]; asmat[j,i]:=-asmat[i,j] end; {блок распечатки матриц} for i:=1 to n do
{печать "в строчку"}
for j:=1 to n do write(smat[i,j]); writeln; for i:=1 to n do
{печать "в колонку"}
for j:=1 to n do writeln(asmat[i,j]); for i:=1 to n do
{печать в виде матрицы}
begin writeln; for j:=1 to n do write(mat[i,j],' ') end end. Пример использования файлов при обработке массивов приведен в разделе "Файловый тип". 2.3. Контрольные вопросы и варианты индивидуальных заданий Ответьте на следующие вопросы. 1. Можно ли во время выполнения программы изменить размер массива? 2. Может ли типом индекса массива быть тип integer, char, real? 3. Одинаковы ли типы array[1..15] of array[0..3] of char и array[1..15,0..3] of char? 4. Какие из операций a:=b; a:=a+b; a:=0; flag:=a=b; read(a); a[1]:=b[1]; a[7,5]:=b[1][3]+b[1,3] допустимы при объявлении var a,b: array[1..21,0..7] of real; flag: boolean? 5. Пусть имеются описания type day=(s,m,t,w,th,f,sa); date=array[1..31] of real; var a:date; b:array[day] of 1..31; c:array['0'..'4'] of date; d:array[date] of date; e:array[day] of day; Корректны ли эти описания? Сколько элементов в каждом из массивов? Какие значения могут принимать элементы каждого из массивов? В соответствии с номером варианта выполните одно из следующих индивидуальных заданий.
1. Составить программу умножения матрицы А размера m x n на вектор b. 2. Составить программу перемножения матриц А и АТ. 3. Дан массив А[1..2n+1]. Составить программу поиска среднего по величине элемента в массиве А. 4. Дан массив А[1..n]. Составить программу подсчета суммы всех элементов, заключенных между A1 и An. 5. Дан массив А[1..n,1..n]. Составить программу поиска всех [i,j], таких что A[ij]=A[ji]. 6. Дан массив А[1..n]. Составить программу подсчета средних арифметических всех отрицательных и всех положительных его элементов. 7. Даны массивы А[1..n] и В[1..n].Составить программу расчета массива С[1..n] такого, что C[i]T=max(B[i],A[i]). 8.
Даны массивы А[1..n] и В[1..n]. Составить программу поиска элементов из А, входящих в В.
9. Дан массив А[1..n,1..m]. Составить программу поиска всех элементов из А меньших, чем все соседние. 10. Дан массив А[1..n]. Составить программу поиска номеров всех его элементов, больших, чем все предыдущие. 11. Даны два массива А и В. Составить программу построения массива С такого, что C[1]=min(A[i],B[i]). 12. Дан массив А[1..n,1..m]. Найти все его элементы, минимальные в своей строке. 13. Дан массив А[1..n,1..m]. Найти все его элементы, максимальные в своем столбце. 14. Последовательность из n точек плоскости задана массивами Х[1..n] и Y[1..n] координат. Составить программу поиска точки, наименее удаленной от начала координат. 15. Дан массив А[1..n]. Составить программу поиска всех его элементов, заключенных между a и b. 16. Дан массив А[1..n,1..m]. Составить программу поиска седловой точки (максимальной в строке и минимальной в столбце). 17. Дан массив А[1..n,1..m]. Составить программу поиска 18. столбца, сумма квадратов элементов которого минимальна. 19. Дан массив А[1..n,1..m]. Составить программу поиска строки, сумма элементов которой максимальна. 20. Даны массивы А[1..n] и В[1..m]. Составить программу построения массива С, состоящего из элементов А, не входящих в В. 21. Дан массив А[1..n]. Составить программу поиска всех его элементов, меньших, чем все предыдущие.
3. Строковый тип 3.1. Строки символов Строка символов представляет собой последовательность, содержащую нуль и более символов из расширенного набора символов кода ASCII, записанную в одной
строке программы и заключенную в одиночные кавычки (апострофы). Строка символов, ничего не содержащая между апострофами, называется пустой строкой. Два последовательных апострофа в строке символов обозначают один символ – апостроф. Атрибут длины строки символов содержит действительное количество символов между апострофами. Строковый тип
string Целое б/знака
[
]
В качестве расширения стандартного Паскаля Turbo Pascal разрешает вставлять в строку символов управляющие символы. Символ # с целой константой без знака в диапазоне от 0 до 255 обозначает соответствующий этому значению символ в коде ASCII. Между символом # и целой константой не должно быть никаких разделителей. Аналогично, если несколько управляющих символов входят в строку символов, то между ними не должно быть разделителей. Строка
символов
'
' Символ строки
Символ строки
Любой символ кроме ' и CR '
'
Примечание: CR – символ возврата каретки. Строка символов нулевой длины (пустая строка) совместима только со строковым типом. Строка символов с длиной, равной 1, совместима с любым символьным и строковым типом. Строка символов с длиной N, где N больше или равно 2, совместима с любым строковым типом и с упакованным массивом из N символов. Приведем несколько примеров строк символов: 'TURBO' 'You''ll see' '''' ';' ' ' #13#10 'Line 1'#13'Line 2' #7#7'Wake up!'#7#7 Значением строкового типа является последовательность символов с динамическим атрибутом длины (в зависимости от действительного числа символов при выполнении программы) и константным атрибутом размера в диапазоне от 1 до 255. Строковый тип, объявленный без атрибута размера, имеет установленный по умолчанию атрибут размера, равный 255. Текущее значение атрибута длины можно получить с помощью стандартной функции Length. Доступ к элементу строки можно получить, проиндексировав строковую переменную. Например, S[5] – пятый символ строки S. Значение индексного выражения должно быть в диапазоне 0 .. N, где N – указанный в объявлении размер строки.
Первый символ строковой переменной (индекс 0) содержит динамическую длину строки; Length(S) тождественно Ord(S[0]). Если атрибуту длины присваивается значение, то компилятор не проверяет, является ли это значение меньше объявленного размера строки. Можно указать индекс строки и вне ее текущей динамической длины. В этом случае считываемые символы будут случайными, а присваивания вне текущей длины не повлияют на действительное значение строковой переменной. Приведем пример обработки строки, состоящий в удалении завершающих ее пробелов. var s : string; begin .. . . . . . . . while (length(s) <> 0) and (s[length(s)] = ' ') do s[0] := chr(length(s) - 1); .. . . . . . . . end. Turbo Pascal позволяет использовать оператор + для объединения двух строковых операндов. Результатом операции S+T, где S и T имеют строковый тип, символьный тип или упакованный строковый тип, будет конкатенация S и T. Результат будет совместим с любым строковым типом (но не с символьным и не с упакованным типом). Если длина результирующей строки превышает 255 символов, то она усекается до 255 символов. 3.2. Сравнение строк Операторы отношения =, <>, <, >, <=, или >= могут применяться для сравнения строк согласно порядку расширенного набора символов кода ASCII. Любые два значения строковых данных можно сравнить, поскольку все значения строковых данных совместимы. Отношение между любыми двумя строковыми значениями устанавливается согласно отношению порядка между значениями символов в соответствующих позициях. В двух строках разной длины каждый символ более длинной строки без соответствующего символа в более короткой строке принимает значение "больше"; например, 'xs' больше, чем 'x'. Пустые строки могут быть равны только другим пустым строкам, и они являются строками с наименьшим значением. Значения символьного типа совместимы со значениями строкового типа, и при их сравнении символьное значение обрабатывается как строковое значение длиной 1. Когда со значением строкового типа сравнивается упакованное строковое значение из N элементов, то оно обрабатывается как значение строкового типа длиной N.
3.3. Процедуры и функции для работы со строками Процедура DELETE (ST,I,C)
Описание Удаляет C символов из строки ST, начиная с символа с номером I
INSERT (SUBST,ST,I)
Вставляет подстроку SUBST в строку ST, начиная с символа с номером I
STR (X [:<формат>],ST)
Преобразует число X в строку ST; параметр "формат" задает формат преобразования (общую ширину поля и количество символов в дробной части) так же, как в процедуре Writeln
VAL (ST,X,CD)
Преобразует строку ST во
внутреннее представление
переменной X; параметр CD содержит нуль, если преобразование прошло успешно, или номер позиции ошибочного символа в ST COPY (ST,I,C)
Копирует С символов из строки ST, начиная с позиции I
CONCAT (S1 [,S2,..., SN])
Возвращает строку-сцепку строк S1, ..., SN
LENGTH (ST)
Возвращает длину строки ST
POS (SUBST,ST)
Отыскивает в строке ST первое вхождение подстроки SUBST и возвращает но мер позиции, с которой она начинается; если подстрока не найдена, воз вращается нуль
CHR (I)
Возвращает символ по его коду I
ORD (CH)
Возвращает код символа CH (номер его значения в типе
UPCASE (CH)
Переводит латинский символ на верхний регистр 3.4. Контрольные вопросы и варианты индивидуальных заданий
Пусть имеются описания var a,b: string; c,d: string[80]; e,f: string[5]; t : boolean; Ответьте на следующие вопросы. 1.
Какие из следующих операций допустимы? a:=b; read(a);
readln(b); a:=b+c; b:=a-e;
c:=a; t:=a=b;
t:=a=c;
a:=d; e:=1234;
f:='1234'; f:='12345678';
f[1]:='z';
f[0]:=4; f[0]:='4';
t:=a>c; t:=c<>'123';
2. f:='qwertyuiop'. Какие значения принимают f[0], f[1], f[2], f[3], f[4], f[5], f[6]? 3. a:='q'. Какое значение возвращает функция length(a)?
4. a:='123'; b:='456'; e:=a+'45'; f:=a+b. Каким будет результат операции writeln(e)? writeln(f)? В соответствии с номером варианта cоставьте программу, которая подготавливает текстовый файл; a) считывает строку из файла; b) вызывает процедуру для обработки строки в соответствии с условием задачи; c) печатает результаты. Варианты заданий Напечатать слово по слогам. 1. В массиве слов найти цепочки символов 'ств' и 'еск'. 2. Растянуть строчку до 80 символов. 3. Определить сколько раз в тексте встречается _if_. 4. Переделать слова в предложении из больших букв в слова из маленьких букв, не меняя первых букв. 5. Переписать предложение, меняя первые буквы слов на большие. 6. В массиве слов найти цепочку из 2 гласных. 7.
Переделать слова в предложении из больших букв в слова из маленьких букв, не меняя слова из 5 и менее букв.
4. Множественный тип 4.1. Объявление и использование множеств в Pascal-программе Значением множественного типа данных является множество, состоящее из однотипных элементов. Тип элемента множества называется базовым типом. Базовым типом может быть любой порядковый тип, кроме WORD, INTEGER, LONGINT. Тип множество описывается в разделе типов следующим образом : TYPE < имя > = SET OF < базовый тип > Например, а) TYPE beta = SET OF '0' .. '9'; б) TYPE glas = SET OF char ; в) TYPE color = ( green, yellow, blue, red, black ); kraska = SET OF color ; г) TYPE number = SET OF 1, ... , 100. Переменные типа множество описываются в разделе переменных, например: а) var A, B : beta; б) var lletter, fletter : glas; в) var last, first : kraska; г) var sinit : number; Если в разделе типов множественный тип не описан, это можно сделать в разделе переменных: а) var A, B : SET OF '0' .. '9';
б) var lletter, fletter : SET OF char ; в) var last, first : SET OF color; г) var sinit : SET OF 1, ... , 100. Множества строятся из своих элементов с помощью конструктора множества. Конструктор представляет собой список, в котором перечисляются через запятую элементы множества или отрезки базового типа. Список обрамляется квадратными скобками [ и ]. Пустое множество обозначается через [ ]. Например, []
(пустое множество),
[ 2, 5 ..7 ]
(множество { 2, 5, 6, 7}),
[ 'A'.. 'Z', 'O'.. '9' ] (множество, состоящее из всех латинских букв и цифр), [ i+j.. i+ 2 * j ]
(множество, состоящее из всех целых чисел между i + j и i+ 2 * j).
Отметим, что если v1>v2, множество [ v1..v2 ] – пустое. Операции над множествами (A <операция> B) Операция
Описание
Результат
+
объединение множеств
A∪ B
*
пересечение множеств
A∩ B
-
разность множеств
A\ B
=
проверка эквивалентности
boolean (true, если эквивалентны)
<>
проверка неэвивалентности
boolean (true, если неэквивалентны)
<=
проверка вхождения A в B
boolean (true, если A входит в B)
>=
проверка вхождения B в A
boolean (true, если B ¦входит в A)
In
Проверка принадлежности эле-
boolean (true, если X входит в A)
мента X множеству A: X in A Если bb – переменная типа Boolean, возможно присваивание вида bb:= A < B; возможны сравнения вида (А = В ) = (С = D). Наличие операций над множествами позволяет применять в программах операторы присваивания, в левой части которых стоит переменная типа множества, а в правой выражение того же типа, например: А := А * [ 1 .. 10 ] + B ; B := ( А + B ) * [ 'A' .. 'Z' ]. Применение множеств позволяет делать запись программы лаконичной и понятной. Сравните FOR X:= ' A ' TO ' Z ' DO IF (X ='A') OR (X ='E') OR (X ='I') OR (X ='O') OR (X='U') THEN S1 ELSE S2 и
FOR Т:= ' A ' TO ' H ' DO IF X in [ 'A', 'E', 'I', 'O', 'U' ] THEN S1 ELSE S2. Последняя форма записи не только лучше читается, но гораздо быстрее вычисляется. 4.2. Контрольные вопросы и варианты индивидуальных заданий Ответьте на следующие вопросы. 1. Как описываются множественные типы и переменные в этих типах? 2. Как определяется конструктор множества? Для чего он используется? 3. Какие операции выполнимы над множествами? 4. Какие отношения определены для данных типа 'множества'? 5. Как получить доступ к элементу множества? 6. Можно ли использовать множества, состоящие из действительных чисел? Массивов? Записей? В соответствии с номером варианта выполните индивидуальные задания. Задание 1 Дан массив слов: M:array [1..n] of string [32] из русских букв. Напечатать 1. все гласные буквы, которые входят в каждое слово; 2. все согласные буквы, которые не входят ни в одно слово; 3. все звонкие согласные буквы, которые входят хотя бы в одно слово; 4. все глухие согласные буквы, которые не входят хотя бы в одно слово; 5. все согласные буквы, которые входят только в одно слово; 6. все глухие согласные буквы, которые не входят только в одно слово; 7. все звонкие согласные буквы, которые входят более чем в одно слово; 8. все гласные буквы, которые не входят более чем в одно слово; 9. все звонкие согласные буквы, которые входят в каждое четное слово и не входят ни в одно нечетное слово; 10. все глухие согласные буквы, которые входят в каждое четное слово и не входят хотя бы в одно нечетное слово. Задание 2 1. Из множества чисел [1..n] выделить подмножество простых чисел вида 4k+1. 2. Из множества чисел [1..n] выделить подмножество полных квадратов вида 6k+1. 3. Из множества чисел [1..n] выделить подмножество простых чисел вида k+n. 4. Из множества чисел [1..n] выделить подмножество чисел вида p, где p-простое. 5. Из множества чисел [1..n] выделить подмножество чисел вида p-q, где p и q - простые. 6. Из множества чисел [1..n] выделить подмножество простых чисел p, таких, что p+z тоже простые (поиск "близнецов").
7. Из множества чисел [1..n] выделить пересечение подмножеств - чисел вида 4k+1 и 5n+4. 8. Из множества чисел [1..n] выделить объединение подмножеств - чисел вида 4k+3 и 5n+2. 9. Из множества простых чисел, меньших чем n выделить подмножество чисел вида 2n+1 и 2n-1. 10. Из множества чисел [1..n] выделить подмножество простых чисел вида k+1. 11. Из множества чисел [1..n] выделить подмножество составных чисел. 12. Из множества чисел [1..n] выделить подмножество составных чисел вида 6k+1. 13. Из множества чисел [1..n] выделить подмножество составных чисел вида k+1. 14. Из множества чисел [1..n] выделить подмножество простых чисел вида p-q+1, где p и q – простые. 15. Из множества чисел [1..n] выделить подмножество простых чисел вида 6k+1 и составных чисел вида 6k + 1. 16. Из множества чисел [1..n] выделить подмножество простых чисел p таких, что p+2, p-2 – составные. 17. Из множества чисел [1..n] выделить пересечение подмножеств и разность подмножеств чисел вида 4k+3 и 5n + 2. 18. Из множества чисел [1..n] выделить подмножество совершенных чисел ( число называется совершенным, если оно равно сумме своих собственных делителей. Например, 6=3+2+1). 19. Из множества чисел [1..n] выделить подмножество составных чисел вида p*q+1, где p и q – простые. 20. Из множества чисел [1..n] выделить подмножество простых чисел вида p*q+1, где p и q -простые. Задание 3. 1. В массиве записей домашних адресов друзей посчитать количество разных улиц. Названия улиц заданы как значения перечислимого типа ulica. 2. Напечатать по одному разу числа, входящие в одномерный массив, и напечатать числа, входящие в массив по одному разу. 3. Можно ли из букв слова A собрать слово B. Буквы можно использовать по нескольку раз. 4. По массиву записей "Моя зачетная книжка" узнать, какие оценки вы получали за семь семестров. В зависимости от их количества напечать сообщение. 5. *) Не используя дополнительных переменных типа множество, поменять местами значения переменных множеств А и B. 6. Даны целые числа A[1],..., A[n]. Является ли эта последовательность перестановкой чисел 1, 2,..., n? 7. Дана матрица целых чисел размера NxM, в которой имеется ровно два одинаковых элементов. Найти индексы этих элементов.
8. В одномерном массиве элементов типа 1..99 определить, каких чисел в массиве больше: однозначных или двузначных. Повторяющиеся числа учитывать один раз. 9. По массиву записей "Ученики моего класса" узнать, есть ли мальчики (девочки) одного роста. Примечание. Значения записей, массивов, множеств – исходных данных задавать как значения констант в блоке описаний или в отдельной процедуре с помощью ':='.
5. Комбинированный тип данных 5.1. Описание комбинированного типа Комбинированный тип (запись) определяет структуру данных, состоящую из фиксированного числа компонент, называемых полями записи. Поля записи могут быть различного вида. В определении типа записи задается имя и тип каждого поля записи. Тип записи определяется в разделе типов, а переменные этого типа – в разделе переменных в соответствии со следующими определениями: <комбинированный тип>::= RECORD < список полей > END < список полей >::= < фиксированная часть > < фиксированная часть >;< вариантная часть > < вариантная часть > < фиксированная часть >::= < секция записи > {,< секция записи >} < секция записи >::= < имя поля >{,< имя поля >}:< тип > < пусто > Синтаксис записей, содержащих вариантную часть (записей с вариантами), мы определим ниже. 5.2. Синтаксические диаграммы комбинированного типа
Фиксиров. часть Комбинир. тип
RECORD
Фиксиров. часть
Вариантн. часть
END
Вариантн. часть
Различные синтаксические диаграммы могут определять один и тот же синтаксис:
Секция записи
Фиксированная часть
; Секция записи
:
Имя поля
Тип
, Фиксиров. часть Комбинир. тип
RECORD
;
END
Вариантн. часть
Запись может входить в состав данных более сложной структуры. Можно говорить, например, о массивах и файлах, состоящих из записей. Запись может быть полем другой записи. 5.3. Примеры определений 1) TYPE complex = RECORD re,im : real end; VAR z1,z2 : complex; 2) TYPE student = RECORD F1,F2,F3 : string[15]; day : 1..31; month : 1..12; year : integer; zach : integer end; VAR GROUP : array [1..25] of student; N : student; VAR
A : file of record name : string[20]; data : record day : 1..31; month : 1..12; year : integer end; zach : integer; end;
При обозначении компоненты записи в программе следом за именем записи ставиться точка, а затем имя соответствующего поля. Так, в примере 2 доступ к полю day возможен по имени A.data.day, а к переменной - первой букве поля name - по имени A.name[1]. Другие примеры: 1)
z1.re:=2;
z1.im:=3;
z2.re:=z1.re+1;
z2.im:=z1.im+2;
2) N.F1:=GROUP[i].F1; N.year:=GROUP[i+1].year; writeln(GROUP[i].zach); 5.4. Записи с вариантами Часто бывает удобно в пределах одной записи иметь различную информацию в зависимости от конкретного значения некоторого поля. Комбинированный тип помимо фиксированного списка полей может содержать вариантную часть, предполагающую несколько вариантов структуры этого типа. Это означает, что разные переменные, относящиеся к одному и тому же типу, могут иметь отличающуюся структуру. Вариантная часть содержит несколько альтернатив, в каждой из которых в круглых скобках задается список полей, присущих данному варианту. Списку предшествует метка, являющаяся конкретным значением поля, которое служит критерием выбора вариантов. В качестве примера построения записи с вариантами рассмотрим тип, содержащий информацию о человеке. Фамилия Имя Фиксированная часть
Отчество Пол Семейное положение (холост, женат, замужем, разведён, вдов)
Признак
Вариантная часть
Холост
Женат
Замужем
Разведён, вдов
ФИО жены,
ФИО мужа,
Количество
количество
девичья фами-
детей,
детей
лия
Дата
количество детей
Синтаксис определения вариантной части <вариантная часть>::= case <поле признака> <имя типа> of <вариант>{;<вариант>} <вариант>::=<список меток варианта>:(<список полей>) _ <пусто> <список меток варианта>::=<метка варианта>{;<метка варианта>} <метка варианта>::=<константа>
<поле признака>::=<имя>: <пусто> Синтаксические диаграммы вариантной части
Вариантная часть
Имя типа
Поле признака
of
Вари;
Вариант
Константа
Список полей
:
,
Поле признака
Имя
:
Тип
Описание типа записи в рассматриваемом примере может иметь вид: TYPE imya = array [1..20] of char; data = record day : 1..31; month : 1..12; year : integer end; chelovek = record f1,f2,f3,:imya; pol : (mujsk, jensk); sempol : (holost, jenat, zamujem, razved, vdov); case sempol of jenat : (fj : imya;
ndet : 1..100);
zamujem : (fm,df: imya; ndet2: 1..100); razved,vdov : (d : data; ndet3: 1..100); holost : ( ) end;
В рассмотренном описании поле признака пусто. На варианты указывает поле sempol. В зависимости от значения этого поля запись имеет ту или иную структуру. Это частая ситуация. Обычно на вариант записи указывает одно из полей фиксированной части этой записи. Поэтому синтаксисом допускается сокращение: описание определяющей вариант компоненты, называемой полем признака (дискриминантом), включается в сам заголовок варианта. В нашем примере это выглядит так: TYPE SP = (holost, jenat, zamujem, razved, vdov); case sempol : sp of Внимание: все имена полей должны быть различными, даже если они встречаются в различных вариантах. (Например, ndet1, ndet2,ndet3 - имена для количества детей). Если поле с меткой L в списке пустое, то оно записывается так:L:(). Пример пустого поля – поле holost. Если p – переменная типа chelovek, то она может быть создана группой операторов присваивания, например: p.f1:= 'Иванов'; p.f2:= 'Илья'; p.f3:= 'Иннокентьевич'; p.pol:=mujsk; p.sempol:=jenat; p.fj:= 'Петрова Б.В.'; p.ndet1:=2. 5.5. Оператор присоединения Операции по обработке записей можно упростить с помощью оператора присоединения. Заголовок этого оператора открывает область действия "внутренних" имен полей записи. Эти имена могут быть использованы как имена переменных. Оператор присоединения WITH имеет следующий вид: with < переменная-запись> {,<переменная-запись>} do <оператор> Например: with p do begin f1:= 'Иванов'; f2:= 'Илья'; f3:= 'Иннокентьевич'; pol:=mujsk; sempol:=jenat; fj:= ' Петрова Б.В. '; ndet1:=2 end { конец оператора with } Аналогично, в варианте sempol=razveden запись может быть сформирована следующим образом:
with p,d do begin f1:= 'Иннокентьева'; f2:= 'Инна'; f3:= 'Ивановна'; pol:=jensk; sempol:=razveden; ndet1:=1 day:=1;month:=4;year:=1988 end; Замечание: в операторе with r do S выражение r не должно содержать переменных, изменяемых в операторе S. Например, оператор with S[j] do j:=j+1 недопустим. Оператор вида with r1,...,rn do S эквивалентен оператору with r1 do with r2 ... with rn do S (см.пример). 5.6. Пример программы В качестве примера рассмотрим программу, которая обрабатывает массив записей, каждая из которых содержит сведения о человеке, необходимые для связи с ним по почте или телефону. Запись имеет вид Фамилия И.О. Почтовый адрес
Индекс Населенный пункт, улица, номер дома и квартиры
Телефон домашний Телефон рабочий Дата рождения
день месяц год
___________________________________________________________________________ program adres; { Программа ввода записной книжки из файла и поиска именинников } { на сегодняшний день. Имя файла исходных данных : 'ZAPKN.txt'. } const m=13; pusto=' '; type mesto = record index:real; kuda :string[40]; end;
date = record day:1..31; mon:1..12; year:integer end; person = record fio:string [20]; adr:mesto; dtel:real; rtel:real; drog:date end; var j:integer; f:text; segodnya:date; zapkn:array [1..m] of person; nashli:boolean; { флажок удачного поиска } { Процедура чтения из файла f одной записи для записной книжки } procedure chtenie (var p:person); begin with p do begin read (f,fio); read (f,adr.index); read (f,adr.kuda); read (f,dtel,rtel); readln (f,drog.day,drog.mon,drog.year); end end; { Процедура вывода сообщения об одном адресате } procedure vivod(p:person); begin writeln('-----------------------------------------------'); write (p.fio,', сегодня исполнилось '); writeln(segodnya.year - p.drog.year, ' лет.'); writeln('Почтовый адрес: ',p.adr.index:6:0,','); writeln(pusto,p.adr.kuda,','); write(pusto,'телефоны: '); writeln(p.dtel:6:0,'(д.), ',p.rtel:6:0,' (р.) .'); end; { Основная программа }
begin { Открытие файла данных для чтения } assign (f,'zapkn.txt'); reset(f); for j:=1 to m do chtenie(zapkn[j]); writeln('Данные считаны. '); writeln; write('Введите сегодняшнюю дату: день – ' ); readln (segodnya.day ); write('
месяц – ');
readln (segodnya.mon ); год – ' );
write('
readln (segodnya.year); writeln; nashli:=false; { Поиск данных в массиве записей } for j:=1 to m do with zapkn[j].drog do if (segodnya.day=day) and (segodnya.mon=mon) then begin if not(nashli) then writeln(pusto,'Именинники на сегодня:'); vivod(zapkn[j]); nashli:=true end; writeln('=================================================); if not(nashli) then writeln('Сегодня именинников нет.') { Конец программы } end. 5.7. Контрольные вопросы и варианты индивидуальных заданий Ответьте на следующие вопросы. 1. Могут ли поля записи быть одного типа? разных типов? 2. Существенен ли порядок описания полей записи? 3. Могут ли быть одинаковыми имена полей разных записей? 4. Могут ли имена полей записи совпадать с именами переменных? 5. Может ли оператор присоединения работать сразу с несколькими различными записями? 6. Можно ли комбинированный тип использовать для преобразования типов? 7. Может ли запись содержать две вариантные части? одну? ни одной? 8. Может ли запись состоять только из вариантной части? В соответствии с номером варианта выполните одно из следующих индивидуальных заданий.
1. Опишите тип записи – сведения о возрасте, росте и весе ученика. Сформируйте массив, состоящий не менее, чем из восьми (воображаемых) учеников "вашего" класса. Разработайте программу, которая определяет всех учеников, родившихся в данный промежуток времени, указанный датами начала и конца, и определяет средний рост и средний вес этой группы учеников. 2. Опишите тип записи – строчку зачетной книжки (экзаменационная часть). Сформируйте массив экзаменов, сданных вами. Разработайте программу, которая определяет ваш средний балл, составляет список ваших экзаменаторов и по номеру семестра распечатывает результаты вашей сессии. 3. Опишите тип записи – строчку в телефонной книге. Сформируйте массив записей – вашу телефонную записную книжку. Разработайте программу поиска номера телефона по фамилии и поиска адреса по номеру телефона. 4. Опишите тип записи – сведения о студенте группы, необходимые старосте группы. Сформируйте массив студентов своей подгруппы. Разработайте программу, которая определяет состояние дисциплины и успеваемости в подгруппе. 5. Опишите тип записи – строчку зачетной книжки (зачетная часть). Сформируйте массив зачетов, сданных вами. Разработайте программу, которая определяет дни, когда вы сдавали по два и более зачетов. 6. Опишите тип записи – сведения об успеваемости ученика, необходимые для учителяпредметника по своему предмету. Сформируйте массив, состоящий не менее, чем из восьми (воображаемых) учеников "вашего" класса. Разработайте программу, которая определяет самого слабого и самого сильного ученика класса. 7. Опишите тип записи – клетки расписания занятий на факультете для своей специальности и курса. Сформируйте массив двухнедельного расписания для своей подгруппы. Разработайте программу, которая определяет количество лекционных, практических и лабораторных занятий в двухнедельном цикле для своей подгруппы по математическим (физическим) дисциплинам. 8. Опишите тип записи – сведения о книге по школьной математике. Сформируйте массив книг, необходимых учителю математики. Составьте программу, которая подбирает книги для класса, номер которого вводится, печатает имена их авторов и год издания. 9. Опишите тип записи – сведения о товаре в магазине. Сформируйте массив товаров, имеющихся в магазине. Разработайте программу, которая по данному товару корректирует массив товаров и определяет выручку магазина к данному моменту времени. 10. Опишите тип записи – сведения о родителях учеников класса, необходимые классному руководителю. Сформируйте массив, состоящий не менее, чем из восьми (воображаемых) учеников "вашего" класса. Разработайте программу, которая по фамилии и имени ученика распечатывает сведения о его родителях.
Примечание. В каждом из вариантов предусмотрите программу ввода информации об объектах задания. Основная программа должна использовать эти данные. 11. Комплексное число может быть представлено в алгебраической или тригонометрической формах. Определить тип Complex, учитывающий эту возможность, описать процедуры ввода, вывода, преобразования из одной формы в другую и различных алгебраических операций над этим типом.
6. Файловый тип 6.1. Файлы и их описания. Файловые переменные Программа, написанная на языке PASCAL, должна каким-то образом обмениваться с внешними устройствами (получать данные с клавиатуры, магнитного диска и т.д.). Для работы с внешними устройствами используются файлы. Файл – это последовательность однотипных компонент, снабженных признаком конца. В любой момент времени доступен только один элемент файла. Другие компоненты доступны только путем последовательного продвижения по файлу. При необходимости работы с файлами они должны быть объявлены в программе. Часть файлов (представляющих собой физические устройства) имеет стандартные имена. Например, для чтения данных с клавиатуры и вывода результатов на экран монитора в Паскаль-программе должны быть объявлены файлы INPUT и OUTPUT соответственно: PROGRAM VVOD_VYVOD(INPUT,OUTPUT); В системе Turbo Pascal это объявление не является обязательным. Для остальных файлов (создаваемых программистом) имена необходимо определить в программе в разделе описания переменных. Имя файла
:
file of
тип
, Типом здесь может быть любой тип Turbo Pascal, кроме файла. В зависимости от способа объявления можно выделить три вида файлов: 1. типизированные файлы (задаются предложениями file of ...); 2. текстовые файлы – совокупность строк переменной длины (определяются стандартным типом text); 3. нетипизированные файлы (определяются типом file). Приведем примеры описания файлов. type car = record model, color, engine : string[15]; year : integer end; st_f_45 = file of string[45];
var f : text; data : File of real; Lit1, Lit2 : File of char; stf : st_f_45; fcar : file of car; При работе с нестандартными файлами имя файловой переменной (data, Lit1, Lit2, stf, fchar) должно быть связано с реально существующим объектом (файлом на диске). Для этого используется стандартная процедура Assign: Assign(<файловая переменная>,<имя файла>); Имя файла имеет тип string и может содержать описание пути к файлу, выполненное в формате DOS. Например, после выполнения процедуры Assign(data,'massiv.dta'); данные из дискового файла massiv.dta (который находится в текущем каталоге) будут доступны программе через файловую переменную data. При диалоговой обработке различных файлов внутри одной программы полезны конструкции вида var f_name : string; f . ..
: file of <тип>; ....
...
readln(f_mame); . ..
....
...
Assign(f, f_name); Прежде, чем приступить к работе с файлом (после объявления файловой переменной и выполнения процедуры Assign), необходимо провести его инициацию (открыть файл, сделать его доступным). Для этого используют одну из процедур Rewrite или Reset. Для обмена данными с файлами используют процедуры Read и Write. По окончании работы с файлом он должен быть закрыт процедурой Close(<файловая переменная>). 6.2. Процедуры и функции для работы с файлами всех видов Assign(<файловая переменная>,<имя файла>) – процедура; связывает файловую переменную с файлом. Append(<файловая переменная>) – процедура; инициирует запись в ранее существовавший текстовый файл для его расширения (при этом указатель файла устанавливается в его конец).
Chdir(<путь>) – процедура; изменяет текущий каталог; "путь" имеет тип string. Close(<файловая переменная>) – процедура; закрывает файл. EOF(<файловая переменная>) – функция; тестирует конец файла. Возвращает TRUE, если указатель стоит в конце файла. Erase(<файловая переменная>) – процедура; уничтожает файл (файл предварительно должен быть закрыт). Flush(<файловая переменная>) – процедура; переписывает данные из внутреннего буфера файла в файл. Getdir(<устройство>,<каталог>) – процедура; определяет имя текущего каталога. "Устройство" – выражение типа word, содержащее имя устройства: 0 – устройство по умолчанию, 1 – диск А, 2 – диск B и т. д. "Каталог" – переменная типа string, в которую возвращается путь к текущему каталогу на указанном диске. IOresult – функция; возвращает код завершения последней операции вводавывода (целое число типа word). Значение 0 свидетельствует об успешном выполнении операции. Функция работает с директивой {$I-}. Mkdir(<каталог>) – процедура; создает новый каталог на указанном диске. "Каталог" – выражение типа string, в котором указывается путь к каталогу. Rename(<файловая переменная>,<новое имя>) – процедура; переименовывает файл (файл предварительно должен быть закрыт); "новое имя" имеет тип string. Reset(<файловая переменная>) – процедура; открывает файл для чтения. Файл готов для чтения из него первого элемента (значения). Rewrite(<файловая переменная>) – процедура; открывает файл для записи. Если файл ранее существовал, все данные хранившиеся в нем, уничтожаются. После выполнения Rewrite файл готов для записи первого элемента (значения). Rmdir(<каталог>) – процедура; удаляет каталог (каталог должен быть пуст). 6.3. Текстовые файлы При создании текстового файла в конце каждой строки ставится специальный признак EOLN (коды ASCII 13 (CR) и 10 (LF)), а в конце файла – признак EOF (код ASCII 26). Для текстовых файлов дополнительно определены процедуры Read, Readln, Write, Writeln и функции Eoln, SeekEoln, SeekEof. Процедура Read([<файловая переменная>,]<список ввода>) читает данные из файла (по умолчанию файл – INPUT) в переменные, указанные в списке; "список ввода" здесь – последовательность из одной или более переменных типа char, string, а также любого целого и вещественного типа. При вводе переменных типа char выполняется чтение одного символа (в том числе CR в конце строки и EOF в конце файла) и присваивание его файловой переменной. При вводе с клавиатуры CR вводится нажатием Enter, а EOF как ^Z.
При вводе переменных типа string выполняется чтение 256 символов, если до этого не встретились символы конца строки или файла (символы CR, EOF в строку не записываются). Таким образом, процедурой Read можно прочесть не более одной строки. При вводе числовых переменных процедура Read работает с дисковым файлом так же, как с файлом Input (стандартный ввод с клавиатуры). Процедура Readln([<файловая переменная>],[<список ввода>]) осуществляет построчный ввод данных из файла. Процедура Write([<файловая переменная>,]<список вывода>) записывает данные в файл (по умолчанию файл – OUTPUT) в переменные, указанные в списке. Процедура Writeln([<файловая переменная>],[<список вывода>]) в отличие от процедуры Write завершает вводимую строку символов кодами CR и LF. Функция Eoln(<файловая переменная>) возвращает true, если во входном файле достигнут маркер конца строки. Функция SeekEoln(<файловая переменная>) пропускает все пробелы и знаки табуляции до маркера конца строки или до первого значащего символа и возвращает true, если достигнут Eoln. Функция SeekEof(<файловая переменная>) пропускает все пробелы, знаки табуляции и маркеры конца строки Eoln до маркера конца файла или до первого значащего символа и возвращает true, если достигнут Eof. 6.4. Типизированные файлы Все компоненты типизированного файла имеют один формат, и к каждой из них можно организовать доступ по ее порядковому номеру. Перед началом работы указатель файла указывает на первый элемент файла (с номером 0). После каждого чтения или записи указатель смещается на следующий элемент. Переменные в списках вводавывода должны иметь тип компонент файла. Для типизированных файлов дополнительно определены процедуры Read (<файловая переменная>,<список ввода>), Write(<файловая переменная>,<список вывода>), Seek(<файловая переменная>,) и функции FileSize(<файловая переменная>), FilePos(<файловая переменная>). Процедура Seek смещает указатель файла к компоненте номер N (выражение типа longint). Функция FileSize возвращает количество компонент файла (значение типа longint). Функция FilePos возвращает порядковый номер компоненты файла (значение типа longint), которая будет обрабатываться следующей операцией ввода-вывода. 6.5. Нетипизированные файлы Тип компонент нетипизированных файлов в объявлении не указывается, что делает эти файлы совместимыми с любыми другими файлами.
При инициализации нетипизированного файла можно указать для него длину f_l записи (выражение типа word) в байтах, например: const f_l = 512; var f1 : file; .. . . . . . . . . . . . Assign(f1,'a:123.321'); Reset(f1,f_l); .. . . . . . . . . . . . Если длина не указана, она принимается равной 128 байтам. Рекомендуется в качестве длины записи указывать числа, кратные 512. При работе с нетипизированными файлами могут применяться всепроцедуры и функции, определенные для типизированных файлов, кроме Read и Write. Две последние
процедуры
заменены
блочными
аналогами
BlockRead(<файловая
перемен-
ная>,<буфер>,<счетчик>[,<результат>]) и BlockWrite(<файловая переменная>, <буфер>, <счетчик> [,<результат>]), обеспечивающими высокоскоростной обмен данными. Здесь "буфер" – переменная (аналог списка ввода или вывода); "счетчик" – количество N записей (выражение типа word), которые должны быть прочитаны или записаны за одно обращение к диску; "результат" – необязательный параметр – количество фактически обработанных записей (word). За одно обращение к процедурам может быть передано (N * f_l) байт. Процедурой Seek и функциями FileSize и FilePos обеспечивается доступ к любой записи файла. 6.6. Примеры программ Пример 1 (работа с текстовым файлом) program VVOD_VYVOD; const n=1000; var vector : array[1..n] of integer; s : array[1..n] of real; i : integer; n, m : string; f1,f2 : text; begin writeln('полное имя исходного файла ...'); readln(n); writeln('файл для записи результатов обработки ...'); readln(m);
{Подготовка файла к чтению} assign(f1,n); {$I-}
{Отключить контроль ошибок ввода-вывода} reset(f1);
{$I+}
{Включить контроль ошибок ввода-вывода} if IOresult <> 0 then
begin writeln('файла с именем ',n,' не существует'); halt end; {Подготовка файла к записи} assign(f2,m); rewrite(f2); {Чтение элементов массива из файла} while not eof(f1) and (i <= n) do begin read(f1,vector[i]); inc(i) end; close(f1); {Обработка элементов массива VECTOR} for i:=1 to n do begin s[i]:=vector[i]/vector[n-i+1]; {Вывод результата на экран} write(s[i]:8:3); {Вывод результата в файл} writeln(f2,s[i]) end; close(f2); end. Пример 2 (работа с типизированным файлом: чтение всех элементов файла PROBA.DTA и вывод их на экран) program red-sim; type dat = record day:1..31; month:1..12; year:1963..1992 end; var gr : dat; fdat : file of dat; begin assign (fdat,"A:PROBA.DTA"); reset (fdat); repeat with gr do readln(fdat,day,month,year); with gr do writeln('День рождения: ',day,'.',month,'.',year,' г.'); until eof(fdat);
close (fdat); end. Пример 3 (работа с нетипизированным файлом: программа быстрого копирования файлов) program f_copy; var f1, f2 : file; n_r, n_w : word; buf : array [1..2048] of char; f_r, f_w : string; begin writeln('полное имя исходного файла ...'); readln(f_r); writeln('файл для записи копии ...'); readln(f_w); assign(f1, f_r);
{открыть исходный файл}
reset(f1);
{длина записи 1 байт}
assign(f2, f_w); rewrite(f2, 1);
{открыть файл-копию} {длина записи 1 байт}
writeln(filesize(f1),'байт копируется из',f_r,'в',f_w); repeat blockread(f1, buf, sizeof(buf), n_r); blockwrite(f2, buf, n_r, n_w); until (n_r = 0) or (n_w <> n_r); close(f1); close(f2) end. 6.7. Контрольные вопросы и варианты индивидуальных заданий Ответьте на следующие вопросы. 1. Можно ли, считав из файла пятый элемент, затем сразу же считать второй? А какой можно? 2. В какое место файла можно добавлять элементы: в начало, в середину, в конец, куда угодно, никуда? 3. Можно ли сравнивать файлы или присваивать один файл другому? 4. Корректен ли следующий фрагмент? Var a: text; b: file of integer; c: file; .
.
.
............
assign (a,"A:PROBA.DTA"); assign (b,"A:PROBA.DTA"); assign (c,"A:PROBA.DTA"); Используя программу creat, создайте массив случайных чисел. Задайте несколько вариантов параметров (диапазон и количество чисел) и создайте несколько файлов. Обработайте файл в соответствии с заданием. program creat; type tma=0..10000; var KOT:file of tma;
i,koln:integer;
t,ga,gb :tma;
fname:string[12];
begin write('Введите количество генерируемых чисел : ');readln(koln); writeln('Введите диапазон для генерируемых чисел : '); write(' Левая граница (>=0) -> ');readln(ga); write(' Правая граница (<=10000) -> ');readln(gb); write('Имя файла для записи чисел : ');read(fname);writeln(' .'); assign(KOT,fname); rewrite(KOT);randomize; for i:=1 to koln do begin t:=random(gb-ga)+ga; write(KOT,t); if i mod 10 = 0 then write(' ',i,#$d); end; close(KOT); writeln(' ',i);writeln('Файл сформирован.'); end. Варианты заданий 1. Среди элементов найти два самых маленьких элемента. 2. Найти среднее арифметическое элементов. 3. Среди элементов найти два самых больших элемента. 4. Построить гистограмму частот попадания элементов в интервалы 1..1000, 1001..2000,..., 9001..10000. Сделать шаг меньше. 5. Найти среднее арифметическое для максимального и минимального элементов файла. 6. Для чисел, находящихся в диапазоне от a до b (0 < a < b < < 10000), найти сумму. 7. Среди чисел, стоящих на 3, 6, 9,..., 3k,... местах, найти максимальное. 8. Найти среднее геометрическое элементов. 9. Среди чисел, кратных 3-м найти минимальное. 10. Найти среднее арифметическое для чисел, стоящих с N по M место в файле. 11. Проверить, найдется ли в файле десять чисел, кратных 118.
12. Найти количества чисел 0, 1, 2,..., 9 в файле. Посчитать процентное соотношение между ними. 13. Найти минимальное для чисел, стоящих с N по M место в файле. 14. Проверить, найдется ли в файле двадцать разных чисел, кратных 27.(!) 15. Проверить, каких чисел в файле больше: четных или нечетных. 16. Сравнить суммы чисел, стоящих на четных и нечетных местах. 17. Для чисел, находящихся в диапазоне от a до b (0 < a < <
b < 10000), найти коли-
чество кратных 3, 2, 5 и 7. 18. Найти количество простых чисел в файле. 19. Для чисел, находящихся в диапазоне от a до b (0 < a < <
b < 10000), найти сумму
и среднее геометрическое элементов. 20. Найти количество чисел с 2-мя и 3-мя нулями в конце числа. Примечание. Задача должна быть решена за одно обращение к файлу.
СОДЕРЖАНИЕ 1. ВВЕДЕНИЕ ..........................................................................................................................................3 2. РЕГУЛЯРНЫЙ ТИП.............................................................................................................................3 2.1. ОБЪЯВЛЕНИЕ И ИСПОЛЬЗОВАНИЕ МАССИВОВ В PASCAL-ПРОГРАММЕ ...................................... 3 2.2. ПРИМЕРЫ ПРОГРАММ С МАССИВАМИ .............................................................................. 4 2.3. КОНТРОЛЬНЫЕ ВОПРОСЫ И ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ..................................... 5 3. СТРОКОВЫЙ ТИП ..............................................................................................................................6 3.1. СТРОКИ СИМВОЛОВ .................................................................................................... 6 3.2. СРАВНЕНИЕ СТРОК ..................................................................................................... 8 3.3. ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ СО СТРОКАМИ ......................................................... 9 3.4. КОНТРОЛЬНЫЕ ВОПРОСЫ И ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ..................................... 9 4. МНОЖЕСТВЕННЫЙ ТИП ................................................................................................................. 10 4.1. ОБЪЯВЛЕНИЕ И ИСПОЛЬЗОВАНИЕ МНОЖЕСТВ В PASCAL-ПРОГРАММЕ ......................................10 4.2. КОНТРОЛЬНЫЕ ВОПРОСЫ И ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ....................................12 5. КОМБИНИРОВАННЫЙ ТИП ДАННЫХ .......................................................................................... 14 5.1. ОПИСАНИЕ КОМБИНИРОВАННОГО ТИПА .........................................................................14 5.2. СИНТАКСИЧЕСКИЕ ДИАГРАММЫ КОМБИНИРОВАННОГО ТИПА ...............................................14 5.3. ПРИМЕРЫ ОПРЕДЕЛЕНИЙ ............................................................................................15 5.4. ЗАПИСИ С ВАРИАНТАМИ .............................................................................................16 5.5. ОПЕРАТОР ПРИСОЕДИНЕНИЯ .........................................................................................18 5.6. ПРИМЕР ПРОГРАММЫ .................................................................................................19 5.7. КОНТРОЛЬНЫЕ ВОПРОСЫ И ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ....................................21 6. ФАЙЛОВЫЙ ТИП.............................................................................................................................. 23 6.1. ФАЙЛЫ И ИХ ОПИСАНИЯ. ФАЙЛОВЫЕ ПЕРЕМЕННЫЕ ...........................................................23 6.2. ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ ВСЕХ ВИДОВ ...........................................24 6.3. ТЕКСТОВЫЕ ФАЙЛЫ ...................................................................................................25 6.4. ТИПИЗИРОВАННЫЕ ФАЙЛЫ ..........................................................................................26 6.5. НЕТИПИЗИРОВАННЫЕ ФАЙЛЫ .......................................................................................26 6.6. ПРИМЕРЫ ПРОГРАММ .................................................................................................27 6.7. КОНТРОЛЬНЫЕ ВОПРОСЫ И ВАРИАНТЫ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ....................................29
ЛИТЕРАТУРА 1. Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И. Задачи по программированию. - М.: Наука, 1988. 2. Абрамов С.А., Зима Е.В. Начала программирования на языке Паскаль. - М.: Наука, 1987. 3. Зуев Е.А. Программирование на языке Turbo Pascal 6.0, 7.0. - М.: Веста, Радио и связь, 1993. 4. Перминов О.Н. Программирование на языке Паскаль - М.: Радио и связь, 1988. 5. Пильщиков В.Н. Сборник упражнений по языку Паскаль. - М.:Наука, 1989. 6. Тумасонис В., Дагене В., Григас Г. Паскаль. Руководство для программиста: Справочник. - М.: Радио и связь, 1992. 7. Фаронов В.В. Основы Турбо-Паскаля. - М.: Учебно-инженерный центр "МВТУ-ФЕСТО ДИДАКТИК", 1992.
Составители: Батхин Александр Борисович Мирецкий Игорь Юрьевич
РАБОТА С СОСТАВНЫМИ ТИПАМИ ДАННЫХ В СИСТЕМЕ TURBO PASCAL
Методические указания для студентов 1 и 2 курсов специальности "Прикладная математика"
Редактор Валентай С.И. Технический редактор Турченкова И.И.
Подписано в печать _______________. Формат _______________ . Бумага типографская N1. Гарнитура Таймс. Усл. печ. л._____. Тираж _______. Заказ ________.
Издательство Волгоградского государственного университета 440062, Волгоград, ул. 2-я Продольная, 30.