Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6312
Последний выпуск: 19.06.2015

Информатика с4

67K
17 мая 2011 года
Mr.Wolf72
7 / / 02.05.2011
Доброго вечере, форумчане! Помогите, пожалуйста, решить с4 по информатике. Я пробовал решать уже сегодня, но так до конца ничего путнего и не вышло, а также сняли бы баллы за оптимизацию. В ответах же дается такое ну просто замудренное решение, которое я даже до конца и не понял. В общем помогие, пожалуйста, написать программу с оптимизацией и с самым на ваш гляд простым решением! ;)

Само задание (4):
http://ucheba.pro/download/file.php?mode=view&id=10523&sid=89190a16eb56073515a4327a583b7ab7
52K
18 мая 2011 года
Sabit
42 / / 29.10.2010
мой вариант программы:
Код:
{-- coding by Sabit Murzaliyev --}
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.
67K
18 мая 2011 года
Mr.Wolf72
7 / / 02.05.2011
Огромное спасибо, а проще разве нельзя решить? Вот какое решение дается:
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.

52K
18 мая 2011 года
Sabit
42 / / 29.10.2010
Цитата: Mr.Wolf72
Вот какое решение дается:
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.



нет, помоему эта программа никак не удовлетворяет условия Вашей задачи...

277
18 мая 2011 года
arrjj
1.7K / / 26.01.2011
Sabit прав, только к его варианту пару замечаний:
зачем использовать readln и вручную её парсить если можно просто
 
Код:
read(Temp.LastName,Temp.FirstName,Temp.Class,Temp.Ball);

И проверка результатов некорректная - нет подсчёта количества победителей (не больше пяти) и минимальный проходной бал 200 (условие (Participants[ i ].Bal <= 200) должно быть (Participants[ i ].Bal >= 200)
52K
18 мая 2011 года
Sabit
42 / / 29.10.2010
Спасибо за замечание! :)
Цитата: arrjj

И проверка результатов некорректная - нет подсчёта количества победителей (не больше пяти) и минимальный проходной бал 200 (условие (Participants[ i ].Bal <= 200) должно быть (Participants[ i ].Bal >= 200)



Еще раз перечитайте по внимательнее условие задачи:

Цитата:

...
Победителем олимпиады не признается никто, если нет участников, набравших больше 200 баллов, или больше 20% от общего числа участников набрали одинаковый наибольший балл.
Напишите эффективную по времени работы и по используемой памяти программу, которая будет определять фамилию и имя лучшего участника, не ставшего победителем олимпиады. Если таких участников несколько, т.е. если следующий за баллом победителей один и тот же балл набрали несколько человек, или если победителей нет, а лучших участников несколько (в этом случае именно они являются искомыми), то выдается только количество искомых участников. Гарантируется, что искомы участники (участник) имеются.
...


Речь идет об участниках которые не стали победителями... :)

277
18 мая 2011 года
arrjj
1.7K / / 26.01.2011
А, да сорь просто скан жуткочитаемый. Всё равно неправильное решение :) Ищете максимальный бал меньший 200 - неправитьно, нет проверки сколько олимпийцев набрали максимальный балл :)
Код:
{-- coding by Sabit Murzaliyev, fixed by arrjj --}
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.
67K
18 мая 2011 года
Mr.Wolf72
7 / / 02.05.2011
[QUOTE=arrjj;351087]


Participants: array [1..255] of TParticipant;
Temp: TParticipant;
Что это разъясните, пожалуйста)
52K
18 мая 2011 года
Sabit
42 / / 29.10.2010
хочу внести поправки
 
Код:
75. if max_bal<=200 then

так как,
Цитата:
Победителем олимпиады не признается никто, если нет участников, набравших больше 200 баллов...


и при выводе результата, Вы пропустили что:

Цитата:
Если таких участников несколько, т.е. если следующий за баллом победителей один и тот же балл набрали несколько человек, или если победителей нет, а лучших участников несколько (в этом случае именно они являются искомыми), то выдается только количество искомых участников. Гарантируется, что искомы участники (участник) имеются.


единственно не организовали проверку на 20%

52K
18 мая 2011 года
Sabit
42 / / 29.10.2010
Цитата: Mr.Wolf72
[QUOTE=arrjj;351087]


Participants: array [1..255] of TParticipant;
Temp: TParticipant;
Что это разъясните, пожалуйста)



TParticipant тип записи об участнике (олимпиады)
Participants массив из 255 элементов такого типа, т.е. информация об участниках.
Temp переменная типа TParticipant
в начале в нее пытаемся разобрать что вводит пользователь в строке, а потом если введенная строка соответствует формату, то записываем информацию в массив Participants

67K
18 мая 2011 года
Mr.Wolf72
7 / / 02.05.2011
Огромное спасибо, Sabit! Щас запустил программу и ну прям просто идеально работает! Еще раз вам огромное спасибо)
52K
18 мая 2011 года
Sabit
42 / / 29.10.2010
пожалуйста! :)
277
18 мая 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Sabit
хочу внести поправки
 
Код:
75. if max_bal<=200 then



Угу меньшеравно а не меньше, этъ я недоглядел.

Цитата: Sabit

единственно не организовали проверку на 20%


 
Код:
83. if winner>n/5 then close_bal:=max_bal;

Это и есть проверка на количество победителей больше 20% от количества участников
52K
19 мая 2011 года
Sabit
42 / / 29.10.2010
Цитата:
...
Это и есть проверка на количество победителей больше 20% от количества участников


Все верно. Спасибо

90K
21 марта 2013 года
dslom
1 / / 21.03.2013
проще решается, без массивов можно обойтись.

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.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог