На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников которое не меньше 10, но не превосходит 100, каждая из следующих строк имеет следующий формат:
где – строка, состоящая не более чем из 20 символов, – строка, состоящая не более чем из 15 символов, – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. и , а также и разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Показать разбор
(допускаются иные формулировки ответа, не искажающие его смысла)
Программа верно читает входные данные, запоминая фамилии, имена и сумму баллов в массиве записей (или в нескольких массивах), сразу или за дополнительный просмотр подсчитывая три худших по величине суммы баллов (так как количество экзаменов у всех учеников одинаковое, лучший средний балл соответствует лучшей сумме баллов). Затем за дополнительный просмотр этого массива распечатывается информация о тех учениках, которые набрали в сумме баллов не больше третьей по величине суммы. Баллы начисляются только за программу, которая решает задачу хотя бы для частного случая (например, все ученики набрали различный средний балл).
Задание 5 | ЕГЭ по информатике | ДЕМО-2023
Пример правильной программы
var p:array[1..100] of record name:string; sum:integer; end; c:char; i,j,N,s1,s2,s3,m:integer; begin readln(N); for i:=1 to N do begin p[i].name:=»; repeat read(c); p[i].name:=p[i].name+c until c=’ ‘; repeat read(c); p[i].
name:=p[i].name+c until c=’ ‘; p[i].sum:=0; for j:=1 to 3 do begin read(m); p[i].sum:=p[i].sum+m end; readln; end; s1:=20; s2:=20; s3:=20; for i:=1 to N do begin if p[i].sumthen begin s3:=s2; s2:=s1; s1:=p[i].sum end else if p[i].sumthen begin s3:=s2; s2:=p[i].sum end else if p[i].sumthen s3:=p[i].sum; end; for i:=1 to N do if p[i].sumthen writeln(p[i].
name); end.
Критерии оценки
4 балла Программа работает верно, т.е. корректно выделяет из входных данных оценки, ищет три худших суммы баллов и распечатывает учеников, набравших эти суммы. Допускается наличие в тексте программы одной синтаксической ошибки.
3 балла Программа работает в целом верно, но содержит по крайней мере две из следующих неточностей (нерациональностей): сохраняются не суммы баллов (средние баллы), а сами баллы, и суммы перевычисляются несколько раз заново; явно вычисляются средние баллы, что приводит к сравнению вещественных чисел; при нахождении трех минимальных значений элементы массива переставляются местами; при печати сравнения производятся с каждым из трех минимальных элементов. Допускается наличие от одной до трех синтаксических ошибок: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных.
Задание 5 | ЕГЭ по информатике | ДЕМО-2022
2 балла Программа работает в целом верно, но выводит только трех худших учеников, даже если кто-то еще сдал экзамены так же. Возможно, в реализации алгоритма содержатся 1–2 ошибки (используется знак “ ”, “or” вместо “and” и т.п.). Возможно, некорректно организовано считывание входных данных. Допускается наличие до пяти синтаксических ошибок: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных.
1 балл Программа неверно работает при некоторых входных данных и, возможно, содержит ошибку в алгоритме поиска трех минимальных элементов. Допускается до 4 различных ошибок в ходе решения задачи, в том числе описанных в критериях присвоения двух баллов. Допускается наличие от одной до семи синтаксических ошибок: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных.
Источник: yandex.ru
На вход программе подаются сведения об учениках
Добрый день.
Помогите, пожалуйста с задачей:
«На вод программе подаются сведения о сдаче экзаменов учениками некоторой школы. В первой строке сообщается кол-во учеников N [10-100]. Каждая из следующих N строк имеет следующий формат: . Где — строка, состоящая максимум из 20 символов, — строка состоящая максимум из 15 символов, — 3 целых числа, разделенных пробелом. Требуется написать программу, выводящую на экран фамилии и имена учеников, сдавших экзамены либо на 4, либо на 5.»
Вот, что получилось у меня:
program e; uses crt; var i,n :integer; LastName :array [1..90] of string[20]; FirstName :array [1..90] of string[15]; M1,M2,M3 :array [1..90] of integer; begin readln(n); if n in [10..100] then begin for i:=1 to n do readln(LastName[i],FirstName[i],M1[i],M2[i],M3[i]); for i:=1 to n do begin if (((M1[i]=4) or (M1[i]=5)) and ((M2[i]=4) or (M2[i]=5)) and ((M3[i]=4) or (M3[i]=5))) then writeln(LastName[i],’ ‘,FirstName[i]); end; end; end.
Есть еще второй вариант через case, но там тот же косяк — после ввода третьей строки «ошибка ввода».
Источник: www.programmersforum.ru
infoegehelp.ru
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> , где <Фамилия>– строка, состоящая не более чем из 20 символов, – строка, состоящая не более чем из 15 символов, – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия>и , а также и разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 4
Требуется написать программу, которая будет выводить на экран фамилии и имена трех лучших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех лучших, то следует вывести и их фамилии и имена. Требуемые имена и фамилии можно выводить в произвольном порядке.
Решение:
Алгоритм программы следующий:
- Считываем записи, сохраняя фамилию, имя и сумму баллов в массиве записей (или в двух массивах).
- Определяем 3 самых высоких суммарных балла при просматре массива записей (или массивов). Средний балл не считаем, т.к. число экзаменов у школьников одинаково.
- При следующем просмотре массивов выводим фамилию и имена учеников, чей суммарный балл ≥ 3-ей по величине суммы.
Пример работы алгоритма.
Пусть на вход подается 10 записей, сумма баллов в которых равны:
- 15
- 14
- 13
- 9
- 12
- 9
- 9
- 15
- 8
- 12
- max1= 15
- max2= 15
- max3= 14
- 15
- 14
- 15
Программа написана на языках:
- Паскаль (среда разработки Turbo Pascal 7.0),
- Бейсик (среда разработки Quick Basic 4.5),
- Алгоритмический язык (среда разработки Кумир 1.9.0).
- Си (среда разработки Borland C++ 3.1),
Чтобы прочесть комментарии к программе, наведите мышью на соответствующую строку. Строки, снабженные комментарием, выделены фиолетовым цветом.
Напротив названия языка программирования в скобках содержатся ссылки на скачку исходников и ехе (исполняемых файлов).
var mas_fi:array[1..100] of record fi:string; sum:integer; end; c:char; i,j,N,max1,max2,max3,mark:integer; begin readln(N); for i:=1 to N do begin mas_fi[i].fi:=»; repeat read(c); mas_fi[i].fi:=mas_fi[i].fi+c until c=’ ‘; repeat read(c); mas_fi[i].fi:=mas_fi[i].fi+c until c=’ ‘; mas_fi[i].sum:=0; for j:=1 to 3 do begin read(mark); mas_fi[i].sum:=mas_fi[i].sum+mark end; readln; end; max1:=0; max2:=0; max3:=0; for i:=1 to N do begin if mas_fi[i].sum>max1 then begin max3:=max2; max2:=max1; max1:=mas_fi[i].sum end else if mas_fi[i].sum>max2 then begin max3:=max2; max2:=mas_fi[i].sum end else if mas_fi[i].sum>max3 then max3:=mas_fi[i].sum; end; write(char(13)+char(10)); for i:=1 to N do if mas_fi[i].sum>=max3 then writeln(mas_fi[i].fi); readln end. |
DIM i, j, N, max1,max2,max3, sum(100) AS INTEGER DIM str AS STRING DIM masfi(100) AS STRING INPUT N FOR i=1 TO N LINE INPUT str c$=MID$(str,1,1) j=1 WHILE NOT (c$=» «) j=j+1 c$=MID$(str,j,1) WEND j=j+1 c$=MID$(str,j,1) WHILE NOT (c$=» «) j=j+1 c$=MID$(str,j,1) WEND masfi(i)=MID$(str,1,j) sum(i)=ASC(MID$(str,j+1,1))-ASC(«0») sum(i)=sum(i)+(ASC(MID$(str,j+3,1))-ASC(«0»)) sum(i)=sum(i)+(ASC(MID$(str,j+5,1))-ASC(«0»)) NEXT i max1=0: max2=0: max3=0 FOR i=1 TO N IF sum(i)>max1 THEN max3=max2: max2=max1 max1=sum(i) ELSE IF sum(i)>max2 THEN max3=max2: max2=sum(i) ELSE IF sum(i)>max3 THEN max3=sum(i) END IF END IF NEXT i FOR i=1 TO N IF sum(i)>=max3 THEN PRINT masfi(i) NEXT i END |
алг нач цел i,j,N,max1,max2,max3,mark сим c лит str литтаб mas_fi[1:100] целтаб sum[1:100] ввод N нц для i от 1 до N ввод str j:=1 нц c:=str[j] j:=j+1 кц при c=» » нц c:=str[j] j:=j+1 кц при c=» » mas_fi[i]:=str[1:j-2] mark:=код(str[j])-код(«0») mark:=mark+(код(str[j+2])-код(«0»)) mark:=mark+(код(str[j+4])-код(«0»)) sum[i]:=mark кц max1:=0 max2:=0 max3:=0 нц для i от 1 до N если sum[i]>max1 то max3:=max2 max2:=max1 max1:=sum[i] иначе если sum[i]>max2 то max3:=max2 max2:=sum[i] иначе если sum[i]>max3 то max3:=sum[i] все все все кц вывод нс нц для i от 1 до N если sum[i]>=max3 то вывод mas_fi[i],нс все кц кон |
#include #include #include void main() char mas_fi[100][36]; char str1[21],str2[16],fi[37]; int sum[100]; int N,i,j,max1,max2,max3,mark1,mark2,mark3; scanf(«%d», for(i=0;i mark2, strcpy(fi,str1); strcat(fi,» «); strcat(fi,str2); j=0; while(fi[j]!=’ |