Программирование простых типов данных и работа с файлами в системе Pascal

Рассмотрение сведений о языке программирования Pascal. Описание структуры программы на языке Pascal, операторов ввода-вывода данных, стандартных математических функций языка, условного оператора и оператора выбора, сведения о работе с файлами и строками.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык русский
Дата добавления 12.08.2015
Размер файла 144,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Program Case_operator;

type func=(sinus, cosin, tg, arctg);

var

f:func;

Procedure ReadFunction (var f1:func);

var

name:string[8];

begin {ReadFunction}

write ('Введите название функции: ');

readln(name);

if name='sin'

then f1:=sinus;

if name='cos'

then f1:=cosin;

if name='tg'

then f1:=tg;

if name='arctg'

then f1:=arctg;

end; {ReadFunction}

Procedure Calculation (f1:func);

var

x,r:real;

begin {Calculation}

write ('Введите значение аргумента: ');

readln(x);

case f1 of

sinus: r:=sin(x);

cosin: r:=cos(x);

tg: r:=sin(x)/cos(x);

arctg: r:=arctan(x)

else writeln('Неверный ввод!')

end;

writeln('Результат вычисления: ',r:7:4)

end; {Calculation}

begin {Program}

ReadFunction(f);

Calculation(f)

end. {Program}

7.5 Задания по теме 7

Перечисляемые типы данных и оператор case. В следующих заданиях использовать перечисляемые типы данных и оператор выбора case.

1) Написать программу "калькулятор". Пользователь вводит с клавиатуры два действительных числа и один из символов "+", "", "*", "/", соответствующий знаку арифметической операции. Результат выполнения операции выводится на экран.

2) Заданы названия стран: Австрия, Болгария, Греция, Италия, Норвегия, Франция и названия их столиц: Афины, Вена, Осло, Париж, Рим, София. Написать программу, которая выводит на экран название страны по заданному названию столицы.

3) Заданы названия стран: Австрия, Бразилия, Греция, Индия, Канада, Франция и названия частей света: Азия, Америка, Европа. Написать программу, которая выводит на экран название части света по заданному названию страны.

4) Заданы названия планет Солнечной Системы: Земля, Марс, Юпитер и названия некоторых спутников этих планет: Луна (спутник Земли), Фобос и Деймос (спутники Марса), Ио, Европа, Ганимед, Каллисто (спутники Юпитера). Написать программу, которая выводит на экран название планеты по заданному названию спутника.

5) В таблице приведены названия наиболее ярких звезд некоторых созвездий.

Самая яркая звезда

Созвездие

Альтаир

Орел

Бетельгейзе

Орион

Вега

Лира

Денеб

Лебедь

Сириус

Большой Пес

Написать программу, которая выводит на экран название самой яркой звезды по заданному названию созвездия.

6) В таблице приведено количество известных на сегодняшний день спутников планет солнечной системы.

Планета

Количество спутников

Меркурий

0

Венера

0

Земля

1

Марс

2

Юпитер

16

Сатурн

22

Уран

5

Нептун

2

Плутон

1

Написать программу, которая выводит на экран количество спутников по заданному названию планеты.

7) В таблице приведены английские названия времен года

Зима

winter

Весна

spring

Лето

summer

Осень

autumn

Написать программу "словарь", которая выводит на экран английское название времени года по заданному русскому названию.

8) В таблице приведены английские названия цифр от 1 до 5.

1

one

2

two

3

three

4

four

5

five

Написать программу "словарь", которая выводит на экран английское название цифры по заданной цифре.

9) В таблице приведены сведения об успеваемости некоторых учеников по математике.

Алексеев

5

Васильев

3

Ильин

5

Петров

4

Филиппов

4

Написать программу, которая выводит на экран фамилии тех учеников, которые имеют определенную оценку.

10) Написать программу, которая выводит на экран количество дней в месяце по заданному названию месяца.

8. Файлы

8.1 Общие сведения о работе с файлами

Средства языка Pascal позволяют работать с файлами, что облегчает обработку данных: например, программа может обращаться к файлам, содержащим необходимые данные, а также записывать в файлы результаты обработки данных. Напомним, что под файлом понимается именованная область памяти компьютера (жесткого диска, дискеты), либо логическое устройство потенциальный источник или приемник информации. Длина файла ограничена только объемом памяти компьютера. Программа может обращаться к нескольким файлам одновременно.

Для обращения к файлу необходимо ввести переменную файлового типа. В процессе работы программы она будет связана с конкретным файлом или логическим устройством, с которым будет происходить обмен данными (см. ниже). Pascal позволяет работать с файлами трех видов - типизированные, текстовые и нетипизированные (вид файла определяет способ хранения информации в нем).

Необходимо прежде всего описать тип, к которому будет принадлежать файловая переменная, и саму эту переменную, например,

type RealFile = file of real;

var f:RealFile;

Здесь переменная f типа RealFile может использоваться для работы с типизированными файлами, компонентами которых являются вещественные числа.

8.1.1 Открытие файла

Файлы или логические устройства становятся доступными программе только после выполнения особой процедуры открытия файла. Исключение составляют ввод данных с клавиатуры и вывод на экран. При открытии файла ранее объявленная файловая переменная связывается с именем уже существующего или вновь создаваемого файла. Для этого служит стандартная процедура assign:

assign (<файловая переменная>,

<имя файла или логического устройства>);

Здесь <имя файла> выражение строкового типа; может содержать прописные и строчные латинские буквы, цифры, а также символы

! @ # $ % ^ & ( ) ' ~ - _

(всего не более 8 символов).

Имя файла начинается с любого из названных символов и может сопровождаться расширением последовательностью, состоящей не более чем из 3 допустимых символов, отделяющейся точкой от имени файла.

Перед именем файла может быть указан также путь к файлу, который может включать в себя имя диска и имя текущего каталога. Максимальная длина имени файла, включая путь и расширение 79 символов. Пример:

assign(f,'C:\Mydocs\Progr#5.txt');

8.1.2 Стандартные имена логических устройств

con клавиатура или экран дисплея (монитор). Использование этого логического имени позволяет осуществлять чтение данных с клавиатуры и вывод данных на экран.

prn принтер. При подключении к компьютеру нескольких принтеров они получают логические имена lpt1, lpt2, lpt3, ... , причем prn и lpt1 по умолчанию считаются синонимами. Использование этих логических имен позволяет осуществлять вывод данных непосредственно на принтер.

aux коммуникационный канал, используемый для связи компьютера с другими машинами. При наличии нескольких коммуникационных каналов они получают логические имена com1, com2, com3, ... , причем aux и com1 по умолчанию считаются синонимами.

nul логическое имя "пустого" устройства (может использоваться при отладке программы).

Перечисленные имена являются зарезервированными, т. е. нельзя, например, обратиться к файлу на жестком или гибком диске с логическим именем prn.

8.1.3 Открытие файла для чтения

После связывания файловой переменной с именем файла с помощью процедуры assign, необходимо его инициировать, указать направление передачи данных открывается ли файл для чтения или для записи.

Файл открывается для чтения с помощью стандартной процедуры reset:

reset (<файловая переменная>);

Если делается попытка инициировать чтение из несуществующего файла или логического устройства prn, возникает ошибка ввода-вывода. Для контроля за ошибками ввода-вывода служит опция I/O CHECKING (меню OPTIONS COMPILER RUNTIME ERRORS I/O CHECKING). В активном состоянии она позволяет контролировать правильность операций ввода-вывода. Существуют также директивы компилятора, которые позволяют включать (директива {$I+}) и отключать (директива {$I-}) контроль правильности операций ввода-вывода.

В случае типизированных файлов к файлу, открытому с помощью процедуры reset, можно обращаться не только для чтения, но и для записи информации (т. е. использовать процедуры write/writeln). Для текстовых файлов, открытых с помощью процедуры reset, процедуры write/writeln использовать нельзя.

8.1.4 Открытие файла для записи

Файл открывается для записи с помощью стандартной процедуры rewrite:

rewrite (<файловая переменная>);

Если файл, открытый с помощью процедуры rewrite, уже существовал ранее (т. е. файловая переменная была связана с именем уже существующего файла при выполнении процедуры assign), при выполнении процедуры rewrite старый файл с указанным именем уничтожается, и к приему информации подготавливается новый, пока еще пустой файл, указатель файла устанавливается в 0.

Для того, чтобы добавить записи в конец уже существующего файла, не уничтожая его, служит процедура append:

append (<файловая переменная>);

Процедура append применима только к текстовым файлам (т. е. файловая переменная должна иметь тип text). Процедура append инициирует запись информации в ранее существовавший текстовой файл, указатель файла устанавливается в его конец. Если текстовой файл ранее уже был открыт с помощью процедур reset или rewrite, использование процедуры append приводит к закрытию этого файла и открытию его вновь, но уже для добавления записей.

8.1.5 Стандартные процедуры для работы с файлами любого типа

close (<файловая переменная>)

закрывает файл, обеспечивая сохранение в файле всех новых записей и регистрацию файла в каталоге. Связь файловой переменной с именем файла, установленная ранее процедурой assign, сохраняется, поэтому файл можно повторно открыть без дополнительного использования процедуры assign.

rename (<файловая переменная>, <новое имя>)

процедура переименования файла. Если файл был ранее открыт с помощью процедур reset, rewrite или append, перед выполнением процедуры rename его необходимо закрыть с помощью процедуры close.

erase (<файловая переменная>)

уничтожает файл. Если файл был ранее открыт с помощью процедур reset, rewrite или append, перед выполнением процедуры rename его необходимо закрыть с помощью процедуры close.

flush (<файловая переменная>)

очищает внутренний буфер файла. При выполнении процедуры flush все записи, временно хранящиеся в буфере (т. е. во вспомогательной памяти, предназначенной для промежуточного хранения данных), будут записаны на диск. Если файл был инициирован для чтения процедурой reset, процедура flush игнорируется.

chdir (<путь>)

изменяет текущий каталог, устанавливая путь к новому каталогу.

getdir (<устройство>, <каталог>)

определяет имя текущего каталога. В результате выполнения процедуры getdir получают определенные значения переменная типа word (<устройство>), содержащая номер устройства, и переменная типа string (<каталог>), содержащая путь к текущему каталогу на указанном устройстве, причем 0 соответствует устройству по умолчанию, 1 диску a:, 2 диску b: и т. д.

mkdir (<имя каталога, включая путь>)

создает каталог с указанным именем. Имя не может совпадать с именем уже существующего каталога.

rmdir (<имя каталога, включая путь>)

удаляет каталог с указанным именем. Удаляемый каталог должен быть пустым, т. е. не содержать файлов или каталогов низшего уровня.

8.1.6 Стандартные функции для работы с файлами любого типа

eof (<файловая переменная>)

логическая функция типа boolean. Принимает значение true, если указатель файла находится в конце файла. В этом случае при записи данные будут добавляться в конец файла, при чтении это означает, что файл исчерпан.

ioresultфункция типа word. Ее значением является код последней операции ввода-вывода. В случае успешного завершения последней операции ввода-вывода принимает значение 0, в противном случае код ошибки ввода-вывода. Функция ioresult становится доступной только при отключении контроля за ошибками ввода-вывода с помощью директивы компилятора {$I+}.

8.2 Типизированные файлы содержат компоненты указанного типа, например, действительные числа

Описание:

type <имя типа> = file of <тип компонентов>;

Примеры:

type

RealExtFile = file of extended;

IntFile = file of byte;

Text80 = file of string[80];

var

f1: RealExtFile;

f2: IntFile;

f3: Text80;

Переменная f1 может использоваться для работы с файлами, компонентами которых являются действительные числа в расширенном формате, переменная f2 может использоваться для работы с файлами, компонентами которых являются целые числа от 0 до 255, переменная f3 - для работы с файлами, компоненты которых - строки длиной не более 80 символов.

Альтернативно, переменную файлового типа можно объявлять в программе без предварительного описания самого типа:

var <имя переменной>: file of <тип компонентов>;

Примеры:

var

f4: file of word;

f5: file of char;

8.2.1 Стандартные процедуры для работы с типизированными файлами

read (<файловая переменная>, <список переменных>)

чтение очередных компонентов файла. При выполнении процедуры read переменные, указанные в списке, последовательно принимают значения очередных компонентов типизированного файла. При этом тип переменных из указанного списка должен совпадать с типом компонентов файла. Файловая переменная должна соответствовать типизированному файлу (т. е. иметь тип file of ... ) и быть связана с именем конкретного файла с помощью процедуры assign. Файл должен быть открыт для чтения с помощью процедуры reset. После каждого чтения указатель файла сдвигается к следующему компоненту файла. Если файл исчерпан, обращение к процедуре read вызовет ошибку ввода-вывода.

write (<файловая переменная>, <список переменных>)

запись очередных компонентов файла. При выполнении процедуры write в файл записываются значения переменных, указанных в списке. При этом тип переменных из указанного списка должен совпадать с типом компонентов файла. Файловая переменная должна соответствовать типизированному файлу (т. е. иметь тип file of ... ) и быть связана с именем конкретного файла с помощью процедуры assign. Файл должен быть открыт с помощью процедуры reset или rewrite. После каждой записи указатель файла сдвигается к следующему компоненту файла.

seek (<файловая переменная>, <номер компонента>)

смещает указатель файла к компоненту с заданным номером. Номер компонента задается выражением типа longint. Первый компонент файла имеет номер 0.

8.2.2 Стандартные функции для работы с типизированными файлами

filesize (<файловая переменная>)

функция типа longint, ее значением является количество компонентов файла.

filepos (<файловая переменная>)

функция типа longint, ее значением является порядковый номер компонента файла, который будет обрабатываться следующей операцией ввода-вывода. Первый компонент файла имеет номер 0.

8.2.3 Пример работы с типизированным файлом

Ниже мы рассмотрим пример программы, которая находит сумму действительных чисел, содержащихся в файле. Программа состоит из двух частей (процедур). В первой процедуре (WriteToFile) запрашивается имя файла, после чего файловая переменная freal связывается с этим именем с помощью процедуры assign. Затем файл открывается для записи с помощью процедуры rewrite. В файл записываются действительные числа, вводимые с клавиатуры. Для этого используется специальная форма цикла - while not eof. Напомним, что eof - это логическая функция, которая принимает значение true, если достигнут конец файла. Если функция употребляется без аргумента (файловой переменной), как в данном случае, по умолчанию предполагается ввод данных с клавиатуры. Для проверки условия цикла работа программы приостанавливается, и ожидается ввод данных с клавиатуры, поэтому первым оператором, выполняемым внутри цикла, должен быть оператор read/readln. Если введена специальная комбинация клавиш Ctrl-Z, сопровождаемая нажатием клавиши Enter, функция eof получает значение true - комбинация Ctrl-Z указывает на окончание ввода данных (достигнут "конец файла"). После окончания ввода данных файл закрывается с помощью процедуры close.

Во второй процедуре (ReadFile - чтение файла) файл открывается для чтения с помощью процедуры reset, и вновь используется конструкция while not eof(freal), на этот раз в качестве аргумента функции eof используется файловая переменная freal. Цикл будет выполняться до тех пор, пока не будет достигнут конец файла, связанного с переменной freal. В цикле последовательно считываются компоненты файла - вещественные числа, выводятся на экран и вычисляется их сумма.

Program Files_1;

type RealFile = file of real;

var freal:RealFile;

Procedure WriteToFile;

var

x:real;

name:string[8];

begin {WriteToFile}

