Министерство образования Российской Федерации
Государственное образовательное учреждение
высшего профессионального образования
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ УПРАВЛЕНИЯ
ИНСТИТУТ ЗАОЧНОГО ОБУЧЕНИЯ
Кафедра «Компьютерных технологий»
Контрольная работа
«Алгоритмизация и программирование задач в различных программных средах»
по дисциплине:
«Компьютерная подготовка»
Выполнила студентка
№ группа
студенческий билет №
ВАРИАНТ № 7
Проверил(а):
Москва 2005 г.
6.2.1. Задания на алгоритмизацию и программирование задач на массивы.
7. Пять парфюмерных фирм представили на конкурс по пять различных наименований духов. Опросили N человек. Каждый из опрошенных назвал не более трех наименований духов. Определить наименование духов и фирму – изготовитель, которые назвали чаще других. Предусмотреть проверку правильности ввода информации.
Да
Нет
Нет
Да
Нет
Да Нет
Нет Да
Нет
Да
Да
Нет
Нет
Да
Нет
Да
Код программы:
Program Zadacha1;
Uses Crt; {Подключение модуля CRT}
Const
proiz: array [1..5] of string = {Массив производителей}
('"Богатырь"','"Заря"','"Октябрь"','"Жемчужина"','"Nivea"');
duhi: array [1..5,1..5] of string = {Двумерный массив духов}
(('ландыш','шарм','boos','москва','волга'), {Представленные фирмами}
('роза','ромашка','life','reno','тюльпан'),
('good','мила','праздник','свобода','край'),
('аполр','вагеом','доренк','смоп','кенвап'),
('fehd','typor','dfon','roitre','weryt'));
Var
x, y, i: Integer; {Вспомогательные счетчики используемые в циклах}
golosa: array [1..5,1..5] of byte; {Двумерный массив в котором хранятся данные}
{для каждых духов сколько людей их выбрало}
Procedure mStr(s1: String; var s2:String); {s1 – исходная строка; s2 – преобразованная строка}
{Процедура перевода больших букв в маленькие.}
var
i: Integer; {Счетчик}
c: Char; {Символ для преобразования}
begin
s2:=''; {Переменная для выходной строки обнуляется}
for i:=1 to Length(s1) do
begin
c:=s1[i];
if ((c>='A') and (c<='Z')) or ((c>='А') and (c<='П')) then
c:=chr(ord(c)+32) {В цикле проверяется очередной символ}
else if (c>='Р') and (c<='Я') then {входной строки. Если этот символ большой}
c:=chr(ord(c)+80); {то он преобразовывается в маленький}
s2:=s2+c {преобразованный символ добавляется к выходной строке}
end
end; {mStr}
Procedure Sravn (s3: String); (s3 – входная строка с одним вариантом духов)
{Процедура сравнивает введенный вариант духов с представленными на конкурсе}
var
Vern: Boolean; {Логическая переменная которая принимает значение True – если
введенный вариант верный, False – если введенный вариант отсутствует в матрице духов}
begin
Vern:= False;
For x:=1 to 5 do
For y:=1 to 5 do
If s3=duhi[x,y] Then {сравнивает вариант духов}
begin
inc(golosa[x,y]); {Если такой вариант существует то для данных духов}
Vern:=True; {увеличиваем на 1 голос (сколько за духи проголосовали)}
Break {как только был найден вариант духов, досрочно выходим}
end;
If not Vern Then WriteLn('Один или несколько из введенных вариантов не совпадает с представленными, он не будет зачтен.');
end;
Procedure Raspoz(stroka: String); {strokа – входная строка содержащая варианты духов, одного опрошенного человека. Процедура предназначена для разбора строки с вариантами духов и выделение из нее по одному варианту.}
var
NachSl, ExitPr, Pr: Boolean; {Логические переменные. NachSl – True–слово началось,}
{False – слово либо закончилось либо пока не началось; ExitPr True – уже найдено три варианта духов и используется чтобы больше не рассматривать входную строку, False – наоборот.}
kol, m: Integer; {kol – счетчик количества вариантов духов; m - счетчик}
s2: String; {s2 – строка в которую записывается один вариант духов и передается на сравнение с имеющимися}
begin
s2:=''; {Задание начальных условий}
NachSl:=False;
kol:=0;
ExitPr:=False;
Pr:=False;
For m:=1 to Length(Stroka) do {Цикл входной строки от 1-го символа до последнего}
begin
If not NachSl Then {Проверка если слово не началось то ищется первый значащий}
Begin {символ, т.е. отбрасываются лишние пробелы и проверочный}
If (Stroka[m]=' ') or (Stroka[m]=',') then {символ ‘,’}
continue
Else
begin
NachSl:=True; {Если найден значащий символ, записываем посимвольно}
s2:=s2+Stroka[m]; {вариант духов в строку s2}
end;
end
Else If NachSl Then {Если слово началось, ищем окончание слова, или просто}
Begin {дописываем в s2}
If Stroka[m]=',' Then
begin
NachSl:=False; {Как только найдено окончание слова передать его на}
Sravn(s2); {сравнение и вернуть переменным (кроме kol) начальные}
s2:=''; {значения.}
inc(kol);
If kol=3 Then
begin
ExitPr:=True; {Если найдено уже три варианта выходим из цикла}
Break;
end;
continue;
end;
If Pr and (Stroka[m]=' ') Then {Проверка кол-ва пробелов между словами}
Continue {на тот случай если вариант духов состоит из}
Else If (not Pr) and (Stroka[m]=' ') Then {нескольких слов. Пробел оставляется}
Begin {только один}
Pr:=True;
s2:=s2+Stroka[m];
end
Else If Stroka[m]<>' ' Then
begin
s2:=s2+Stroka[m];
Pr:=False;
end;
end;
end;
If not ExitPr Then Sravn(s2); {Если третий вариант не заканчивается запятой то отослать его на сравнение.}
end; {Raspoz}
{Основной блок программы в котором выводятся все строки с условиями и вариантами духов. Также ищется самый популярные духи}
var
Sinp, Sout: String;
n, mproiz, mduhi, maxd: Integer;
begin
For x:=1 to 5 do {обнуляется матрица голосов}
For y:=1 to 5 do
golosa[x,y]:=0;
ClrScr;
WriteLn('На конкурсе 5 парфюмерных фирм представили по 5 духов');
WriteLn;
for x:=1 to 5 do
begin
Write('Фирма ',proiz[x],' представила духи: '); {Вывод информации о производителях и их духов}
for y:=1 to 5 do
begin
Write(duhi[x,y],' ');
end;
WriTeLn;
WriteLn;
end;
Write('Сколько людей было опрошено? ');
ReadLn(n);
WriteLn;
WriteLn('Введите названия духов выбранные ',n,' опрошенными людьми.');
WriteLn('Каждый опрошенный может выбрать не более трех духов.');
WriteLn('Если вы введете более трех духов на одного опрошенного то');
WriteLn('будут приняты только первые три варианта.');
WriteLn('Названия духов необходимо вводить через запятую.');
WriteLn;
For i:=1 to n do
begin
Write('Введите выбор ',i,'-го опрошенного: '); {Ввод информации опроса}
ReadLn(Sinp);
mStr(Sinp, Sout);
Raspoz(Sout);
end;
WriteLn;
mproiz:=0;
mduhi:=0;
maxd:=0;
For x:=1 to 5 do
For y:=1 to 5 do
begin
If golosa[x,y] > maxd Then {Нахождение самых популярных духов.}
begin
maxd:=golosa[x,y];
mproiz:=x;
mduhi:=y;
end;
end;
WriteLn('Самые полпулярные духи "',duhi[mproiz,mduhi],
'" производимые фирмой ',proiz[mproiz]);
ReadLn
end.
Вариант работы программы: