Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы - PascalABC.NET
Формулировка задачи:
Помогите найти ошибку в моей программе. Не нужно писать свою программу.
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <оценки>,
где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Решение задачи: «Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы»
textual
Листинг программы
const LIM = 100; var Info: array[1..LIM] of record name: string; sum: integer; end; i, k, N, mark, min1, min2, min3: integer; c: char; begin readln(N); { ввод исходных данных } for i:=1 to N do begin Info[i].name := ''; for k:=1 to 2 do repeat read(c); Info[i].name := Info[i].name + c; until c = ' '; Info[i].sum := 0; for k:=1 to 3 do begin read(mark); Info[i].sum := Info[i].sum + mark; end; readln; end; { поиск трех минимальных } min1 := 20; min2 := 20; min3 := 20; for i:=1 to N do begin if Info[i].sum <min1 then begin min3 := min2; min2 := min1; min1 := Info[i].sum; end else if Info[i].sum <min2 then begin min3 := min2; min2 := Info[i].sum; end else if Info[i].sum <min3 then min3 := Info[i].sum; end; { вывод результата } for i:=1 to N do if Info[i].sum <= min3 then writeln(Info[i].name); end.
Объяснение кода листинга программы
- В начале кода объявляются следующие переменные:
- LIM - целочисленная константа, определяющая максимально возможное количество учеников (100);
- Info - массив записей, содержащих информацию об учениках (имя и сумма баллов);
- i, k, N, mark, min1, min2, min3 - целочисленные переменные для выполнения различных операций;
- c - символ, используемый для чтения имени ученика;
- end - символ, обозначающий конец цикла.
- Затем происходит чтение количества учеников (N) с помощью функции readln.
- В цикле по i от 1 до N происходит заполнение массива Info. Значение переменной name формируется путем чтения двух символов (имя ученика) и добавляется к уже имеющейся строке. Значение переменной sum устанавливается равным 0.
- В цикле по k от 1 до 3 происходит чтение трех оценок для каждого ученика и добавление их к сумме.
- После окончания ввода данных происходит поиск трех минимальных значений сумм. Переменные min1, min2 и min3 инициализируются значением 20.
- В цикле по i от 1 до N происходит сравнение суммы текущего ученика с минимальными значениями. Если сумма текущего ученика меньше min1, то значения min3, min2 и min1 обновляются. Если сумма текущего ученика меньше min2, то значения min3 и min2 обновляются. Если сумма текущего ученика меньше min3, то только значение min3 обновляется.
- В цикле по i от 1 до N происходит проверка условия Info[i].sum <= min3, и если оно выполняется, то выводится имя ученика. Таким образом, данный код выполняет следующие действия:
- Считывает количество учеников.
- Заполняет массив Info информацией об учениках.
- Находит три минимальных значения суммы баллов.
- Выводит имена учеников, сумма баллов которых не превышает минимальное значение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д