Гимназия №8
Подготовка к ЕГЭ
по информатике
Решение задач С4
С использованием комбинированного типа данных - ЗАПИСЬ
Учитель МБОУ СОШ № 4 г. Туапсе Пятакова Н. В.
Евграфова О.В.
Определение и правила записи
Запись — структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи .
Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту.
Например, информация о рекордах по бегу у мужчин для открытых стадионов может содержать следующие атрибуты
рекордсмен
страна
статус соревнований (Олимпиада, чемпионат мира)
длина дистанции
год рекорда
время
Описание записи в языке Паскаль осуществляется с помощью служебного слова record, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом end.
Например, телефонный справочник содержит фамилии и номера телефонов, поэтому отдельную строку в таком справочнике удобно представить в виде следующей записи:
type TRec = Record
FIO: String[20];
TEL: String[7]
end;var rec: TRec;
Описание записей возможно и без использования имени типа, например:
var rec: Record
FIO: String[20];
TEL: String[7]
end;
Запись может быть объявлена в разделе type:
идентификатор типа = Record
поле1: тип;
поле2: тип;
…
полеN: тип
end;
Например,
type beg = record
fam: string[25];
srtana: string[20];
status: boolean; {Олимпиада - true; чемпионат мира - false}
dlina: longint;
god: 1900..2009;
vr: string[15];
end;
Var a: beg;
К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:
.
Например,
a.fam; a.dlina и т.п.
Если, например, требуется полю "status" присвоить значение «true», то это делается так:
a.status := true;
Поля записи могут иметь любой тип, кроме файла, в частности, сами могут быть записями.
В программе могут использоваться массивы записей.
Любая обработка записей, в том числе ввод и вывод, производится поэлементно.
Например,
var b: array[1..200] of beg1;
...
write('Число рекордсменов? '); readln(n);
for i:=1 to n do
with b[i] do
begin
write('Фамилия спортсмена? '); readln(fam);
write('Гражданин какой страны спортсмен? '); readln(strana);
write('Статус соревнования? '); readln(status);
write('Длина дистанции? '); readln(dlina);
write('Год проведения соревнования? '); readln(god);
write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec);
end;
...
В примере был использован оператор присоединения, который имеет следующий вид: with do ;
Он позволяет, один раз указав имя переменной типа "запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен.
Или
With m do
begin
number:=1964;
marka:=‘Audi - 100’;
fio:=‘Фёдорова Н. В.’;
adres:=‘ул. Красина 53 к. 1 – 73.’;
end;
Задача. Сведения о деталях, хранящихся на складе, содержат следующие атрибуты: название, количество, стоимость одной детали. Вывести информацию о детали, суммарная стоимость для которой максимальна.
program ex_zap;
type detal = record a: string[30]; kol, st: integer; end;
var a: array [0..99] of detal; n, i, max: integer;
begin
write('Количество деталей? ');
readln(n);
for i:=0 to n-1 do
With a[i] do
begin write('Информация об ', i, ' детали: ');
readln(a);
readln(kol);
readln(st);
end;
max := 0;
for i:= 1 to n-1 do
if a[max].kol*a[max].st
writeln('Искомая деталь: ', a[max].a, ' стоимостью ', a[max].st, ' в количестве ', a[max].kol);
end.
Условие задачи типа С4 с использованием записей.
На вход в программе подаются сведения о студентах с 1-го по 5-й курс некоторого вуза. В первой строке сообщается количество студентов N, которое больше 20, но меньше или равно 100, каждая из следующих N строк имеет следующий формат: , где - строка, состоящая не более чем из 20 символов, - строка, состоящая не более чем из 15 символов, - целое число от 1 до 5, - вещественное число. и , а также и и разделены одним пробелом. Входные данные не упорядочены никаким способом.
Пример входных строк:
25
Федорова Ирина 5 4500
Иванов Сергей 3 2050
Требуется написать программу, которая будет выводить на экран фамилии и имена студентов, имеющих максимальную стипендию на своём курсе в порядке с первого курса по пятый. Если есть студенты с одинаковыми стипендиями, то следует вывести их фамилии и имена. Алфавитный порядок при выводе фамилий можно не соблюдать. Считать, что на всех курсах есть студенты, получающие стипендию.
Пример выходных строк:
Курс 1
Петров Иван
Катаев Сергей
Курс 2
Смирнов Максим
max_kurs[p[i].kurs] then max_kurs[p[i].kurs]:=p[i].stip; readln; end; {цикла} {вывод студентов с мах стипендией на курсе} writeln('максимальная стипендия студентов’);writeln; for k:=1 to 5 do begin writeln('курс',k); for i:=1 to n do with p[i] do begin if ((kurs=k)and (stip=max_kurs[k])) then writeln(name); end; writeln; end; readln; end. " width="640"
var p:array[1..100] of record
name: string;
kurs:integer;
stip: real;
end;
c:char;
i,k,n,m:integer;
max_kurs:array[1..5] of real;
begin
readln(n);
for i:=1 to n do
max_kurs[i]:=0;{обнулено мах значение стипендии по всем 5 курсам}
for i:=1 to n do
begin
p[i].name:='';
repeat
read(c);
p[i].name:=p[i].name+c
until c=' ';{считана фамилия}
repeat
read(c);
p[i].name:=p[i].name+c
until c=' ';{считано имя}
read(m);{считан курс}
p[i].kurs:=m;
read(p[i].stip);{считана стипендия}
if p[i].stipmax_kurs[p[i].kurs] then max_kurs[p[i].kurs]:=p[i].stip;
readln;
end; {цикла}
{вывод студентов с мах стипендией на курсе}
writeln('максимальная стипендия студентов’);writeln;
for k:=1 to 5 do begin
writeln('курс',k);
for i:=1 to n do
with p[i] do
begin
if ((kurs=k)and (stip=max_kurs[k])) then writeln(name);
end;
writeln;
end;
readln;
end.
Задача С4 из демонстрационного варианта 2012 года
(с использованием записей)
В командных олимпиадах по программированию для решения предлагается
не больше 11 задач. Команда может решать предложенные задачи в любом
порядке. Подготовленные решения команда посылает в единую
проверяющую систему соревнований. Вам предлагается написать
эффективную, в том числе по используемой памяти, программу, которая
будет статистически обрабатывать пришедшие запросы, чтобы определить
наиболее популярные задачи. Следует учитывать, что количество запросов в
списке может быть очень велико, так как многие соревнования проходят с
использованием Интернет.
Перед текстом программы кратко опишите используемый вами алгоритм
решения задачи.
На вход программе в первой строке подаётся количество пришедших
запросов N. В каждой из последующих N строк записано название задачи
в виде текстовой строки. Длина строки не превосходит 100 символов,
название может содержать буквы, цифры, пробелы и знаки препинания.
Пример входных данных:
6
А+B
Крестики-Нолики
Прямоугольник
Простой делитель
А+В
Простой делитель
Программа должна вывести список из трёх наиболее популярных задач
с указанием количества запросов по ним. Если в запросах упоминаются
менее трех задач, то выведите информацию об имеющихся задачах. Если
несколько задач имеют ту же частоту встречаемости, что и третья по частоте
встречаемости задача, их тоже нужно вывести.
Пример выходных данных для приведённого выше примера входных данных:
А+В 2
Простой делитель 2
Крестики-Нолики 1
Прямоугольник 1
1 then {proveriaem kolichestvo razlichnix zadach } begin {ecli da to snowa vivodim maxsimalnii} for i:=1 to num do if max writeln('',a[maxi].s1,' ',a[maxi].d); a[maxi].d:=0; max:=0; end; if num2 then {proveriaem kolichestvo razlichnix zadach } begin {ecli da to snowa vivodim maxsimalnii} for i:=1 to num do if max for i:=1 to num do {ecli takix znach mnogo to vivodim vse} if max=a[i].d then writeln('',a[i].s1,' ',a[i].d); end; readln; end. " width="640"
program C4;
type avto= record
d:integer;{d-kolichestvo poiavlenii zadach s1}
s1:string;{nazvanie zadachi}
end;
var
s:string;
a : array [1..11] of avto; {massiv sodergahii zapisi}
n,i,j,num,max,maxi:integer;
begin
num:=0;{num - kolichestvo razlichnix zadach}
readln(n);{n - kolichestvo vsex nazvanii zadach}
for i:=1 to n do
begin
readln(s);{vvodim nazvanie zadachi}
j:=1;
while (ja[j].s1) do j:=j+1;{proveriaem bila li do etigo dannoe nazvanie zadachi}
if j
a[j].d:=a[j].d+1{pribavliaem odin k schetchiky poiavlenii}
else begin {inache}
a[j].s1:=s;{zanosim nazvanie v massiv}
a[j].d:=1;
num:=num+1;
end;
end;
for i:=1 to num do {ihem maximalnii}
if max
writeln('',a[maxi].s1,' ',a[maxi].d); {vivodim ego}
a[maxi].d:=0;{ochishaem scetchik poiavlenii}
max:=0;
if num1 then {proveriaem kolichestvo razlichnix zadach }
begin {ecli da to snowa vivodim maxsimalnii}
for i:=1 to num do
if max
writeln('',a[maxi].s1,' ',a[maxi].d);
a[maxi].d:=0;
max:=0;
end;
if num2 then {proveriaem kolichestvo razlichnix zadach }
begin {ecli da to snowa vivodim maxsimalnii}
for i:=1 to num do
if max
for i:=1 to num do {ecli takix znach mnogo to vivodim vse}
if max=a[i].d then
writeln('',a[i].s1,' ',a[i].d);
end;
readln;
end.
Спасибо за внимание
[email protected]