write('Введите имя файла (не более 8 символов): ');

readln(name);

assign(freal,name);

rewrite(freal)

write('Последовательно вводите ');

writeln('действительные числа.');

write('Ввод каждого числа завершайте ');

writeln('нажатием клавиши Enter.');

write('Для окончания ввода данных ');

writeln('нажмите клавиши Ctrl-Z и Enter.');

while not eof

do begin

readln(x);

write(freal,x)

end;

close(freal);

writeln

end; {WriteToFile}

Procedure ReadFile;

var x,sum:real;

begin {ReadFile}

sum:=0;

reset(freal);

write('Файл',name:9,' содержит следующие числа:');

while not eof(freal)

do begin

read(freal,x);

writeln(x:10:5);

sum:=sum+x

end;

writeln('Сумма чисел в файле: ', sum:10:5);

writeln

end; {ReadFile}

begin {Program}

write('Определение суммы чисел, содержащихся ');

writeln('в типизированном файле');

writeln;

WriteToFile;

ReadFile;

end. {Program}

8.3 Текстовые файлы в языке Pascal рассматривается как совокупность строк переменной длины

Они определяются типом text. Доступ к каждой строке осуществляется последовательно, начиная с первой. При создании текстового файла в конце каждой строки помещается специальный признак конца строки. В конце файла помещается специальный признак конца файла. Описание:

type <имя типа> = text;

Примеры:

type TextFile = text;

var t1: TextFile;

Альтернативно, файловую переменную можно объявлять в программе без предварительного описания типа text:

var <имя переменной>: text;

8.3.1 Стандартные процедуры для работы с текстовыми файлами

read (<файловая переменная>, <список переменных>)

чтение данных из файла. Файловая переменная имеет тип text и должна быть связана с именем конкретного файла с помощью процедуры assign. В отличие от типизированных файлов переменные, указанные в списке, могут иметь любой целый или вещественный тип, а также char или string.

В зависимости от типа переменных процедура чтения данных выполняется по-разному. При чтении целых или вещественных данных в текстовом файле выделяется последовательность (подстрока) символов, которая должна соответствовать символьному представлению числовой константы, например,

65535

35

4.0

-78.128

-0.27408E-07

Пробелы, которые могут находиться в начале строки (так называемые ведущие пробелы), при этом игнорируются. Признаком конца подстроки (после значащих символов) является пробел, символ конца строки или конца файла. Если символы подстроки не соответствуют принятому формату представления чисел (например, подстрока представляет собой запись действительного числа, в то время как ожидается чтение целого числа), возникает ошибка ввода-вывода. Если достигнут конец файла, а значащих символов не обнаружено, переменная получает значение 0.

При чтении символьных данных переменная типа char получает значение, равное очередному считанному символу из файла.

При чтении строковых данных переменная типа string получает значение, соответствующее последовательности считанных из файла символов, причем количество считанных символов равно максимальной длине строки, если только один из считанных символов не является признаком конца строки или конца файла.

Если файловая переменная не указана, предполагается, что ввод данных осуществляется с клавиатуры, т. е. мы имеем дело с уже хорошо знакомой нам процедурой read.

readln (<файловая переменная>, <список переменных>)

процедура аналогична процедуре read, за исключением того, что при выполнении процедуры readln считывается целая строка из файла. При следующем обращении к процедуре readln чтение данных из файла начинается с начала следующей строки. Использование процедуры readln без параметра <список переменных> приводит к пропуску строки.

write (<файловая переменная>, <список переменных>)

запись данных в файл. Файловая переменная имеет тип text и должна быть связана с именем конкретного файла с помощью процедуры assign. В отличие от случая типизированных файлов переменные, указанные в списке, могут иметь любой целый или вещественный тип, а также char или string.

Если файловая переменная не указана, предполагается, что вывод данных осуществляется на экран, т. е. мы имеем дело с уже хорошо знакомой нам процедурой write.

Формат представления данных, записываемых в текстовой файл, может быть определен программистом аналогично тому, как это можно сделать при выводе данных на экран. Например, при выводе десятичных чисел можно указать число цифр после запятой и полное число десятичных знаков, включая знак числа и десятичную точку.

writeln (<файловая переменная>, <список переменных>)

процедура аналогична процедуре write, за исключением того, что при выполнении процедуры writeln в файл записывается целая строка, в конец строки помещается признак конца строки. Использование процедуры writeln без параметра <список переменных> приводит к записи в файл пустой строки (содержащей только признак конца строки).

8.3.2 Стандартные функции для работы с текстовыми файлами

eoln (<файловая переменная>)

логическая функция типа boolean. Принимает значение true, если достигнут конец строки.

seekeoln (<файловая переменная>)

логическая функция типа boolean. Принимает значение true, если в строке нет более значащих символов (пробелы и символы табуляции игнорируются).

seekeof (<файловая переменная>)

логическая функция типа boolean. Принимает значение true, если в файле нет более значащих символов (пробелы, символы табуляции и признаки концов строк игнорируются).

8.3.3 Пример работы с текстовым файлом

Рассмотрим вновь программу, которая находит сумму действительных чисел, содержащихся в файле, но теперь будем использовать текстовый файл. Структура программы остается той же самой, отличия же заключаются в том, что, во-первых, используется файловая переменная типа text, во-вторых, данные - действительные числа - записываются в файл с помощью оператора writeln, при этом каждое число располагается в текстовом файле на отдельной строке. Запись в типизированный файл, в отличие от текстового, с помощью оператора writeln невозможна, и необходимо использовать оператор write. Для записи в текстовый файл можно использовать как оператор writeln, так и оператор write, в последнем случае данные в строке будут разделяться пробелами. Текстовые файлы, созданные в результате работы программы, можно просмотреть с помощью стандартных приложений Windows, например, Блокнот или WordPad. Данные в типизированном файле хранятся во внутреннем представлении; при попытке просмотреть такой файл с помощью текстового редактора мы увидим только непонятные символы.

Program Files_2;

var ftext:text;

Procedure WriteToFile;

var

x:real;

name:string[8];

begin {WriteToFile}

write('Введите имя файла (не более 8 символов): ');

readln(name);

assign(ftext,name);

rewrite(ftext)

write('Последовательно вводите ');

writeln('действительные числа.');

write('Ввод каждого числа завершайте ');

writeln('нажатием клавиши Enter.');

write('Для окончания ввода данных ');

writeln('нажмите клавиши Ctrl-Z и Enter.');

while not eof

do begin

readln(x);

writeln(ftext,x)

end;

close(ftext);

writeln

end; {WriteToFile}

Procedure ReadFile;

var x,sum:real;

begin {ReadFile}

sum:=0;

reset(ftext);

write('Файл',name:9,' содержит следующие числа:');

while not eof(ftext)

do begin

readln(ftext,x);

writeln(x:10:5);

sum:=sum+x

end;

writeln('Сумма чисел в файле: ', sum:10:5);

writeln

end; {ReadFile}

begin {Program}

write('Определение суммы чисел, содержащихся ');

writeln('в типизированном файле');

writeln;

WriteToFile;

ReadFile;

end. {Program}

8.4 Нетипизированные файлы

отличаются тем, что для них не указан тип компонентов. Это делает их совместимыми с любыми другими файлами. При работе с нетипизированными файлами необходимо указывать длину записи нетипизированного файла. Они определяются типом file. Описание:

type <имя типа> = file;

Примеры:

type FileType = file;

var t2:FileType;

Альтернативно, файловую переменную можно объявлять в программе без предварительного описания типа file:

var <имя переменной>: file;

Для записи информации в нетипизированный файл и чтения данных из файла используются специальные процедуры blockread и blockwrite (аналоги процедур read и write).

8.5 Задания по теме 8

Работа с файлами

В следующих заданиях следует написать два различных варианта программы, в первом случае с использованием типизированного файла, во втором случае с использованием текстового файла.

1) Написать программу, которая создает файл, содержащий действительные числа, и находит сумму наибольшего и наименьшего из чисел, содержащихся в файле.

2) Написать программу, которая создает файл, содержащий целые числа, и находит произведение всех чисел, содержащихся в файле.

3) Написать программу, которая создает файл, содержащий действительные числа, и находит сумму квадратов чисел, содержащихся в файле.

4) Написать программу, которая создает файл, содержащий целые числа, и находит модуль суммы и квадрат произведения чисел, содержащихся в файле.

5) Написать программу, которая создает файл, содержащий действительные числа, и находит последнее из чисел, содержащихся в файле.

6) Написать программу, которая создает файл, содержащий целые числа, и находит количество четных чисел, содержащихся в файле.

7) Написать программу, которая создает файл, содержащий действительные числа, и находит наименьшее из чисел, содержащихся в файле.

8) Написать программу, которая создает файл, содержащий целые числа, и находит сумму нечетных чисел, содержащихся в файле.

9) Написать программу, которая создает файл, содержащий действительные числа, и находит разность первого и последнего из чисел, содержащихся в файле.

10) Написать программу, которая создает файл, содержащий целые числа, и находит произведение четных чисел, содержащихся в файле.

9. Строки (тип данных string)

9.1 Описание строкового типа данных

При работе с текстовыми файлами удобно использовать специальный строковый тип данных - стандартный тип string. По этой причине рассмотрение этого типа данных включено в настоящее учебное пособие. Его описание:

type <имя типа> = string[<максимальное число

символов в строке>];

<максимальное число символов в строке> должно задаваться любой константой порядкового типа, значение которой не превосходит 255. Если число символов в строке не указано, оно принимается максимально возможным, равным 255.

Примеры:

type TextString=string[80];

WordString=string[10];

Здесь тип TextString представляет собой строку текста - последовательность из 80 символов, тип WordString - слово - последовательность из не более, чем 10 символов

Альтернативно, переменную типа string можно объявлять в программе без предварительного описания самого типа:

var <имя переменной>: string[<максимальное число

символов в строке>];

Пример:

var st,st1:string[20];

Тип string[n] (строка) в языке Pascal во многом аналогичен типу array [0..n] of char, т. е. одномерному массиву символов (n максимальное количество символов в строке, некоторая константа). В отличие от обычного массива, количество элементов которого фиксировано, количество символов в строке может меняться от 0 до n. К каждому символу в строке можно обращаться так же, как к элементу массива, например,

if st[5] = 'a' then ...

Первый байт в строке имеет индекс 0 и содержит текущую длину строки. При выполнении над строкой различных операций длина строки может изменяться.

Если при обращении к некоторой процедуре или функции необходимо использовать переменную типа string, этот тип, должен быть описан заранее. Иными словами, объявление процедуры

Procedure p1(s:string[10]);

является недопустимым. Правильным в данном случае будет

Procedure p1(s:WordString);

(см. выше описание типа WordString).

9.2 Операции над строками в языке Pascal

+сцепление двух строк.Например,

st:='a'+'b';

(Строка st будет содержать "ab".)

st:=st+'c';

(Строка st будет содержать "abc".)

Операции сравнения:

=равно;

<>не равно;

<меньше;

>больше;

<=меньше или равно;

>=больше или равно

При сравнении двух строк символы обеих строк сравниваются попарно друг с другом таким образом, что первый символ первой строки сравнивается с первым символом второй строки, второй символ первой строки сравнивается со вторым символом второй строки и т. д. Если одна строка короче другой, недостающие символы заменяются нулями. Фактически сравниваются коды символов, поэтому при сравнении строк нужно иметь в виду таблицу кодов символов. Например, цифры '0'..'9' имеют коды 048..057, большие буквы латинского алфавита 'A'..'Z' имеют коды 065..090, поэтому

'A'<'D';

'AB'<'ABC';

'A'>'1';

'ABD'>'ABC'.

9.3 Стандартные процедуры для работы со строками

delete (<строка>, <номер первого символа>,

<число символов>)

удаление из указанной строки заданного числа символов, начиная с символа с указанным номером.Например,

st:='12345';

(Строка st содержит 12345.)

delete(st,2,3);

(Строка st будет содержать 15.)

insert (<подстрока>, <строка>, <номер первого символа>)

вставка указанной подстроки в заданную строку, начиная с символа с указанным номером.

Например,

st1:='345';

(Строка st1 содержит 345.)

insert('-',st1,2);

(Строка st1 содержит 3-45.)

str (<вещественное или целое число>:

<общее количество символов>:

<число символов после запятой>, <строка>)

преобразование вещественного или целого числа в строку символов, подобно тому, как это делает стандартная процедура writeln.

Формат представления чисел, может быть определен программистом аналогично тому, как это можно сделать при выводе данных на экран. Например, при выводе вещественных чисел можно указать число цифр после запятой и полное число десятичных знаков, включая знак числа и десятичную точку.

st:='12345';

(Строка st содержит 12345.)

str(pi:5:2,st);

(Сейчас строка st содержит 3.14.)

val (<строка>,

<вещественная или целая переменная>,

<код выполнения преобразования>)

преобразование строки символов в вещественное или целое число, которое становится значением указанной вещественной или целой переменной. Если преобразование прошло успешно, код выполнения преобразования содержит 0, в противном случае он содержит номер позиции в указанной строке, где обнаружен символ, не соответствующий формату числа. В последнем случае значение указанной переменной не изменяется. В строке допускаются ведущие пробелы (находящиеся в начале строки), в то время как ведомые пробелы (находящиеся в конце строки) не допускаются.

Например,

val(' 3.1415',x,code);

(Переменная x получает значение 3.1415, а параметр code - 0.)

val('3.1415 ',x,code);

(Значение переменной x не изменяется, а параметр code получает значение 7 - номер позиции первого пробела после записи числа 3.1415.)

val('3,1415',x,code);

(Значение переменной x не изменяется, а параметр code получает значение 2 - номер позиции, в которой вместо точки стоит запятая в записи числа 3.1415.)

9.4 Стандартные функции для работы со строками

concat (<строка 1>, <строка 2>, ... <строка N>)

функция типа string, ее значением является строка, которая представляет собой сцепление указанных строк.Например,

st:=concat('12','345');

(Строка st содержит 12345.)

copy (<строка>, <номер первого символа>,

<число символов>)

функция типа string, ее значением является строка, получаемая копированием из указанной строки заданного число символов, начиная с символа с указанным номером.Например,

st:='12345';

(Строка st содержит 12345.)

st1:=copy(st,2,3);

(Строка st1 содержит 234.)

length (<строка>)

функция типа integer, ее значением является длина строки (число символов в строке).Например,

st:='12345';

n:=length(st);

(n-- длина строки st - равна 5.)

pos (<подстрока>, <строка>)

функция типа integer, ее значением является номер символа (позиции), начиная с которого указанная подстрока входит в заданную строку. Если в строке указанная подстрока не найдена, функция имеет значение 0.Например,

st:='12345';

n:=pos('2',st);

upcase (<символ>)

функция типа char, заменяет строчные латинские буквы на заглавные. Ее аргументом должна быть строчная буква латинского алфавита, ее значением является соответствующая заглавная буква. Если в качестве аргумента функции upcase указан любой другой символ (в том числе строчная буква русского алфавита), значением функции является тот же символ без изменения. (n - позиция символа “2” в строке st - равна 2.)

9.5 Пример: редактирование текстового файла

В качестве примера рассмотрим программу, которая создает текстовой файл (который в языке Pascal рассматривается как совокупность строк). После создания файла программа предоставляет пользователю возможность редактировать файл заменять одни последовательности символов на другие, задаваемые пользователем, в частности, заменять целые слова. Предполагается, что файл состоит из строк, каждая из которых содержит не более 60 символов.

Программа состоит из трех процедур. Первая процедура - CreateFile - предназначена для создания файла и ввода в него необходимой информации. Имя файла получает расширение .dat и связывается с файловой переменной f. Файл открывается для записи с помощью процедуры rewrite. На экран выводятся сообщения для пользователя, каким образом ему следует вводить текст в файл. После этого используется уже знакомая нам по работе с файлами конструкция while not eof, в цикле с клавиатуры вводится очередная строка и записывается в файл.

Вторая процедура - PrintText - предназначена для вывода на экран содержащегося в файле текста. Файл открывается для чтения с помощью процедуры reset, затем в цикле while not eof(f) из файла считывается и выводится на экран очередная строка.

Наиболее интересна процедура корректировки текста Replacement - замены неправильно введенных последовательностей символов. Сначала пользователю предлагается ввести текст - строку символов, - которую следует заменить. Эта строка сохраняется в переменной s1. Затем предлагается ввести текст, который будет помещен на место неправильной последовательности символов. Он будет сохранен в строковой переменной s2. Предусматривается возможность замены только целых слов, т. е. последовательностей символов, в начале и в конце сопровождаемых пробелами. На экран выводится соответствующий запрос. Если пользователь ответит на этот вопрос утвердительно, в начало и в конец строк s1, s2 будет добавлено по одному пробелу. На этом заканчивается подготовительная часть работы.

Далее старый файл переименовывается с помощью процедуры rename. При этом изменяется его расширение: файл имел расширение .dat, теперь он будет иметь расширение .bak. После переименования файл открывается для чтения. Затем создается новый файл с тем же именем и расширением .dat: он связывается с новой файловой переменной f1 с помощью процедуры assign и открывается для записи исправленного текста с помощью процедуры rewrite. В цикле из старого файла считывается очередная строка, и в ней определяется позиция первого символа той подстроки s1, которую нужно заменить. Для этого используется функция pos, которая определяет номер символа, начиная с которого указанная подстрока входит в очередную строку. Затем организуется новый цикл, условием окончания работы которого является то, что подстрока не найдена (функция pos получает значение 0). В случае, если подстрока найдена, она удаляется с помощью процедуры delete, и на ее место вставляется новая подстрока с помощью процедуры insert, после чего вычисляется новое значение функции pos. Таким образом, находим все последовательности символов в строке, которые необходимо заменить. Исправленная строка записывается в новый файл с расширением .dat. Старый файл с расширением .bak, который нам больше не потребуется, закрывается и удаляется с помощью процедуры erase.

Основная программа содержит вызовы процедур CreateFile (создание файла) и PrintText (вывод на экран его содержимого). В программе предусмотрена возможность редактировать файл столько раз, сколько захочет пользователь (выдается соответствующий запрос пользователю). Если пользователь желает отредактировать текст, вызывается процедура Replacement, а затем исправленный текст вновь выводится на экран с помощью процедуры PrintText.

Program Strings;

var

f:text;

name:string[8];

a:0..1;

Procedure CreateFile;

var s:string[60];begin {CreateFile}

write('Введите имя файла (не более 8 символов): ');

readln(name);

writeln;

assign(f,name+'.dat');

rewrite(f);

write('Вводите текст в файл, последовательно ');

writeln('набирая на клавиатуре строки.');

write('Каждая строка должна содержать ');

writeln('не более 60 символов.');

write('Ввод каждой строки завершайте ');

writeln('нажатием клавиши Enter.');

write('Для окончания ввода текста ');

writeln('нажмите клавиши Ctrl-Z и Enter.');

writeln;

while not eof

do begin

readln(s);

writeln(f,s)

end;

writeln;

close(f)

end; {CreateFile}

Procedure PrintText;

var s: string[60];

begin {PrintText}

assign(f,name+'.dat');

reset(f);

write('Файл ',name,'.dat содержит ');

writeln('следующий текст:');

writeln;

while not eof(f)

do begin

readln(f, s);

writeln(s)

end;

writeln;

close(f)

end; {PrintText}

Procedure Replacement;

var

f1:text;

s,s1,s2:string[60];

i:byte;

a1:0..1;

begin {Replacement}

writeln('Введите последовательность символов,');

write('которую необходимо найти в файле ');

writeln(name, '.dat и заменить:');

readln(s1);

write('Введите новую последовательность символов, ');

writeln('которую необходимо поместить на место ');

writeln('неправильной последовательности:');

readln(s2);

write('Вы хотите, чтобы заменялись ');

writeln('только целые слова');

write('(т. е. указанные Вами последовательности, ');

writeln('сопровождаемые пробелами ');

writeln('в начале и в конце)? 1 - да, 0 - нет: ');

readln(a1);

if a1=1

then begin

s1:=' '+s1+' ';

s2:=' '+s2+' '

end;

rename(f,name+'.bak');

reset(f);

assign(f1, name+'.dat');

rewrite(f1);

while not eof(f)

do begin

readln(f,s);

i:=pos(s1,s);

while i<>0

do begin

delete(s,i,length(s1));

insert(s2,s,i);

i:=pos(s1,s)

end;

writeln(f1, s)

end;

close(f);

erase(f);

close(f1)

end; {Replacement}

begin {Program}

CreateFile;

