infoegehelp.ru

Успешно сдать ЕГЭ по информатике
  • Главная
  • Контакты
  • Карта сайта
  • Помощь сайту
Важно
  • Демо варианты ЕГЭ
  • Учим числа: 2 в степени
  • Биты, байты, килобайты
Решение задач
  • Задачи вне основных разделов информатики
Разделы информатики
  • 2011-12-18-14-33-54Системы счисления
  • 2011-12-18-16-45-20Алгебра логики
  • 2011-12-18-16-55-26Программирование
  • 2011-12-18-16-53-40Кодирование информации
  • 2011-12-18-16-56-19Компьютерные сети и Интернет
  • -excelЭлектронные таблицы (Excel)
  • 2011-12-18-16-57-50Базы данных
  • 2011-12-18-16-58-50Графы
  • 2011-12-18-17-00-15Файловая система
  • Устройство компьютера
  • ПО компьютера

Разбор задачи C4 (демо ЕГЭ 2007)

На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <оценки>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:

Иванов Петр 4 5 4

Требуется написать программу, которая будет выводить на экран фамилии и имена трех лучших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех лучших, то следует вывести и их фамилии и имена. Требуемые имена и фамилии можно выводить в произвольном порядке.

Решение:

Алгоритм программы следующий:

  • Считываем записи, сохраняя фамилию, имя и сумму баллов в массиве записей (или в двух массивах).
  • Определяем 3 самых высоких суммарных балла при просматре массива записей (или массивов). Средний балл не считаем, т.к. число экзаменов у школьников одинаково.
  • При следующем просмотре массивов выводим фамилию и имена учеников, чей суммарный балл ≥ 3-ей по величине суммы.

Пример работы алгоритма.

Пусть на вход подается 10 записей, сумма баллов в которых равны:

  1. 15
  2. 14
  3. 13
  4. 9
  5. 12
  6. 9
  7. 9
  8. 15
  9. 8
  10. 12
Тогда самыми высокими баллами будут:
  1. max1=15
  2. max2=15
  3. max3=14
Программа выведет 3 записи с суммой баллов (без сортировки):
  • 15
  • 14
  • 15

Программа написана на языках:

  • Паскаль (среда разработки Turbo Pascal 7.0),
  • Бейсик (среда разработки Quick Basic 4.5),
  • Алгоритмический язык (среда разработки Кумир 1.9.0).
  • Си (среда разработки Borland C++ 3.1),

Чтобы прочесть комментарии к программе, наведите мышью на соответствующую строку. Строки, снабженные комментарием, выделены фиолетовым цветом.

Напротив названия языка программирования в скобках содержатся ссылки на скачку исходников и ехе (исполняемых файлов).

Паскаль (исходник+exe-файл)Бейсик (исходник)
var
  mas_fi:array[1..100] of record
     fi:string;
     sum:integer;
   end;

  c:char;
  i,j,N,max1,max2,max3,mark:integer;
begin
  readln(N);
  for i:=1 to N do
  begin
     mas_fi[i].fi:='';
     repeat
       read(c);
       mas_fi[i].fi:=mas_fi[i].fi+c
     until c=' ';
     repeat
       read(c);
       mas_fi[i].fi:=mas_fi[i].fi+c
     until c=' ';

     mas_fi[i].sum:=0;
     for j:=1 to 3 do
     begin
       read(mark);
       mas_fi[i].sum:=mas_fi[i].sum+mark
     end;

    readln;
  end;
   max1:=0;
   max2:=0;
   max3:=0;
   for i:=1 to N do
   begin
     if mas_fi[i].sum>max1 then
     begin
       max3:=max2;
       max2:=max1;
       max1:=mas_fi[i].sum
     end
     else
       if mas_fi[i].sum>max2 then
       begin
         max3:=max2;
         max2:=mas_fi[i].sum
       end
       else
          if mas_fi[i].sum>max3
            then max3:=mas_fi[i].sum;
   end;

  write(char(13)+char(10));
   for i:=1 to N do
     if mas_fi[i].sum>=max3
       then writeln(mas_fi[i].fi);

   readln
