Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ запись

Автор: Richard 12.05.2007 16:19

Вот надо решить такую задачу:
1. Записать структуру с именем STUDENT, содержащую следующие поля:
=>NAME – фамилия и инициалы;
=>GROUP – номер группы;
=>SES – успеваемость (массив из пяти элементов).
2. Написать программу, выполняющие следующие действия:
=>ввод с клавиатуры данных в массив STUD1, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию содержимого поля GROUP;
=>вывод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4.0;
=>если таких студентов нет, вывести соответствующее сообщение.

Вот код который я пытался сделать
1.

type
STUDENT=record
NAME:String;
GROUP:integer;
SES:array[0..4] of byte;
end;


2.
var
STUD1:array[0..9]of STUDENT;
i,j:integer;
vspom:student;
sr:real;
Count:byte;
begin
for i:=0 to 9 do
begin
writeln('Please enter a name');
readln(stud1[i].name);
writeln('Please enter a group');
readln(stud1[i].group);
for j:=0 to 4 do
begin
writeln('Введите оценку:');
readln(stud1[i].ses[j]);
end;
end;
for j:=0 to 8 do
begin
if stud1[i].group<stud1[i+1].group then
vspom:=stud1[i];
stud1[i]:=stud1[i+1];
stud1[i+1]:=vspom;
end;
count:=0;
for i:=0 to 9 do
begin
sr:=(stud1[i].ses[0]+stud1[i].ses[1]+stud1[i].ses[2]+stud1[i].ses[3]+stud1[i].se
s[3])/2;
if sr>4.0 then
writeln('Name:',stud1[i].name,'','Group:',stud1[i].group
)
else
count:=count+1;
end;
if count=5 then
writeln('Все троечники и двоечники');
end;

Но чето не выходит у меня

Автор: arhimag 12.05.2007 16:22

Код
sr:=(stud1[i].ses[0]+stud1[i].ses[1]+stud1[i].ses[2]+stud1[i].ses[3]+stud1[i].se
s[3])/2;

надо делить не на 2 а на 5 smile.gif среднее арифметическое равно (a1+a2+a3+...+an)/n

Добавлено через 8 мин.
Код
    
for j:=0 to 8 do
for i:=9 downto j+1 do
  begin
   if stud1[pred(i)].group>stud1[i].group then begin
    vspom:=stud1[pred(i)];
    stud1[pred(i)]:=stud1[i];
    stud1[i]:=vspom;
   end;
  end;

И вот сортировка.

Автор: volvo 12.05.2007 16:51

Цитата
надо делить не на 2 а на 5
Для начала надо исправить
Цитата
sr:=(stud1[i].ses[0]+stud1[i].ses[1]+stud1[i].ses[2]+stud1[i].ses[3]+stud1[i].ses[3])/2;
вот тут дважды описанное ses[3] на ses[3] и ses[4], а потом уже можно и на 5 делить...

Автор: Richard 12.05.2007 17:50

for j:=0 to 8 do
for i:=9 downto j+1 do
begin
if stud1[pred(i)].group>stud1[i].group then begin
vspom:=stud1[pred(i)];
stud1[pred(i)]:=stud1[i];
stud1[i]:=vspom;
end;
end;

А че за сортировка и че такое pred(i)
А так правильно
 sr:=(stud1[i].ses[0]+stud1[i].ses[1]+stud1[i].ses[2]+stud1[i].ses[3]+stud1[i].ses[4])/5)

Автор: volvo 12.05.2007 18:00

Цитата
А че за сортировка и че такое pred(i)
http://forum.pascal.net.ru/index.php?act=findpost&pid=27328 ... А pred(x) - то же самое, что x - 1, т.е. предыдущее значение...

Автор: Richard 12.05.2007 18:42

Вот я подправил немного


var
STUD1:array[0..9]of STUDENT;
i,j:integer;
vspom:student;
sr:real;
Count:byte;
begin
for i:=0 to 9 do
begin
writeln('Please enter a name');
readln(stud1[i].name);
writeln('Please enter a group');
readln(stud1[i].group);
for j:=0 to 4 do
begin
writeln('Введите оценку:');
readln(stud1[i].ses[j]);
end;
end;
for j:=0 to 8 do
for i:=9 downto j+1 do
begin
if stud1[pred(i)].group>stud1[i].group then begin
vspom:=stud1[pred(i)];
stud1[pred(i)]:=stud1[i];
stud1[i]:=vspom;
end;
end;
count:=0;
for i:=0 to 9 do
begin
sr:=(stud1[i].ses[0]+stud1[i].ses[1]+stud1[i].ses[2]+stud1[i].ses[3]+stud1[i].se
s[4])/5;
if sr>4.0 then
writeln('Name:',stud1[i].name,'','Group:',stud1[i].group
)
else
count:=count+1;
end;
if count=5 then
writeln('All losers');
readln;
end;

Только он у меня не выводит то что когда ни у кого нет среднего бала выше 4.0 соответствующее сообщение.
И как на английском будет 'Введите оценку', а то паскаль у меня русский не воспринимает.

Автор: arhimag 12.05.2007 18:54

count должно быть равно 10, а не 5, ведь оно должно это вывести, когда у всех плохо.