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

Обновлено: 04.07.2024

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

Имена файлов передаются через параметры программы.

В файле должны храниться целые числа в диапазоне от -20 до +60. Осуществляется поиск первого элемента, кратного 5, и перестановка его в конец файла.

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

2.2. Процедура вывода типизированного файла

2.3. Процедура поиска в файле первого элемента, кратного 5, и номера его позиции

2.4. Функция перемещения первого элемента, кратного 5, в конец файла

  1. Недостаточно параметров.
  2. Невозможно открыть файл для чтения.
  3. Некорректные данные в файле.
  4. Невозможно открыть файл для записи.
  5. Значения в текстовом файле не попадают в заданный диапазон – такие значения должны отбрасываться.

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

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

При перемещении элемента сначала необходимо проверить, что размер типизированного файла не равен 0 (с помощью функции FileSize). Затем используем подпрограмму поиска для поиска элемента, удовлетворяющего заданному условию, и его позиции в файле. Если элемент найден, то необходимо сместить ряд элементов файла вперёд или назад в зависимости от положения найденного элемента и позиции, куда его надо переместить. Это делается с помощью операций чтения и записи и прямого доступа к файлу. Затем найденный элемент записывается в нужную позицию. Функция перемещения должна возвращать значение, сигнализирующее о результате перемещения – файл пуст, элемент не найден, элемент успешно перемещён. Для того чтобы использовать не просто числовые значения, а осмысленные имена, создадим перечислимый тип.
type Results = (Moved, FileIsEmpty, ElementNotFound);

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

Файл – совокупность данных, записанных во внешней памяти под определенным именем.

  • Типизированные;
  • Текстовые;
  • Нетипизированные.
  • Есть имя, что дает возможность работать одновременно с несколькими файлами;
  • Он содержит компоненты одного типа (любой тип Турбо Паскаля, кроме файлового);
  • Он содержит компоненты одного типа (любой тип Турбо Паскаля, кроме файлового);

Описание файловой переменной

Файл можно представить как бесконечный список значений одного и того же (базового) типа. Все элементы файла пронумерованы, начальный элемент имеет нулевой номер.

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

Текстовый файл можно рассматривать как последовательность символов разбитую на строки длиной от 0 до 256 символов.

Для текстовых файлов существует специальный вид чтения и записи (read, write).

  • rewrite(f); - открыт для записи
  • reset(f); - открыт для чтения
  • append(f); - открывает уже существующий файл и позиционирует указатель обработки на конец файла. После такого открытия текстовый файл можно только дополнить информацией, начиная с конца строки.

К типизированным файлам относятся файлы строго определенного типа. Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных.

В типизированных файлах содержимое рассматривается как последовательность записей определенной структуры. Единицей измерения такого набора данных является сама запись. Длина записи определяется как sizeof(fil);

Seek(f, num) процедура устанавливает текущую файловую переменную f на запись с номером num.

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

  1. truncate(f); - уничтожает все компоненты файла f, начиная с места текущего положения файлового указателя;
  2. filepos(f): longint; - функция возвращает для файла f текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа longint;
  3. filesize(f): longint; - функция нахождения размера файла (количество записей) в виде значения типа longint.

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

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

С помощью процедур reset, rewrite можно задать длину нетипизированного файла: reset(f,512); rewrite(f, 65535); по умолчанию длина равна 128 байтам.

  1. Используют все процедуры и функции, рассмотренные ранее, кроме read, write , которые заменяются высокоскоростными.
  2. Blockread(f,buf,c); - где buf – имя переменной, которая участвует в обмене данными с дисками, задает число, считываемых блоков;
  3. Blockwrite(f,buf,c); - процедура предназначена для быстрой передачи в файл определенного числа записей из переменной buf.

Эти процедуры выполняют операции ввода – вывода блоками. Объем блока в байтах определяется по формуле: объем=c*recsize(f);, где recsize – размер записи файла, заданный при его открытии.

1. Составить программу, которая создает типизированный файл, состоящий из 50 случайных чисел целого типа в диапазоне от –100 до 100. Найти максимальное среди этих чисел.

2. Создать текстовый файл и записать в него пять одинаковых фраз.

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

4. Создайте текстовый файл. Запишите в него фразу "Здравствуй мир!"

5. Посчитать количество строк в текстовом файле.

6. Найти длину строк текстового файла.

7. Найти среднее арифметическое всех чисел текстового файла, расположенных на четных строках.

8. Имеется текстовый файл. Переместить его строки в другой файл. Порядок строк в этом файле должен совпадать с порядком строк в заданном файле.

9. Создать файл и записать в него десять случайных чисел от –100 до 100.

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

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

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

13. Имеется текстовый файл. Напечатать первые 10 символов первой строки.

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

15. Имеется текстовый файл напечатать его пятую строку

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

17. Имеется типизированный файл, состоящий из 12 вещественных чисел. Найти их среднее арифметическое.

18. Имеется текстовый файл. Напечатать все его строки, начинающиеся с буквы «r». Посчитать их количество.

19. Имеется файл с числами. Поменять местами второе и последнее числа.

20. Имеется текстовый файл. Найти длину самой длинной строки.

21. Составить программу обслуживания телефонных справочников (создание, изменение, добавление, поиск номера телефона абонента).

Выберите правильный ответ
1. Что понимается в Pascal под файлом?
a. Накопитель на гибком магнитном диске
b. Последовательность действий записанная на внешнем носителе
c. Область памяти на внешнем запоминающем устройстве, способная хранить некоторую совокупность информации
d. Область памяти на внешнем запоминающем устройстве, способная перерабатывать некоторую совокупность информации

2. Какие функции выполняет процедура Assign?
a. Предназначена для установления связи между конкретным физическим файлом на магнитном носителе и переменной файлового типа, которая будет являться представителем этого файла в программе
b. Завершает действия с файлом, который указывается в качестве ее единственного параметра
c. Создает новые записи после текущей в файле и текущая позиция в файле становится концом файла
d. Возвращает ложность (false), если указатель находится не в конце файла и возвращает истина (True), если указатель достиг конец файла

3. Для чего предназначена поцедура Close?
a. Предназначена для установления связи между конкретным физическим файлом на магнитном носителе и переменной файлового типа, которая будет являться представителем этого файла в программе
b. Устанавливает текущую позиция в файле
c. Завершает действия с файлом, который указывается в качестве ее единственного параметра
d. Возвращает ложность (false), если указатель находится не в конце файла и возвращает истина (True), если указатель достиг конец файла

4. Какое отличие существует между процедурами Reset и Rewrite?
a. Процедура Reset предполагает, что открываемый дисковый файл уже существует, в противном случае возникает ошибка; процедура Rewrite допускает, что открываемый файл может еще не существовать, в этом случае она создает заданный файл
b. Процедура Reset допускает, что открываемый файл может еще не существовать, в этом случае она создает заданный файл; процедура Rewrite предполагает, что открываемый дисковый файл уже существует, в противном случае возникает ошибка
c. Процедура Reset создает новые записи; процедура Rewrite перезаписывает файл с заданной позиции
d. Никакой

5. Какова роль функции Eof()?
a. Создает новые записи после текущей в файле и текущая позиция в файле становится концом файла
b. Закрывает данный файл
c. Возвращает ложность (false), если указатель находится не в конце файла и возвращает истина (True), если указатель достиг конец файла
d. Возвращает ложность (false), если указатель достиг конец файла и возвращает истина (True), если указатель находится не в конце файла

6. Какие действия выполняют процедуры Rename и Erase?
a. Переименование файла и перенос файла
b. Переименование файла и завершает действия с файлом
c. Переименование файла и создание нового файла на диске
d. Переименование файла и удаление файла на диске

7. В чем состоит особенность текстового файла?
a. Представляется как последовательность записей определенного типа. Единицей измерения такого набора данных является сама запись
b. Рассматривается как совокупность символов или байтов. Такое представление стирает все различия между файлами независимо от типа их объявления
c. Рассматривают как последовательность символов, разбитую на строки. Каждая строка завершается маркером конца строки
d. Рассматривают как последовательность букв, разбитую на строки. Каждая строка завершается маркером конца строки

8. Что представляет собой типизированный файл?
a. Представляется как последовательность записей определенного типа. Единицей измерения такого набора данных является сама запись
b. Рассматривают как последовательность символов, разбитую на строки. Каждая строка завершается маркером конца строки
c. Рассматривается как совокупность символов или байтов. Такое представление стирает все различия между файлами независимо от типа их объявления
d. Представляется как последовательность символов. Единицей измерения такого набора данных является сам символ

9. Для чего предназначена функция Eoln(f)?
a. Возвращает значение True, если указатель файла находится на маркере конца файла
b. Возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False в противном случае
c. Возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(f) возвратил значение True
d. Возвращает булевское значение True при достижении маркера конца строки, причем указатель файла пропускает все пробелы и знаки табуляции, предшествующие маркеру

10. Для чего предназначена функция SeekEoln(f)?
a. Возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False в противном случае
b. Возвращает значение True, если указатель файла находится на маркере конца файла
c. Возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(f) возвратил значение True
d. Возвращает булевское значение True при достижении маркера конца строки, причем указатель файла пропускает все пробелы и знаки табуляции, предшествующие маркеру

11. Для чего предназначена функция SeekEof(f)?
a. Возвращает значение True, если указатель файла находится на маркере конца файла
b. Возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False в противном случае
c. Возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(f) возвратил значение True
d. Возвращает булевское значение True при достижении маркера конца строки, причем указатель файла пропускает все пробелы и знаки табуляции, предшествующие маркеру

12. Что предсавляют собой нетипизированные файлы?
a. Предназначены для низкоуровневой работы с файлами. В отличии от типизированного файла не имеет жестко установленной единицы чтения/записи
b. Отличаются от типизированных файлов лишь названием
c. Предназначены для высокоуровневой работы с файлами. В отличии от типизированного файла имеет жестко установленной единицы чтения/записи
d. Обычные файлы информации

13. Как объявляется нетипизированный файл?
a. При объявлении указывается только ключевое слово file
b. При объявлении указывается только одна файловая переменная
c. При объявлении указывается только ключевое слова char
d. При объявлении указывается несколько файловых переменных

Доступ к полям записи осуществляется через полное имя поля, которое образуется с помощью:

Другим способом доступа осуществляется с помощью оператора With:

With student do

For i:=1 to 4 do read(marks[i]);

Можно сказать, что оператор with сделал запись student текущей, и в операции с полями можно указывать только собственно имена полей.

Формой оператора withимеет вид:

With<имя записи> do <оператор>;

<оператор> - произвольный оператор ТР, в том числе составной. Инициализация записи может производиться в разделе констант. Для каждого поля задаётся его имя, после которого через двоеточие указываются значения:

Const s1 : studrec = (name : ’Петров’ , group: ’2’ ,marks : (4,3,5,5));

Определение: Если элементам записи является запись, то это называется вложенной записью.

Поля записи могут хранить информацию-pole 1,pole A, pole B.

И поле как элемент записи(rec 2).

Уникальность имён полей записи.Примеры.

1)В рамках одной записи имена записи должны быть различны

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

3)Допускается, чтобы имя записи и имя поля совпадали.

Массивы в структуре записи:

1)массив может быть элементом записи

2)На промежуточном уровне записи может располагаться массив.

T_array=array[1..2] of trec;

Запись как единый объект операций.

Если записи совпадают по типу, то допускается применение операции присваивания между такими записями.

Вариантные записи.

Одно из полей записи может быть вариантной записью.

Вариантная часть записи – изменяемая часть. Все варианты этой части располагаются в памяти на одном и том же месте в конце записи.

Case k:integer of

2: (v2:real; v3:array[1..10] of integer);

Вариантная часть начинается словом case, но это не оператор варианта, так как такая часть стоит последней в записи, то закрывающий case end не нужен.

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

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

Контроля за размещением вариантов нет, одна вариантная часть может быть вложена в другую.

Допускается пустой вариант:

Case Boolean of

Указание имени селектора не является обязательным, обязателен лишь тип.

Константы выбора могут повторяться, их тип необязательно будет совпадать с типом селектора.

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

Множества в ТП. Описание Типа. Задание значений множественных переменных.

Удобна возможность введения нестандартных типов, например перечислимый. Формат описания типа имеет вид:

Type <идентификатор>=(<список значений через запятую>);

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

1)Повторяющиеся элементы недопустимы

2)Переменной перечислимого типа можно назначать любое значение в пределах типа.

3)Нет представления ввода-вывода переменных перечислимого типа

4)Допускается использование операции сравнения для переменных перечислимого типа.

Type<идентификатор> = (<начальное значение>..<конечное значение>)

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

Замечание: при преобразовании типа возможен выход за границы типа, – сигнал для компилятора, так называемая директива (проверяет выход за границу).

Функция sizeof(x), возвращающая размер памяти в байтах, которую занимает переменная Х, может быть именем типа.

Замечание: функция sizeof может использоваться для структурированных типов.

Type <идентификатор>=set of <тип элементов>, тип элементов –порядковый, удовлетворяющий ограничению число элементов не более 256 (0..255)

Type letter=set of ‘A’..’Z’;

Type seol=set of (Red,Green);

Type all=set of char;

Замечание: в отличие от массива, множество-неупорядочно, сами элементы множества в памяти не записываются, там хранится только информация об их наличии или отсуствии

Множество может быть задано в виде списка элементов в квадратных скобках.

Замечание: в качестве элементов списка в квадратных скобках можно использовать выражение, допустимый тип.

Если начальное и конечное значения диапазона образуют ошибку задания типа.

Операции с множеством

4)Проверка принадлежности элемента множеству(“in”)

Пример 1 операции:

А+В, в котором будут находиться все элементы А и В, но если есть повторяющиеся, то они пишутся один раз

Пример 2 операции:

А*В , то есть которые повторяются и в А и в В

А - может быть выражение базового типа(Red in Colset) или Red in [Red, Green]=true 8+1 in [1..12]=true

Type chs=set of char;

Var chs 1,chs 2,chs 3,:chs;

Chs 3:=chs 1*chs 2;;

Пример использования множества .

Множества можно использовать вместо case или наборов операторов if.

Var sp:set of char;

Sp:=[‘A’ , ‘B’ , ‘C’ , ‘D’ , ‘a’ , ‘b’ , ‘c’ , ‘d’];

Repeat writeln(‘введите допустимое значение’);

Файлы в ТП. Виды файлов.Описание файлового типа. Текстовые файлы.

Файл – последовательность компонентов одного типа. Кол-во элементов файла не обговаривается.

Файл – структура последовательного доступа.

Определение файлового типа:

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

тип элементов – любой кроме файлового.

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

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

var<имя переменной>:<имя файлового типа>;

1) var f: file of integer

2) type g: file of real; var f: g;

текстовый файл – файл из строк символов; т.е. есть отличия между стандартным типом text и fileofchar.

Для хранения числа в текстовом файле может потребоваться больше места, чем в типизированном файле.

Типизированные файлы. Организация “прямого доступа” к элементам файла.

В типиз. файле все элементы имеют одну и ту же длину, т.е. занимают одинаковый объем в памяти.

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

В типиз. файле все элементы можно пронумеровать и выбрать по номеру. Нумерация элементов в файле начинается с 0. Для перемещения указателя файла в нужную позицию можно использовать стандартную процедуру seek(f,N-1)

Для больших объемов данных типиз. файлы эффективнее текстовых – с помощью процедуры seek можно использовать прямой доступ к элементам файла.

Более характерным для Pascal являются типизированные файлы, или файлы произвольного доступа. Основным свойством этих файлов является то, что их структура данных представляет собой последовательность компонентов одного типа. Описывают подобный файл словосочетанием file of с последующим указанием типа компонентов файла, число которых (длина файла) не фиксируется:

var имя_файла : file of тип_компонентов

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

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

Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла (оператор Assign). Затем нужно открыть его (используются операторы Reset и Rewrite, но не Append). Операторы Reset и Rewrite открывают файл и для чтения, и для записи (а не только для чтения или только для записи, как при использовании текстовых файлов). Отличие их в том, что оператор Reset открывает только существующий файл (если такого файла нет, будет сгенерирована ошибка времени выполнения). С другой стороны, оператор Rewrite создает новый файл (если файл с таким именем уже имеется, то он будет уничтожен и создан заново). При открытии файла с ним связывается текущий указатель файла, который позиционируется на его первый элемент. Оперировать можно только тем элементом файла, на который ссылается указатель файла. При чтении или записи элемента файла происходит автоматическое перемещение указателя на следующий элемент. Чтение из типизированного файла производится оператором Read (но не ReadLn), а запись в него — оператором Write (но не WriteLn). Однако следует помнить, что в списке вывода оператора Write могут быть только переменные. Типы элементов файла и типы переменных в списках ввода-вывода должны быть согласуемы по присваиванию. Элементами типизированных файлов могут быть числовые, символьные, булевы, строковые значения, массивы, записи, но не файлы или структуры с файловыми элементами.

Узнать количество элементов типизированного файла (размер файла) можно с помощью функции FileSize , для которой используется следующий синтаксис:

Например, если переменная k имеет тип LongInt, а f – файловая переменная типизированного файла, то оператор k := FileSize(f), записывает в переменную k размер файла f.

Элементы типизированного файла нумеруются с нуля (порядковый номер последнего элемента файла на единицу меньше размера файла). Чтобы узнать, на каком элементе располагается указатель файла, используют функцию FilePos:

Текущим положением указателя можно управлять, для чего служит процедура Seek , которая использует следующий синтаксис:

Второй параметр (тип LongInt ) задает номер элемента (отсчет от 0), на который должен переместиться указатель файла. Рассмотрим несколько примеров.

Перейти к пятому (фактически шестому) элементу файла f :

Перейти к предыдущему элементу:

Перейти в конец файла:

Как и для текстовых файлов, можно использовать функцию Eof(имя_файла), которая возвращает значение True, если текущий указатель расположен на признаке конца файла (т. е. при выполнения равенства FilePos(имя_файла) = FileSize(имя_файла)).

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

Текстовые файлы могут быть созданы текстовым редактором. Однако типизированные файлы создаются в результате работы какой-либо программы.

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

Пример последовательного доступа к типизированному файлу:

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

Читайте также: