Вики-учебник Подготовка к ЕГЭ/Информатика/Алгоритмизация и программирование/Программирование
Описание задания
Вашему вниманию предлагается задача С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
Основные причины ошибок, которые допускают учащиеся
Назад к разделу Вики-учебник для подготовки к ЕГЭ/Раздел Информатика