Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Прикладное программирование. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
где наименьшее значение находится дальше от начала того массива. Получен­ный массив С распечатать на экране.
Вариант 27
Задача 1. Ввести с экрана 1-мерный массив А целого типа. Заменить все отличные от нуля элементы массива минимальным элементом массива А. По­лученный массив распечатать на экране.
Задача 2. Ввести два 1-мерных массива А и В целого типа. Сформировать новый массив С, переписав в него все элементы того Массива, у которого больше четных элементов. Полученный массив С распечатать на экране.
Вариант 28
Задача 1. Ввести с экрана 1- мерный массив А целого типа. Найти количе­ство положительных массива А и их индексы. Распечатать на экране найден­ные индексы положительных элементов и их количество.
Задача 2. Ввести 1-мерный массив А целого типа. Сформировать новый массив В, переписав в него все нулевые и кратные 5 элементы массива А в по­рядке их следования. Полученный массив В распечатать на экране.
Вариант 29
Задача 1. Ввести с экрана 1-мерный массив А целого типа. Найти сумму кратных 5 элементов массива А. Полученный результат распечатать на экране.
Задача 2. Ввести 1-мерный массива А целого типа. Сформировать два но­вых массива В и С, переписав массив В все элементы массива А больше 10, а в массив С – все элементы массива А меньше 10. Полученные массивы В и С распечатать на экране.
Вариант 30
Задача 1. Ввести с экрана 1-мерный массив А целого типа. Найти макси­мальный элемент среди положительных элементов массива А. Полученный ре­зультат распечатать на экране.
Задача 2. Ввести 2 1-мерных массива А и В целого типа. Сформировать новый массив С, переписав в него все элементы того массива (А или В), у ко-
51
торого максимальный элемент наибольший. Полученный массив С распечатать на экрана
Пример отчета «Одномерный массив»
Задача 1. Ввести с экрана 1-мерный массив А целого типа. Заменить нуля­ми все четные элементы массива и найти их количество. Полученный массив А и количество распечатать на экране.
Цель работы: закрепить основные понятия языка Паскаль.
Программный код (рисунок 3.)
Program ttt;
Const n=5;
Var i,k: integer;
A: array[1..n];
Begin
K:=0;
For i:=1 to n do
Begin
Write (‘a[‘,i,’]’);
Readln a[i];
If a[i] mod 2 =0 then
Begin
A[i]:=0;
K:=k+1;
End;
End;
For i:=1 to n do
Writeln (a[i]);
Writeln (‘количество четных элементов =’,k);
Readln;
End.
52
Схема алгоритма
конец
k
A[i] mod
A[i]=0 k=k+1
n
I=1,n
начало
K=0
A[i]
A[i]
I=1,n
k
Рисунок 3. Схема алгоритма поставленной задачи
Пример: при a[1]=1, a[2]=2, a[3]=46, a[4]=5, a[5]=8,
Новый массив: 1, 0, 0, 5, 0.
Количество четных элементов = 3.
53
Типизированные файлы
Файл — единственная структура данных, которая хранится во внешней памяти компьютера.
Файл — структура данных, состоящая из упорядоченной совокупности произвольного числа однотипных компонент, хранящихся в поименованной области памяти на диске. Каждый файл данных хранится во внешнем запоми­нающем устройстве (ВЗУ), а обрабатывается в оперативно запоминающем устройстве (ОЗУ), поэтому существует два понятия файла: Физический файл – фактический файл, хранящийся на ВЗУ.
Логический файл, то есть тип данных принадлежащий конкретной про­грамме с заданным способом обработки
Физический файл — это поименованная совокупность компонент, высту­пающая как единое целое при хранении и поиске данных. Он состоит из компо­нент или записей. Компоненты имеют определенную длину, зависящую от ин­формации, которая будет храниться в файле. Например, если это вещественные числа, то компонента будут состоять из 6 байт, для целых чисел – компоненты длины 2 байта и т. д.
В файлах размещаются данные для длительного хранения, а также для об­работки их различными программами. Каждому файлу, размещенному на дис­ке, присваивается уникальное имя, длина которого не должна превышать вось­ми символов. Полезно также применять расширение файла в соответствии с со­глашениями операционной системы. Длина расширения файла не должна пре­вышать трех символов. Перед именем файла можно указать полный путь к файлу. Путь к файлу может включать в себя указание имени диска (например, с:, d: — для жесткого диска или а:, b: — для гибких дисков), а затем цепочку имени каталогов файла, отделяемых от имени диска и друг от друга символом V Таким образом, полная спецификация файла: <имя_диска>:\<каталог1>\<кат2>\.. .<катN>\<имя_файла>. <расширение>
Пример: d:\users\TT152\prog.pas
54
Существует ряд имен файлов, зарезервированных для стандартных устройств, например:
Ргn — устройство печати, Con — консоль (клавиатура и дисплей) и неко­торые другие (LPT1, LPT2, LPT3.COM 1, COM2, AUX, NUL…). В качестве имен файлов на жестком диске не рекомендуется использовать любые зарезер­вированные слова.
При формировании имени файла используется смысловая мнемоника. Например, файл с данными по кадрам — KADR.FIO, KADR.ADR и др.
Логический файл не существует, как некоторая реальная структура дан­ных. Дело в том, что нет смысла физический файл полностью считывать с дис­ка в ОЗУ (прежде всего этой памяти может не хватить). Логический файл неко­торая абстракция, созданная для удобства рассмотрения при программировании физического файла. В Паскале различают следующие файловые типы:
типизированные файлы (файлы, состоящие из записей постоянной дли- ны);
текстовые файлы,
нетипизированные файлы (файлы, представляющие собой неструктури-
рованный поток байтов).
При работе с файлами устанавливается связь между логическим и физиче­ским файлами с помощью файловой переменной (ФП).
Файловая переменная не является представлением одного конкретного файла. Она является таким же обобщением, как и формальный параметр блока: указывается во всех программных действиях с файлом и запись этих действий применима к любому файлу из группы однотипных файлов. Нужно лишь свя­зать файловую переменную с именем этого файла.
В языке Паскаль реализована возможность организации, хранения и выво­да информации в последовательных файлах.
Существенной особенностью всех рассмотренных до сих пор значений производных типов является наличие в них конечного, наперед заданного числа компонент. Так, в значении многомерного массива это число можно опреде-
55
лить, зная количество компонент по каждому измерению, а в значении записи это число определяется количеством и типом полей. Таким образом, заранее, еще до выполнения программы, по этому описанию можно выделить необхо­димый объем памяти машины для хранения значений переменных этих типов.
Но существует определенный класс задач и определенные ситуации, когда количество компонент (пусть даже одного и того же из известных уже типов) заранее определить невозможно, оно выясняется только в процессе решения за­дачи. Поэтому возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и то­го же типа, причем длина этих последовательностей заранее не определяется, а конкретизируется в процессе выполнения программы. Этот тип значений полу­чил название файлового типа. Условно файл в Паскале можно изобразить как некоторую ленту, у которой есть начало, а конец не фиксируется. Элементы файла записываются на эту ленту последовательно друг за другом:
где F—имя файла, а F1, F2, F3, F4 – его элементы. Файл во многом напо­минает магнитную ленту, начало которой заполнено записями, а конец пока свободен. В программировании существует несколько разновидностей файлов, отличающихся методом доступа к его компонентам: файлы последовательного доступа и файлы произвольного доступа.
Методы доступа к элементам файла
Метод доступа — это способ достижения той или иной компоненты при операциях обмена. Известно, что файлы в языке Паскаль — последовательные, отсюда следует естественный метод доступа — последовательный, так как по­сле считывания или записи очередной компоненты текущий указатель устанав­ливается на следующую компоненту.
Для того чтобы напрямую обратиться к требуемой компоненте для чтения или записи ее, необходимо выполнить специальную процедуру по изменению положения текущего указателя записи. Для этого используют процедуру seek.
56
Формат:
Наименование
функции
Формат
Тип
результата
Результат
Определение
конца файла
eof
(<файл_перем>
)
boolean
true – если конец файла,
false – в
противном случае
Определение
позиции
файла
filepos
(<файл_перем>
)
longint
Номер текущей компонен-
ты файла
Определение
размера файла
filesize (<файл
перем>)
longint
Число компонент в
файле
seek (<файловая_переменная>,<номер_компоненты>);
Пример:
seek (f,0); {указатель на начало файла}.
Полезно использовать следующие функции для доступа к элементам файла
Таблица 3 Функции доступа к элементам файла
Пример:
seek (f, filepos (f) -1); (указатель на предыдущую компоненту!
seek (f, filepos (f) +1); {указатель на следующую)
seek (f, filesize (f)-l); {указатель на последнюю компоненту файла)
seek (f, filesize (f)); {указатель на конец файла}
L:=fiiesize (f); {определение числа компонент в файле}
Номера компонент файла будут меняться от 0 до L-1, так как компоненты номеруются с нуля.
Этот способ будем называть прямым доступом.
Для чтения компонент файла используется процедура Read.
Формат:
Read (<файловая_переменная>,<список_переменных>);
57
Пример:
Read (f, а); {чтение компоненты в переменную а}
Read (f, b, с); {«чтение компонент в переменные b и с)
Значения переменных вводятся через пробел или ENTER. После ввода по­следнего значения обязательно нажать клавишу ‘ENTER’.
Для записи компонент в файл используется процедура Write.
Формат:
Write (<файловая_переменная>, <список_переменных>);
Пример:
Write (m, с); {записать значение переменной с в файл ш|
Переменные, указанные в процедурах Read и Write, должны быть того же типа, что и компоненты файла, с которым связана файловая переменная
Иногда требуется отсечь часть файла, начиная с текущей позиции, а для этого существует процедура Truncate.
Формат:
Truncate (<файловая_переменная>):
При этом файл должен быть открыт, а для настройки на конкретную ком­поненту файла, с которой следует удалить его часть, можно воспользоваться процедурой Seek.
Основные режимы обработки файла:
1. создание файла на диске;
2. чтение файла с диска;
3. обновление файла на диске:
4. поиск компоненты по заданному номеру или признаку;
5. исключить из файла компоненту с заданным номером или признаком:
6. добавить в конец файла одну или несколько компонент,
7. добавить в файл новую компоненту после компоненты с заданным но-
мером и признаком;
8. отсечь концевую часть файла, начиная с компоненты с заданным номе-
ром и признаком;
58
9. заменить одну или несколько компонент новыми значениями
Таким образом, простейший метод доступа состоит в том, что по файлу можно двигаться только последовательно, начиная с первого его элемента, и, кроме этого, всегда существует возможность начать просмотр файла с его начала. Таким образом, чтобы добраться до пятого элемента файла, необходи­мо, начав с первого элемента, пройти через предыдущие четыре. Такие файлы называют файлами последовательного доступа. У последовательного файла до­ступен всегда лишь очередной элемент. Если в процессе решения задачи необ­ходим какой-либо из предыдущих элементов, то необходимо вернуться в нача­ло файла и последовательно пройти все его элементы до нужного.
Файлы произвольного доступа Паскаля позволяют вызывать компоненты в любом порядке по их номеру.
Важной особенностью файлов является то, что данные, содержащиеся в файле, переносятся на внешние носители. Файловый тип Паскаля – это един­ственный тип значений, посредством которого данные, обрабатываемые про­граммой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ЭВМ.
Работа с файлами в Паскале
Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонен­тов может быть любой тип Паскаля, кроме файлов. Иными словами, нельзя со­здать «файл файлов». В-третьих, длина вновь создаваемого файла никак не ого­варивается при его объявлении и ограничивается только емкостью устройств внешней памяти.
Файловый тип или переменную файлового типа в Паскале можно задать одним из трех способов:
Type <имя_ф_типа>=file of<тип_элементов>;
59
<имя_ф_типа>=text;
<имя_ф_типа>=file;
Здесь <имя_ф_типа> – имя файлового типа (правильный идентификатор); File, of — зарезервированные слова (файл, из); <тип_элементов> — любой тип
Паскаля, кроме файлов.
Пример описания файлового типа в Паскале
Type
Product= record
Name: string;
Code: word;
End;
Text80= file of string[80];
Var
F1: file of char;
F2: text;
F3: file;
F4: Text80;
F5: file of Product;
В зависимости от способа объявления можно выделить три вида файлов Паскаля:
типизированные файлы Паскаля (задаются предложением file of..);
текстовые файлы Паскаля (определяются типом text);
нетипизированные файлы Паскаля (определяются типом file).
Следует помнить, что физические файлы на магнитных дисках и перемен­ные файлового типа в программе на Паскале – объекты различные. Переменные файлового типа в Паскале могут соответствовать не только физическим фай­лам, но и логическим устройствам, связанным с вводом/выводом информации. Например, клавиатуре и экрану соответствуют файлы со стандартными имена­ми Input, Output.
60