Задания для самостоятельного решения

Задача 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 должен существовать на диске или может быть создан с помощью блока, обозначенного в программе.