Просмотр задания
{Pascal}

Пожалуйста можете написать, почему у меня не получается из стринговой переменной перетащить числа в интежер и взять среднее значение.
И если у меня не правильно решение, напиши пожалуйста алгоритм решения подобных задач, очень буду благодарен :).
------------------------------------
http://rghost.ru/6HLdtXPyp/image.png
------------------------------------
P.S В программе я использую, записи я знаю что можно и без них, и то что они весят много памяти :).

На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:

, где – строка, состоящая не более чем из 20 символов, – строка, состоящая не более чем из 15 символов, – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. и , а также и разделены одним пробелом.

Пример входной строки:
Иванов Петр 4 5 3

Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.

{ sur - фамилия
nic - имя
N - кол-во учеников
i - для цикла
j - для цикла сортировки пузрьком
m - среднее значение оценок
a - Массив для фамилии и имя
b - Массив для оценок
r - записи,стундента
}
28 января 2016
Ответы (15)
Max Shkiv # 28 января 2016 в 21:47 0
{
nickname - имя и фамилия
N - кол-во учеников
i - для цикла
j - для цикла сортировки пузрьком
m - ввод оценок
a - Массив для фамилии и имя
b - Массив для оценок
r - записи,стундента
}
Информатик БУ # 28 января 2016 в 21:55 0
Такие программы пишутся чутка по другому. Ввод фамилии/имени осуществляется через цикл, например, так:

Код PASCAL:
  1. repeat //ввод фамилии
  2. read(c);
  3. s:=s+c;
  4. until c=' ';
  5. repeat //ввод имени
  6. read(c);
  7. s:=s+c;
  8. until c=' ';
  9. a[i] := s;
  10. readln(a1, a2, a3); //ввод оценок
где c - char (ввод каждой буквы фамилии/имени происходит через повторение цикла), s - переменная с фамилией/именем, которая сохраняется в массив a. Переменные a1 a2 a3 - числа.

Перевести string в integer можно функцией strtoint(s), где s - строка. Например s:='50'; x:=strtoint(s)*2; - s=100. Работает не во всех паскалях, в ABC функция есть.
Хотя тут этого не надо в любом случае.
Информатик БУ # 28 января 2016 в 22:00 0
И кстати, зачем тут record так записан?


Record нужен для того, чтобы в одном массиве можно было сохранять, например, текст и числа, в данной задаче можно использовать для хранения имён и оценок. В коде же в типе student всего одно поле - nickname.
Max Shkiv # 28 января 2016 в 22:18 0
Я вначале написал, что думаю об этой задаче, и без записей я не имел понятия как решать... , и потом когда я уже заскринил, увидел и написал в разделе P.S =), удалять и переделывать уже было бы сложнее :)
Информатик БУ # 28 января 2016 в 22:21 0
Как вариант:
Код PASCAL:
  1. type student = record
  2. name: string;
  3. sr: real;
  4. end;
  5. var
  6. c: char;
  7. s: string;
  8. a: array[1..100] of student;
  9. t, min1, min2, min3: real;
  10. i, n, a1, a2, a3: integer;
  11. begin
  12. readln(n);
  13. min1:=5; min2:=5; min3:=5;
  14. for i:=1 to n do
  15. begin
  16. repeat
  17. read(c);
  18. s:=s+c;
  19. until c=' ';
  20. repeat
  21. read(c);
  22. s:=s+c;
  23. until c=' ';
  24. readln(a1, a2, a3);
  25. t:=(a1+a2+a3)/3;
  26. a[i].name := s;
  27. a[i].sr := t;
  28. if t<min1 then
  29. begin
  30. min3:=min2;
  31. min2:=min1;
  32. min1:=t;
  33. end else
  34. if t<min2 then
  35. begin
  36. min3:=min2;
  37. min2:=t;
  38. end else
  39. if t<min3 then
  40. min3:=t;
  41. s := '';
  42. end;
  43. for i:=1 to n do
  44. if a[i].sr <= min3 then
  45. writeln(a[i].name, a[i].sr);
  46. end.
Max Shkiv # 28 января 2016 в 22:35 0
Оцените пожалуйста мой вариант, без записей, по критериям егэ
(сам проверить на работоспособность не могу =), когда нажимаю на play, паскаль(абс) вылетает и если не вылетает, то выдает ошибку что сейчас закроется. )
http://rghost.ru/7XyZ4jgFP/image.png
Информатик БУ # 28 января 2016 в 22:40 0
А зачем кидать код картинкой, когда его можно скопировать в комментарий сюда?
Информатик БУ # 28 января 2016 в 22:41 0
Программа не эффективна по времени.
for i:=1 to n-1 do
for j:=1 to n-1 do
За такое по головке не погладят)
И сортировать массив не надо.
Max Shkiv # 28 января 2016 в 22:45 0
А можно вопрос, у меня в самом конце, ошибка
write(a[1]); writeln(b[1]);
write(a[2]); writeln(b[2]);
write(a[3]); writeln(b[3]);
дело в том, что элементы массива a и b разные, тоесть я вывожу каких то левых из массива а, средние числа из массива b, как сделать так, чтобы эти числа в массиве совпадали?
Информатик БУ # 28 января 2016 в 22:51 0
Потому что сортировка массива b есть, а массива a - нет. Кстати, такой вывод не лучший вариант. Если b[1]=b[2]=b[3] (трое написали одинаково плохо), то другие ученики, которые получили 2 и 3 место в антирейтинге не будут выведены. И формулировка "Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена." подразумевает, что если, например, минимальные средние баллы 2, 2.5, 3, то вывести всех учеников, которые набрали 2, 2.5 и 3 балла.
Max Shkiv # 28 января 2016 в 22:53 0
Хорошо, спасибо хорошо объясняете smile zlo
Информатик БУ # 28 января 2016 в 22:58 0
joke
Max Shkiv # 28 января 2016 в 23:03 0
А еще будет такой вопрос, вы использовали в программе записи да еще и добавили их в массив, это не будет слишком много по памяти? И сколько ваша программа набрала бы баллов на егэ?
Информатик БУ # 28 января 2016 в 23:12 0
Нужно понимать, какие данные необходимо хранить во время работы программы. Так как все ученики могли набрать один балл, этот балл будет наихудшим, значит в этом случае надо хранить фамилии и имена всех учеников.
По объему запись будет равна двум массивам (строковому и целочисленному), то есть разницы нет, два массива или запись.
Хотя можно было бы уменьшить количество переменных, тут можно обойтись, например, без a1 a2 a3, но это не критично.
Программа на 4 балла.
Max Shkiv # 28 января 2016 в 23:19 0
спасибо music
Перевести число из в Результат: 510 = 1012