Задания для самостоятельного решения
Задача 1. Создать файл, компонентами которого являются целые числа. Вывести на экран компоненты, позиции которых имеют четные номера, а затем - компоненты, позиции которых имеют нечетные номера.
Задача 2. Даны символьные файлы f1 и f2. Переписать с сохранением порядка компоненты файла f1 в файл f2, а компоненты файла f2 - в файл f1. Использовать вспомогательный файл h.
Задача 3. Дан файл f, компоненты которого являются целыми числами. Никакая из компонент файла f не равна нулю. Числа в файле идут в следующем порядке: десять положительных, десять отрицательных, десять положительных, десять отрицательных и т.д. Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в следующем порядке: пять положительных, пять отрицательных, пять положительных, пять отрицательных и т.д.
Задания для контрольной работы
Вариант 1.
Дан файл вещественных чисел. Вычислить сумму компонент файла, записанных до первого отрицательного. Записать в новый файл суммируемые компоненты.
Вариант 2.
Дан файл вещественных чисел. Найти наибольшую компоненту файла и разделить ее на все компоненты. Результаты записать в файл.
Вариант 3.
Дан файл вещественных чисел. Удалить из него максимальную компоненту.
Вариант 4.
Дан файл вещественных чисел. Найти сумму компонент, расположенных между максимальной и минимальной компонентами. Записать в новый файл суммируемые компоненты.
Вариант 5.
Дан файл вещественных чисел. Удалить из него все компоненты, принадлежащие отрезку [1,5].
Вариант 6.
Дан файл вещественных чисел. Записать вместо максимального элемента файла сумму положительных компонент.
Вариант 7.
Дан файл вещественных чисел. Найти среднее арифметическое его компонент и удалить все компоненты, превышающие среднее значение.
Вариант 8.
Дан файл вещественных чисел. Переписать в новый файл все компоненты, расположенные после первого положительного.
Вариант 9.
Дан файл вещественных чисел. Записать вместо его минимального элемента сумму отрицательных компонент.
Вариант 10.
Дан файл вещественных чисел. Переписать в новый файл все компоненты, расположенные после максимальной компоненты.
Вариант 11.
Дан файл вещественных чисел. Найти произведение его отрицательных компонент. Переписать эти компоненты в новый файл.
Вариант 12.
Дан файл целых чисел. Найти сумму компонент с четным значением и записать в новый файл те из них, значения которых превышают 4.
Вариант 13.
Дан файл вещественных чисел. Получить новый файл, записав в него сначала все положительные, а затем все отрицательные компоненты.
Вариант 14.
Дан файл вещественных чисел. Записать в новый файл все элементы данного в обратном порядке и найти сумму всех отрицательных компонент.
Вариант 15.
Дан файл вещественных чисел. Переписать в новый файл сначала все компоненты, превышающие среднее арифметическое его элементов, а затем все остальные компоненты.
Вариант 16.
Дан файл вещественных чисел. Если сумма его элементов превышает количество компонент, переписать в новый файл все положительные компоненты, в противном случае – все отрицательные.
Вариант 17.
Дан файл целых чисел. Все числа, кратные трем, переписать в новый файл. Найти их среднее арифметическое.
Вариант 18.
Дан файл вещественных чисел. Если среднее арифметическое его компонент превышает значение максимального элемента файла, удалить из него все отрицательные элементы, в противном случае – удалить все положительные.
Вариант 19.
Дан файл вещественных чисел. Заменить в нем все отрицательные элементы значением минимальной компоненты файла.
Вариант 20.
Дан файл вещественных чисел. Все элементы, расположенные до минимального элемента, заменить нулями.
Записи
Запись - это структурированный тип данных, состоящий из фиксированного числа компонент одного или нескольких типов. Такой тип удобен для компактного представления комбинаций разнотипных данных.
Определение типа начинается идентификатором record и заканчивается словом end. Между ними заключен список компонент, называемых полями. Каждое поле состоит из идентификатора и типа компоненты. Примеры определения типа:
Туре
PaletteType = record
Size : Byte;
Colors: Array[0..MaxColors] of Shortint
end;
ViewPortType = record
xl,yl,x2,y2: Integer;
Clip : Boolean;
end;
FileRec = record
Handle, Mode, RecSize: Word;
Private : Array[1..26] of Byte;
UserData: Array[1..16] of Byte;
Name : Array [0..79] of Char;
end;
Поле записи может иметь практически любой тип: массив, множество, другая запись. В последнем случае элементы (поля полей) имеют имя, состоящее из трёх частей. На практике чаще всего используют массивы записей, т.к. записи отражают табличную форму хранения данных и применяются в различных приложениях - от бухгалтерских задач до задач системного программирования. Порядок описания полей в определении записи задаёт их порядок хранения в памяти, а необходимый для этого объём складывается из длин полей.
Примеры решения заданий
Задача 1. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Имеется информация о багаже нескольких пассажиров - соответствующие пары чисел. Подсчитать общее количество вещей и выяснить, имеется ли пассажир, багаж которого состоит из одной вещи весом не менее 30 кг.
Решение: Алгоритм решения задачи представлен на рис. 7.1.
Программа в Turbo Pascal будет иметь следующий вид:
Const z:String[3] = ' не';
t:Byte=0;
Type Info = record
q: Byte;
w: Real;
end;
Var luggage: Info;
i,n : Byte;
Begin
Write('Введите число пассажиров ');
ReadLn(n);
WriteLn ('Вводите пары чисел (количество
и вес) ');
For i:=l to n do
Begin
ReadLn(luggage.q,luggage.w);
Inc(t,luggage.q);
If (luggage.q=l) and (luggage.w>=30)
then z:='';
End;
WriteLn('Суммарное количество вещей: ',t);
WriteLn('Искомый пассажир ' ,z, ' имеется');
ReadLn;
End.
Рис. 8.1. Блок-схема алгоритма решения задачи 1
Определим тип Info - запись с двумя полями. Имена полей q (количество вещей одного пассажира) и w (общий вес вещей одного пассажира); типы полей Byte и Real. Luggage - идентификатор переменной введенного типа. Введём данные с клавиатуры и, используя составные имена полей записи luggage.q и luggage.w, найдём искомые величины.
Задача 2. Имеются сведения о кубиках: размер каждого кубика (длина ребра в см), его цвет (красный, желтый, зеленый или синий) и материал (деревянный, металлический, картонный). Найти: а) количество кубиков каждого из перечисленных цветов и их суммарный объём; б) количество деревянных кубиков с ребром 3 см и количество металлических кубиков с ребром, большим 5 см.
Решение: Алгоритм решения задачи представлен на рис. 7.2.
Для представления разнотипной информации о кубе определим тип Info - запись с тремя полями. Имена полей l (размер), с (цвет) и m (материал); типы полей Word, String[7] и String[13]. Для хранения информации введём сложную типизированную константу - массив записей Cube. Имена полей при этом указываются явно; поле от своего значения отделяется двоеточием; поля разделяются точкой с запятой; порядок следования полей должен соответствовать порядку их описания в типе Info.
Для упрощения доступа к полям записей при их совместной обработке предназначен оператор with, имеющий формат:
with <имя переменной> do <onepamop>.
Один раз указав имя переменной типа запись в операторе with, можно внутри оператора обращаться к полям записи без указания имени.
Программа в Turbo Pascal будет иметь следующий вид:
Uses Crt;
Type Info = record
l: Word;
c: String[7];
m: String [13];
end;
Const n=5;
Cube: Array [l..n] of Info =
((l: 3; с: 'синий'; m: 'деревянный' ),
(l: 8; с: 'красный'; m: 'металлический'),
(l: 3; с: 'зеленый'; m: 'деревянный' ),
(1: 4; с: 'желтый'; m: 'металлический'),
(1: 5; с: 'синий'; m: 'картонный' ));
Var i,ql,q2,q3,q4,q5,q6: 0..n;
v: Longlnt;
Begin
ql:=0;
q2:=0;
q3:=0;
q4:=0;
q5:=0;
q6:=0;
v:=0;
For i:=l to n do
begin
With Cube[i] do
begin
{a} If с='красный' then Inc(ql);
If с='желтый' then Inc(q2);
If c='зеленый' then Inc(q3);
If c='синий' then Inc(q4);
Inc(v, l*Sqr(l));
{б} If (m='деревянный') and (l=3)
then
Inc(q5);
If (m='металлический') and (l>5)
then
Inc(q6);
End;
End;
{ вывод }
WriteLn('Красных:',ql,' желтых:',q2,
' зеленых:',q3,' синих:',q4);
WriteLn('Суммарный объем: ',v);
WriteLn('Деревянных кубиков с ребром 3 см:',
q5);
WriteLn('Металлических кубиков с ребром,
большим 5 см: ', q6);
ReadLn;
End.
Рис. 8.2. Блок-схема алгоритма решения задачи 2
Задача 3. Сведения об автомобиле состоят из его марки, номера и фамилии владельца. Дан файл f, содержащий сведения о нескольких автомобилях. Найти фамилии владельцев и номера автомобилей данной марки.
Решение: Программа в Turbo Pascal будет иметь следующий вид:
Program Automobile;
Uses Crt;
Const n=10;
found: Boolean=false;
Type Info = record
Brand : String[15];
Number : String[15];
Surname: String [20];
end;
Var Car: Info;
f: File of Info;
z: String[20];
i: 1..n;
Begin
Assign(f,'auto.dat');
{$I-};{отключаем проверку ошибки ввода-вывода}
Reset(f);
{$I+}
{если файл не существует, создаем новый}
If IOResult<>0 then Rewrite(f);
{если файл пустой, заполняем его}
If FileSize(f)=0 then
begin
Writeln('Файл пуст! Введите элементы!');
Write('Вводите данные построчно: ');
Write('марку автомобиля, его номер ');
Writeln('и фамилию владельца');
For i:=l to n do
begin
With Car do
begin
Readln(Brand);
Readln(Number);
Readln(Surname);
End;
Write(f,Car);
End;
Write('Введите заглавными буквами');
Write('марку автомобиля >>');
ReadLn(z);
While not Eof(f) do
begin
Read(f,Car);
With Car do
If Brand=z
then
begin
found:=true;
WriteLn(Surname:20, Number:20);
End;
End;
If Not found
then
Write('Автомобиля данной марки нет');
ReadLn;
End.
Пример демонстрирует запись в файл и чтение из файла структурных данных типа запись. Файл exl68.dat должен существовать на диске или может быть создан с помощью блока, обозначенного в программе.