Информатика с4
program olimp;
const
max = 100;
type
TParticipant = record
LastName : string[20];
FirstName: string[15];
Class: 7..11;
Bal: integer;
end;
var
n, i, j, err, max_bal, winner: integer;
s: string;
Participants: array [1..max] of TParticipant;
Temp: TParticipant;
c, param: byte;
bOk: boolean;
begin
write('Input participant count: ');
readln(n);
writeln('Enter data of participants');
writeln('Format: Lastname Firstname class bal');
writeln;
for i:= 1 to n do
begin
repeat
bOk:= true;
param:= 0;
write(i,': ');
readln(s);
if length(s) < 6 then
bOk:= false
else
for j:= 2 to length(s) do
if (s[j] = ' ') and (s[j-1] <> ' ') then
inc(param);
if (param <> 3) then bOk:= false;
if s[length(s)] = ' ' then bOk:= false;
c:= pos(' ', s);
Temp.LastName:= copy(s, 1, c-1);
s:= copy(s, c+1, length(s)-c);
c:= pos(' ', s);
Temp.Firstname:= copy(s, 1, c-1);
s:= copy(s, c+1, length(s)-c);
c:= pos(' ', s);
val(copy(s, 1, c-1), Temp.Class, err);
s:= copy(s, c+1, length(s)-c);
val(s, Temp.Bal, err);
if bOk then
begin
writeln('ok');
Participants:= Temp;
end
else writeln('error');
until bOk;
end;
max_bal:= Participants[1].Bal;
winner:= 1;
for i:= 2 to n do
if (Participants.Bal >= max_bal) and (Participants.Bal <= 200) then
begin
if Participants.Bal = max_bal then inc(winner);
max_bal:= Participants.Bal;
end;
if winner = 1 then
begin
writeln('Winner');
for i:= 1 to n do
if Participants.Bal = max_bal then
writeln(Participants.Lastname +' '+ Participants.Firstname);
end
else
writeln('winners count: ', winner);
readln;
end.
Program c4;
var nc:aray[1..99] of integer;
p:1..99;
c:char;
i,k,n,min:integer;
begin
readln(n);
for i:=0 to 99 do nc:=0;
for i:=1 to n do
begin
repeat
read(c)
until c='';
repeat
read(c)
until c='';
readln(p);
nc
:=nc
+1;
end;
min:=n;
for i:=1 to 99 do
if nc>0 then
begin
if nc<min then min:=nc;
end;
for i:=1 to 99 do
if nc=min then
writeln(i);
readln
end.
Program c4;
var nc:aray[1..99] of integer;
p:1..99;
c:char;
i,k,n,min:integer;
begin
readln(n);
for i:=0 to 99 do nc:=0;
for i:=1 to n do
begin
repeat
read(c)
until c='';
repeat
read(c)
until c='';
readln(p);
nc
:=nc
+1;
end;
min:=n;
for i:=1 to 99 do
if nc>0 then
begin
if nc<min then min:=nc;
end;
for i:=1 to 99 do
if nc=min then
writeln(i);
readln
end.
нет, помоему эта программа никак не удовлетворяет условия Вашей задачи...
зачем использовать readln и вручную её парсить если можно просто
И проверка результатов некорректная - нет подсчёта количества победителей (не больше пяти) и минимальный проходной бал 200 (условие (Participants[ i ].Bal <= 200) должно быть (Participants[ i ].Bal >= 200)
И проверка результатов некорректная - нет подсчёта количества победителей (не больше пяти) и минимальный проходной бал 200 (условие (Participants[ i ].Bal <= 200) должно быть (Participants[ i ].Bal >= 200)
Еще раз перечитайте по внимательнее условие задачи:
...
Победителем олимпиады не признается никто, если нет участников, набравших больше 200 баллов, или больше 20% от общего числа участников набрали одинаковый наибольший балл.
Напишите эффективную по времени работы и по используемой памяти программу, которая будет определять фамилию и имя лучшего участника, не ставшего победителем олимпиады. Если таких участников несколько, т.е. если следующий за баллом победителей один и тот же балл набрали несколько человек, или если победителей нет, а лучших участников несколько (в этом случае именно они являются искомыми), то выдается только количество искомых участников. Гарантируется, что искомы участники (участник) имеются.
...
Речь идет об участниках которые не стали победителями... :)
program olimp;
type
TParticipant = record
LastName : string[20];
FirstName: string[15];
Class: 7..11;
Bal: integer;
end;
var
n, i, j, err, max_bal,close_bal, winner: integer;
s: string;
Participants: array [1..255] of TParticipant;
Temp: TParticipant;
c, param: byte;
bOk: boolean;
begin
write('Input participant count: ');
n:=0;
while(n<1) do
begin
readln(n);
if n<1 then writeln('!!!');
end;
writeln('Enter data of participants');
writeln('Format: Lastname Firstname class bal');
writeln;
for i:= 1 to n do
begin
repeat
bOk:= true;
param:= 0;
write(i,': ');
readln(s);
if length(s) < 6 then
bOk:= false
else
for j:= 2 to length(s) do
if (s[j] = ' ') and (s[j-1] <> ' ') then
inc(param);
if (param <> 3) then bOk:= false;
if s[length(s)] = ' ' then bOk:= false;
c:= pos(' ', s);
Temp.LastName:= copy(s, 1, c-1);
s:= copy(s, c+1, length(s)-c);
c:= pos(' ', s);
Temp.Firstname:= copy(s, 1, c-1);
s:= copy(s, c+1, length(s)-c);
c:= pos(' ', s);
val(copy(s, 1, c-1), Temp.Class, err);
s:= copy(s, c+1, length(s)-c);
val(s, Temp.Bal, err);
if bOk then
begin
writeln('ok');
Participants:= Temp;
end
else writeln('error');
until bOk;
end;
max_bal:= Participants[1].Bal;
close_bal:=max_bal;
for i:= 2 to n do
begin
if (Participants.Bal > max_bal) then
begin
close_bal:=max_bal;
max_bal:= Participants.Bal;
end;
if (close_bal = max_bal) and (Participants.Bal<max_bal) then close_bal:=Participants.Bal;
end;
if max_bal<200 then
begin
close_bal:=max_bal;
end
else begin
winner:= 0;
for i:=1 to n do
if Participants.Bal = max_bal then inc(winner);
if winner>n/5 then close_bal:=max_bal;
end;
writeln('Result:');
for i:= 1 to n do
if Participants.Bal = close_bal then
writeln(Participants.Lastname +' '+ Participants.Firstname);
readln;
end.
Participants: array [1..255] of TParticipant;
Temp: TParticipant;
Что это разъясните, пожалуйста)
так как,
и при выводе результата, Вы пропустили что:
единственно не организовали проверку на 20%
Participants: array [1..255] of TParticipant;
Temp: TParticipant;
Что это разъясните, пожалуйста)
TParticipant тип записи об участнике (олимпиады)
Participants массив из 255 элементов такого типа, т.е. информация об участниках.
Temp переменная типа TParticipant
в начале в нее пытаемся разобрать что вводит пользователь в строке, а потом если введенная строка соответствует формату, то записываем информацию в массив Participants
Это и есть проверка на количество победителей больше 20% от количества участников
Все верно. Спасибо
uses crt;
var
n,i,k,max1,kol1,max2,kol2,klass,ball:integer;
ch:char;
s1,s2,fam:string;
begin
readln(n);
for i:=1 to n do begin
for k:=1 to 2 do
repeat read (ch);
fam:=fam+ch
until ch=' ';
read (klass);
readln (ball);
if ball>max1 then begin
max2:=max1;
kol2:=kol1;
s2:=s1;
max1:=ball;
kol1:=1;
s1:=fam;
end
else
if ball=max1 then
kol1:=kol1+1
else
if ball>max2 then begin
s2:=fam;
max2:=ball;
kol2:=1;
end
else
if ball=max2 then
kol2:=kol2+1;
fam:='';
end;
if (max1>200) and (kol1<=n*0.2) and (kol2=1) then writeln (s2)
else if (max1>200) and (kol1<=n*0.2) and (kol2>1) then writeln (kol2)
else if (kol1>0.2*n) then writeln (kol1)
else if (max1<=200) and (kol1=1) then writeln (s1)
else if (max1<=200) and (kol1>1) then writeln (kol1);
end.