Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа N 7.
Подпрограмма-процедура.
Цель и задача работы: изучить работу с подпрограммами-процедурами. Реализовать программу лабораторной работы номер 5 с подпрограммой-процедурой, например ввод в одной подпрограмме-процедуре, вывод в другой подпрограмме-процедуре, а обработка в третьей подпрограмме-процедуре. Обрабатываемые данные передаются в подпрограмму-процедуру и возвращаются оттуда через параметры.
Теоретические положения.
Идея подпрограмм состоит в том, что решение любой задачи можно разбить на последовательность решений подзадач и т.д., например, упорядочение компонент вектора по убыванию, решение систем линейных алгебраических уравнений, ввод/вывод данных (что часто используется при написании больших программ со сложным вводом/выводом), то имеет смысл выделить его в отдельный модуль называемый подпрограммой-процедурой. От этого программа становится более наглядной и компактной.
Описание подпрограммы-процедуры начинается с ключевого слова PROCEDURE за которым следует имя подпрограммы-процедуры. Подпрограммы-процедуры подразделяются на подпрограммы-процедуры без параметров и на подпрограммы-процедуры с параметрами. Если описывается подпрограмма-процедура с параметрами, то после имени процедуры в круглых скобках указывают формальные параметры.
Формат описания подпрограммы-процедуры:
описание-процедуры = "PROCEDURE" идентификатор ";" ! "PROCEDURE" идентификатор "(" секция-формальных-параметров (* "," секция-формальных-параметров *) ")" ";"
секция-формальных-параметров = список-параметров ! "VAR"
список-параметров ! "FUNCTION" список-параметров ! "PROCEDURE" идентификатор (* ";" идентификатор *)
список-параметров = идентификатор (* "," идентификатор *) ":" идентификатор-типа.
Пример описания подпрограммы-процедуры с параметрами:
PROCEDURE MAX(A, B: REAL; VAR C: REAL);
BEGIN
IF (A>=B)
THEN C:=A
ELSE C:=B;
END;
формальные параметры делятся на параметры-переменные и параметры-значения.
Обращение к подпрограмме-процедуре происходит путем написания имени процедуры, а в круглых скобках непосредственно за именем список фактических параметров, если процедура с параметрами.
Формат обращения:
оператор-процедуры = идентификатор-процедуры [ список-фактических-параметров ]
идентификатор-процедуры = идентификатор
список-фактических-параметров = "(" фактический-параметр (* "," фактический-параметр *)
фактический-параметр = (выражение!переменная!идентификатор процедуры!идентификатор-функции).
Некоторые требования, предъявляемые к фактическим параметрам:
- число фактических параметров должно быть равно числу формальных параметров;
- соответствие между фактическими и формальными параметрами устанавливается путем их сопоставления слева направо в соответствующих списках: первый формальный параметр ставится в соответствие первому фактическому параметру и т.д.
- тип каждого фактического параметра должен соответствовать типу формального параметра;
- при задании каждого очередного фактического параметра надо особенно внимательно следить за тем, что представляет собой в процедуре соответствующий ему формальный параметр - значение или переменную.
Если в подпрограмме-процедуре используются параметры-значения, то в подпрограмму передаются сами значения, если же используются параметры-переменные, то в подпрограмму передаются адреса параметров-переменных. Отсюда видно, что параметры в подпрограмме-процедуре могут быть входными, выходными и входными-выходными. Параметр-значение описывается без ключевого слова VAR, а параметр-переменная с ним. В нашем примере A и B - параметры-значения (входные параметры), а C - параметр-переменная (выходной параметр).
Используемые в подпрограмме-процедуре переменные могут быть формальными, локальными или глобальными переменными. Формальные переменные - это переменные, перечисленные в списке формальных параметров. Локальные переменные - это переменные, которые описаны внутри подпрограммы-процедуры и не являются формальными переменными. Глобальныме переменные - это переменные, описанные вне тела подпрограммы-процедуры, имеют тот же смысл, который они имеют к моменту входа в подпрограмму-процедуру. Если в подпрограмме-процедуре встретилась переменная, то она считается формальным параметром, если это не так, то считается, что это локальная переменная, если это не так, то считается, что это глобальная переменная, иначе выдается сообщение, такая-то переменная не описана.
Лабораторная работа N 8.
Подпрограмма-функция.
Цель и задача работы: изучить работу с подпрограммой-функцией. Реализовать программу лабораторной работы номер 2 с подпрограммой-функцией, например, ввод и вывод в соответствующих подпрограммах-процедурах, а обработка в подпрограмме- функции. Обрабатываемые данные передаются подпрограмме-функции через параметры.
Теоретические положения.
Все, что было сказано в предыдущей лабораторной работе о подпрограммах-процедурах, также относится и к подпрограммам-функциям.
Но характерное отличие между ними заключается в том, что само имя подпрограммы-функции может возвращать некоторый результат. В связи с этим отличаются описание подпрограммы-функции от описания подпрограммы-процедуры и способ обращения к ней.
Описание подпрограммы-функции начинается с ключевого слова FUNCTION, за которым идет имя подпрограммы-функции, вслед за именем в круглых скобках формальные параметры, если подпрограмма-функция с параметрами, потом ставится двоеточие и пишется тип возвращаемого значения. В языке программирования Паскаль допустимы подпрограммы- функции, возвращаемые значения которых относятся к простым типам, т.е. значением функции не может быть, например, массив. При описании под- программы-функции в ее теле должен присутствовать хотя бы один оператор присваивания, в левой части которого фигурирует имя описываемой подпрограммы-функции, причем хотя бы один оператор такого вида должен быть выполнен.
Формат описания подпрограммы-функции:
описание-функции = "FUNCTION" идентификатор ":" тип-результата ";" ! "FUNCTION" идентификатор "(" секция-формальных-параметров (* ";" секция-формальных-параметров *) ")" ":" тип-результата ";"
тип-результата = идентификатор-типа.
Так как подпрограмма-функция возвращает некоторое значение, то при обращении к подпрограмме-функции указывается ее имя (в круглых скобках фактические параметры, если они необходимы), например, в правой части оператора присваивания, в условном операторе при записи условия или при передаче в подпрограмму (функция или процедура) в виде фактического параметра, которому соответствует только формальный параметр-значение и т.д.
Формат обращения к подпрограмме-функции:
указатель-функции = идентификатор-функции [список-фактических- параметров]
идентификатор-функции = идентификатор.
Пример описания подпрограммы-функции:
FUNCTION FACT(N: INTEGER): INTEGER;
VAR L, K: INTEGER;
BEGIN
K:=1;
FOR L:=2 TO N DO K:=K*L;
FACT:=K;
END;
Лабораторная работа N 9.
Рекурсивные функции и процедуры.
Цель и задача работы: научиться описывать и использовать рекурсивные функции. Написать программу, обрабатывающую данные рекурсивным способом.
Теоретические положения.
Использование идентификатора функции (процедуры) в теле самой функции (процедуры) называется рекурсивным обращением к функции(процедуре) или рекурсией.
Рекурсия применяется в основном тогда, когда природа самой решаемой задачи рекурсивна. Как правило это различные комбинаторные задачи, решаемые полным или неполным перебором; деревья, уже само их определение через поддеревья (которые, в свою очередь, сами являются деревьями) подчеркивает их рекурсивную природу и многие другие задачи.
Рекурсивные функции можно понять на примере факториала - функция F(N)=N! эту функцию можно определить по размеру, в том числе и рекурсивно:
N!=
1, при N=0
N*(N-1)!, при N>0
Отсюда видно, что N! определяется через N*(N-1)!, т.е. через эту же самую функцию, но для предыдущего значения аргумента.
Язык программирования Паскаль разрешает рекурсивное писание функций. Особенность рекурсивного описания функции состоит в том, что в теле функции содержится обращение к этой же описываемой функции.
Факториал вычисляется только от натуральных чисел, т.е. чисел больше или равных нулю, и обязательно целых.
Пример описания функции:
TYPE NATUR=0..MAXINT;
FUNKTION FACT(N: NATUR): NATUR;
BEGIN
IF (N=0)
THEN FACT:=1
ELSE FACT:=N*FACT(N-1);
END;
Рассмотрим процесс вычисления рекурсивной функции. Пусть, например, вызываем функцию в виде FACT(3). При входе в функцию локальной переменной N присваивается значение равное 3. (N=3)
Т.к. N<>0, то выполняется оператор FACT:=3*FACT(2); в правой части стоит вызов функции FACT(2), то происходит обращение к функции FACT с параметром 2. Теперь вводится уже новая переменная N, чтобы подчеркнуть это, обозначим ее как N1. (N1=2) Т.к. N1<>0, то выполняется оператор FACT:=2*FACT(1); в правой части стоит вызов функции FACT(1), то происходит обращение к функции FACT с параметром 1. Опять вводится новая переменная N2 и ей присваивается значение 1. (N2=1)
Т.к. N2<>0, то выполняется оператор FACT:=1*FACT(0); опять происходит обращение к самой себе (заметим, что каждый раз откладывается завершение вычисления в правой части). Теперь N=0, и происходит присваивание FACT:=1; по получении данного результата завершается выполнение оператора FACT:=1*FACT(1); что дает FACT(1), далее завершается выполнение оператора FACT:=2*FACT(1); что дает FACT(2),далее завершается выполнение оператора FACT:=3*FACT(2); что дает конечный результат FACT(3)=6.
Рекурсивные функции короче и нагляднее, чем нерекурсивные, нона их выполнение затрачивается больше машинного времени (за счет повторных обращений к функции) и памяти (за счет увеличения локализованных в функции переменных (в данном случае N, N1, N2)).
Варианты заданий:
1) Вычислить X в степени Y путем многократного умножения (X, Y: INTEGER)
2) Написать функцию C(M,N), где 0<=M<=N, для вычисления биноминальных коэффициентов: C(M,N)=N!/(M!*(N-M)!)
3) Написать рекурсивную функцию PIN(X,N) от вещественного X (X<>0) и целого N, которая вычисляет величину X^N согласно формуле:
X^N=
1 , при N=0
1/X^N , при N<0
X*X^(N-1) , при N>0
4) Описать рекурсивную функцию ROOT(F,A,B,EPS), которая методом деления отрезка пополам находит с точностью EPS>0 корень уравнения F(X)=0 на отрезке [A,B] (считать, что A<B, F(A)<F(B) и F(X)- непрерывная и монотонная функция на отрезке [A,B]
5) Задана последовательность символов, описать функцию проверяющую, является ли симметричной последовательность символов в этой последовательности, начиная с I-того и кончающегося на J-том элементе
6) Задана последовательность вещественных чисел, описать функцию которая ищет минимальный элемент в этой последовательности
7) Дана последовательность из N целых чисел, N+1 элемент которой равен нулю (последовательность не содержит больше нулей кроме этого). Напечатать сначала все отрицательные числа этой последовательности, а затем - все положительные (в любом порядке) 8) Дано N различных натуральных чисел. Напечатать все перестановки этих чисел.
9) Задача о 8 ферзях: на шахматной доске расставить 8 ферзей так, чтобы они не "били" друг друга
10) "Ханойская башня". Имеются три колышка A,B,C и N дисков разного диаметра на A, пронумерованных от 1 до N в порядке возрастания из размеров. Требуется перенести все диски с колышка A на колышек C, соблюдая при этом следующие условия : диски можно пере- носить только по одному, больший диск нельзя ставить на меньший
11) Вычислить рекурсивно функцию вида
у=COS(X)+COS(X^2)+COS(X^3)+...+COS(X^N)
12) Вычислить N-ое число ряда Фибоначчи
13) Найти количество цифр заданного числа
14) Найти сумму цифр заданного числа
15) Вычислить интеграл от А до В функции F(X)=1/(0.5-E^X), при заданных А и В.
16) Задано целое число N, записать его цифры в обратном порядке и вывести его на экран дисплея, как целые число
17) Определить, является ли заданная строка "правильной записью целого числа" (возможно со знаком). Число вводить посимвольно
18) Написать функцию, заменяющую оператор MOD, т.е. запись в виде "L:=X MOD Y;" заменить на "L:=MD(X,Y);" (оператор MOD не использовать)
19) Написать функцию, заменяющую оператор DIV, т.е. запись в виде "L:=X DIV Y;" заменить на "L:=DV(X,Y);" (оператор DIV не использовать)
20) Перевести целое число из одной системы счисления в другую
21) Задано N чисел, описать функцию, находящую в этой последовательности максимальный элемент.
22) Составить программу сортировки по возрастанию одномерного массива из N элементов. Использовать рекурсию.
23) Обойти шахматную доску конем, побывав в каждой клетке, но не более одного раза.
24) Лабиринт задан двумерным массивом. Из левого верхнего угла лабиринта пройти в правый нижний. Массив задается вводом. Элементы, по которым можно пройти, обозначаются "1", а по которым нельзя проходить - "0". Если проход возможен, то координаты каждого шага вывести на экран. Если пройти нельзя, то выдать соответствующее сообщение. Проход по диагонали невозможен.
25) Вычислить функцию Y=SIN(X), разложенную в степенной ряд, с заданной степенью точности.
26) Из состава участников конференции, на которой присутствует N человек. Надо избрать делегацию, состоящую из M человек. Сколькими способами это можно сделать?
27) Вывести на экран все возможные способы расстановки белых фигур (два коня, два слона, две ладьи, ферзь и король) на первой линии шахматной доски.
28) Найти кол-во чисел меньше числа N (1000<N<100000), составленных из цифр A, B, C.
29) Какое максимальное число коней можно расставить на шахматной доске, при условии, что они не будут бить друг друга ?
30) Вычислить функцию Y=LN(X), разложенную в степенной ряд, с заданной степенью точности.
Лабораторная работа N 10.
Тип запись.
Цель и задача работы: изучить тип запись. Рассмотрение понятия запись.
Теоретические положения.
Тип запись - это один из наиболее гибких и удобных механизмов построения структур данных самой произвольной природы. Значение этого типа состоит из нескольких компонент, но, в отличие от массива, эти компоненты могут иметь различные типы, и доступ к ним осуществляется не по индексам, а по именам. Значение этого типа обычно называют - записью.
Записью является структура данных, содержащая фиксированное (для данного типа записи) число компонент, называемых полями.
Каждому полю записи дается имя и задается тип этого поля. На тип ограничений не накладывается, т.е. полем записи в свою очередь может являться тоже запись.
Формат описания:
тип-RECORD = "RECORD" список-полей "END"
список-полей = [фиксированная-часть][вариантная-часть]
фиксированная-часть = секция-записи (* ";" секция-записи *)
секция-записи = идентификатор-поля (* "," идентификатор-поля *) ":" тип
идентификатор-поля = идентификатор
вариантная-часть = "CASE" [поле-признака ":"] идентификатор "OF" вариант (* ";" вариант *)
поле-признака = идентификатор
вариант = метка-случая (* "," метка-случая *) ":" [ "(" список-полей ")" ]
метка-случая = константа.
Пример описания переменной, являющейся комплексным числом:
TYPE COMPL=RECORD
RE, IM: REAL;
END;
VAR A, B: COMPL;
Это описание говорит, что создана структура данных (тип) COML, являющийся записью, состоящей из двух полей с именами RE и IМ и имеющих тип REAL. Переменная A является переменной типа COMPL.
Чтобы присвоить значение переменной A, нужно присвоить значения обоим полям записи. Для ссылок на поля записи используются переменные вида:
<составное имя переменной>.<Имя поля>
Например, требуется A присвоить 5.68-I7.32
A.RE:=5.68;
A.IM:=7.32;
Для переменных одного и того же типа записи в языке программирования Паскаль предусмотрено только присваивание: B:=A; более сложным является тип запись в котором поля являются так- же типом записи.
Пример:
TYPE ST=RECORD
FIO: RECORD
F, I, O: PACKED ARRAY [1..15] OF CHAR;
END;
GR: INTEGER;
END;
VAR STUDENT: ST;
STUDENT.FIO.F:='Сычев ';
STUDENT.FIO.I:='Владимир ';
STUDENT.FIO.O:='Станиславович ';
STUDENT.GR:=2114;
При работе с записями обращение к ее элементам приводит к на- писанию достаточно длинных имен, причем имена могут повторятся. Например в нашем случае 4 раза был написан идентификатор STUDENT и 3 раза FIO. Для сокращения таких имен в Паскале введен специальный оператор присоединения.
WITH R DO S, Где R - переменная типа запись, S - любой оператор языка формат оператора:
оператор-WITH = "WITH" список-переменным-записи "DO" оператор
список-переменная-записи = переменная-запись (* "," переменная- запись *)
переменная-запись = идентификатор.
С использованием этого оператора присваивания можно выполнить в виде:
WITH STUDENT DO BEGIN
WITH FIO DO BEGIN
F:='сычев ';
I:='владимир ';
O:='станиславович ';
END;
END;
Вариант заданий:
1) TYPE масть=(пик,трефы,бубны,червы);
достоинство=(шесть,семь,восемь,девять,десять,валет,дама,король, туз);
карта=RECORD
M: масть;
Д: достоинство;
END;
Описать логическую функцию KICK(K1,K2,KM), проверяющую, "бьет" ли карта K1 карту K2, с учетом того, что масть KM является ко- зырной
2) TYPE LINE=PACKED ARRAY [1..15] OF CHAR;
PIC=RECORD
NAME:LINE;
PIC:1000..9999;
END;
SPISOK=ARRAY [1..30] OF PIC;
Описать процедуру, печатающую название самой высокой вершины из списка
3) TYPE POINT1=ARRAY [(X,Y)] OF REAL;
POINT2=RECORD
X, Y: REAL;
END;
VAR P1: POINT1; P2: POINT2; D: REAL;
Переменной D присвоить расстояние между точками P1 и P2.
4) Описать переменную "студент", содержащую: имя, фамилию, отчество студента, название учебного заведения, номер группы. Создать список студентов (N>10). Определить фамилии студентов, учащихся в одной и той же группе, в одном и том же заведении
5) Описать переменную "адрес", содержащую: название города, название улицы, номер дома, корпус, номер квартиры. Создать массив адресов. Поменять местами номер дома в N-ом адресе и номер квартиры в M-ом адресе
6) Описать переменную "студент" (см. Вариант 4). Создать список студентов (N>10). Определить названия учебных заведений в которых учатся однофамильцы и если у них одинаковые имена, то сообщить, что они тезки
7) Описать переменную "служащий", состоящую из: имени, фамилии, отчества служащего, даты рождения, полученного образования, домашнего адреса, профессии. Создать список служащих (N>10). Определить имена людей с высшим образованием. Выдать данные о служащем, который имеет ту или иную профессию.
8) Описать переменную "круг", в которой содержатся все данные для построения круга в декартовой системе координат. Определить площадь и длину окружности круга 9) Описать комплексное число. Умножить одно число на другое
10) Описать переменную "экзаменационная ведомость" (предмет, номер группы, список студентов данной группы, их оценки). Определить отличников, хорошистов, троечников и двоечников
11) Создать записи определяющие положение точки в декартовой и в полярной системах координат. Описать процедуру, преобразующую координаты точки на плоскости из декартовой в полярные
12) Создать записи определяющие положение точки в декартовой и в полярной системах координат. Описать процедуру, преобразующую координаты точки на плоскости из полярных в декартовые
13) Создать список студентов в группе. Определить средний рост и вес студентов
14) Даны комплексное число Z (пара вещественных чисел) и вещественное число EPS>0. Вычислить с точностью EPS значение следующей комплексной функции: E^Z=1+Z/1!+Z^2/2!+Z^3/3!+...+Z^N/N!
15) Найти корни квадратного трехчлена с заданными комплексными коэффициэнтами
16) Создать запись (см. Вариант 6). Упорядочить список по алфавиту пофамильно
17) Создать запись (см. Вариант 6). Упорядочить список по алфавиту по возрастанию номеров групп
18) Задать переменную круг (см. Вариант 8). Определить в каких четвертях плоскости лежит данная окружность. В какой четверти лежит ее большая часть
19) Задать две переменные круг (см. Вариант 8). Определить пересекаются ли две окружности, если да, то определить точки (точку) пересечений
20) TYPE COMPL=RECORD
RE, IM: REAL;
END;
COEF=RECORD
A, B, C: COMPL;
END;
VAR P: COEF; X, L: COMPL;
Определить процедуру, которая вычисляет значение квадратного трехчлена AX^2+BX+C с коэффициэнтами из P в комплексной точке X
21) Описать рациональные числа (поля содержат числитель и знаменатель)
22) Задана последовательность вещественных чисел. Создать переменную, поля которой содержат:
а) последовательность положительных элементов и их количество
б) количество нулевых элементов
в) последовательность отрицательных элементов и их количество
23) TYPE TIME=RECORD
H:0..23;
M,S:
END;
VAR T1, T2: TIME;
Описать логическую функцию предшествует ли время T1 времени T2
24) TYPE TIME=RECORD
H:0..23;
M,S:
END;
VAR T1, T2: TIME;
Описать процедуру, которой вычислять время между T1 и T2
25) Вычислить квадратный корень из комплексного числа.
26) Описать переменную "расписание", содержащую:
1. День недели
2. Кол-во пар в этот день
3. Время начала и конца пары
4. Название предмета
5. Фамилия преподавателя
27) Описать переменную "валюта", содержащую:
1. Название страны
2. Название валюты
3. Достоинство купюры
4. Номерной знак (серия и номер)
28) Описать переменную "автомобиль", с полями:
1. Марка машины
2. Ф. И. О. владельца
3. Номерной знак
29) В библиотеке имеются: книги, газеты, журналы. Для каждого печатного издания указать:
1. Название
2. Год выпуска (для книги), дату выпуска (для газет и журналов)
3. Автора (для книги), редактора (для газеты), редколлегию (для журнала)
4. Объем (при описании переменной использовать оператор CASE)
30) Составить таблицу, содержащую данные о 20 участниках забега, включающую в себя : фамилию участника, время (в часах, минутах и секундах). Выбрать три лучших результата и вывести на экран фамилии и время призеров.
31) Расположить в порядке возрастания произвольную последовательность игральных карт (масти возрастают в порядке : бубны, червы, винны, трефы) с учетом козырной масти.
32) Описать переменную "квартира", для которой указать:
1. Кол-во комнат
2. Названия комнат
Для каждой комнаты :
1. Площадь
2. Кол-во мебели
Для каждого эл-та мебели :
1. Его стоимость
2. Название
3. Материал
Лабораторная работа N 11.
Файлы. Работа с текстом.
Цель и задача работы: научиться работать с файлами и обрабатывать данные, находящиеся в них. Требуется написать программу, считывающую данные из текстового файла; затем данные записываются в файл прямого доступа (компоненты файла являются целого или вещественного типа (если входные данные символы, то сначала нужно перевести их в коды, а потом записать в файл)); обработать данные (использовать прямой доступ к компонентам файла) и записать результат в текстовый файл.
Теоретические положения.
Существует определенный класс задач и определенные ситуации, когда количество компонент заранее определить невозможно, оно выясняется только в процессе решения задачи, т.е. при выполнении программы. Отсюда возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и того же типа, причем длина этой последовательности заранее не определена. Этот тип получил название файлового. Файл можно представить как ленту, у которой есть начало, а конец не фиксирован. Элементы файла записываются на ленте друг за другом.
Формат описания:
тип-FILE = "FILE" "OF" тип.
Файл - это такое устройство, с помощью которого программа общается с внешним миром, поэтому имена таких файлов (имена переменных, связанных с файлом) вносят в список, который следует за именем программы, где указываются также стандартные имена файлов ввода/ вывода. Для связи имени файла с файловой переменной служат процедуры
RESET (для чтения из файла) и REWRITE (для записи в файл). Параметры у данных процедур одинаковы. Первый параметр обязательный и является именем файловой переменной. Второй параметр - имя внешнего файла, с которым должна быть связана переменная файлового типа. Этот параметр может быть строкой, литералом или переменной. Третий дополнительный параметр является строкой, он обеспечивает задание любых полей спецификации файла, опущенных в имени файла. Четвертый дополнительный параметр возвращает размер файла в блоках при выполнении процедуры RESET или указывает число блоков, предварительно вы- деленных файлу при выполнении процедуры REWRITE. Четвертый параметр может быть переменной целого типа, кроме того, он возвращает код состояния, равный -1, если файл не может быть открыт.
Стандартные процедуры RESET и REWRITE допускают дополнительные аргументы - ключи управления вводом/выводом, которые обеспечивают непосредственное управление интерфейсом с операционной системой. Эти ключи располагаются во втором или третьем дополнительном пара- метрах. Имя ключа может быть сокращено до двух символов. Ниже при- веден полный перечень ключей.
/BLK (BLOCKED) - записи в файле не должны пересекать границ блока на диске. Этот ключ принимается по умолчанию для файлов записей.
/SPAN, /NOSPAN (SPANNED) - записи в файле могут пересекать границу блока на диске. Ключ принимается по умолчанию для текстовых файлов.
/ALOC:N, /CL:N (ALLOCATION или CLUSTERSIZE) - параметр N определяет количество блоков, выделяемых при расширении файла. Если N>0, то выделяются смежные блоки, иначе - несмежные.
/SI:N (SIZE) - используется в процедуре REWRITE и определяет начальный обуем памяти (в блоках), выделяемых под файл. Если N>0 - выделяются смежные блоки, иначе - несмежные.
/CR (CARRIAGE CONTROL) - записи в файле при печати начинаются сим- волом перевода строки (LF) и завершаются символом возврата каретки (CR). Этот ключ принимается по умолчанию для текстовых файлов.
/NOCR (NO CARRIAGE CONTROL) - принимается по умолчанию для всех файлов кроме текстовых.
/FTN (FORTRAN CARRIAGE CONTROL) - первый символ каждой записи является символом управления кареткой и интерпретируется в соответствии с правилами, принятыми в языке Фортран.
/RO (READ-ONLY) - файл только для чтения. Принимается по умолчанию для всех файлов, открытых процедурой RESET.
/RW (READ-WRITE) - файл как для чтения, так и для записи. Принимается по умолчанию для файлов открытых процедурой REWRITE.
/SEEK (DIRECT ACCESS) - файл прямого доступа. При использовании этого ключа разрешается использовать стандартную процедуру SEEK.
/TEMP (TEMPORARY) - помечает файл, подлежащий удалению после выполнения процедуры CLOSE или после окончания работы программы. Если в процедуре REWRITE не было имени файла, то этот файл также будет помечет как временный.
/NSP (NO SUPERSEDE) - если файл открывается процедурой REWRITE и если уже существует файл с таким же именем, то будет выдано сообщение об ошибке.
/SHR (SHARE) - разрешает разделенный доступ к файлу нескольким пользователям.
Ключи, обеспечивающие доступ к внутренним средствам системы управления файлов:
/ACTL:N - N определяет количество указателей извлечений и характеристики позиционирования магнитной ленты.
/APD - указывает на то, что к существующему файлу можно добавлять записи
/EXT - указывает на то, что файл доступен для расширения
/INS - указывает на то, что процедура PUT в режиме последовательного доступа модифицирует запись без усечения файла. Если задан ключ /SEEK, то ключ /INS включается автоматически.
/WRT - определяет что файл доступен для записи.
/FIX:N - определяет файл с записями фиксированной длины (N байтов). Принимается по умолчанию если файл не текстовый.
/VAR:N - определяет файл с записями переменной длины (N максимальная длина записи в байтах). Для текстовых файлов по умолчанию принимается ключ /VAR:132.
/SQ - определяет файл с последовательными записями, номера записей недоступны для программы.
Предопределенная процедура CLOSE указывает, что файл, упомянутый в качестве параметра, больше не используется. Процедура освобождает память, выделенную под буфер, дальнейший доступ к файлу запрещается. Заметим, что файлы автоматически закрываются при завершении программы или когда они появляются в других процедурах RESET или REWRITE.
Для файлов прямого доступа используется процедура SEEK, которая обеспечивает прямой доступ к компонентам файла. Она имеет два пара- метра: файловую переменную и номер записи (записи в файле нумеруются последовательно, начиная с единицы). После вызова процедуры SEEK указанная запись, если она существует, становится доступной в буфер- ной переменной файла, иначе устанавливается признак конца файла EOF.
Процедура обеспечивает также доступ для чтения и записи в один и тот же файл, что позволяет непосредственно вносить изменения в записи файла на том же месте.
При чтении/записи для файлов нетекстовых типов используются процедуры GET(<имя файловой переменной>) и PUT(<имя файловой переменной>), где GET берет компоненту из файла, а PUT записывает компоненту в файл.
Пример: программа копирования файла COP.DAT;1 В файл COP1.DAT;1
PROGRAM CPY1(F1,F2,OUTPUT);
VAR F1, F2: TEXT; CH: CHAR; I: INTEGER;
BEGIN
RESET(F1, 'COP.DAT',';1',I); REWRITE(F2, 'COP1.DAT;1', '', I);
WHILE (NOT EOF(F1)) DO BEGIN
READ(F1, CH); WRITE(F2,CH);
END;
WRITELN(' Файл COP.DAT;1 Скопирован в файл COP1.DAT;1');
END.
Варианты заданий:
1) Убрать из текста лишние пробелы, т.е. там, где они встречаются больше одного раза, оставить один пробел
2) Подсчитать количество символов в заданном тексте
3) Подсчитать количество слов и число предложений (предложения оканчиваются точкой, слова разделяются запятыми)
4) Определить, какая буква чаще всего встречается в заданном тексте
5) Если строка начинается с цифры, то перед ней поставить левую круглую скобку, а в конец строки - правую круглую скобку
6) Подсчитать число цифр в данном тексте и их сумму
7) Перед каждым символом поставить порядковый номер в тексте
8) Определить переменную "студент", содержащую следующие поля: имя, фамилия, отчество студента, название института, номер группы. Данные считать из текстового файла. Вывести данные о студентах, которые учатся в одном и том же институте, и в одной группе.
9) Определить, входит ли заданное слово в текст. Если да, то сколько раз
10) Удвоить в тексте каждую литеру
11) Напечатать в алфавитном порядке все буквы, входящие в текст
12) Подсчитать сумму чисел записанных в тексте
13) В тексте записаны слова через пробел. Вывести их в алфавитном порядке
14) Напечатать самое длинное слово, найденное в тексте
15) Во всех словах заменить первую букву на последнюю, а последнюю на первую
16) Удалить из текста все последующие вхождения первой буквы
17) Оставить в слове только первые вхождения каждой буквы
18) Заданное число, от 1 до 1999, напечатать римскими цифрами XLVI и т.д.
19) Определить, является ли текст правильной записью римскими цифрами целого числа от 1 до 1999. Если да, то напечатать это число арабскими цифрами
20) Удалить из текста каждое N-е вхождение в него заданного символа
21) Удалить из текста каждое N-е вхождение в него заданного слова
22) Задан текст. Вывести этот текст, подчеркивая (ставя в следующей строке под этим символом минус) все входящие в него цифры
23) Определить, равны ли два заданных файла
24) Заменить заданное слово в тексте на другое слово
25) Определить строку максимальной длины и вывести ее.
26) Подсчитать, сколько раз в тексте встречается заданное слово.
27) Выбросить из текста заданный знак, где бы он не встречался.
28) Удалить из текста каждое четное предложение.
29) Отформатировать текст следующим образом: каждое предложение должно иметь свой порядковый номер; начинаться с красной строки.
30) Подсчитать, сколько раз в тексте встречается заданный знак.
31) Удалить из текста все предложения, в которых запятые встречаются более 2-х раз.
32) В тексте перед каждым предложением, в котором встречается за- данное слово, поставить восклицательный знак "!"
Лабораторная работа N 12.
Динамические переменные.
Цель и задача работы: научиться создавать, использовать и уничтожать динамические переменные (ссылки).
В данной работе требуется реализовать лабораторную работу номер 11 с помощью динамических переменных, т.Е. Сначала из файла считываются все данные в память, обрабатываются и оттуда записываются в файл.
Теоретические положения.
Использование при программировании статических объектов (объекты, порождаемые непосредственно перед выполнением программы, которые существуют в течении всего времени ее выполнения и размер значений которых (объем машинной памяти) не изменяется по ходу выполнения программы) может вызвать определенные трудности, особенно с точки зрения получения эффективной программы, а также эффективность бывает чрезвычайно важной при решении ряда задач. Дело в том, что иногда мы заранее (т.е. на этапе составления программы) не знаем не только размера значений того или иного программного объекта, но даже и того, будет ли нужен в той ситуации этот объект или нет. Такого рода программные объекты, которые возникают в процессе выполнения программы или размер которых определяется (или изменяется) при выполнении программы, называются динамическими объектами (или динамическими переменными).
В языке программирования Паскаль для работы с динамическими объектами предусмотрен специальный тип значений - так называемый ссылочный тип. Значением этого типа является ссылка на какой-либо программный объект, по которой осуществляется непосредственный доступ к этому объекту. На машинном языке такая ссылка как раз и представляeтся указателем места в памяти (адреса), соответствующего объекта.
В Паскале - с целью повышения надежности программ - в задании ссылочного типа обязательно должен фигурировать тип значений тех динамических программных объектов, на которые будут указывать переменные задаваемого ссылочного типа.
^ (или стрелка вверх) - признак ссылочного типа
формат описания:
тип-POINTER - "^" идентификатор-типа.
Для переменных ссылочного типа определены следующие процедуры:
NEW(P); - создает динамическую переменную P
DISPOSE(P); - уничтожает динамическую переменную P
В некоторых случаях возникает необходимость в качестве значения указателя принять ссылку, которая не связывает с данным указателем никакого объекта, т.Е. "Пустую ссылку" - NIL.