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

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

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

> База данных с помощью записей, подскажите, рационально ли
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Олег

Репутация: -  0  +


Суть такова: написал базу данных, но не могу никак сообразить, возможно ли редактировать в такой БД запись отдельно. Как мне выделить/вычленить любую по желанию запись и, например, удалить только ее или отредактировать? Или лучше использовать для такой БД двумерные массивы?


*Тупанул при написании. Для запуска файла надо в том же каталоге создать файл "database" и указать его имя при запросе в программе.




program students;

uses crt,dos;

label ChangeFile;

type spisok = record
nomer: string[6]; // Порядковый номер
zach: string[7]; // Номер зачетной книжки
fam: string[20]; // Фамилия
imya: string[20]; // Имя
otch: string[20]; //Отчество
gruppa: string[8]; //Номер группы
end;

StudentDataBase = file of spisok;

var a: StudentDataBase;
i, z: integer;
s: real;
c:char;
q:boolean;
DataBase: string;
k:byte;

p:string;
ss:string;

{-------------------------------------------------> INPUT}
procedure new(var a: StudentDataBase);
var j: integer; zk: spisok;
begin
reset(a);
seek(a, filesize(a));
repeat
begin

with zk do begin

writeln;

write('#................: ');
readln(nomer);

write('Зачетная книжка..: ');
readln(zach);

write('Фамилия..........: ');
readln(fam);

write('Имя..............: ');
readln(imya);

write('Отчество.........: ');
Readln(otch);

write('Группа...........: ');
readln(gruppa);

writeln;

write(a, zk);

writeln;
writeln('Продолжить запись? Да: 1 Нет: 0');

readln(j);
end;
end;
until j =0;

close(a);
end;
{-----------------------------------------------> // INPUT}






{-------------------------------------------------> OUTPUT}
procedure output(var a: StudentDataBase);
var i: integer; zk: spisok;
begin
with zk do begin
clrscr;
reset(a);
writeln;
writeln(' База данных "Студенты" ');
writeln;
writeln(& #39;============================================================================
===');
writeln(' № | з/книжка | Фамилия | Имя | Отчество | Группа ');
writeln(& #39;============================================================================
===');

while not eof(a) do

begin
read(a, zk);
write(nomer:6);
write('|', zach: 10);
write('|', fam: 17);
write('|', imya: 13);
write('|', otch: 18);
write('|', gruppa: 8);
writeln;
writeln('-------------------------------------------------------------------------------');

end;
writeln;
writeln(' Нажмите клавишу Enter для перехода в меню...');
close(a);
end;

readln;
end;
{-----------------------------------------------> // OUTPUT}




{------------------------------------------> FIND}

procedure find(var a: StudentDataBase);
var i: integer;
zk: spisok;
student: string;
begin
clrscr;
reset(a);
write('Введите данные для поиска: ');
readln(student);
writeln;
writeln(' База данных "Студенты" ');
writeln;
writeln(& #39;============================================================================
===');
writeln(' № | з/книжка | Фамилия | Имя | Отчество | Группа ');
writeln(& #39;============================================================================
===');


while not eof(a) do
begin
with zk do begin
read(a, zk);
if (zach = student) or (fam=student) or (imya=student) or (otch=student) or (gruppa=student) then
begin
write(nomer:6);
write('|', zach: 10);
write('|', fam: 17);
write('|', imya: 13);
write('|', otch: 18);
write('|', gruppa: 8);
writeln;
writeln('-------------------------------------------------------------------------------');
end;
end;
end;
close(a);
writeln;
writeln(' Нажмите клавишу Enter для перехода в меню...');
readln;
end;

{------------------------------------------> // FIND}






begin
changefile:


{------------------------------------------> LOADING}

clrscr;
write('Укажите имя загружаемой базы: ');
readln(DataBase);
repeat
clrscr;
assign(a, DataBase);
{------------------------------------------> // LOADING} // временно отключил






{-------> MENU}

write('Disk Size: ', DiskSize(0) div 1024 div 1024, ' Мбайт');
writeln;
write('Current File: ', DataBase);
writeln;
writeln('Menu: ');
writeln;
writeln('1: New Record(-s)');
writeln('2: Output Record(-s)');
writeln('3: Find Record(-s)');
writeln('4: Change File | отключил');
writeln('5: Exit');
writeln('6: Delete File');
writeln('7: Add Record(-s) | не работает');
writeln('8: Delete Record(-s) | не работает');
writeln('9: Current Record: | не работает');
readln(z);

case z of
1: new(a);
2: output(a);
3: find(a);
4: goto changefile;
5: q:=true;
6: begin
erase(a);
writeln;
write('File ', Database, ' was deleted');
readln;
end;
end;
until q;
end.



Сообщение отредактировано: hemm -


Прикрепленные файлы
Прикрепленный файл  bd.pas ( 4.8 килобайт ) Кол-во скачиваний: 296
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(hemm @ 24.06.2011 1:34) *
Суть такова: написал базу данных, но не могу никак сообразить, возможно ли редактировать в такой БД запись отдельно. Как мне выделить/вычленить любую по желанию запись и, например, удалить только ее или отредактировать? Или лучше использовать для такой БД двумерные массивы?

Односложный ответ на твой вопрос такой: да, конечно - впрограммировании можно ВСЕ. Но односложным тут не обойтись, боюсь )).

Редактировать запись очень просто. Открываешь reset'ом, подходишь к началу нужной записи, читаешь, редактируешь, возвращаешься на одну запись в файле и пишешь ее - все, только не забыть закрыть.

Удалять несколько сложнее, если сохранять порядок следования записей в файле. Нужно

найти запись, встать за ней, 
repeat
прочитать, вернуться на две записи, записать, пропустить одну запись
until eof(f)


Но только это делать необязательно. Хранить записи можно в произвольном порядке (ее номер все равно сохраняется в поле nomer). Если тебе надо стереть запись - просто перемещаешь последнюю на ее место и файл обрезаешь на одну запись. Номера записей при этом будут непоследовательными. Например, из ряда 1 2 3 4 5 стираешь запись 3, остаются записи 1 2 4 5, которые реально в файле следуют в таком порядке: 1 2 5 4. Когда ты добавишь еще одну запись, будет 1 2 5 4 6. А поиск записи с нужным номером можно проводить либо последовательно, либо создать карту записей. Ее можно сделать либо отдельным файлом (что не очень надежно), либо отвести под нее пространство в начале файла.

Но, помимо этого, я бы советовал тебе продумать структуру программы. Такие безобразия, как метки - это колесо машины, починенное скотчем.. smile.gif
Остальные замечания высказывать?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 





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