end.
DIM i, j, N, max1,max2,max3, sum(100) AS INTEGER
DIM str AS STRING
DIM masfi(100) AS STRING
INPUT N
FOR i=1 TO N
  LINE INPUT str
  c$=MID$(str,1,1)
   j=1
   WHILE NOT (c$=" ")
     j=j+1
     c$=MID$(str,j,1)
   WEND
   j=j+1
   c$=MID$(str,j,1)
   WHILE NOT (c$=" ")
     j=j+1
     c$=MID$(str,j,1)
   WEND

  masfi(i)=MID$(str,1,j)
   sum(i)=ASC(MID$(str,j+1,1))-ASC("0")
   sum(i)=sum(i)+(ASC(MID$(str,j+3,1))-ASC("0"))
   sum(i)=sum(i)+(ASC(MID$(str,j+5,1))-ASC("0"))

NEXT i
max1=0: max2=0: max3=0
FOR i=1 TO N
  IF sum(i)>max1 THEN
    max3=max2: max2=max1
    max1=sum(i)
  ELSE
    IF sum(i)>max2 THEN
      max3=max2: max2=sum(i)
    ELSE
      IF sum(i)>max3 THEN max3=sum(i)
    END IF
  END IF
NEXT i

PRINT
FOR i=1 TO N
  IF sum(i)>=max3 THEN PRINT masfi(i)
NEXT i

END
Алгоритмический язык (исходник)Си (исходник+exe-файл)
алг
нач
   цел i,j,N,max1,max2,max3,mark
   сим c
   лит str
   литтаб mas_fi[1:100]
   целтаб sum[1:100]
   ввод N
   нц для i от 1 до N
     ввод str
       j:=1
       нц
         c:=str[j]
         j:=j+1
       кц при c=" "
       нц
         c:=str[j]
         j:=j+1
       кц при c=" "

     mas_fi[i]:=str[1:j-2]
      mark:=код(str[j])-код("0")
      mark:=mark+(код(str[j+2])-код("0"))
      mark:=mark+(код(str[j+4])-код("0"))
      sum[i]:=mark

   кц
   max1:=0
    max2:=0
    max3:=0
    нц для i от 1 до N
      если sum[i]>max1
        то
          max3:=max2
          max2:=max1
          max1:=sum[i]
        иначе
          если sum[i]>max2
            то
              max3:=max2
              max2:=sum[i]
            иначе
              если sum[i]>max3
                то max3:=sum[i]
              все
          все
      все
    кц

   вывод нс
    нц для i от 1 до N
      если sum[i]>=max3
        то вывод mas_fi[i],нс
      все
    кц

кон
#include <stdio.h>
#include <string.h>
#include <conio.h>

void main()
{
   char mas_fi[100][36];
   char str1[21],str2[16],fi[37];
   int sum[100];
   int N,i,j,max1,max2,max3,mark1,mark2,mark3;
   scanf("%d",&N);
   for(i=0;i<N;i++){
      scanf("%s %s %d %d %d",str1,str2,
               &mark1,&mark2,&mark3);

     strcpy(fi,str1);
       strcat(fi," ");
       strcat(fi,str2);

     j=0;
      while(fi[j]!='\0'){
         mas_fi[i][j]=fi[j];
         j++;
       }
       mas_fi[i][j]='\0';

     sum[i]=mark1+mark2+mark3;
   }
    max1=0;
    max2=0;
    max3=0;
    for(i=0;i<N;i++){
      if(sum[i]>max1){
        max3=max2;
        max2=max1;
        max1=sum[i];
      }
      else
        if(sum[i]>max2){
          max3=max2;
          max2=sum[i];
        }
        else if(sum[i]>max3) max3=sum[i];
    }

   printf("\n");
   for(i=0;i<N;i++){
      if(sum[i]>=max3){
        for(j=0;mas_fi[i][j]!='\0';j++)
          printf("%c",mas_fi[i][j]);
        printf("\n");
      }
    }

   getch();
}

Работа программы на этих языках:

Задача С4 ЕГЭ по информатике 2007 выполнение программы на Паскале, Бейсике и Си

Выполнение программы в Кумире

На рисунках видно, что в результате работы программы было выбрано 3 записи. Максимальный средний балл у 2-х школьников: Иванова Артема и Белова Олега, он равен (5+5+5)\3=5 баллов. Еще один школьник, Петров Андрей, набрал (4+5+5)/3=4,67 баллов.

Перейти к другим задачам.

 

Rambler's Top100

© Латыпова В.А., 2012-2020. Все права защищены.
Копирование материалов сайта только с разрешения администрации сайта