Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2016, 16:27   #1
NadyaP
Новичок
Джуниор
 
Регистрация: 07.01.2016
Сообщений: 2
По умолчанию Задача из егэ. Частичное решение внутри.

Имеется список учеников разных школ, сдававших экзамен по информатике, с указанием их фамилии, имени, школы и набранного балла. Напишите программу, которая будет определять двух учеников школы № 37, которые лучше всех сдали информатику, и выводить на экран их фамилии и имена.
Если наибольший балл набрали более двух человек, нужно вывести только их количество. Известно, что информатику сдавали не менее 5 учеников школы № 37.
На вход программе в первой строке подается количество учеников списке N. В каждой из последующих N строк находится информация в следующем формате:
<Фамилия> <Имя> <Школа> <Балл>
где <Фамилия> – строка, состоящая не более, чем из 20 символов без пробелов,
<Имя> – строка, состоящая не более, чем из 20 символов без пробелов,
<Школа> – целое число от 1 до 99, <Балл> – целое число от 1 до 100.

Пример входной строки:
Иванов Сергей 50 87
Пример выходных данных, когда найдено два лучших:
Иванов Сергей
Сергеев Иван

Программа выводит только одного лучшего ученика. Чтобы вывести второго, нужно найти как бы второй максимум после первого, то есть нужно делать еще один цикл от 1 до первого максимума, так? Этого цикла тут нет. Не получается...
Код:
type ych=record
          fam,name:string[20];
          nsch,ball:byte
         end;
var n,i,k,max:byte;
    s:string;
    y,y1,y2:ych;
    err:integer;
begin
    readln(n);max:=0;
    for i:=1 to n do
     begin
      with y do
       begin
        readln(s);s:=s+' ';
        fam:=copy(s,1,pos(' ',s)-1);delete(s,1,pos(' ',s));
        name:=copy(s,1,pos(' ',s)-1);delete(s,1,pos(' ',s));
        nsch:=strtoint(copy(s,1,pos(' ',s)-1));delete(s,1,pos(' ',s));
        ball:=strtoint(copy(s,1,pos(' ',s)-1));
        if nsch=37
         then
          begin
           if ball>max then begin max:=ball;y1:=y;k:=1 end
                       else
                        if y.ball=max
                         then begin y2:=y;inc(k) end
          end
       end
     end;
    if k=1 then writeln(y1.fam,' ',y1.name)
           else
            begin
             if k=2
              then
               begin
                writeln(y1.fam,' ',y1.name);
                writeln(y2.fam,' ',y2.name)
               end
              else writeln(k)
            end
end.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 08.01.2016 в 16:00.
NadyaP вне форума Ответить с цитированием
Старый 08.01.2016, 16:35   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Надя, ещё вопрос актуален?

я бы решал эту задачу с использованием массива.
варианта 2.
один не очень эффективный, но очень простой.
заводим обычный статический массив на 10000 записей (ограничиваем максимальное число учеников, которые могут учиться в 37-й школе). читаем записи из файла, если ученик из 37 школы - добавляем его в массив.
После окончания записей сортируем массив по баллам по убыванию.
Считаем, сколько записей имеют балл, равный первой записи (в первой записи у нас максимальный балл после сортировки)
Если количество больше двух - выдали число,
если меньше - выдали фамилии первого (и второго, если у него тот же балл)

второй вариант. Эффективный. я лично его рекомендую.
Заводим массив на два элемента.
Заводим указатель в массиве, он же счётчик ребят с максимальным баллом.
Если встретили запись с баллом больше, чем MAX, то счётчик устанавливаем в 1, запись об ученике в массив.
Если встретили запись с баллом равным MAX, то, если увеличиваем счётчик. если он меньше 2, сохраняем запись об ученике в массив.
Закончился цикл ввода, выводим или счётчик (если он больше двух) или содержимое массива.
Всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.01.2016, 01:33   #3
NadyaP
Новичок
Джуниор
 
Регистрация: 07.01.2016
Сообщений: 2
По умолчанию