PrintText;

repeat

write('Вы хотите отредактировать ');

write('текст? 1 - да, 0 - нет: ');

readln(a);

if a=1

then begin

Replacement;

PrintText

end;

until a=0;

writeln

end. {Program}

9.6 Задания по теме 9

Строки.

В следующих заданиях использовать строковый тип данных (string). Учесть, что

словами называются группы символов, разделенные пробелами и не содержащие пробелов внутри себя;

в вариантах 6 10 откорректированный текст должен быть записан в новый файл, в то время как старый файл должен быть уничтожен.

Написать программу, которая создает текстовой файл, и, кроме того,

1) определяет, сколько раз заданный символ содержится в данном файле;

2) определяет, сколько раз заданное слово содержится в данном файле.

3) находит самую длинную строку в файле и выводит ее на экран;

4) определяет, сколько слов, состоящих из пяти букв, содержится в данном файле;

5) определяет, сколько слов, начинающихся с латинской буквы "a", содержится в данном файле;

6) удаляет из файла все лишние пробелы между словами (оставляет слова разделенными только одним пробелом);

7) удаляет из файла все ведущие пробелы (т. е. те, которые находятся в начале строки);

8) заменяет в файле все символы "0" символами "1";

9) заменяет в файле все строчные буквы латинского алфавита прописными;

10) заменяет в файле все прописные буквы латинского алфавита строчными.

Литература

1. В. В. Фаронов, Turbo Pascal в подлиннике, “BHV-Санкт-Петербург”, 2004. 1056 стр.

2. С. А. Немнюгин, Turbo Pascal. Программирование на языке высокого уровня: Учебник для вузов, 2-е издание, “Питер”, 2005. 544 стр.

3. С. А. Немнюгин, Turbo Pascal:Практикум, 2-е издание, “Питер”, 2004. 272 стр.

4. Т. А. Павловская, Паскаль. Программирование на языке высокого уровня: Учебник для вузов, “Питер”, 2004. 400 стр.

5. В. И. Грызлов, Т. П. Грызлова, Турбо Паскаль 7.0. Учебный курс, “Питер”, 2004. 416 стр.

6. В. Кораблев, Турбо Паскаль 7.0. Самоучитель, 16-е издание, “Питер”, 2004. 480 стр.

Размещено на Allbest.ru


Подобные документы

  • Рассмотрение правил записи, способов ввода и вывода, использования функций обработки символьных данных в Pascal. Описание алгоритмизации и программирования файловых структур данных, проектирования структуры файла. Ознакомление с работой данных массива.

    курсовая работа [336,2 K], добавлен 27.06.2015

  • Изучение функций и возможностей среды разработки языка программирования Pascal. Рассмотрение работы с одномерными и двумерными массивами, со строками и числами. Математическая формулировка задач. Разработка алгоритмов, описание структуры программ.

    курсовая работа [879,8 K], добавлен 11.02.2016

  • Структура и основные элементы языка Turbo Pascal. Алгоритм составления простейших программ на Turbo Pascal. Применение условного оператора и сильноветвящихся алгоритмов. Циклы с предусловием и постусловием, сочетание циклических и условных операторов.

    реферат [64,0 K], добавлен 20.03.2016

  • Строгая типизация и наличие средств структурного (процедурного) программирования императивного языка Pascal. Структура программы, выражения, строки. Правила и описание типов, процедур и функций, операторов ввода - вывода, модулей и подпрограмм.

    курсовая работа [37,3 K], добавлен 28.06.2008

  • Информационные технологии и защиты данных. Методы защиты информации. Виды информационной безопасности и умышленные угрозы. Программирование на языке Turbo Pascal. Типы числовых данных. Функции ввода и вывода. Логические операторы, символьные переменные.

    курсовая работа [1,7 M], добавлен 16.05.2016

  • Характеристика вычислительной системы и инструментов разработки. Программирование на языке Pascal в среде Turbo Pascal и на языке Object Pascal в среде Delphi. Использование процедур, функций, массивов, бинарного поиска. Создание базы данных в виде файла.

    отчет по практике [2,1 M], добавлен 02.05.2014

  • Создание программы для обработки структуры данных. Возможность ввода и записи данных на персональном компьютере. Прикладное программирование на языке Turbo Pascal. Свободное редактирование записанных данных с помощью программы, написанной на Turbo Pascal.

    лабораторная работа [11,4 K], добавлен 13.05.2011

  • Основные сведения о языке программирования Pascal. Листинг программы с комментариями. Диагональ элементов вектора и матрицы. Использование команд ввода-вывода информации. Быстродействие выполнения программы при компиляции. Отражение процессов вычисления.

    курсовая работа [1,9 M], добавлен 05.05.2009

  • Векторная компьютерная графика. Графические примитивы. Графические возможности языка программирования Pascal. Методические рекомендации к изучению графики в языке программирования Pascal. Построение графиков функций.

    курсовая работа [28,3 K], добавлен 13.06.2007

  • Элементы языка Object Pascal: идентификаторы, константы, переменные, выражения. Структура проекта Delphi. Операторы и метки. Типы данных языка OPascal. Статические и динамические массивы. Записи с вариантными полями. Совместимость и преобразование типов.

    курс лекций [385,4 K], добавлен 18.02.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.