Главная страница

Учебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты


Скачать 1.07 Mb.
НазваниеУчебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты
АнкорABC_Pascal.doc
Дата15.02.2017
Размер1.07 Mb.
Формат файлаdoc
Имя файлаABC_Pascal.doc
ТипУчебное пособие
#2721
страница7 из 8
1   2   3   4   5   6   7   8


DELETE(S, Start, Len)  процедура возвращает строку S:string, удаляя из неё подстроку длиной Len:integer, начиная с символа с номером Start:integer.

После стирания подстроки ее оставшиеся части "склеиваются". Если Start=0 или превышает длину строки S, то строка не изменяется. Не из­менит строку и значение Len=0. При Len большем, чем остаток строки, будет удалена подстрока от Start до конца S. Например, для

Delete('aбвгде' , 4, 2); // результатом будет строка - “абве”.

INSERT(Subs, S, index)  процедура возвращает строку S:string, вставляя в неё подстроку Subs:string, начиная с символа под номеpом index:integer;

Если измененная строка S оказывается слишком длинной, то она ав­томатически укорачивается до объявленной длины S (при этом всегда те­ряются символы справа). Например,

st := 'abcdef' ;

Insert( '-***-' ,st, 4); // результат - строка: St = 'abc-***- de'

POS(Subs, S)  функция типа byte отыскивает вхождение подстроки Subs:string в строке S:string и выдает номер позиции, с которой начинается это вхождение.

Если строка s не содержит данной подстроки, то функция POS выдает 0. Если в строке s несколько одинаковых подстрок subs, то функция выдает только номер первого вхождения. Например, для строки St = 'abcdef' результатом функций

POS( 'de' , St); является значение 4,

POS( 'k' , St); является значение 0.

STR(x[:w[:n]], s)  процедура преобразует числовое значение x в строковое s:string, возвращая строку s.

Х может быть переменной или выражением целого или вещест­венного типа. Для переменной x может быть указана ширина поля w, кото­рое она занимает, а также n  количество знаков после десятичной точ­ки. Параметры [:w[:n]] не обязательны. Если параметр n отсутствует для вещественного типа, то используется экспоненциальное представле­ние. Если w больше, чем реальное количество знаков в числе, то произ­водится выравнивание числа по правому краю. Для выравнивания по левому краю используется отрицательное значение w. Если в дробной части числа x знаков больше, чем указано в n, выполняется округление.

Например:

str(6.66:8:1, s); {результат: S= '6.7' c округлением}

str(6.66:-8:2, s); {результат: S= '6.66'}

VAL(S, x, ErrCod)  процедура преобразует числовую строку S:string в числовую переменную x (типа Real или Integer) и формирует код ошибки ErrCod:Integer, возвращая x и ErrCod.

Строка S не долж­на содержать незначащих пробелов, в том числе в начале и конце. ErrCod  целочисленная переменная. Она равна 0, если преобразование выполне­но. В противном случае (если преобразование невозможно) эта функция выдает код символа, на котором прекратилось преобразование, значение x в этом случае не определено. Если в строке S имеется десятичная точка или символ E, то переменная x должна быть определена вещественной.

Например:

VAL( '1324' , x, Cod); // результат преобразования x = 1324, Cod=0;

VAL( '13.24Е2' , x, Cod); // результат преобразования x = 1324, Cod=0;

VAL( '25А3' , x, Cod); // результат не определен, Cod=3.

9.3. Пример и задания для обработки строк

Пример. Ввести строку st1. Сформировать строку st2 перестановкой символов исходной строки в обратном порядке и заменой всех строчных латинских букв прописными.

Program lr_10;

Var i, j: byte;

st1, st2: string; {эквивалентно string[255]}

Begin

writeln(‘введи строку’);

readln (st1);

writeln(‘исходная строка:’ , st1);

j := LENGTH(st1); {максимальный индекс элемента в строке}

for i:=1 to ord( st1[0] ) do

begin

st2[i] := UPCASE(st1[j]);

j := j-1

end;

st2[0] = st1[0]; {запись символа с кодом, равным длине строки}

write(‘искомая строка: ’ , st2 );

writeln {перевод строки}

END.

Задания для самостоятельного выполнения

1. Дана строка, содержащая не более двадцати латинских букв. Все вхождения «max» в ней заменить на «min» и «макс» на «мин». Подсчитать число таких замен.

2. Дана строка, содержащая сорок латинских букв. Подсчитать все вхождения «abc» в строку и их удалить. Вывести на экран два варианта полученных строк, заполняя образовавшуюся «дыру» последующими буквами с добавлением в конце пробелов и оставляя на месте удаленных символов пробелы.

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

4. Определить номера позиций гласных букв в заданном тексте.

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

6. Дана строка, состоящая из слов, разделенных пробелами, в конце строки – точка. Определить, сколько в строке слов, содержащих четное число символов.

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

