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
Итак, от изначальных 715 строк исходного файла в результате нехитрых действий осталось чуть больше 420:
Много кода, поэтому под спойлером(Показать/Скрыть)
Program Students; Uses crt, dos; type DataBase= record SecondName: string; FirstName: string; FatherName: string; Group: string; Course: string; end;
const maxRecords = 50; dbFilename = 'db.txt';
var massive : array[1 .. maxRecords] of DataBase; n : integer;
{Считывание базы данных} procedure ReadAll; var f : text; begin n := 0; Assign(f, dbFilename); {$I-} Reset(f); {$I+}
if IOResult <> 0 then Writeln('Ошибка: невозможно открыть исходный файл. Повторите ввод.') else begin 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; end;
{Сохранение отредактированной базы данных в файл} procedure SaveAll; var i : integer; f : text; Begin Assign(f, dbFilename); 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 Add; begin Clrscr; inc(n); Writeln('Добавление новой записи о студенте:'); Writeln; InputRec(Massive[n]); SaveAll; Writeln; Write('Запись успешно добавлена в базу данных'); Delay(1000); end;
{Вывод записей базы данных на экран} procedure WriteAll; var i : integer; begin ClrScr; MainTitle; For i := 1 To n do PrintRec(Massive[i]); Line; Writeln; Write(' |Enter|.. Переход в меню'); Readln; end;
{Вывод записей базы данных с сортировкой на экран} procedure Sort;
function Exchange(Var A, B : Database) : boolean; var T : Database; begin T := A; A := B; B := T; Exchange := true; end;
var i, nn : integer; Xchanged : boolean; begin ClrScr;
nn := n; repeat Xchanged := false; for i := 1 to nn - 1 do begin if Massive[i].SecondName > Massive[i+1].SecondName then Xchanged := Exchange(Massive[i], Massive[i+1]); end; nn := nn-1; until not Xchanged; MainTitle; WriteAll; Line; End;
{Поиск по фамилии} procedure SearchSecondName; var SN : string; i : integer; Found : boolean; x : char; begin Clrscr; SearchTitle; Write('Введите фамилию студента: '); Readln(SN); Writeln; Found := false; MainTitle;
for i := 1 to n do if Massive[i].SecondName = SN then Found := PrintRec(Massive[i]);
Line; if not Found then Writeln('Записей с такой фамилией не обнаружено либо имя указано неверно'); Writeln; Line; Writeln(' |1|...... Повторный поиск'); Writeln(' |0|...... Выход из программы'); Writeln(' |Enter|.. Переход в меню'); Line; Write('Ваш выбор| '); Readln(x); case x of '1' : SearchSecondName; '0' : Halt; end; end;
{Поиск по группе} procedure SearchGroup; var SG : string; i : integer; Found : boolean; x : char; begin ClrScr; SearchTitle; Write('Введите номер группы: '); Readln(SG); Writeln; Found := false; MainTitle;
for i := 1 to n do if Massive[i].Group = SG then Found := PrintRec(Massive[i]);
Line; if not Found then Writeln('Записей с таким номером группы не обнаружено.'); Writeln; Line; Writeln(' |1|...... Повторный поиск'); Writeln(' |0|...... Выход из программы'); Writeln(' |Enter|.. Переход в меню'); Line; Write('Ваш выбор| '); Readln(x); case x of '1' : SearchGroup; '0' : Halt; end; end;
{Редактирование} procedure Edit; var i : integer; begin Clrscr; Writeln('Редактирование записей базы данных:'); Writeln; MainTitleEdit; for i := 1 to n do begin Write(i:2, '.'); PrintRec(Massive[i]); end;
Writeln; Write('Введите номер редактируемой записи (укажите [0] для отмены): '); Readln(i); if i = 0 then begin Writeln('Отмена редактирования'); Delay(500); end else begin clrscr; Writeln('Изменяем:'); MainTitleEdit; Write(i:2, '.'); PrintRec(Massive[i]); Writeln; Writeln('Введите новые данные:'); InputRec(Massive[i]);
SaveAll; ReadAll; Writeln; Write('Запись успешно отредактирована.'); Delay(1000); end; end;
{Удаление всех записей} procedure DeleteAll; var f : text; k : char; begin Writeln; Line; Writeln; Writeln('Вы действительно хотите удалить все данные? [указать "Y" для удаления]'); Write('Ваш выбор| '); Readln(k); If k in ['Y', 'y'] then begin Assign(f, dbFilename); ReWrite(f); Write(''); // o_O close(f); Writeln; Write(' Все данные успешно удалены'); Delay(1000); end else begin Writeln(' Указан неверный символ'); Delay(500); Writeln(' Переход в меню'); Delay(500); end; end;
{Удаление записи} procedure Deleting; var i : integer; begin Writeln('Удалить запись с номером: '); Readln(i); if i <= n then begin Move(Massive[i+1], Massive[i], Sizeof(Database) * (n - i)); dec(n); SaveAll; Writeln; Write('Запись успешно удалена.'); end else write('Ошибка: неверный номер записи...'); Delay(1000); end;
procedure Password; var i, s : integer; Attempts : Integer; begin Attempts := 5; for i := 1 to Attempts do begin clrscr; Writeln('Количество попыток ввода правильного пароля: ', n); Write( 'Введите пароль: ' ); Readln(S); if S = 1234 then break else if i <> Attempts then continue;
{Меню} procedure Menu; var option: char; begin ReadAll;
repeat clrscr; 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; end; until option = '0'; end;
begin Password; Menu; end.
Можно еще покумекать над объединением двух процедур поиска в одну (я где-то на форуме выкладывал пример, если не ошибаюсь, надо будет поискать). Также стоит подумать над вынесением часто повторяющихся
Write('bla-bla-bla'); Delay(...);
в отдельную процедуру. В общем, заготовка у тебя есть, допиливай