Спасибо большое за ответ. На самом деле, решение было не мое и вообще не очень шарю во всем этом. Но все-таки попробовала воспользоваться вашим первым вариантом и попробовала решить для начала часть задачи:
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
заводим обычный статический массив на 10000 записей (ограничиваем максимальное число учеников, которые могут учиться в 37-й школе). читаем записи из файла, если ученик из 37 школы - добавляем его в массив.
Код:
Var 
   A: array [1..1000] of integer; 
   I : byte ;
   n,nsch,ball,k:integer;
   s,fam,name:string;
   begin
   readln(n);
    for i:=1 to n do begin
        readln(s);s:=s+' ';
        fam:=copy(s,1,pos(' ',s)-1);delete(s,1,pos(' ',s));
        name:=copy(s,1,pos(' ',s)-1);delete(s,1,pos(' ',s));
        nsch:=strtoint(copy(s,1,pos(' ',s)-1));delete(s,1,pos(' ',s));
        ball:=strtoint(copy(s,1,pos(' ',s)-1));
        end;
        for i:=1 to n do begin
        if nsch=37 then ball:=k;
        end;
        writeln(a[k]);
        end.
я никогда ее не решу..
NadyaP вне форума Ответить с цитированием
Старый 10.01.2016, 00:57   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от NadyaP Посмотреть сообщение
я никогда ее не решу..
сочувствую...

ну ладно.
вот код для предложенного мною выше второго алгоритма.
Разбирайте:
Код:
program ProjectParseTextFile1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

type ychenik=record
          fam,name:string[20];
          nsch,ball:byte
         end;
var
  f : TextFile;
  ArrayWithMaxBall: array[1..2] of ychenik;
  one: ychenik;
  i, n, countMax : integer;
  s: string;
begin

  SetConsoleOutputCP(1251);
  SetConsoleCP(1251);

  AssignFile(f, 'spisok.txt');
  Reset(f);
  ReadLn(f,n);

  countMax := 0; {пока в массиве max нет }
  for i := 1 to n do begin
    readln(f,s);
    s := s + ' ';
    one.fam := copy(s, 1, pos(' ', s) - 1); delete(s, 1, pos(' ', s));
    one.name := copy(s, 1, pos(' ', s) - 1); delete(s, 1, pos(' ', s));
    one.nsch := strtoint(copy(s, 1, pos(' ', s) - 1)); delete(s, 1, pos(' ', s));
    one.ball := strtoint(copy(s, 1, pos(' ', s) - 1));

    if one.nsch=37 then {если текущая строка - запись об ученике 37 школы, тогда}
    begin
      if countMax=0 then begin
        inc(countMax);
        ArrayWithMaxBall[ countMax ] := one; {сохранили первую запись об ученике 37 школы}
      end
      else  {уже были ученики 37 школы, тогда сравним баллы}
        if one.ball>ArrayWithMaxBall[1].ball then begin {у нас новый лидер, сбрасываем счётчик}
          countMax := 1;
          ArrayWithMaxBall[ countMax ] := one;
        end
        else {иначе, проверим, может у текущего ученика школы тоже максимум баллов}
          if one.ball=ArrayWithMaxBall[1].ball then begin
            Inc(countMax);
            if countMax=2 then ArrayWithMaxBall[ countMax ] := one;
          end;
    end;
  end;
  CloseFile(f);

  {вывод результатов}
  if countMax=0 then WriteLn('Нет ни одного ученика 37 школы!')
  else
    if countMax>2
      then WriteLn('Максимальный балл = ',ArrayWithMaxBall[1].ball,
                    ' набрали ',countMax, ' учеников.')
    else begin {значит countMax равен 1 или 2}
      WriteLn('Список учеников с максимальным баллом, равным ',ArrayWithMaxBall[1].ball);
      for i:=1 to countMax do WriteLn(ArrayWithMaxBall[i].fam,' ',ArrayWithMaxBall[i].name);
    end;

  ReadLn
end.
p.s. это код я проверил в Delphi, но, в принципе, после небольших косметических доработок код заработает в любом Паскале...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Частичное решение adika00 Общие вопросы C/C++ 3 11.04.2014 15:10
Задача ЕГЭ PANDA8 Паскаль, Turbo Pascal, PascalABC.NET 2 28.03.2011 19:52
Задача ЕГЭ Rusl92 Паскаль, Turbo Pascal, PascalABC.NET 4 18.04.2009 10:49