Ильгиза, во-первых, подобных задач на нашем форуме рассмотрено море, и все они решаются через массивы, но не простые, а массивы записей. Могли бы и поискать самостоятельно. Во-вторых, Ваша программа... ну, неряшливая, что ли. Ведь для чего вводятся константы? А для того, чтобы при необходимости их значение можно было бы заменить, и при этом программа работала бы по-прежнему. А у Вас? Задаете число предметов в виде константы (d=3) и тут же в теле программы используете это количество в явном виде. Ну что это такое:
s:=(n1+n2+n3)/d;
А если я поменяю значение d на, например, 5 - что будет? Ответ: ахинея. Отвыкайте от подобных подходов, для программиста они недопустимы.
Вот работающий код. Обе задачи там "в одном флаконе":
Код:
Const
d=3;
Type
stud=record
FIO:string;
Mark:Array[1..d] of Byte;
Mark_med:real;
end;
Var
st:Array[1..20] of stud;
stdm:stud;
t1,t2,t3:text;
i,j,Nst,Nbest,n,code:integer;
Ch:Char;
Mark_med_gr:real;
Begin
assign(t1,'file.txt');
reset(t1);
assign(t2,'file2.txt');
rewrite(t2);
assign(t3,'file3.txt');
rewrite(t3);
Nst:=0;
Mark_med_gr:=0;
while not eof(t1) do
begin
Inc(Nst);
with st[Nst] do
begin
FIO:='';
repeat
read(t1,Ch);
val(Ch,n,code);
If code<>0 then FIO:=FIO+Ch else Mark[1]:=n;
until code=0;
for i:=2 to d do read(t1,Mark[i]);
readln(t1);
Mark_med:=0;
for i:=1 to d do
begin
Mark_med:=Mark_med+Mark[i]/d;
Mark_med_gr:=Mark_med_gr+Mark[i];
end;
end;
end;
Close(t1);
Mark_med_gr:=Mark_med_gr/(Nst*d);
Writeln('Group medium mark: ',Mark_med_gr:4:2);
Writeln('Students whose medium mark is higher then group one:');
Nbest:=0;
For i:=1 to Nst do
with St[i] do
If Mark_med>Mark_med_gr then
begin
Inc(Nbest);
write(t2,FIO);
for j:=1 to d do
write(t2,Mark[j]:2);
writeln(t2,Mark_med:5:2);
write(FIO);
for j:=1 to d do
write(Mark[j]:2);
writeln(Mark_med:5:2);
end;
Close(t2);
Writeln('Number of such students ',Nbest);
Writeln;
Writeln('Sorted list of sudents:');
For i:=1 to Nst do
For j:=1 to Nst-i do
If St[j].Mark_med<St[j+1].Mark_med then
begin
Stdm:=St[j];
St[j]:=St[j+1];
St[j+1]:=Stdm;
end;
For i:=1 to Nst do
with St[i] do
begin
write(t3,FIO);
for j:=1 to d do
write(t3,Mark[j]:2);
writeln(t3,Mark_med:5:2);
write(FIO);
for j:=1 to d do
write(Mark[j]:2);
writeln(Mark_med:5:2);
end;
Close(t3);
Readln
End.