Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Помогите найти ошибку в моей программе. Не нужно писать свою программу. На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <оценки>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки: Иванов Петр 4 5 3 Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Листинг программы
  1. program c4;
  2. Var Saf:Array[1..100] Of Integer;
  3. Var FI: Array[1..100] of String;
  4. Var p2p,i,min1,min2,min3,n:Integer;
  5. Var s: String;
  6. begin
  7. Writeln('Введите количество учащихся...');
  8. Read(N);
  9. Writeln ('Введите строку, содержащую сведения о сдаче экзамена');
  10. For i:=1 to N do begin
  11. Readln(s);
  12. p2p:=PosEx(' ',s,pos(' ',s)+1);{позиция второго пробела в строке}
  13. FI[i]:=Copy(s,1,p2p-1);{заполняем массив Фамилией и именем каждой строки}
  14. Delete(s,1,p2p);{удаляем из исходной строки ФИ с пробелом}
  15. SAF[i]:=(StrToInt(copy(s,1,1))+StrToInt(Copy(s,3,1))+StrToInt(copy(s,5,1)))div 3;
  16. {заполянем массив средними значениями трех оценок}
  17. end;
  18. min1:=20;min2:=20;min3:=20; {находим третье минимальное среднее значение}
  19. For i:=1 to N do begin
  20. If Saf[i]< min1 then begin
  21. min3:=min2;
  22. min2:=min1;
  23. min1:=Saf[i];
  24. end
  25. else If Saf[i]<min2 then begin
  26. min3:=min2;
  27. min2:=Saf[i];
  28. end
  29. else If Saf[i]<min3 then min3:=Saf[i];
  30. end;
  31. For i:=1 to N do {выводим всех учеников, у которых среднее значение баллов
  32. меньше или равно третьему минимальному значению}
  33. If Saf[i]<=min3 then writeln (Fi[i]);
  34. end.

Решение задачи: «Сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы»

textual
Листинг программы
  1. const LIM = 100;
  2. var Info: array[1..LIM] of record
  3.       name: string;
  4.       sum: integer;
  5.      end;
  6.  i, k, N, mark, min1, min2, min3: integer;
  7.   c: char;
  8. begin
  9. readln(N);
  10.   { ввод исходных данных }
  11. for i:=1 to N do begin
  12.  Info[i].name := '';
  13.  for k:=1 to 2 do
  14.   repeat
  15.    read(c);
  16.    Info[i].name := Info[i].name + c;
  17.   until c = ' ';
  18.  Info[i].sum := 0;
  19.  for k:=1 to 3 do begin
  20.   read(mark);
  21.   Info[i].sum := Info[i].sum + mark;
  22.  end;
  23.  readln;
  24. end;
  25.   { поиск трех минимальных }
  26. min1 := 20; min2 := 20; min3 := 20;
  27. for i:=1 to N do begin
  28.  if Info[i].sum <min1 then begin
  29.   min3 := min2; min2 := min1;
  30.   min1 := Info[i].sum;
  31.  end
  32.  else if Info[i].sum <min2 then begin
  33.    min3 := min2;
  34.    min2 := Info[i].sum;
  35.   end
  36.   else if Info[i].sum <min3 then
  37.      min3 := Info[i].sum;
  38. end;
  39.   { вывод результата }
  40. for i:=1 to N do
  41.  if Info[i].sum <= min3 then
  42.    writeln(Info[i].name);
  43. end.

Объяснение кода листинга программы

  1. В начале кода объявляются следующие переменные:
    • LIM - целочисленная константа, определяющая максимально возможное количество учеников (100);
    • Info - массив записей, содержащих информацию об учениках (имя и сумма баллов);
    • i, k, N, mark, min1, min2, min3 - целочисленные переменные для выполнения различных операций;
    • c - символ, используемый для чтения имени ученика;
    • end - символ, обозначающий конец цикла.
  2. Затем происходит чтение количества учеников (N) с помощью функции readln.
  3. В цикле по i от 1 до N происходит заполнение массива Info. Значение переменной name формируется путем чтения двух символов (имя ученика) и добавляется к уже имеющейся строке. Значение переменной sum устанавливается равным 0.
  4. В цикле по k от 1 до 3 происходит чтение трех оценок для каждого ученика и добавление их к сумме.
  5. После окончания ввода данных происходит поиск трех минимальных значений сумм. Переменные min1, min2 и min3 инициализируются значением 20.
  6. В цикле по i от 1 до N происходит сравнение суммы текущего ученика с минимальными значениями. Если сумма текущего ученика меньше min1, то значения min3, min2 и min1 обновляются. Если сумма текущего ученика меньше min2, то значения min3 и min2 обновляются. Если сумма текущего ученика меньше min3, то только значение min3 обновляется.
  7. В цикле по i от 1 до N происходит проверка условия Info[i].sum <= min3, и если оно выполняется, то выводится имя ученика. Таким образом, данный код выполняет следующие действия:
  8. Считывает количество учеников.
  9. Заполняет массив Info информацией об учениках.
  10. Находит три минимальных значения суммы баллов.
  11. Выводит имена учеников, сумма баллов которых не превышает минимальное значение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы