Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы - PascalABC.NET
Формулировка задачи:
Помогите найти ошибку в моей программе. Не нужно писать свою программу.
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <оценки>,
где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Листинг программы
- program c4;
- Var Saf:Array[1..100] Of Integer;
- Var FI: Array[1..100] of String;
- Var p2p,i,min1,min2,min3,n:Integer;
- Var s: String;
- begin
- Writeln('Введите количество учащихся...');
- Read(N);
- Writeln ('Введите строку, содержащую сведения о сдаче экзамена');
- For i:=1 to N do begin
- Readln(s);
- p2p:=PosEx(' ',s,pos(' ',s)+1);{позиция второго пробела в строке}
- FI[i]:=Copy(s,1,p2p-1);{заполняем массив Фамилией и именем каждой строки}
- Delete(s,1,p2p);{удаляем из исходной строки ФИ с пробелом}
- SAF[i]:=(StrToInt(copy(s,1,1))+StrToInt(Copy(s,3,1))+StrToInt(copy(s,5,1)))div 3;
- {заполянем массив средними значениями трех оценок}
- end;
- min1:=20;min2:=20;min3:=20; {находим третье минимальное среднее значение}
- For i:=1 to N do begin
- If Saf[i]< min1 then begin
- min3:=min2;
- min2:=min1;
- min1:=Saf[i];
- end
- else If Saf[i]<min2 then begin
- min3:=min2;
- min2:=Saf[i];
- end
- else If Saf[i]<min3 then min3:=Saf[i];
- end;
- For i:=1 to N do {выводим всех учеников, у которых среднее значение баллов
- меньше или равно третьему минимальному значению}
- If Saf[i]<=min3 then writeln (Fi[i]);
- end.
Решение задачи: «Сведения о сдаче экзаменов учениками 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 информацией об учениках.
- Находит три минимальных значения суммы баллов.
- Выводит имена учеников, сумма баллов которых не превышает минимальное значение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д