IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Удаление строки из текстового файла в БД
hemm
сообщение 16.12.2011 22:53
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Олег

Репутация: -  0  +


База данных. Не могу наладить удаление конкретной записи.
Удаляются данные из массива, но остаются символы, разделяющие колонки.
Получается такая картина:
Изображение
*Создал две записи. Затем удалил запись №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.



Сообщение отредактировано: hemm - 16.12.2011 22:55
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.07.2025 22:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"