![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 07.06.2009
Сообщений: 5
|
![]()
Вечер добрый!
Хочу обратиться к вам с такой проблемой: 1)Не могу разобраться с удалением какой-либо записи из файла. 2)Сортировка записей в файле данных по определенному ключу. Я только начинаю изучать паскаль и некоторые моменты мне пока не понятны! Понимание, конечно,приходит,но с опозданием.А иногда эта задержка черевата последствиями(для студентов конечно... ![]() Если есть возможность помогите !!! P.S.:Прилагаю файл-исходник Books_of_... (.Pas фаил переименнованный в .txt для того что-бы вы могли посмотреть исходник) и файл Книги.txt (Содержиться информация о книгах в библиотеке)созданный через эту же программу!!! С удалением вроде бы разобрался!!!только что то не выводяться сообщения о удалении файлов(( ну с этим потом! вот с сортировкой проблема так и осталась:как отсортировать типизированный файл (одержащий информацию о книгах в библиотеке) Помогите Плз!!! Последний раз редактировалось Stilet; 09.06.2009 в 11:49. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
если по условиям задачи Ваш типизированный файл помещается в память (например, в массив записей), то задача сводится к элементарной:
считываем полностью файл в array[1..МаксимальноВозможноеКоличествоЗа писей] of TMyRecord; сортируем этот массив. записываем отсортированный массив в файл, либо в новый, либо в старый (в этом случае лучше исходный файл при этом переименовывать в имя.BAK) всё. если же файл по каким-либо причинам нельзя считывать в память - то тогда это намного сложнее... погуглите по словам "внешняя сортировка" |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 07.06.2009
Сообщений: 5
|
![]()
Чего-то я немножко недопонял из выше сказанного!!
А файл(Мною созданный)Содержит информацию о книгах и включает в себя: 1) Удк; 2)Фамилию и инициалы автора; 3)Название книги; 4)Год издания; 5)Количество экземпляров в библиотеке Эти пять позиций для каждой книги!!! и надо отсортировать их по году издания! вот начальный текст программы,где указываються типы переменных в записи!! Код:
Мозг просто в шоке,от обилия инфы и не успевает переработать все это!Прошу вас (если это возможно)объяснить как мне справиться с сортировкой по данному файлу! за ранее благодарен!!! Последний раз редактировалось Stilet; 09.06.2009 в 11:49. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
ладно. спрошу по простому - СКОЛЬКО МАКСИМАЛЬНО КНИЖЕК МОЖЕТ БЫТЬ В ВАШЕМ ФАЙЛЕ (BookFile:file of Books; ) ??
Т.е. можно ли считать, что у Вас не может быть больше, чем, скажем 900 книг (к сожалению, для DOS TurboPascal есть ограничение на сегмент данных, и для Вашей структуры записи более 950 записей в памяти не поместятся). Если ограничение устраивает. тогда всё просто: Код:
|
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 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. |
![]() |
![]() |
![]() |
#6 |
Новичок
Джуниор
Регистрация: 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. |
![]() |
![]() |
![]() |
#7 |
Новичок
Джуниор
Регистрация: 07.06.2009
Сообщений: 5
|
![]()
Выложу в рар архиве свою прогу и файл обращения программы(первоначально созданный)
не судите строго за ошибки!! |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Удаление записи в 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 |