Вики-учебник Подготовка к ЕГЭ/Информатика/Алгоритмизация и программирование/Программирование

Материал из Letopisi.Ru — «Время вернуться домой»
Перейти к: навигация, поиск

Шаблон:Campus

Описание задания

Вашему вниманию предлагается задача С4 из Демо варианта 2007 года


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


На сайте ФИПИ выложено решение этой задачи, в том числе и на языке Basic. Но на элементарном тесте:

Фам1 Им1 5 5 5

Фам2 Им2 4 4 4

Фам3 Им3 3 3 3

Фам4 Им4 2 2 2

Фам5 Им5 5 5 5

программа работает не корректно.

Примеры решения

Полный листинг программы приведён ниже


 ' pr - первый результат 
 ' vt - второй результат
 ' tr - третий результат, которых ( и первых, и вторых, и третих ) может быть несколько
 ' f(n) - массив фамилий
 ' b(n) - массив сумм баллов
 INPUT "Кол-во учащихся"; n
 DIM f(n) AS STRING
 DIM b(n) AS INTEGER
 pr = 0: vt = 0: tr = 0
 FOR i = 1 TO n
   ' ----- Вводим очередную строку -----
   INPUT s$
   ' ----- Находим номер второго пробела ( переменная k ) -----
   k = 1
   c$ = MID$(s$, k, 1)
   WHILE c$ <> " "
     k = k + 1
     c$ = MID$(s$, k, 1)
   WEND
   k = k + 1
   c$ = MID$(s$, k, 1)
   WHILE c$ <> " "
     k = k + 1
     c$ = MID$(s$, k, 1)
   WEND
   ' ----- Считываем фамилию и имя и запоминаем в массиве -----
   f(i) = MID$(s$, 1, k - 1) 
   ' ----- Считываем три оценки и их сумму запоминаем в массиве -----
   o1 = VAL(MID$(s$, k + 1, 1))
   o2 = VAL(MID$(s$, k + 3, 1))
   o3 = VAL(MID$(s$, k + 5, 1))
   b(i) = o1 + o2 + o3
   ' ----- Обработка полученных данных согласно поставленной задачи -----
   IF b(i) > pr THEN
      tr = vt: vt = pr: pr = b(i)
      ELSE
       IF b(i) > vt AND b(i) <> pr THEN
          tr = vt: vt = b(i)
          ELSE
           IF b(i) > tr AND b(i) <> pr AND b(i) <> vt THEN tr = b(i)
       END IF
   END IF
 NEXT i
 ' ----- Вывод результата -----
 FOR i = 1 TO n
   IF b(i) >= tr THEN PRINT f(i); b(i)
 NEXT i
 END

Обратите внимание на второй блок программы, который на сайте ФИПИ реализован следующим образом и, именно он, работает не корректно.


   IF b(i) > pr THEN
      tr = vt: vt = pr: pr = b(i)
      ELSE
       IF b(i) > vt THEN
          tr = vt: vt = b(i)
          ELSE
           IF b(i) > tr THEN tr = b(i)
       END IF
   END IF

Основные причины ошибок, которые допускают учащиеся

Назад к разделу Вики-учебник для подготовки к ЕГЭ/Раздел Информатика

Персональные инструменты
Инструменты
Акция час кода 2018

организаторы проекта