Непонятная ошибка в Массиве записей

Свойственно имею программу по мз (код под примерами запуска, т.к. он большой), первым делом инициализирую мз, потом просматриваю все записи (рис 1) на данный момент все хорошо, потом использую либо процедуру change_ward либо change_doctor, и при присмотре на той записи которую я хотел изменить , странно меняется текст(рис 2),если же использовать удаление , то проблема вообще не проявится, можете пожалуйста подсказать с чем это связано, и как это можно подправить рис 1:введите сюда описание изображения

рис 2: введите сюда описание изображения

код:

Uses Crt;
Type
bolnoy=Record
FIO : String[20];
nom_palaty : Byte;
osn_d : string[10];
vrach : string[20];
date : string[10];
naz : string[10];
End;
Stud_File = File of bolnoy;
Stud_Mas = Array[1..50] of bolnoy;

Procedure Wait;
Begin
GotoXY(20,24);
Write('Для продолжения - нажмите любую клавишу ...');
ReadKey;
End;

Function F_I_O : String;
Const
B1:string='БВГДМНПРСТХЧ';
G1:string='аеиоаюеуоае';
Sog1:string='бвзклмнпрстч';
I1:Array[1..4] of string=('нов','лов','ский','ко');
Var
Kb,I : Byte;
F : String;
Begin
F:=B1[Random(12)+1];
Kb:=Random(2)+3;
For I:=1 To Kb Do
If I mod 2 = 1 then
F:=F+G1[Random(11)+1]
else
F:=F+Sog1[Random(12)+1];
F:=F+I1[Random(4)+1];
F:=F+' '+ B1[Random(12)+1]+'.'+ B1[Random(12)+1]+'.';
F_I_O:=F;
End;


Function F_I_O_doctor : String;
Const
B1:string='БВГДМНПРСТХЧ';
G1:string='аеиоаюеуоае';
Sog1:string='бвзклмнпрстч';
I1:Array[1..4] of string=('нов','лов','ский','ко');
Var
Kb,I : Byte;
F : String;
Begin
F:=B1[Random(12)+1];
Kb:=Random(2)+3;
For I:=1 To Kb Do
If I mod 2 = 1 then
F:=F+G1[Random(11)+1]
else
F:=F+Sog1[Random(12)+1];
F:=F+I1[Random(4)+1];
F:=F+' '+ B1[Random(12)+1]+'.'+ B1[Random(12)+1]+'.';
F_I_O_doctor:=F;
End;


function Diagnose: string;
const
s1:string = 'ОРВИ';
s2:string = 'Ротовирус';
s3:string = 'Гастрит';
s4:string = 'Хитрость';
s5:string = 'Синусит';
s6:string = 'Другое';
var
rand: byte;
r: string;
begin
rand:=random(5)+1;
case rand of
1: r:=s1;
2: r:=s2;
3: r:=s3;
4: r:=s4;
5: r:=s5;
6: r:=s6;
end;
Diagnose:=r;
end;


function date_opr: string;
var
v: string;
d,m,g: string;
Den,Mec: byte;
God: integer;
begin
Den:=random(31)+1;
Mec:=random(12)+1;
God:=random(20)+1999;
str(den,d);
str(mec,m);
str(god,g);
If den<10 then
d:='0'+d;
if mec<10 then
m:='0'+m;
v:=d+'.'+m+'.'+g;
date_opr:=v;
end;



function Naznach : string;
Const
n1:string = 'Покой';
n2:string = 'Валерьянка';
n3:string = 'Шалфей';
n4:string = 'Процедуры';
n5:string = 'УЗИ';
n6:string = 'Другое';
var
Rand: byte;
n: string;
begin
Rand:=random(6)+1;
case Rand of
1: n:=n1;
2: n:=n2;
3: n:=n3;
4: n:=n4;
5: n:=n5;
6: n:=n6;
end;
Naznach:=n;
end;




Procedure Input_Record(Var St_Rec:bolnoy);
Var
Kb,I,J,N : Byte;
Begin
{Randomize};
With St_Rec Do
Begin
{ Kb:=Random(6)+5;
FIO:='';
For J:=1 To Kb Do'
FIO:=FIO+CHR(Random(26)+65);}
FIO:=F_I_O;
nom_palaty:=random(10)+1;
osn_d:=diagnose;
vrach:=F_I_O_doctor;
date:=date_opr;
naz:=naznach;
End;
End;

