Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 17:52   #1
Paster
Новичок
Джуниор
 
Регистрация: 07.06.2009
Сообщений: 5
По умолчанию

Вечер добрый!
Хочу обратиться к вам с такой проблемой:
1)Не могу разобраться с удалением какой-либо записи из файла.
2)Сортировка записей в файле данных по определенному ключу.

Я только начинаю изучать паскаль и некоторые моменты мне пока не понятны!
Понимание, конечно,приходит,но с опозданием.А иногда эта задержка черевата последствиями(для студентов конечно...).

Если есть возможность помогите !!!

P.S.:Прилагаю файл-исходник Books_of_... (.Pas фаил переименнованный в .txt для того что-бы вы могли посмотреть исходник)

и файл Книги.txt (Содержиться информация о книгах в библиотеке)созданный через эту же программу!!!

С удалением вроде бы разобрался!!!только что то не выводяться сообщения о удалении файлов(( ну с этим потом!
вот с сортировкой проблема так и осталась:как отсортировать типизированный файл (одержащий информацию о книгах в библиотеке)

Помогите Плз!!!
Вложения
Тип файла: txt BOOK_OF_.txt (5.2 Кб, 151 просмотров)
Тип файла: txt КНИГИ.TXT (272 байт, 141 просмотров)
Тип файла: txt BOOOKSUS.txt (6.1 Кб, 145 просмотров)

Последний раз редактировалось Stilet; 09.06.2009 в 11:49.
Paster вне форума Ответить с цитированием
Старый 08.06.2009, 22:42   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если по условиям задачи Ваш типизированный файл помещается в память (например, в массив записей), то задача сводится к элементарной:
считываем полностью файл в array[1..МаксимальноВозможноеКоличествоЗа писей] of TMyRecord;
сортируем этот массив.
записываем отсортированный массив в файл, либо в новый, либо в старый (в этом случае лучше исходный файл при этом переименовывать в имя.BAK)
всё.

если же файл по каким-либо причинам нельзя считывать в память - то тогда это намного сложнее... погуглите по словам "внешняя сортировка"
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2009, 00:05   #3
Paster
Новичок
Джуниор
 
Регистрация: 07.06.2009
Сообщений: 5
По умолчанию

Чего-то я немножко недопонял из выше сказанного!!

А файл(Мною созданный)Содержит информацию о книгах и включает в себя:
1) Удк;
2)Фамилию и инициалы автора;
3)Название книги;
4)Год издания;
5)Количество экземпляров в библиотеке
Эти пять позиций для каждой книги!!!
и надо отсортировать их по году издания!

вот начальный текст программы,где указываються типы переменных в записи!!
Код:
Program Sozd_Files;

 uses
     crt;
 type
    Books=record
     Udk:integer;
     Fio:string[30];
     Nazv:string[30];
     God_Izd:word;
     Kol_Ekz:word;
    end;
 var
  BookFile:file of Books;
  Work:Books;
  Vid:byte;
  End_Menu:boolean;
  Name:string[15];
просто везде пишут по разному:где-то надо метки какието ставить,гдето динамические файлы реализовывать....

Мозг просто в шоке,от обилия инфы и не успевает переработать все это!Прошу вас (если это возможно)объяснить как мне справиться с сортировкой по данному файлу!

за ранее благодарен!!!

Последний раз редактировалось Stilet; 09.06.2009 в 11:49.
Paster вне форума Ответить с цитированием
Старый 09.06.2009, 10:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. спрошу по простому - СКОЛЬКО МАКСИМАЛЬНО КНИЖЕК МОЖЕТ БЫТЬ В ВАШЕМ ФАЙЛЕ (BookFile:file of Books; ) ??
Т.е. можно ли считать, что у Вас не может быть больше, чем, скажем 900 книг (к сожалению, для DOS TurboPascal есть ограничение на сегмент данных, и для Вашей структуры записи более 950 записей в памяти не поместятся).

Если ограничение устраивает. тогда всё просто:
Код:
var BookArr : array[1..900] of Books;
  while Not Eof(BookFile) do begin
     inc(BookCount);
     Read(BookFile, BookArr[BookCount]);
  end;
Дальше сортируйте BookArr (любым способом, хоть тем же "пузырьком") - и записывайте полученный массив в файл.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2009, 17:57   #5
Paster
Новичок
Джуниор
 
