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

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

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

> Удаление строки из текстового файла в БД
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 12.04.2025 4:29
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name