Procedure Korrekt_File;
Var
Kb,I,J,N : Byte;
St_Rec : bolnoy;
St_F : Stud_File;
File_Name : String;
Begin
ClrScr;
GotoXY(25,5); Write('Процедура <Korrekt_File>');
GotoXY(20,8); Write('Номер записи -> '); Readln(N);
GotoXY(20,10); Write('Имя файла -> '); Readln(File_Name);
ASSIGN(St_F,File_Name);
ReSet(St_F);
SEEK(St_F,N-1);
Randomize;
Input_Record(St_Rec);
Write(St_F,St_Rec);
GotoXY(20,15);
WriteLn('Файл с именем ',File_Name,' откорректирован');
GotoXY(20,17);
WriteLn('Номер корректируемый записи = ',N);
Close(St_F);
Wait;
End;



Procedure Dopoln_File;
Var
Kb,I,J,N : Byte;
St_Rec : bolnoy;
St_F : Stud_File;
File_Name : String;
Begin
ClrScr;
GotoXY(25,5); Write('Процедура <Dopoln_File>');
GotoXY(20,8); Write('Количество дополняемых записей N= '); Readln(N);
GotoXY(20,10); Write('Имя файла -> '); Readln(File_Name);
ASSIGN(St_F,File_Name);
ReSet(St_F);
SEEK(St_F,FileSize(St_F));
Randomize;
For I:=1 To N Do
Begin
Input_Record(St_Rec);
Write(St_F,St_Rec);
End;
GotoXY(20,15);
WriteLn('файл с именем ',File_Name,' дополнен');
GotoXY(20,17);
WriteLn('Количество дополнительных компонент = ',N);
Close(St_F);
Wait;
End;

Procedure Init_File;
Var
Kb,I,J,N : Byte;
St_Rec : bolnoy;
St_F : Stud_File;
File_Name : String;
Begin
ClrScr;
GotoXY(25,5);
Write('Процедура
<Init_File>');
GotoXY(20,8);
Write('Количество компонент N= '); Readln(N);
GotoXY(20,10);
Write('Имя файла -> '); Readln(File_Name);
ASSIGN(St_F, File_Name);
ReWrite(St_F);
For I:=1 To N Do
Begin
Input_Record(St_Rec);
Write(St_F,St_Rec);
End;
GotoXY(20,15);
WriteLn('файл с именем ',File_Name,' создан');
GotoXY(20,17);
Writeln('Количество компонент = ',N);
Close(St_F);
Wait;
End;


Procedure Output_Monitor(N:Byte;St_Mas:Stud_Mas;Name:String);
Var
I:Byte;
St_Rec:bolnoy;
Begin
ClrScr;
GotoXY(20,2);
Write(Name);
WriteLn; WriteLn;
For I:=1 To N Do
Begin
With St_Mas[I] Do
WriteLn(I:5,FIO:15,nom_palaty:5,osn_d:12,vrach:17,date: 15,naz:10);
End;
Wait;
End;

Procedure Output_File;
Var
I,N:Byte;
St_Rec:bolnoy;
St_F:Stud_File;
St_Mas:Stud_Mas;
File_Name,Name:String;
Begin
ClrScr;
GotoXY(25,5); Write('Процедура <Output_File>');
{ReadLn;}
GotoXY(20,10); Write('Имя файла -> ');
{ReadLn;}
ReadLn(File_Name);
{ReadLn;}

Assign(St_F,File_Name);
ReSet(St_F);
I:=0;
While Not EOF(St_F) Do
Begin
INC(I);
Read(St_F,St_Rec);
St_Mas[I]:=St_rec;
End;
N:=I;
Wait;
Name:='Содержимое файла '+File_Name;
Output_Monitor(N,St_Mas,Name);
Close(St_F);
End;

Procedure Delete_Record;
Var
St_F:Stud_File;
File_Name:String;
I,K,L,M,N,Num:Byte;
St_Rec,Buf:bolnoy;
St_Mas,St_Mas1:Stud_Mas;
Sravn:Boolean;
Nomer:Byte;
Name:String;
Begin
ClrScr;
GotoXY(25,5);
Write('Процедура <Delete_Record>');
GotoXY(20,8);
Write('Номер записи которую хотите удалить= '); Readln(Num);
GotoXY(20,10);
Write('Имя файла -> '); Readln(File_Name);
ASSIGN(St_F, File_Name);
ReSet(St_F);
I:=0;
While Not EOF(St_F) Do
Begin
INC(I);
Read(St_F,St_Rec);
St_Mas[I]:=St_rec;
End;
N:=I;
close(St_f);
Rewrite(st_f);
for i:=Num to N do
St_Mas[i]:=St_Mas[i+1];
for i:=1 to N-1 do
begin
St_rec:=st_mas[i];
Input_record(st_rec);
Write(St_F,St_rec);
end;
GotoXY(20,15);
WriteLn('Запись с номером ',Num,' удалена');
Close(St_F);
Wait;
End;


Procedure Change_ward;
Var
St_F:Stud_File;
File_Name:String;
I,K,L,M,N:Byte;
St_Rec,Buf:bolnoy;
St_Mas:Stud_Mas;
Sravn:Boolean;
Nomer:Byte;
Name:String;
Begin
ClrScr;
GotoXY(25,5); Write('Процедура <Change_ward>');
GotoXY(20,8); Write('Номер больного -> '); Readln(N);
GotoXY(20,10); Write('Имя файла -> '); Readln(File_Name);
ASSIGN(St_F,File_Name);
ReSet(St_F);
SEEK(St_F,N-1);
St_rec.nom_palaty:=random(10)+1;
Write(St_F,St_Rec);
GotoXY(20,15);
WriteLn('Номер палаты больного с номером ', N,' изменен');
Close(St_F);
Wait;
End;

Procedure Change_doctor;
Var
St_F:Stud_File;
File_Name:String;
I,K,L,M,N:Byte;
St_Rec,Buf:bolnoy;
St_Mas:Stud_Mas;
Sravn:Boolean;
Nomer:Byte;
Name:String;
Begin
ClrScr;
GotoXY(25,5); Write('Процедура <Change_ward>');
GotoXY(20,8); Write('Номер больного -> '); Readln(N);
GotoXY(20,10); Write('Имя файла -> '); Readln(File_Name);
ASSIGN(St_F,File_Name);
ReSet(St_F);
SEEK(St_F,N-1);
Randomize;
St_rec.vrach:=F_I_O_doctor;
Write(St_F,St_Rec);
GotoXY(20,15);
WriteLn('Номер палаты больного с номером ', N,' изменен');
Close(St_F);
Wait;
End;

Procedure Menu_Obrabotka;
Var
Rez:Char;
Begin
While True Do
Begin
ClrScr;
GotoXY(25,8); Write('М Е Н Ю обработка');
GotoXY(20,10); Write('1. Вывод содержимого файла');
GotoXY(20,12); Write('2. Удаление сведений о заданном больном');
GotoXY(20,14); Write('3. Изменение номера палаты для заданного больного');
GotoXY(20,16); Write('4. Изменение лечащего врача для заданного больного');
GotoXY(20,18); Write('Выход');
GotoXY(23,20); Write(' Р Е Ж И М -> ');
Rez:=ReadKey;
Case Rez Of
'1' : Output_File;
'2' : Delete_Record;
'3' : Change_ward;
'4' : Change_doctor;
'5' : Exit;
End;
End;
End;
Procedure Menu;
Var
Rez:Char;
Begin
While True Do
Begin
ClrScr;
GotoXY(30,8); Write('М Е Н Ю');
GotoXY(20,10); Write('1. Инициализация файла записей');
GotoXY(20,12); Write('2. Дополнение файла');
GotoXY(20,14); Write('3. Корректировка файла');
GotoXY(20,16); Write('4. МЕНЮ обработка');
GotoXY(20,18); Write('5. Выход');
GotoXY(23,20); Write(' Р Е Ж И М -> ');
Rez:=ReadKey;
Case Rez Of
'1' : Init_File;
'2' : Dopoln_File;
'3' : Korrekt_File;
'4' : Menu_Obrabotka;
'5' : Exit;
End;
End;
End;
Begin
Menu;
End.

Ответы (1 шт):

Автор решения: MBo

Насколько можно понять из этого неформатированного текста, Вы нигде не читаете из файла в st_rec, так что в этой локальной переменной просто лежит мусор.

Когда вы добавите чтение, для записи в то же место нужно будет снова сделать seek

→ Ссылка