Регистрация: 07.06.2009
Сообщений: 5
По умолчанию

Дело в том, что Файл уже создан и содержит пока 4-ре записи,но будет дополняться педагогом(Для проверки работоспособности программы);

получается надо
1) (BookArr : array[1..900] of Books ввести в описание основной программы как переменну или же обозначить ее уже в самой процедуре?
если в процедуре тогда туда-же надо вводить переменную BookCount(Это как я понимаю счетчик записей)

вообщем вот это текст программы,две последние процедуры(Если их можно так назвать) -это я пробовал чтонибудь сделать ссортировкой!!!


Program Sozd_Files;

uses
crt;
type
Books=record
Udk:integer;
Fio:string[30];
Nazv:string[30];
God_Izd:word;
Kol_Ekz:word;
end;
var
BookFile:file of Books;
Work:Books;
Vid:byte;
End_Menu:boolean;
Name:string[15];
BookArr:array[1..10] of Books;//эту запись я ввел после прочтения вашего ответа,Но не уверен в правильности своего ввода!!


procedure Name_File;
begin
writeln('Введите имя файла');
readln(Name);
end;

procedure AddRec;
begin
Writeln ('Ввод записи №',FilePos(BookFile)+1);
with Work do
begin
write ('Введите Удк');
readln (Udk);
Write ('Введите Фамилию и инициалы ');
readln (Fio);
write ('Введите название ');
readln (Nazv);
write ('‚Введите год издания ');
readln (God_Izd);
write ('‚Кколичество Экз_ов');
readln (Kol_Ekz);
write (BookFile,Work); {запись в файл окончена}
end;
end;

procedure Create_book_Of_Lib;
var
ind,count : integer;
begin
name_file;
assign (bookfile, name);
rewrite (bookfile);
writeln ('создание файла записи ',Name);
write ('введите кол-во записей ');
readln (count);
for ind:= 1 to count do
addrec;
writeln('создание файла завершенно');
writeln('Файл содержит ',filesize(bookfile),' записей');
close(bookfile);
end;

procedure OutputRec;
begin
read(bookfile, work);
with work do
begin
writeln('Запись № :', FilePos(bookfile));
writeln('Удк :',Udk);
writeln('Фио :',Fio);
writeln('Название :',Nazv);
writeln('Год :',God_Izd);
writeln('Кол-во Экз :',Kol_Ekz);
end;
end;

procedure OutputAllrec;
begin
Name_File;
Assign(BookFile,Name);
{$I-}
Reset(BookFile);
{$I+}
if IOresult=0 then
begin
Seek(Bookfile,0);
writeln('*** Вывод данных',Name,' ***');
while (not Eof(BookFile)) do
OutputRec;
end
else
writeln('Файла с именем',Name,' не существует');
end;

Procedure UpdateRec;
var
NumRec:longint;
begin
Name_File;
Assign(BookFile,Name);
{$I-}
Reset(BookFile);
{$I+}
if IOresult=0 then
begin
Write('Введите номер изменяемой записи');
Readln (NumRec);
Seek(BookFile,NumRec-1);
writeln('--старое значение записи--');
OutputRec;
Seek(BookFile,NumRec-1);
writeln('задаем новое значение ',NumRec,' записи');
AddRec;
Close(BookFile);
end
else
writeln('Файла с именем '+Name+' не существует');
end;

Последний раз редактировалось Paster; 09.06.2009 в 18:16.
Paster вне форума Ответить с цитированием
Старый 09.06.2009, 18:03   #6
Paster
Новичок
Джуниор
 
Регистрация: 07.06.2009
Сообщений: 5
По умолчанию

(продолжение)


procedure addrectoend;
begin
name_file;
assign(bookfile, name);
reset(bookfile);
if ioresult = 0 then
begin
seek(bookfile,filesize(bookfile)); {Установка записи в конец файла}
addrec;
Writeln('Измененый файл имеет',filesize(bookfile), ' записи');
close(bookfile);
end
else
writeln('Файла с именем'+Name+' на диске нет');
end;

procedure Del_Rec; {Эта процедура вроде бы работает но почемуто не выводит пояснительную информацию??}
var NumRec:integer;
begin
Assign(BookFile,'книги.txt');
{$I-}
reset(BookFile);
{$I+}
If IOresult=1 then
begin
writeln('Ошибка');
end
else
writeln('Введите номер удаляемой записи');
Read(NumRec);
begin
if NumRec>FileSize(BookFile) then
begin
writeln('Такой записи не существует');
end
else
begin
Seek(BookFile,FileSize(BookFile)-1);
read(BookFile,work);
Seek(BookFile,NumRec-1);
write(BookFile,Work);
Seek(BookFile,FileSize(BookFile)-1);
truncate(BookFile);
Writeln('Запись стерта ');
writeln('Файл данных имеет ',FileSize(BookFile),' записей');
close(BookFile);
end;
end;

end;


{ procedure Sort_God; //Это то что я пробовал сделать с процедурами сортировки
var
i,Count:integer;

begin
Name_File;
Assign(BookFile,Name);
reset(BookFile);
writeln('—вҐ*ЁҐ д ©« § ЇЁбҐ©');
while Not (Eof(BookFile)) do
begin
read(BookFile,Work);
inc(Count);
writeln('‚ д ©«Ґ ᮤҐа¦Ёвмбп ',Count,' § ЇЁбҐ©');
writeln('” ©« ¤® б®авЁа®ўЄЁ');
Seek(BookFile,0);
for i := 1 to Count do
begin
read(BookFile,Work);
writeln(Work.God_Izd);
end; }

{ Procedure Sort_God; // это тоже не понятно что получилось
var
Stop:boolean;
k:integer;
begin
assign(BookFile,Name);
reset(BookFile);
while Not Eof(BookFile) do
begin
repeat
Stop := true;
for k := 1 to 3 do
if BookArr[k].God_Izd > BookArr[k+1].God_Izd then
begin
work := BookArr[k];
BookArr[k] := BookArr[k+1];
BookArr[k+1] := work;
Stop := false
end
until Stop;
Create_book_Of_Lib;
end;
end; }

begin
ClrScr;
End_Menu:=false;
repeat
writeln('*** ’Ґ«Ґд®**л© бЇа ў®з*ЁЄ ***');
writeln('1 - б®§¤ *ЁҐ *®ў®Ј® д ©« ');
writeln('2 - Їа®б¬®ва д ©« ');
writeln('3 - Ё§¬Ґ*ҐЁҐ ¤ **ле');
writeln('4 - ¤®Ї®«*Ґ*ЁҐ д ©« ');
writeln('5 - Ї®ЁбЄ Ї® д ¬Ё«ЁЁ');
writeln('7 - “¤ «Ґ*ЁҐ § ЇЁбЁ');
writeln('6 - ‘®авЁа®ўЄ Ї® Ј®¤г Ё§¤ *Ёп');
writeln('0 - ‡ ўҐаиҐ*ЁҐ а Ў®вл.');

writeln('‚ и ўлЎ®а');
readln(Vid);
case Vid of
1:Create_Book_Of_Lib;
2:OutputAllRec;
3:UpdateRec;
4:AddRecToEnd;
5:FindFio;
6:Sort_God;
7:Del_Rec;

0:End_Menu:=True;
end;
writeln('„«п Їа®¤®«¦Ґ*Ёп * ¦¬ЁвҐ Enter');
readln;
ClrsCR
UNTIL End_Menu;
end.


вот такой исходник!!
не могу пока въехать!)
буду конечно сейчас искать да пробовать сам,почитаю мануалы!
За Инфу спасибо!!!за помощь то же!
Скорее всего где-то что то не дописал ,не доглядел ну и не додумал конечно!!

Последний раз редактировалось Paster; 09.06.2009 в 18:24.
Paster вне форума Ответить с цитированием
Старый 09.06.2009, 18:48   #7
Paster
Новичок
Джуниор
 
Регистрация: 07.06.2009
Сообщений: 5
По умолчанию

Выложу в рар архиве свою прогу и файл обращения программы(первоначально созданный)
не судите строго за ошибки!!
Вложения
Тип файла: rar Pascal.rar (2.4 Кб, 40 просмотров)
Paster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление записи в ListView Небесный Общие вопросы Delphi 1 14.12.2008 22:22
Полное удаление данных из файла в формате *.mdb AleksP Microsoft Office Access 1 07.09.2008 21:24
Удаление записи из файла(Delphi) студентка Помощь студентам 1 16.12.2007 13:54
Удаление записи с файла werser Помощь студентам 8 27.06.2007 06:25
Удаление записи из *.dbf BJF.41 БД в Delphi 4 15.03.2007 18:29