Объём ЖМД составляет п Гбайт. На дискете размещаются два файла, состоящих из l1 и l2 знаков соответственно (считать, что один знак занимает 1Байт). Определить, сколько свободной памяти останется на ЖМД (Гб, Мб, Кб и б), если необходимо скопировать на него к таких дискет. Подразумевается, что к (l1+l2) <п Гбайт.
nm = 50;
type
Data = record
day: 1..31;
month: 1..12;
year: integer
end;
lichn = record
famnam: string;
datr: Data
end;
listlichn = array [1..nm] of lichn;
var
m: listlichn;
n: integer;
procedure GetLichn(k: integer);
begin
Write(k, ') Введите через пробел фамилию, имя: ');
Readln(m[k].famnam);
Writeln('Введите через пробел день, месяц и год рождения: ');
Readln(m[k].datr.day, m[k].datr.month, m[k].datr.year)
end;
procedure WriteLichn(k: integer);
begin
Writeln(m[k].famnam, ' ', m[k].datr.day, '.', m[k].datr.month, '.', m[k].datr.year)
end;
procedure Vvod(var p: integer);
var
i: integer;
begin
Write('Введите количество лиц n (максимум 50) -> ');
Readln(p);
if p <= 50 then for i := 1 to p do GetLichn(i)
else begin Writeln('Вы ввели неправильное значение'); p := 0 end
end;
procedure Zapros1;
{ фамилии и имена тех кто родился в месяц l года }
var
i: integer;
l: 1..12;
begin
Write('Введите номер месяца рождения (1-12): ');
Readln(l);
for i := 1 to n do
if m[i].datr.month = l then WriteLichn(i)
end;
procedure Zapros2;
{ фамилии и имена тех кто родился в год a }
var
a, i: integer;
begin
Write('Введите год рождения: ');
Readln(a);
for i := 1 to n do
if m[i].datr.year = a then WriteLichn(i)
end;
procedure Zapros3;
{ фамилии и имена тех чья дата рождения z.l.a }
var
a, i: integer;
z: 1..31;
l: 1..12;
begin
Write('Введите через пробел день, месяц и год рождения: ');
Readln(z, l, a);
for i := 1 to n do
if (m[i].datr.year = a) and (m[i].datr.month = l)
and (m[i].datr.day = z) then
WriteLichn(i)
end;
begin
Vvod(n);
Zapros1;
Zapros2;
Zapros3
end.
Тестовое решение:
Введите количество лиц n (максимум 50) -> 3
1) Введите через пробел фамилию, имя: Иванов Иван
Введите через пробел день, месяц и год рождения:
24 12 1973
2) Введите через пробел фамилию, имя: Петров Петр
Введите через пробел день, месяц и год рождения:
05 03 1982
3) Введите через пробел фамилию, имя: Козлова Екатерина
Введите через пробел день, месяц и год рождения:
1 12 1994
Введите номер месяца рождения (1-12): 12
Иванов Иван 24.12.1973
Козлова Екатерина 1.12.1994
Введите год рождения: 1982
Петров Петр 5.3.1982
Введите через пробел день, месяц и год рождения: 5 3 1982
Петров Петр 5.3.1982
tR = real;
tF = file of tR;
procedure SwapFile(fn1, fn2: string);
var
r: tR;
fin, fout: tF;
begin
Assign(fin, fn1); Reset(fin);
Assign(fout, fn2); Rewrite(fout);
while (not Eof(fin)) do begin Read(fin, r); Write(fout, r) end;
Close(fin); Close(fout)
end;
var
f1, f2, f3, f4, f5, fh: string;
begin
f1 := 'f1.bin'; f2 := 'f2.bin'; f3 := 'f3.bin';
f4 := 'f4.bin'; f5 := 'f5.bin'; fh := 'tmp.bin';
{ f2 <-> f4 }
SwapFile(f2, fh); SwapFile(f4, f2); SwapFile(fh, f4);
{ f5->h, f3->f5, f1->f3, h->f1 }
SwapFile(f5, fh); SwapFile(f3, f5); SwapFile(f1, f3); SwapFile(fh, f1)
end.
Для тестирования
Можно создать тестовые файлы с следующей программы:
type
tR = real;
tF = file of tR;
procedure WF(fn: string; m, n: integer);
var
fout: tF;
i: integer;
begin
Assign(fout, fn); Rewrite(fout);
for i := m to n do Write(fout, i / 2);
Close(fout)
end;
var
f1, f2, f3, f4, f5: string;
begin
f1 := 'f1.bin'; f2 := 'f2.bin'; f3 := 'f3.bin';
f4 := 'f4.bin'; f5 := 'f5.bin';
WF(f1, 3, 7); WF(f2, 11, 19); WF(f3, -6, 9); WF(f4, 0, 11); WF(f5, 14, 22);
end.
Далее можно просмотреть содержимое созданных файлов с следующей программы:
type
tR = real;
tF = file of tR;
procedure WF(fn: string);
var
fin: tF;
r: tR;
begin
Writeln(fn);
Assign(fin, fn); Reset(fin);
while (not Eof(fin)) do
begin Read(fin, r); Write(r:0:1, ' ') end;
Writeln;
Close(fin)
end;
var
f1, f2, f3, f4, f5: string;
begin
f1 := 'f1.bin'; f2 := 'f2.bin'; f3 := 'f3.bin';
f4 := 'f4.bin'; f5 := 'f5.bin';
WF(f1); WF(f2); WF(f3); WF(f4); WF(f5)
end.
Затем выполнить основную программу по перезаписи и снова запустить программу для просмотра обновленнных файлов.