-6A82E~1
.PDF21
Type имя_типа = file of базовы_тип; Var имя_файла : имя_типа;
или
Var имя_файла : имя_типа;
В качестве базового типа элементов файла можно использовать любой тип данных, как стандартный, так и пользовательский, кроме типа file.
Текстовые файлы содержат некоторый текст, который состоит из некоторых символов, разбитых на строки различной длины. Описание текстовых файлов имеет следующий вид:
Type имя_типа = text;
Var имя_файла : имя_типа;
или
Var имя_файла : text;
Отличие текстового файла от файла типа char или string заключается в том, что текстовый файл состоит из последовательности строк различной длины, каждая из которых может содержать различные символы и цифры и заканчивается специальным символом конца строки.
4.5Некоторые стандартные процедуры и функции для работы с файлами
ВТурбо-Паскале для нахождения конца файла введена стандартная функ-
ция
eof(f):boolean; - когда достигнут конец файла, eof принимает значение true, в противном случае - false.
Работа с файлами производится посредством следующих стандартных процедур:
assign(F,'name'); - связывает имя переменной F в программе с именем внешнего файла на диске. Здесь 'name' - выражение строкового типа вида
'диск:\имя_каталога\имя_подкаталога\имя_файла'.
Если в параметре 'name' имена диска и подкаталога не указаны, то выбирается текущий диск и текущий каталог. Если вместо 'name' указать ''(без пробела), то файл F оказывается связанным со стандартным файлом ввода Input или со стандартным файлом вывода Output (в зависимости от того, как он будет открыт - для чтения или для записи). После выполнения процедуры assign все действия над переменной F будут эквивалентны действиям над файлом с именем name. Процедуру assign необходимо
22
использовать до начала работы с файлом (до его открытия процедурой reset
или rewrite).
reset(F); - открывает файл F для чтения. При этом указатель файла устанавливается на первый элемент файла и eof(F)=false. Если файл пустой, то eof(f)=true.
rewrite(F); - открывает новый файл для записи, при этом уничтожается вся предыдущая информация в F.
close(F); - закрывает файл F. Обязательно необходим, хотя бы в конце программы.
Ввод-вывод значений переменных в файлы осуществляется с помощью процедур
write(F, x1,...,xn) - запись в текстовый файл значений пере-
менных x1,...,xn;
read(F, x1,...,xn) - чтение из текстового файла значений пе-
ременных x1,...,xn;
Для работы с текстовыми файлами наряду с вышерассмотренными процедурами и функциями используются следующие стандартные процедуры:
eoln(F):boolean; - функция используется для определения конца строки текстового файла, принимает значение true, если достигнут конец строки, и - false, в противном случае.
append(F); - открытие уже существующего текстового файла F для добавления данных в конец файла;
writeln(F, x1,...,xn) - запись в текстовый файл значений переменных x1,...,xn с завершением текущей строки;
writeln(F) - завершение текущей строки (при записи); readln(F, x1,...,xn) - чтение из текстового файла значений
переменных x1,...,xn с завершением текущей строки; readln(F) - завершение текущей строки (при чтении).
23
5 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ МАССИВОВ
В Турбо-Паскале массивы относятся к сложным типам данных.
5.1 Описание массивов
Под массивом понимается упорядоченная совокупность конечного числа данных одного типа. Возможны два способа описания массивов:
1)type имя_типа=array[t1,t2,...,tn] of to; var имя_массива:имя_типа;
2)var имя_массива:array[t1,t2,...,tn] of to;
Здесь t1,t2,...,tn - типы индексов массива. Количество индексов n определяет размерность массива;
to - базовый тип элементов массива. Размерность n в Турбо-Паскале практически не ограничена.
Пример 1. Пусть в программе необходимо описать следующий двумерный массив (матрицу) M:
1 |
2 |
3 |
M |
7 |
|
6 |
2 |
1)
type Mas=array[1..2,1..3] of integer; var M:Mas;
2)
var M:array[1..2,1..3] of integer;
3) следующее описание будет неправильным:
var M:array[2,3] of integer;
В самой программе, задав конкретные значения индексов, можно выбрать конкретный элемент массива:
N:=M[2,3]; |
{т.е. N будет равно 2}. |
В качестве индексов массива могут использоваться и выражения, частным случаем которых являются константы и переменные:
p1:=M[2*i+1,3];
Пример 2. Опишем трехмерный массив:
var A:array[char,1..5,boolean] or real;
Тогда при использовании в программе элемента A[i,j,k] индексы i,j,k должны быть следующий типов: i - символьного; j - ограниченного; k - логического. Сами же элементы массива A – вещественного типа.
24
5.2 Особенности ввода-вывода массивов
Для ввода и вывода числовых значений массива используются циклы. Например, цикл
for i:=1 to 9 do read(A[i]);
организует ввод девяти значений элементов массива A, а цикл
for i:=1 to 9 do write(A[i]); - вывод этих элементов.
В Турбо-Паскале допускается использование массива в целом только в операторе присваивания вида
M1:=M2;
где M1, M2 - два однотипных массива одинаковой размерности.
Кроме переменных типа array Турбо-Паскаль позволяет также определять типизованные константы типа array (в разделе const). Общая форма описания таких констант имеет следующий вид:
type имя_типа=array[тип_индекса] of тип_элементов;
const имя_константы: имя_типа=(список_констант);
Пример 3. При описании константы типа "многомерный массив" константы каждой размерности (каждой строки в случае матрицы M из примера 1) заключается в отдельные скобки:
type Matr=array[1..2,1..3] of integer; const M: Matr((1,2,5),(6,7,2));
5.3 Упакованные массивы
Для работы со строками символов, а также с целью экономии памяти в Турбо-Паскале введено понятие упакованного массива, который имеет следующее описание:
var имя_массива: packed array[тип_индекса] of char;
Известно, что символьные переменные в Турбо-Паскале принимают значение только одного символа. Для работы со строками символов необходимо иметь массив символов.
Пример 4. Пусть имеется строка символов 'МТФ'. Эту строку символов можно считать массивом из трех символов. Опишем этот мас-сив следующим образом:
var Fac: packed array[1..3] of char;
Каждый элемент этого массива может принимать значение только одного символа:
Fac[1]:='М'; Fac[2]:='Т'; Fac[3]:='Ф'
Элементы упакованного массива используются в программе точно также, как и элементы неупакованного массива. Только памяти для упакованного массива будет автоматически выделяться меньше. Время работы программы при этом увеличивается.
Замечание: В данной работе рассматриваются массивы с постоянным числом элементов, которое фиксируется при описании массива и в дальнейшем не изменяется. В Турбо-Паскале возможно также использование динамических мас-
25
сивов (с нефиксированным числом элементов), что в данной работе не рассматривается.
5.4 Классические задачи обработки массивов
Задача №1
Найти максимальный элемент массива:
Program Poisk_Max;{poisk max element} Var A:array[1..10] of integer;
i,n,max:integer;
Begin Write('n=');Readln(n); Writeln('Vvedite massiv');
For i:=1 to n do Read(A[i]); max:=A[1];
For i:=1 to n do
if A[i]>max then max:=A[i]; Writeln('MAX element massiva =',max);
END.
Задача №2
Найти сумму элементов массива:
Program SUM_Mas;{summa element massiva} Var A:array[1..10] of integer;
i,n,sum:integer; Begin Write('n=');Readln(n); Writeln('Vvedite massiv');
For i:=1 to n do Read(A[i]); sum:=0;
For i:=1 to n do sum:=sum+A[i]; Writeln('Summa element massiva =',sum); END.
Задача №3
Отсортировать элементы массива по убыванию:
Program Sort;{sortirovka po ubyvaniyu} Var A:array[1..10] of integer;
i,j,n,temp:integer; Begin Write('n=');Readln(n); Writeln('Vvedite massiv');
For i:=1 to n do Read(A[i]); For i:=1 to n-1 do
For j:=2 to n do
if A[j-1]<A[j] then begin temp:=A[j]; A[j]:=A[j-1]; A[j-1]:=temp;
end;
Writeln('Result massiv');
For i:=1 to n do Write(A[i]:5); Writeln;
Readln;
END.
26
Задача №4
Найти минимальный элемент матрицы и его местоположение:
Program Min_Matr;{MIN element matrix} Var M:array[1..10,1..10] of integer; i,j,na,nb,min,im,jm:integer;
Begin
Write('Kol-vo strok=');Readln(na); Write('Kol-vo stolbtsov=');Readln(nb); Writeln('Vvedite matrix');
For i:=1 to na do
For j:=1 to nb do Read(M[i,j]); min:=M[1,1];im:=1;jm:=1;
For i:=1 to na do For j:=1 to nb do
if M[i,j]<min then begin min:=M[i,j];im:=i;jm:=j;
end;
Writeln('MIN element matrix = ',min);
Writeln(' Nom stroki = ',im,' Nom stolbtsa = ',jm); END.
Задача №5
Найти максимальный элемент 2-й строки матрицы и номер его столбца:
Program MAX_sr_Matr;{MAX element 2-y stroki matrix} Var M:array[1..10,1..10] of integer;
i,j,na,nb,max,jm:integer;
Begin
Write('Kol-vo strok=');Readln(na); Write('Kol-vo stolbtsov=');Readln(nb); Writeln('Vvedite matrix');
For i:=1 to na do
For j:=1 to nb do Read(M[i,j]); max:=M[2,1];jm:=1;
For j:=1 to nb do
if M[2,j]>max then begin max:=M[2,j];jm:=j;
end;
Writeln('MAX element 2-y stroki matrix = ',max); Writeln(' Nom stolbtsa = ',jm);
END.
Задача №6
Найти минимальный элемент последнего столбца матрицы и номер его строки:
Program Min_stb_Matr;{MIN element poslednego stolbtsa matrix} Var M:array[1..10,1..10] of integer;
i,j,na,nb,min,im:integer;
Begin
Write('Kol-vo strok=');Readln(na); Write('Kol-vo stolbtsov=');Readln(nb); Writeln('Vvedite matrix');
For i:=1 to na do
For j:=1 to nb do Read(M[i,j]); min:=M[1,nb];im:=1;
For i:=1 to na do
if M[i,nb]<min then begin min:=M[i,nb];im:=i;
end;
Writeln('MIN element poslednego stolbtsa matrix = ',min); Writeln(' Nom stroki = ',im);
END.
27
Задача №7
Найти произведение элементов главной диагонали матрицы:
Program Proizv_diag_Matr;{Proizved element glavnoy diagonali matrix} Var M:array[1..10,1..10] of integer;
i,j,n,s:integer;
Begin
Write('Razmer matrix=');Readln(n); Writeln('Vvedite matrix');
For i:=1 to n do
For j:=1 to n do Read(M[i,j]); s:=1;
For i:=1 to n do s:=s*M[i,i];
Writeln('Proizved element glavnoy diagonali matrix = ',s); END.
Задача №8
Найти сумму двух матриц. Результат вывести в файл.
Program Sum_Matr;{Summa 2 matrix}
Var M1,M2,M3:array[1..10,1..10] of integer; i,j,na,nb:integer;
res:text;
Begin
Assign(res,'res-sum'); Rewrite(res); Write('Kol-vo strok=');Readln(na); Write('Kol-vo stolbtsov=');Readln(nb); Writeln('Vvedite matrix M1');
For i:=1 to na do
For j:=1 to nb do Read(M1[i,j]); Writeln('Vvedite matrix M2');
For i:=1 to na do
For j:=1 to nb do Read(M2[i,j]); For i:=1 to na do
For j:=1 to nb do M3[i,j]:=M1[i,j]+M2[i,j]; Writeln(res,'Result matrix ');
For i:=1 to na do begin
For j:=1 to nb do Write(res,M3[i,j]:3); Writeln(res);
end;
Close(res);
END.
28
6 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ С ИСПОЛЬЗОВАНИЕМ СТРОК
6.1 Строковые константы и переменные
Данные типа string (строки символов), как и числовые данные подразделяются на константы и переменные.
Строковые константы могут быть описаны в разделе констант:
const Str='STROKA'; C='СТРОКА';
Описание строковых переменных имеет вид
type имя_типа=string[n]; var имя_переменной:имя_типа;
или
var имя_переменной:string[n];
Здесь n - целая константа, указывающая максимальную длину строки (количество символов в строке). В Турбо-Паскале 1 ≤ n ≤ 255.
Возможно также описание вида
var имя_переменной:string;
которое определяет строковую переменную максимально возможной длины
(255).
В Турбо-Паскале переменные типа string[n] занимают n+1 байт. К отдельным символам строки можно обратиться с помощью индексов в квадратных скобках. Нулевой индекс определяет позицию, в которой содер-
жится текущая длина строки.
Турбо-Паскаль допускает также использование типизованных констант строкового типа.
Строковые данные могут участвовать в строковых выражениях, состоящих из строковых констант, переменных типа string и char , знаков операций и встроенных функций. При этом над строковыми данными допустимы следующие операции: присваивание, сцепление и отношение.
Ввод и вывод строковых переменных осуществляется без апострофов.
29
6.2 Операция присваивания
Общий вид этой операции:
имя_строковой_переменной:=строковое_выражение;
Если длина строкового выражения превышает максимальную длину строковой переменной, то все лишние символы справа отбрасываются.
6.3 Операция сцепления
Эта операция применяется для сцепления нескольких строк в одну результирующую строку. Для обозначения операции сцепления в Турбо-Паскале ис-
пользуется знак +. |
|
Пример 1. |
|
Выражение |
Результат |
'ЕС'+'-'+'1840' |
'ЕС-1840' |
'АВ'+' '+'С' |
'АВ С' |
|
6.4 Операции отношения |
Операции отношения ( =, <>, <, >, <=, >= ) проводят сравнение двух строковых операндов и имеют более низкий приоритет, чем операции сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается большей, в которой первый несовпадающий символ имеет больший номер в кодовой таблице ПЭВМ. Результат выполнения операций отношения над строковыми операндами всегда имеет логический тип (true или false). Строки считаются равными, если они полностью совпадают по текущей (а не по объявленной длине) и содержат одни и те же символы. Следует также учитывать, что одинаковые заглавные и строчные буквы в строках определяют разные значения строковых переменных.
6.5 Некоторые встроенные функции для обработки строк
Для обработки строковых данных используется стандартных процедур и функций. Рассмотрим только некоторые из них.
Пусть Str, Str1, Str2 - string;
I,J - константы, переменные или выражения типа integer. Length(Str) - функция, которая вычисляет текущую длину строки STR.
Результат имеет целочисленный тип.
Copy(Str,I,J) - функция, которая выделяет из Str подстроку длиной
J, начиная с позиции I. |
|
Delete(Str,I,J) - процедура, которая удаляет из строки |
Str под- |
строку длиной J начиная с позиции |
I. Результатом |
является новая строка Str без удаленной подстроки.
30
Insert(Str1,Str2,I) - процедура, которая вставляет строку Str1 в строку Str2, начиная с позиции I. Если полученная в результате строка превышает 255 символов, то все лишние символы отбрасываются.
Пример.
Program PR;
var str1:string[2]; str2:string[3]; str3:string[4]; str:string; n:integer;
BEGIN str1:='ab'; str2:='cde'; str3:=str1+str2;
writeln(r,' 1) str3=',str3); str:=copy(str2,3,1); insert(str1,str,2); writeln(r,' 2) str=',str); insert(str2,str,3); writeln(r,' 3) str=',str); delete(str,3,2); writeln(r,' 4) str=',str); n:=length(str);
writeln(r,' длина строки Str =',n); END.
Врезультате выполнения этой программы получим
1)str3=abcd
2)str=eab
3)str=eacdeb
4)str=eaeb
длина строки Str =4
