среда, 6 февраля 2013 г.

ввод данных в массив записей из текстового

Procedure Deleting;Var i, j:integer;begin Writeln('Удалить запись с номером: '); readln(i); if i <= n then begin Move(Massive[i+1], Massive[i], Sizeof(Database) * (n - i)); dec(n); SaveAll; // ReadAll; Writeln; Write('Запись успешно у

Удалять надо не строки из содержимого ячейки массива, а собственно саму ячейку (сдвигать все содержимое массива на одну позицию влево, начиная от i-той) :

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;Beginn:=0;Assign(f,'db.txt');{$I-}Reset(f);{$I+}If IOresult<>0 thenWriteln('Ошибка: невозможно открыть исходный файл. Повторите ввод.');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;BeginAssign(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;BeginFor k:=1 To 79 doBegin Write('-');End;Writeln;End;{Оглавление}Procedure MainTitle;Var k,m,n:integer;BeginLine;Write('Фамилия |'); Write(' Имя |'); Write(' Отчество |'); Write(' Группа |');Write(' Курс');Writeln;Line;End;{Оглавление редактирования}Procedure MainTitleEdit;Var k,m,n:integer;BeginLine;Write(' | Фамилия |'); Write(' Имя |'); Write(' Отчество |'); Write('Группа |');Writeln;Line;End;{Оглавление процедуры поиска}Procedure SearchTitle;BeginLine; Writeln('Поиск...');Line;Writeln;End;{Добавление записи}Procedure Add;Var i:integer;BeginClrscr; 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;Beginclrscr;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;BeginClrscr;For Letter:=5 DownTo 1 doBegin 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;BeginClrscr;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;Beginclrscr;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;ElseMenu;End;End;{Редактирование}Procedure Edit;Var i,j:integer; s1,s2,s3:string; Swop:boolean;BeginClrscr;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;BeginWriteln;Line;Writeln;Writeln('Вы действительно хотите удалить все данные? [указать "Y" для удаления]'); Write('Ваш выбор| ');Readln(k);If (k='Y') or (k='y') thenBeginAssign(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;beginWriteln('Удалить запись с номером: ');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;Beginn:=5;For i:= 1 To n do Beginclrscr; 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;Beginclrscr;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.

База данных. Не могу наладить удаление конкретной записи. Удаляются данные из массива, но остаются символы, разделяющие колонки. Получается такая картина:*Создал две записи. Затем удалил запись 1, но пустые колонки все равно остались.Буду благодарен за любые советы по улучшению и упрощению кода.*процедуру проверки на существования текстового файла пока не делал, поэтому для запуска программы в том же каталоге надо создать файл DB.TXTПроверял на FREEPASCAL.

Форум «Всё о Паскале» > Удаление строки из текстового файла в БД

Комментариев нет:

Отправить комментарий