Ох.
У вас много ошибок.
Вот правильные сорцы.
Первая программа:
Код:
Program fail;
uses crt;
type student=record
index:string;
fam:string;
ysp:array[1..3] of integer;
end;
var f:file of student;
a:student;
i:byte;
j:byte;
begin
clrscr;
assign (f,'d:\student.txt');
rewrite (f);
for i:=1 to 3 do begin
writeln ('vvedite familiy');
readln (a.fam);
writeln ('vvedite gruppy');
readln (a.index);
writeln ('vvedite ocenki po trem ekzamenam:');
for j:=1 to 3 do
readln (a.ysp[j]);
write (f,a);
end;
close(f);
end.
Вторая программа:
Код:
Program fail2;
uses crt;
type student=record
index:string;
fam:string;
ysp:array [1..3] of integer;
end;
var f:file of student;
a:student;sr:real;
S:integer;
m:integer;
begin
clrscr;
assign(f,'d:\student.txt');
reset(f);
writeln('familii neuspevayushih:');
m:=0;
S:=0;
while not eof(f) do begin read (f,a);
if (a.ysp[1] <= 3) or (a.ysp[2] <= 3) or (a.ysp[3] <= 3) then writeln (a.fam);
m:=m+3;
S:=S + a.ysp[1] + a.ysp[2] + a.ysp[3];
sr:=S/m;
end;
writeln;
writeln ('srednii ball=',sr:3:1);
close(f);
readln;
end.
Давайте по порядку?
Первое. Типы данных должны быть одинаковые в обоих программах. А у вас -- разные.
Код:
type student=record
index:string;
fam:string;
ysp:array[1..3] of integer;
end;
Код:
type student=record
fam:string;
index:string;
ysp:array [1..3] of integer;
end;
Чуете разницу? Нельзя переставлять местами переменные. Порядок -- важен. Ибо то, что у вас в первой программе было фамилией, во второй программе стало названием группы. Ну и название группы стало фамилией.
Далее.
Ошибка на цикл вылетала потому, что вы закрывали файл в цикле. А надо после окончания ВСЕЙ работы.
Еще одна важная вещь -- у вас неправильно написана первая программа :-)
Код:
for j:=1 to 3 do begin
readln (a.ysp[j]);
write (f,a);
end;
Этот вот кусок считывает оценки.
Но! Зачем! Он! Пишет в файл ВСЮ "запись" о студенте? У вас получается три записи!
Запись "записи"(record) в файл надо производить в КОНЦЕ каждого цикла!
Вернемся ко второй программе.
Переменные нужно обнулять.
У вас в цикле идет накопление суммы:
Код:
m:=m+3;
S:=S + a.ysp[1] + a.ysp[2] + a.ysp[3];
Перед циклом необходимо обнулить переменные:
Зачем? А затем, что в m и S могут изначально находиться страшные цифры, отличные от нуля. Естественно, это приведет к ошибке.
Далее.
Код:
if a.ysp[i]=3 then write (a.fam);
Что вы хотели сказать этой строчкой? i у вас даже не определена.
Вы считали ПОЛНОСТЬЮ запись.
Вам надо проверить, не является ли ХОТЯ БЫ одна из трех оценок меньше или равной трем.
Это делается так:
Код:
if (a.ysp[1] <= 3) or (a.ysp[2] <= 3) or (a.ysp[3] <= 3)
Далее.
Что вы хотели этим сказать? У вас же по каждому студенту три оценки! Надо их все в общую сумму складывать. И считать их как три :-)
Т.е.:
Код:
m:=m+3;
S:=S + a.ysp[1] + a.ysp[2] + a.ysp[3];
Ну и опять же.
ВЫВОД результатов надо делать ПОСЛЕ цикла. А не в его теле. Посмотрите, где стоит end; для цикла у меня и у вас.
И на последок.
Код:
writeln ('srednii ball=',sr:3:1);
Эта волшебная конструкция (:3:1) означает, что под число с плавающей запятой будет выделено три клеточки. Из них одна клеточка -- под десятичную часть.
Удачи!