8. Дан непустой текст из строчных букв, за которыми следует точка. Определить, упорядочены ли эти буквы по алфавиту. Напечатать результат проверки и исходный текст прописными буквами.

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

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

11. Дана последовательность, содержащая от одного до восьми слов, в каждом из которых от одной до пяти строчных букв; между соседними словами – запятая, за последним словом – точка. Напечатать эту же последовательность, удалив из нее повторные вхождения слов.

12. В заданном тексте (слова разделены пробелами) поменять местами первое и последнее слово.

13. Даны числа K и текст из слов, разделенных пробелами, в конце – точка. Определить количество слов в тексте, состоящих из K букв.

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

15. Дана последовательность, содержащая от двух до десяти слов, в каждом из которых от одной до пяти строчных букв; между соседними словами – запятая, за последним словом – точка. Напечатать эту же последовательность слов, но в обратном порядке.

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

17. В заданном тексте найти и, если есть, напечатать все слова-палиндромы (слова, которые одинаково читаются слева направо и справа налево).

18. Дан текст из слов, разделенных пробелами, в конце – точка. Найти слово наименьшей длины (содержащее наименьшее количество букв).

19. Разработать программу шифровки – дешифровки текста путем замены каждой буквы текста другой буквой, с кодом на N больше (меньше) исходной.

20. Дана непустая последовательность слов, в каждом из которых от одной до шести букв; между соседними словами – запятая, за последним – точка. Напечатать те слова, у которых одинаковые «соседи». (Написать процедуру, которая вводит очередное слово и присваивает его литерной строке, а запятую или точку присваивает некоторой глобальной переменной).
10. ФАЙЛЫ

Файл  именованная область внешней памяти ПК. Файлом может назы­ваться логическое устройство, потенциальный источник или приемник ин­формации.

Файл характеризуется именем и содержит компоненты одного ти­па (может быть любой тип, кроме файлов). Длина вновь создаваемого файла не указывается при его объявлении.

В Pascal ABC различают типизированные и текстовые файлы. Определяются файловые типы в блоке TYPE следующим способом:

Type

<имя> = FILE OF <тип>; {типизированный}

<имя> = TEXT; {текстовый}

где <имя>  имя файлового типа (правильный идентификатор);

FILE, OF  зарезервированные слова (файл, из),

TEXT  имя стандартного типа для текстовых файлов;

<тип>  любой тип, кроме файлового.

Например:

TYPE

FIL = file of char; {файл символов}

text30 = file of string[30]; {файл строк }

Вид файла определяет способ хранения информации в файле.

Переменные файловых типов объявляются в разделе VAR:

VAR f: FIL;

ff: text30; а также

f1: TEXT; {переменная для текстового файла }

f2: file of real; {переменная файла вещественных чисел}

т. е. сразу можно описывать файловые переменные без объявления типа, например:

VAR

<имя_переменной>: TEXT;

<имя_переменной>: FILE OF <тип>;

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

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

Связывание выполняется стандартной процедурой ASSIGN:

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

где <файловая_переменная>  правильный идентификатор, объявленный как переменная файлового типа; <имя_файла>  текстовое выражение, содержащее имя файла (заключается в апост­рофы).

Пример. VAR f, f1, f2 : text; {объявление файловых переменных}

Begin

ASSIGN(f, ' nameF.txt '); // связывание с файлом nameF.txt

<Имя_файла>  это любое выражение строкового типа, которое стро­ится по правилам определения имен в MS DOS:

 содержит до 8 разрешенных символов: прописные и строчные ла­тинские буквы, цифры и следующие символы ! @ # $ % ^ & ( ) '

- _ ;

 начинается с любого разрешенного символа;

 за именем может следовать расширение  последовательность до трех разрешенных символов. Расширение, если оно есть, отделяется от имени точкой, например: Lab1.pas или date.txt.

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

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

Имя диска  это один из символов А: В: С: ... Z. При этом А: и В: относят­ся к дисковым накопителям на гибких дискетах, а С:, D: и другие – к жестким и виртуальным дискам. Если имя диска не указано, то по умолчанию подразумевается устройство, установленное в операционной системе перед нача­лом работы программы. Максимальная длина имени пути с файлом  79 символов, например:

VAR

f1, f2: text;

Begin

...

Assign( f1 , 'd:\V-129\date.txt ' ) ;

Assign( f2, name.dat); {файл в текущем каталоге}



Однажды установленная связь процедурой Assign между файловой пе­ременной f и физическим файлом сохраняется до следующего вызова Assign с той же файловой переменной f. То есть можно проделывать различные операции с файлом, лишь один раз связав его с файловой переменной f. Для инициализации файла необходимо указать имя физического файла и направление передачи данных. В Pascal ABC можно открыть файл для чтения, за­писи, а также для чтения и записи одновременно.

10.2. Процедуры и функции для работы с файлами

Следующие процедуры открывают логический файл с файловой перемен­ной <ф.п.>, связанной ранее с уже существующим файлом:

RESET(<ф.п.>) – для чтения,

REWRITE(<ф.п.>) – для записи.

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

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

Процедура CLOSE(f) закрывает открытый ранее логический файл f и обеспечивает сохранение всех записей и регистрацию файла на диске. Вы­зовы процедуры CLOSE необходимы для завершения работы с файлами. Также необходимо закрывать открытые файлы перед их удалением (ERASE) или пе­реименованием (RENAME). При этом связь файла с файловыми переменными сох­раняется. Попытка закрыть уже закрытый файл или еще не открытый вызовет сбой в работе программы. Закрытие файлов выполняется автоматически по отношению ко всем открытым файлам при нормальном за­вершении программы.

В таблице 8 сведены общие процедуры и функции для работы с файлами, наиболее применимые на практике.
Таблица 8

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

Процедуры и функции

Выполняемые действия

Assign (f, name)

ReSet (f)

ReWrite (f )

Close (f )

Erase (f)
ReName (f, NewName )
EOF (f )

Связывает <ф.п.> f с именем файла nameтипа string

Открывает файл с логическим именем f для чтения

Открывает файл с логическим именем f для записи

Закрывает файл с логическим именем f

Удаляет (стирает) физический файл, связанный с f,
с диска. Стираемый файл должен быть закрыт

Переименовывает физический файл, связанный с

<ф.п.> f, в файл с новым именем NewName

Функция логического типа возвращает значение

TRUE, если достигнут признак конца файла или

файл пуст, иначе возвращает FALSE

При переименовании процедурой RENAME менять можно лишь имя файла, имя диска менять нельзя. Предварительно файл должен быть закрыт проце­дурой CLOSE.

Функция EOF(f) тестирует конец файла. Если она возвращает TRUE, при записи очередной компонент будет добавлен в конец файла, при чте­нии  файл считается исчерпанным.
10.3. Типизированные файлы

Типизированные файлы позволяют организовать прямой доступ к каж­дой из компонент (по ее порядковому номеру), поскольку длина любого компонента типизированного файла строго постоянна. Описание файловой переменной для таких файлов выполняется в следующем виде:

Var < ф.п.> : file of <тип компонент>;

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

Для работы с типизированными файлами определены следующие проце­дуры и функции (табл. 9). Процедуру SEEK и функции FILESIZE, FILEPOS нельзя использовать для текстовых файлов.

Таблица 9

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

Процедуры, функции

Выполняемые действия

READ(<ф.п.>, <список ввода>);

WRITE(<ф.п.>,

<список вывода>);
SEEK(<ф.п.>,
<номер_компоненты>)
FILESIZE(<ф.п.>);
FILEPOS(<ф.п.>);

Процедура обеспечивает чтение очередных ком­понентов файла

Процедура используется для записи новых ком­понентов в файл; в качестве элементов вывода может стоять выражение.

Процедура смещает указатель файла к компо­ненту с указанным номером; <номер_компоненты> – выражение типа Integer

Функция возвращает количество компонент, содержащихся в файле

Функция возвращает порядковый номер компо­ненты файла, доступной для чтения или записи

Чтобы переместить указатель в конец файла, можно написать, напри­мер: Seek(f, FileSize(f)); где f  файловая переменная.

Файловая переменная предварительно должна быть объявлена предло­жением FILE OF и связана с именем физического файла процедурой ASSIGN. Файл перед обращением к нему должен быть открыт.

10.4. Текстовые файлы

Это файлы последовательного доступа. Они предназначены для хране­ния текстовой информации.

Текстовые файлы связываются с файловыми переменными типа TEXT:

Var <ф.п.> : TEXT;

Текстовый файл в Pascal ABC трактуется как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой строки. При создании текстового файла в конце каждой строки ставится специальный признак EOLN (End Of LiNe  конец строки), а в конце всего файла – признак EOF (End Of File – конец файла) c кодом 26. Тестируются эти признаки одноименными логическими функциями.

Для доступа к записям текстового файла применяются процедуры RE­AD, READLN, WRITE, WRITELN. В них можно использовать переменное число параметров, в качестве которых могут быть символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять фай­ловая переменная. В этом случае осуществляется обращение к дисковому файлу, связанному с файловой переменной процедурой ASSIGN, и открытому процедурами RESET или REWRITE.
10.5. Процедуры ввода

Процедура READ обеспечивает ввод символов, строки и чисел. Она имеет следующий формат:

READ(<ф.п.>,<список_ввода>); или READ(<список_ввода>);

где <список_ввода>  последовательность из одной или более переменных типа CHAR, STRING или любого целого или вещественного типов, например:

