1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
База данных. Не могу наладить удаление конкретной записи. Удаляются данные из массива, но остаются символы, разделяющие колонки. Получается такая картина: *Создал две записи. Затем удалил запись №1, но пустые колонки все равно остались.
Буду благодарен за любые советы по улучшению и упрощению кода. *процедуру проверки на существования текстового файла пока не делал, поэтому для запуска программы в том же каталоге надо создать файл DB.TXT Проверял на FREEPASCAL.
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 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+' ';
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+' ';
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+' ';
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+' ';
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+' ';
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);
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