next up previous

Next: 5.5.2 Упражнения
Up: 5.5 Программы обработки таблиц
Previous: 5.5 Программы обработки таблиц
 

5.5.1 Статистика

Задача. В библиотеке университета находятся журналы за последние 20 лет. Сведения о выдаче всякого экземпляра журнала содержат название журнала (20 букв), год издания, номер выпуска (цифру от 1 до 6), номер читательского билета (4 цифры) и дату выдачи (год, месяц, день). Даны название журнала и набор из 1000 сведений о выдаче. Найти, сколько раз каждый из выпусков журнала выдавался на руки. Ответ распечатать в порядке возрастания годов издания и номеров выпусков. Решение. При решении (см.программу СТАТИСТИКА) удобно использовать переменную 226#112 типа ТАБЛИЦА, в которой элемент 227#113 хранит количество выдач журнала выпуска 228#114 за год $I$. Вычисление результата происходит путем последовательного выполнения следующих действий: обнуление таблицы 226#112, ввод названия журнала, обработка набора из 1000 сведений о выдачах с заполнением таблицы 226#112, печать результатов из таблицы 226#112.
program СТАТИСТИКА; const M = 1000; ДЛИНА=20; НАЧ=1981; КОН=2001; type ВЫПУСК = 1..6; ГОД = НАЧ..КОН; МЕСЯЦ=1..12; ДЕНЬ=1..31; НОМЕРБУКВЫ=1..ДЛИНА; НОМЕР=1..35000; НОМЕРВЫДАЧИ = 1..М; ДАТА = record Г:ГОД; М:МЕСЯЦ; Д:ДЕНЬ end; НАЗВАНИЕ = array [НОМЕРБУКВЫ] of Char; ВЫДАЧА=record Н:НАЗВАНИЕ; Г:ГОД; В:ВЫПУСК; N:НОМЕР; D:ДАТА end; ТАБЛИЦА = array [ГОД] of array[ВЫПУСК] of Integer; var X:ТАБЛИЦА; Z:ВЫДАЧА; W:НАЗВАНИЕ; I:ГОД; J:ВЫПУСК; ЭТОТ:Boolean; K:НОМЕРВЫДАЧИ; L:НОМЕРБУКВЫ; begin {Обнуление таблицы } for I := НАЧ то КОН do for J := 1 to 6 do X[I][J] := 0; { Ввод названия журнала } for L := 1 to ДЛИНА do Read(W[L]); 229#115 for K := 1 to M do begin { Обработка сведений о текущей выдаче } {Ввод этих сведений } for L := 1 to ДЛИНА do Read(Z.H[L]); Read(Z.Г, Z.B, Z.N, Z.D.Г, Z.D.M, Z.D.Д); {Проверка названия журнала } ЭТОТ := True; L := 1; while ЭТОТ and (L 134#20 ДЛИНА) do begin ЭТОТ := Z.H[L] = W[L]; L := L+1 end; if ЭТОТ then X[Z.Г] [Z.B] := X[Z.Г] [Z.B]+1 end; {Печать результатов поиска } for I := НАЧ to КОН do begin WriteLn(I,'ГОД':4); for J := 1 to 6 do WriteLn('Выпуск N':20,J:2, 'выдавался':10,X[I] [J],'раз':5) end end.

 © В.Н. Касьянов, 2001