READ(Х); // ввод переменной Х с клавиатуры

READ(f, x1, x2, x3); // ввод трех переменных из файла

При вводе переменной типа CHAR выполняется чтение одного символа из файла и присваивается считанное значение переменной. Если перед чтением указатель файла достиг конца очередной строки, то считывается символ CR (код 13). Если достигнут конец файла  то символ EOF.

При вводе переменной типа STRING количество считанных символов равно максимальной длине строки, если раньше не встретились символы CR, EOF. В этом случае эти символы в строку не помещаются. Если коли­чество символов во входной строке больше максимального размера строки, то «лишние» символы до конца строки отбрасываются, а новое обращение к READ возвращает пустую строку.

Таким образом, READ не в состоянии прочесть последовательность строк: читается только одна строка, остальные окажутся пустыми. Для ввода последовательности строк символов применяется процедура READLN.

При вводе числовых данных процедура READ сначала выделяет подс­троку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк пропускаются до первого знача­щего символа; и, наоборот, после первого значащего символа любой из перечисленных символов или символ EOF указывает на конец подстроки. Вы­деленная таким образом подстрока рассматривается как символьное представление числовой константы и присваивается переменной. Фактически весь файл рассматривается как одна длинная строка чисел.

Процедура READLN также обеспечивает ввод символов, строк и чисел:

READLN( f, x);

или READLN(f, x1, x2, ..., xN);

Она идентична процедуре READ за исключением того, что после счи­тывания последней переменной списка ввода оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки.

Эту процедуру можно вызвать без параметра <список ввода>: READLN(f); READLN; что приведет к пропуску всех символов текущей строки. Таким способом можно организовать ожидание нажатия клавиши ENTER при открытом окне результатов.

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

10.6. Процедуры вывода

Процедура WRITE обеспечивает вывод информации в файл или на экран дисплея. Существует две формы обращения к процедуре:

WRITE(<ф.п.>, <список_вывода>); или WRITE(<список_вывода>);

где <список вывода>  это последовательность, состоящая из одной и более переменных (или вы­ражений) символьного, строкового, логического или любого целого или вещественного типа, например:

WRITE(x); WRITE(f, x1, x2, xN);

Файловая переменная, если она указана, должна быть предварительно описана типом TEXT и связана с именем файла процедурой ASSIGN. Если файловая переменная отсутствует, подразумева­ется вывод в стандартный файл – на экран дисплея.

Вывод процедурой WRITELN отличается от WRITE тем, что выводимая строка завершается кодами CR (возврат каретки) и LT (перевод строки), т. е. добавляет маркер конца строки.

При вызове WRITELN можно опускать <список_вывода>. В этом случае в файл передается признак конца строки EOLN, что при выводе на экран приводит к переводу курсора в начало следующей строки:

WRITELN(f); WRITELN;

Любой элемент X списка вывода для процедур WRITE/ WRITELN может быть представлен в следующем формате: X[:w[:d]], причем элементы, заключенные в квадратные скобки, мо­гут отсутствовать. Здесь X  имя переменной или выражение, w, d  вы­ражения целого типа WORD (0..65535). Если параметр w присутствует, то он указывает минимальную ширину поля для записи значения X. При длине переменной X меньше w слева производится дополнение поля вывода пробе­лами, если Х больше w, то w игнорируется и выводится необходимое число символов (по умолчанию w = 23); если параметр w не указан, то значение соответствующей переменной выводится вслед за предыдущим без како­го-либо разделения.

Параметр d задает количество десятичных знаков в дробной части вещественного числа. Используется только для вывода значений вы­ражений вещественных типов. Если параметр d не указан, то число выводится в экспоненциальной форме, в противном случае в формате представ­ления с фиксированной точкой. Если d = 0, выводится только целая часть числа. Например: результаты вывода для числа Х = 3.22 будут следующие:

WRITE(X:6:2); { 3.22}

WRITE(X:6:0); { 3}

WRITE(X:4:2); {3.22}.

Для текстовых файлов также применимы следующие процедуры и функции (табл. 10).
Таблица 10


Процедуры, функции

Выполняемые действия

Append( f);
EOLN(f);

SeekEOLN(f);


SeekEOF(f);

Процедура открывает уже существующий файл f для дозаписи в его конец (для расширения)

Функция возвращает значение TRUE, если во входном файле f достигнуты маркеры конца строки EOLN или конца файла EOF, и FALSE  в противном случае

Функция пропускает все пробелы и знаки табу­ляции до первого признака EOLN или первого значащего символа. Возвращает значение TRUE, если обнаружен маркер конца файла или конца строки

Функция пропускает все пробелы, знаки табу­ляции и маркеры конца строк до маркера конца файла или первого значащего символа. Если мар­кер обнаружен, возвращает значение TRUE
1   2   3   4   5   6   7   8


написать администратору сайта