Удаляются данные из массива, но остаются символы, разделяющие колонки.
Получается такая картина:
*Создал две записи. Затем удалил запись №1, но пустые колонки все равно остались.
Буду благодарен за любые советы по улучшению и упрощению кода.
*процедуру проверки на существования текстового файла пока не делал, поэтому для запуска программы в том же каталоге надо создать файл DB.TXT
Проверял на FREEPASCAL.
Program Students;
Uses crt, dos;
Type DataBase=record
SecondName: string;
FirstName: string;
FatherName: string;
Group: string;
Course: string;
End;
Var Massive:array[1..50] of DataBase;
n:integer;
Procedure menu;
Forward;
{Считывание базы данных}
Procedure ReadAll;
Var f: text;
Begin
n:=0;
Assign(f,'db.txt');
{$I-}
Reset(f);
{$I+}
If IOresult<>0 then
Writeln('Ошибка: невозможно открыть исходный файл. Повторите ввод.');
While not EOF(f) do
Begin
inc(n);
Readln(f,Massive[n].SecondName);
Readln(f,Massive[n].FirstName);
Readln(f,Massive[n].FatherName);
Readln(f,Massive[n].Group);
Readln(f,Massive[n].Course);
Readln(f);
End;
close(f);
End;
{Сохранение отредактированной базы данных в файл}
Procedure SaveAll;
Var i:integer; f:text;
Begin
Assign(f,'db.txt');
ReWrite(f);
For i:=1 To n do
Begin
Writeln(f,Massive[i].SecondName);
Writeln(f,Massive[i].FirstName);
Writeln(f,Massive[i].FatherName);
Writeln(f,Massive[i].Group);
Writeln(f,Massive[i].Course);
Writeln(f);
End;
close(f);
End;
{Линия}
Procedure Line;
Var k:integer;
Begin
For k:=1 To 79 do
Begin
Write('-');
End;
Writeln;
End;
{Оглавление}
Procedure MainTitle;
Var k,m,n:integer;
Begin
Line;
Write('Фамилия |'); Write(' Имя |'); Write(' Отчество |'); Write(' Группа |');Write(' Курс');
Writeln;
Line;
End;
{Оглавление редактирования}
Procedure MainTitleEdit;
Var k,m,n:integer;
Begin
Line;
Write('№ | Фамилия |'); Write(' Имя |'); Write(' Отчество |'); Write('Группа |');
Writeln;
Line;
End;
{Оглавление процедуры поиска}
Procedure SearchTitle;
Begin
Line;
Writeln('Поиск...');
Line;
Writeln;
End;
{Добавление записи}
Procedure Add;
Var i:integer;
Begin
Clrscr;
inc(n);
Writeln('Добавление новой записи о студенте:');
Writeln;
Write('Фамилия........: '); Readln(Massive[n].SecondName);
Write('Имя............: '); Readln(Massive[n].FirstName);
Write('Отчество.......: '); Readln(Massive[n].FatherName);
Write('Номер группы...: '); Readln(Massive[n].Group);
Write('Курс...........: '); Readln(Massive[n].Course);
SaveAll;
Writeln;
Write('Запись успешно добавлена в базу данных');
Delay(1000);
Menu;
End;
{Вывод записей базы данных на экран}
Procedure WriteAll;
Var i,j:integer; s1,s2,s3,s4:string;
Begin
clrscr;
MainTitle;
For i:=1 To n do
{-------- ВОТ ЗДЕСЬ ПОДСКАЖИТЕ КАК УПРОСТИТЬ}
Begin
s1:='';
s2:='';
s3:='';
s4:='';
For j:=1 To 18-length(Massive[i].SecondName) do s1:=s1+' ';
For j:=1 To 8-length(Massive[i].FirstName) do s2:=s2+' ';
For j:=1 To 18-length(Massive[i].FatherName) do s3:=s3+' ';
For j:=1 To 18-length(Massive[i].Group) do s4:=s4+' ';
Writeln(Massive[i].SecondName,s1,' | ',Massive[i].FirstName,s2,' | ',Massive[i].FatherName,s3,' | ',Massive[i].Group, s4, ' | ', Massive[i].Course);
End;
Line;
Writeln;
Write(' |Enter|.. Переход в меню');
Readln;
Menu;
End;
{Вывод записей базы данных с сортировкой на экран}
Procedure Sort;
Procedure Exchange(Var a,b:string);
Var c:string;
Begin
c:=a;
a:=b;
b:=c;
End;
Var i,Letter,nn:integer;
Swop:boolean;
SecondName1,SecondName2:string;
Begin
Clrscr;
For Letter:=5 DownTo 1 do
Begin
nn:=n;
Repeat
swop:=false;
For i:=1 To nn-1 do Begin
SecondName1:=Massive[i].SecondName;
SecondName2:=Massive[i+1].SecondName;
If Ord(SecondName1[Letter])>Ord(SecondName2[Letter]) then
Begin
Exchange(Massive[i].SecondName, Massive[i+1].SecondName);
Exchange(Massive[i].FirstName, Massive[i+1].FirstName);
Exchange(Massive[i].FatherName, Massive[i+1].FatherName);
Exchange(Massive[i].Group, Massive[i+1].Group);
Exchange(Massive[i].Course, Massive[i+1].Course);
swop:=true;
End;
End;
nn:=nn-1;
Until not swop;
End;
MainTitle;
WriteAll;
Line;
Readln;
Menu;
End;
{Поиск по фамилии}
Procedure SearchSecondName;
Var SN: string;
i,j: integer;
s1,s2,s3: string;
Swop: boolean;
x: char;
Begin
Clrscr;
SearchTitle;
Write('Введите фамилию студента: ');
Readln(SN);
Writeln;
Swop:=false;
MainTitle;
For i:=1 To n do
If Massive[i].SecondName=SN then
Begin
{-------- ВОТ ЗДЕСЬ ПОДСКАЖИТЕ КАК УПРОСТИТЬ}
s1:='';
s2:='';
s3:='';
For j:=1 To 18-length(Massive[i].SecondName) do s1:=s1+' ';
For j:=1 To 8-length(Massive[i].FirstName) do s2:=s2+' ';
For j:=1 To 18-length(Massive[i].FatherName) do s3:=s3+' ';
Writeln(Massive[i].SecondName,s1,' | ',Massive[i].FirstName,s2,' | ',Massive[i].FatherName,s3,' | ',Massive[i].Group,' | ',Massive[i].Course);
Swop:=true;
End;
Line;
If not Swop then Writeln('Записей с такой фамилией не обнаружено либо имя указано неверно');
Writeln;
Line;
Writeln(' |1|...... Повторный поиск');
Writeln(' |0|...... Выход из программы');
Writeln(' |Enter|.. Переход в меню');
Line;
Write('Ваш выбор| ');
Readln(x);
Case x of
'1':SearchSecondName;
'0':halt;
Else Menu;
End;
End;
{Поиск по группе}
Procedure SearchGroup;
Var
SG:string;
i,j:integer;
s1,s2,s3:string;
Swop:boolean;
x:char;
Begin
clrscr;
SearchTitle;
Write('Введите номер группы: ');
Readln(SG);
Writeln;
Swop:=false;
MainTitle;
For i:=1 To n do
If Massive[i].Group=SG then
Begin
s1:='';
s2:='';
s3:='';
For j:=1 To 18-length(Massive[i].SecondName) do s1:=s1+' ';
For j:=1 To 8-length(Massive[i].FirstName) do s2:=s2+' ';
For j:=1 To 18-length(Massive[i].FatherName) do s3:=s3+' ';
Writeln(Massive[i].SecondName,s1,' | ',Massive[i].FirstName,s2,' | ',Massive[i].FatherName,s3,' | ',Massive[i].Group,' | ',Massive[i].Course);
Swop:=true;
End;
Line;
If not Swop then Writeln('Записей с таким номером группы не обнаружено.');
Writeln;
Line;
Writeln(' |1|...... Повторный поиск');
Writeln(' |0|...... Выход из программы');
Writeln(' |Enter|.. Переход в меню');
Line;
Write('Ваш выбор| ');
Readln(x);
Case x of
'1':SearchGroup;
'0':halt;
Else
Menu;
End;
End;
{Редактирование}
Procedure Edit;
Var
i,j:integer;
s1,s2,s3:string;
Swop:boolean;
Begin
Clrscr;
Writeln('Редактирование записей базы данных:');
Writeln;
MainTitleEdit;
For i:=1 To n do
Begin
s1:='';
s2:='';
s3:='';
For j:=1 To 18-length(Massive[i].SecondName) do s1:=s1+' ';
For j:=1 To 8-length(Massive[i].FirstName) do s2:=s2+' ';
For j:=1 To 18-length(Massive[i].FatherName) do s3:=s3+' ';
Writeln(i,'. ',Massive[i].SecondName,s1,' | ',Massive[i].FirstName,s2,' | ',Massive[i].FatherName,s3,' | ',Massive[i].Group,' | ',Massive[i].Course);
End;
Writeln;
Write('Введите номер редактируемой записи (укажите [0] для отмены): ');
Readln(i);
If i=0 then
Begin
Writeln('Отмена редактирования');
Delay(500);
Menu;
End;
s1:='';
s2:='';
s3:='';
clrscr;
Writeln('Изменяем:');
For j:=1 To 18-length(Massive[i].SecondName) do s1:=s1+' ';
For j:=1 To 8-length(Massive[i].FirstName) do s2:=s2+' ';
For j:=1 To 18-length(Massive[i].FatherName) do s3:=s3+' ';
MainTitleEdit;
Writeln(i,'. ',Massive[i].SecondName,s1,' | ',Massive[i].FirstName,s2,' | ',Massive[i].FatherName,s3,' | ',Massive[i].Group);
Writeln;
Writeln('Введите новые данные:');
Write('Фамилия........: '); Readln(Massive[i].SecondName);
Write('Имя............: '); Readln(Massive[i].FirstName);
Write('Отчество.......: '); Readln(Massive[i].FatherName);
Write('Номер группы...: '); Readln(Massive[i].Group);
Write('Курс...........: '); Readln(Massive[i].Course);
SaveAll;
ReadAll;
Writeln;
Write('Запись успешно отредактирована.');
Delay(1000);
Menu;
End;
{Удаление всех записей}
Procedure DeleteAll;
Var f:text; k:char;
Begin
Writeln;
Line;
Writeln;
Writeln('Вы действительно хотите удалить все данные? [указать "Y" для удаления]');
Write('Ваш выбор| ');
Readln(k);
If (k='Y') or (k='y') then
Begin
Assign(f,'db.txt');
ReWrite(f);
Write('');
close(f);
Writeln;
Write(' Все данные успешно удалены');
Delay(1000);
Menu;
End;
Writeln(' Указан неверный символ');
Delay(500);
Writeln(' Переход в меню');
Delay(500);
Menu;
End;
{---------------------------------------}
{ ---------------------------- НЕКОРРЕКТНО УДАЛЯЕТ ЗАПИСЬ. УДАЛЯЕТ ДАННЫЕ ИЗ МАССИВА, НО В СТРОКЕ ОСТАЮТСЯ СИМВОЛЫ "|" КОТОРЫЕ РАЗДЕЛЯЮТ КОЛОНКИ }
{Удаление записи}
Procedure Deleting;
Var i,j:integer;
begin
Writeln('Удалить запись с номером: ');
readln(i);
Delete(Massive[i].SecondName,1,50);
Delete(Massive[i].FirstName,1,50);
Delete(Massive[i].FatherName,1,50);
Delete(Massive[i].Group,1,50);
Delete(Massive[i].Course,1,50);
SaveAll;
ReadAll;
Writeln;
Write('Запись успешно удалена.');
Delay(1000);
Menu;
End;
Procedure Password;
Var i,s:integer;
Begin
n:=5;
For i:= 1 To n do Begin
clrscr;
Writeln('Количество попыток ввода правильного пароля: ', n);
Write( 'Введите пароль: ' );
Readln(S);
n:=n-1;
If S = 1234 then Break
Else If i <> 5 then continue;
clrscr;
goToxy(1,1);
Writeln('Количество попыток ввода правильного пароля: 0');
Delay(1000);
Writeln( 'Доступ запрещен!');
Delay(2000);
Writeln( 'Завершение работы программы...');
Delay(1000);
Halt;
End;
End;
{Меню}
Procedure Menu;
Var option:char;
Begin
clrscr;
ReadAll;
Writeln('База данных "Студенты"');
Line;
Writeln(' Меню');
Line;
Writeln(' |1| Добавление новой записи');
Writeln(' |2| Просмотр записей');
Writeln(' |3| Просмотр записей с сортировкой');
Writeln(' |4| Редактирование записи');
Writeln(' |5| Удаление записи');
Writeln(' |6| Очистить базу данных');
Line;
Writeln(' Поиск');
Line;
Writeln(' |7| Поиск по фамилии');
Writeln(' |8| Поиск по группе');
Line;
Writeln(' |0| Выход из программы');
Line;
Write('Ваш выбор| ');
Readln(option);
Case option of
'1':Add;
'2':WriteAll;
'3':Sort;
'4':Edit;
'5':Deleting;
'6':DeleteAll;
'7':SearchSecondName;
'8':SearchGroup;
'0':halt;
Else Menu;
End;
End;
Begin
{Password;}
Menu;
End.