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
Ну, и, наконец - самая большая ошибка: вызов Menu в конце работы процедуры, из этого же Menu вызванной. Не надо этого делать!!!
Если убираю допустим после Добавления новой записи (Procedure Add) процедуру Menu, по завершению ввода данных программа завершает свою работу, а не переходит обратно в меню.
И вот если я буду из меню открывать процедуру, а затем опять же возвращаться в меню, в конечном итоге это забьет стек?