Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Задача о студентах - решение

17.09.2017, 12:23. Показов 1359. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <оценки>,
где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 5 3
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const
  N = 6;
  M = 3;
 
type
  Student = class
  public 
    Name, Surname: string;
    Assessments: array [0..2] of integer;
    
    constructor(n, sn: string; r1, r2, r3: integer);
    begin
      Name := n;
      Surname := sn;
      Assessments[0] := r1;Assessments[1] := r2;Assessments[2] := r3;
    end;
    
    function Sum()  := Assessments[0] + Assessments[1] + Assessments[2];
  end;
 
var
  Students: array of Student;
  Data: string;
  j: integer;
 
begin
  SetLength(Students, N);
  for var i := 0 to N - 1 do
  begin
    Readln(Data);
    var a := Data.Split();
    Students[i] := new Student(a[0], a[1], StrToInt(a[2]), StrToInt(a[3]), StrToInt(a[4]));
  end;
  
  Students := Students.OrderBy(v -> v.Assessments.Sum()).ToArray();
  
  var i := 0;
  var Sum := Students[0].Sum();
  while i < N do
  begin
    while (i < N) and (Students[i].Sum() = Sum) do
    begin
      WritelnFormat('Ученик {0} {1} {2}-ый по счету имеет баллы {3}.', Students[i].Name, Students[i].Surname, j + 1, Students[i].Sum());
      Inc(i);
    end;
    
    if i < N then
    begin
      Inc(j);
      Sum := Students[i].Sum();
    end;
    
    if j >= M then break;
  end;
end.
Насколько плох/хорош код?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2017, 12:23
Ответы с готовыми решениями:

Задача о студентах
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней...

Записи. Ввод с клавиатуры массива записей со сведениями о студентах. Вывод данных о студентах двоечниках. Сортировка по алфавиту
Напишите программу :gsorry: :-* Описать запись с именем STUDENT, содержащую следующие поля:...

Задача о 2-х студентах
Два студента условились встретиться в определенном месте между 12 и 13 часами дня. Студент...

Перевести код с Pascal на C#: задача о студентах и их предпочтениях
Помогите пожалуйста перевести код на С#(как угодно), заранее спасибо. const n=5; m=9; var...

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
17.09.2017, 14:32 2
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Я бы вообще от циклов избавился:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const
  N = 10;
  M = 3;
 
type
  Student = class
  public 
    Name, Surname: string;
    Assessments: array of integer;
    
    constructor(n, sn: string; r1, r2, r3: integer);
    begin
      Name := n;
      Surname := sn;
      Assessments := Arr(r1, r2, r3);
    end;
    
    function ToString := Format('Ученик: {0}, {1}; оценки: {2}', Name, Surname, Assessments.JoinIntoString(' '));
  end;
 
var
  Students: array of Student;
  Data: string;
  j: integer;
 
begin
  var info := Arr('Иванов Иван 3 4 4',
                  'Петров Алексей 4 3 4',
                  'Алексеева Ирина 5 4 4',
                  'Сидоров Василий 4 3 5',
                  'Кукушкина Зоя 5 4 5',
                  'Васильев Павел 4 4 5',
                  'Ужов Виктор 3 4 4',
                  'Ежов Николай 3 5 3',
                  'Водкин Александр 3 4 4',
                  'Перова Ольга 4 4 4');
  Students := new Student[N];
  for var i := 0 to Pred(N) do // это только для теста, не обращай внимания
  begin
    var a := info[i].Split;
    Students[i] := new Student(a[0], a[1], StrToInt(a[2]), StrToInt(a[3]), StrToInt(a[4]));
  end;
  (*
    SetLength(Students, N);
    for var i := 0 to N - 1 do
    begin
      Readln(Data);
      var a := Data.Split();
      Students[i] := new Student(a[0], a[1], StrToInt(a[2]), StrToInt(a[3]), StrToInt(a[4]));
    end;
    *)
  
  Students := Students.OrderByDescending(v -> v.Assessments.Average()).ToArray();
  
  writeln('Best average:');
  var avgBest := Students.Take(M).Select(v -> v.Assessments.Average());
  writeln(Students.Take(M).Select(v -> v.ToString).JoinIntoString(NewLine));
  writeln('Worst average:');
  var avgWorst := Students.TakeLast(M).Select(v -> v.Assessments.Average());
  writeln(Students.TakeLast(M).Select(v -> v.ToString).JoinIntoString(NewLine));
  
  var other := Students.Skip(M).SkipLast(M).Where(v -> avgBest.Concat(avgWorst).Contains(v.Assessments.Average));
  writeln('Кроме этого, средние баллы, совпадающие с лучшими/худшими имеют:');
  writeln(other.Select(v -> v.ToString).JoinIntoString(NewLine));
end.
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
17.09.2017, 14:50  [ТС] 3
У меня к тебе вопрос. А почему я беру именно M начиная с первого элемента массива в строке
Pascal
1
var avgBest := Students.Take(M).Select(v -> v.Assessments.Average());
, если может получиться, что несколько средних арифметических являются одинаковые?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
17.09.2017, 16:28 4
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

И что? Тебе все равно надо взять только "троих учеников, у которых худший средний балл", хоть у них у всех будет одинаковый средний балл. А не "всех учеников с тремя худшими средними баллами". А уж потом проходишь по всем остальным и проверяешь, не было ли совпадений с теми тремя, которые уже были выведены.

Я зря сделал с лучшими, оказывается в задании этого не было, так что достаточно:
Pascal
1
2
3
4
5
6
7
8
9
  Students := Students.OrderBy(v -> v.Assessments.Average()).ToArray();
  
  writeln('Worst average:');
  var avgWorst := Students.Take(M).Select(v -> v.Assessments.Average());
  writeln(Students.Take(M).Select(v -> v.ToString).JoinIntoString(NewLine));
  
  var other := Students.Skip(M).Where(v -> avgWorst.Contains(v.Assessments.Average));
  writeln('Кроме этого, средние баллы, совпадающие с худшими имеют:');
  writeln(other.Select(v -> v.ToString).JoinIntoString(NewLine));
1
17.09.2017, 16:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2017, 16:28
Помогаю со студенческими работами здесь

На основаниии введенной информации о студентах вывести сводную ведомость о студентах-спортсменах по курсам
Составить программу, которая вводит данные о студентах: № п/п, фамилию, год рождения, пол, курс,...

Дана информация студентах (структура с полями: ФИО и 4 оценки за экзамен). Вывести данные о студентах, сдавших сессию на отлично.
Подскажите как решать задачи вот такого типа: Дана информация о пяти студентах. Структура имеет...

Задача на решение функции
Пожалуйста помогите решить задачку. Она на фото. Заранее спасибо! Вот как я сделал, но...

Задача на решение функции
Вычислить значение функции при A, B, C – константы (задать значение самостоятельно), х вводится с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru