Здравствуйте, Романов Артем.
Исправленная программа — в приложении. Я изменил описание записи, чтобы сделать возможным использование цикла при вводе оценок. (Вывод на экран я не изменял, там по-прежнему без циклов.)
Кстати, структура создаваемого Вашей программой файла не соответствует описанию в задаче: поле имени предваряется байтом длины (в условии про это ничего не сказано), номер зачетки — 2 байта (бинарное представление типа integer), порядок полей иной. Если требуется точное соответствие условию — обращайтесь в мини-форум, можно исправить.
Кроме того, подправлено вычисление процента успеваемости: кол-во студентов определяется по размеру файла, нет обращения к неопределенному файлу f1; у Вас вычислялся процент НЕуспеваемости; сообщение вида 'Процент успева
имости:50 %' — корявое, исправил (если Вы пишете "Процент успеваемости", то знак '%' в конце является лишним, если хотите его использовать, то достаточно написать "Успеваемость".
Еще несколько замечаний:
- Старайтесь свести к минимуму использование глобальных переменных. Если Вы пытаететсь сэкономить память таким образом, то эффект получается обратный. Локальные переменные размещаются в стеке и освобождаются при выходе из процедуры (функции). По возможности, переменные должны быть локальными. Не бойтесь, что их имена повторяются.
- Используйте оператор WITH, если многократно обращаетесь к членам записи.
- Если Вы выводите несколько строк подряд, особенно в одном операторе write
[ln], то лучше их объединить.
- В сообщениях старайтесь использовать вежливое обращение: "Введи" — это слишком грубо.
Программа протестирована в Borland Pascal 7.0
Успехов!
Приложение:
{
Дан файл, в котором содержатся данные о студентах.
ФИО(символов). Первая оценка, вторая оценка, третья оценка (по 1 символу),
номер зачетки (4символа). Нужно найти:
1) количество неуспевающих и процент успеваемости.
2) с помощью Seek, по номеру зачетки, нужно изменить оценки.
}
program pro;
uses crt;
type stud=record
nz : integer;
fio : string[15];
o : array[1..3] of char;
end;
var
f:file of stud;
procedure vvod;
var i, j, n : integer;
stude: stud;
begin
rewrite(f);
write('Количество учеников: ');
readln(n);
for i:=1 to n do
with stude do
begin
write(' Введите имя и фамилию ', i ,'-го ученика ');
readln(fio);
for j:=1 to 3 do
begin
write(' Введите ', j, '-ю оценку ученика ');
readln(o[j]);
end;
write(' Введите № зачетки: ');
readln(nz);
write(f,stude);
end;
close(f);
end;
procedure pros;
var stude: stud;
begin
reset(f);
writeln('Имя ученика':15,' Первая оценка Вторая оценка Третья оценка Номер зачетки');
while not(eof(f)) do
begin
read(f,stude);
with stude do
writeln( fio:15, o[1]:8, o[2]:14, o[3]:14, nz:16 );
end;
close(f);
end;
procedure poisk;
var stude: stud;
j, k, n : integer;
u: real;
begin
writeln;
reset(f);
k:=0;
writeln('Имя ученика':15,' Первая оценка Вторая оценка Третья оценка Номер зачетки');
while not(eof(f)) do
with stude do
begin
read(f,stude);
for j:=1 to 3 do
if o[j]='2' then
begin
writeln( fio:15, o[1]:8, o[2]:14, o[3]:14, nz:16 );
inc(k);
break;
end;
end;
u:=0;
Writeln('Неуспеващих: ',k);
n := FileSize(f);
u:= (n-k)/n *100;
writeln('Успеваемость: ',u:5:1,'%');
close(f);
end;
procedure poisk2;
var nz, j, n: integer;
stude: stud;
begin
reset(f);
write('Введите № зачетки: ');
readln(nz);
while not(eof(f)) do
begin
read(f,stude);
if nz = stude.nz then
with stude do
begin
writeln( 'Ученик: ', fio );
for j:=1 to 3 do
begin
write(' Введите ', j, '-ю оценку ученика ');
readln(o[j]);
end;
seek( f, FilePos(f)-1 );
write(f,stude);
exit;
end;
end;
writeln( 'Номер зачетки ', nz, ' не найден.' );
close(f);
end;
var ch: char;
begin
clrscr;
assign(f,'c:\bp\stud.dat');
repeat
writeln('--------------');
writeln('1-создание');
writeln('2-просмотр');
writeln('3-успеваемость');
writeln('4-исправление');
writeln('--------------');
writeln('0-выход');
{ этот цикл позволяет исключить повторный вывод меню при
нажатии неверной клавиши }
repeat ch := readkey; until (ch >= '0') and (ch <= '4');
case ch of
'1': vvod;
'2': pros;
'3': poisk;
'4': poisk2;
end;
until ch = '0';
end.