Type tBook = record author: string[20]; title: string[30]; year: integer end;
var f1: file of tBook;
function k2000(): integer; { файл должен быт открыт на чтение } var k: integer; book: tBook; begin while not Eof(f1) do begin Read(f1, book); if book.year < 2000 then k := k + 1 end; k2000 := k end;
var B: tbook;
begin Assign(f1, 'books.000'); Rewrite(f1); Writeln('Для книги вводите в трех строках: автор, название, год издания'); Writeln('Введите * для завершения ввода'); repeat Readln(B.author); if B.author[1] <> '*' then begin Readln(B.title); Readln(B.year); Write(f1, B) end until B.author[1] = '*'; Close(f1); Write('Количество книг, изданных до 2000г равно '); Reset(f1); Writeln(k2000); Close(f1) end.
Пример диалога с программой: Для книги вводите в трех строках: автор, название, год издания Введите * для завершения ввода Александр Грин Бегущая по волнам 1984 Эдгар Аллан По Золотой жук 2002 Луи Буссенар Капитан Сорви-голова 1997 Гарри Гаррисон Крыса из нержавеющей стали 2007 А. и Б. Стругацкие Сказка о Тройке 1974 * Количество книг, изданных до 2000г равно 3
Описание алгоритма: Будем наращивать длину последовательности от 0 знаков до N. Пусть после какого-то количества шагов у нас выписаны все последовательности длины А и мы хотим узнать количество подходящих последовательностей длины А+1. Распределим все последовательности на три группы(так как предыдущие символы нас не волнуют, то любые последовательности одной группы для нас равнозначны): 1) Заканчиваются на 0. 2) Ровно на одну единицу 3) Ровно на две единицы. Из каждой последовательности группы 1 приписыванием нуля или единицы мы можем получить одну последовательность группы 1 и одну - группы 2. Неважно, какие именно, но они не перекрываются, т.к. предыдущие символы различны, хоть мы их и не учитываем. Точно так же из второй группы мы получаем одну последовательность группы 3 и одну группы 1, а из группы 3 - только группу 1. Таким образом, если количества последовательностей длины А по группам были (x, y, z), то для длины А+1 такое распределение будет (x+y+z, x, y). Если взять для длины 0 тройку (0, 0, 1) и просчитать тройки от 1 до N, получится искомое количество. Для N=1 и N=2 также работает правильно. Программа на Pascal:
var num00,num01,num11,mem00:integer; n,i:byte; begin readln(n); num00:=1; for i:=1 to n do begin mem00:=num11; num11:=num01; num01:=num00; num00:=num01+num11+mem00; end; writeln(num11+num01+num00); end.
tBook = record
author: string[20];
title: string[30];
year: integer
end;
var
f1: file of tBook;
function k2000(): integer;
{ файл должен быт открыт на чтение }
var
k: integer;
book: tBook;
begin
while not Eof(f1) do
begin
Read(f1, book);
if book.year < 2000 then k := k + 1
end;
k2000 := k
end;
var
B: tbook;
begin
Assign(f1, 'books.000');
Rewrite(f1);
Writeln('Для книги вводите в трех строках: автор, название, год издания');
Writeln('Введите * для завершения ввода');
repeat
Readln(B.author);
if B.author[1] <> '*' then
begin
Readln(B.title); Readln(B.year); Write(f1, B)
end
until B.author[1] = '*';
Close(f1);
Write('Количество книг, изданных до 2000г равно ');
Reset(f1);
Writeln(k2000);
Close(f1)
end.
Пример диалога с программой:
Для книги вводите в трех строках: автор, название, год издания
Введите * для завершения ввода
Александр Грин
Бегущая по волнам
1984
Эдгар Аллан По
Золотой жук
2002
Луи Буссенар
Капитан Сорви-голова
1997
Гарри Гаррисон
Крыса из нержавеющей стали
2007
А. и Б. Стругацкие
Сказка о Тройке
1974
*
Количество книг, изданных до 2000г равно 3
Будем наращивать длину последовательности от 0 знаков до N. Пусть после какого-то количества шагов у нас выписаны все последовательности длины А и мы хотим узнать количество подходящих последовательностей длины А+1. Распределим все последовательности на три группы(так как предыдущие символы нас не волнуют, то любые последовательности одной группы для нас равнозначны):
1) Заканчиваются на 0.
2) Ровно на одну единицу
3) Ровно на две единицы.
Из каждой последовательности группы 1 приписыванием нуля или единицы мы можем получить одну последовательность группы 1 и одну - группы 2. Неважно, какие именно, но они не перекрываются, т.к. предыдущие символы различны, хоть мы их и не учитываем. Точно так же из второй группы мы получаем одну последовательность группы 3 и одну группы 1, а из группы 3 - только группу 1. Таким образом, если количества последовательностей длины А по группам были (x, y, z), то для длины А+1 такое распределение будет (x+y+z, x, y). Если взять для длины 0 тройку (0, 0, 1) и просчитать тройки от 1 до N, получится искомое количество. Для N=1 и N=2 также работает правильно.
Программа на Pascal:
var num00,num01,num11,mem00:integer;
n,i:byte;
begin
readln(n);
num00:=1;
for i:=1 to n do begin
mem00:=num11;
num11:=num01;
num01:=num00;
num00:=num01+num11+mem00;
end;
writeln(num11+num01+num00);
end.