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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2010, 16:34   #1
nurmizmat
 
Регистрация: 30.05.2010
Сообщений: 7
По умолчанию сохранение изменений в списке

для сохранения изменений в списке использую такую процедуру:

Код:
procedure save;
begin
  assign(f,namebase);
  rewrite(f);
  top :=kon^.link;
  while top <>nil do
     begin
          k :=top;
          top :=k^.link;
          write(f,k^);
     end;
     close(f);
end;
при этом список после каждого сохранения изменений "переворачивается": последний элемент становится первым, а первый последним.

как сделать, чтобы список сохранялся в том же порядке, в каком он находится в памяти?

Последний раз редактировалось Stilet; 31.05.2010 в 17:19.
nurmizmat вне форума Ответить с цитированием
Старый 01.06.2010, 23:17   #2
nurmizmat
 
Регистрация: 30.05.2010
Сообщений: 7
По умолчанию

не могу разобраться
nurmizmat вне форума Ответить с цитированием
Старый 02.06.2010, 01:54   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
не могу разобраться
А мы думаете телепатически сможем?

Код:
 top :=kon^.link;
Как объвлен список, top? Кто такой kon?

Код:
k :=top;
top :=k^.link;
Зачем???

Код:
write(f,k^);
Если это традиционный список, то вы пишете в файл адресс, который очень легко может изменитя.... не говоря уже о том, что он точно изменится при перезапуске проги.
p51x вне форума Ответить с цитированием
Старый 02.06.2010, 23:39   #4
nurmizmat
 
Регистрация: 30.05.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А мы думаете телепатически сможем?

Код:
 top :=kon^.link;
Как объвлен список, top? Кто такой kon?

Код:
k :=top;
top :=k^.link;
Зачем???

Код:
write(f,k^);
Если это традиционный список, то вы пишете в файл адресс, который очень легко может изменитя.... не говоря уже о том, что он точно изменится при перезапуске проги.
объявление списка:

Код:
program Bookstore;
uses Crt;
type TP = ^Books;
     Books = record
       Name : string[50];
       Avtor : string[15];
       Kolvo : integer;
       Cena : string[10];
       Link : TP
     end;

var i : integer;
    top,k,kon,r : TP;
    BooksF : file of Books;
    BooksR : Books;
    dir : string;
основная программа:

Код:
begin
   ClrScr;
   write('Введите путь и имя файла с данными: ');
   readln(dir);
   top :=nil;
   Assign(BooksF,dir);
   Reset(BooksF);
   while not Eof(BooksF) do
   begin
   new(k);
   Read(BooksF,BooksR);
   k^.Name :=BooksR.Name;
   k^.Avtor :=BooksR.Avtor;
   k^.Kolvo :=BooksR.Kolvo;
   k^.Cena :=BooksR.Cena;
   k^.Link :=top;
   top :=k;
   end;
   new(k);
   k^.Name :='';
   k^.Avtor :='';
   k^.Kolvo :=0;
   k^.Cena :='';
   k^.Link :=top;
   kon :=k;
   top :=k;
   Close(BooksF);
   ClrScr;
   BooksMenu;
end.
Код:
{Процедура вывода списка книг на экран}
procedure WriteBooks(ctp: TP);
var lb: integer;
begin
  if ctp =nil then
  begin
       ClrScr;
       writeln('Список имеющихся книг:');
       top :=kon^.link;
       WriteCaption(0);
       lb :=0;
       while top <>nil do
       begin
            if lb <15 then
            begin
                 k :=top;
                 top :=k^.link;
                 write('|',k^.Name:25,'|');
                 write(k^.Avtor:15,'|');
                 write(k^.Kolvo:12,'|');
                 writeln(k^.Cena:12,'|');
                 lb :=lb+1;
            end
            else
            begin
                 WriteCaption(1);
                 write('Для дальнейшего просмотра списка книг нажмите любую клавишу...');
                 ReadKey;
                 ClrScr;
                 writeln('Список имеющихся книг:');
                 WriteCaption(0);
                 lb :=0;
            end;
       end;
       WriteCaption(1);
       write('Нажмите любую клавишу...');
       ReadKey;
  end
  else
  begin
       write('|',ctp^.Name:25,'|');
       write(ctp^.Avtor:15,'|');
       write(ctp^.Kolvo:12,'|');
       writeln(ctp^.Cena:12,'|');
  end;
end;

{Процедура добавления новой книги в базу}
procedure AddBooks;
begin
  ClrScr;
  writeln('Добавление книги:');
  writeln;
  top :=kon^.link;
  new(k);
  Write('Введите название книги:');
  readln(k^.Name);
  write('Введите автора:');
  readln(k^.Avtor);
  write('Введите количество книг:');
  readln(k^.Kolvo);
  write('Введите цену:');
  readln(k^.Cena);
  k^.link :=top;
  top :=k;
  kon^.link :=k;
  writeln;
  writeln('Книга успешно добавлена в базу!!!');
  writeln;
  write('Нажмите любую клавишу...');
  ReadKey;
end;

procedure save;
begin
  assign(f,namebase);
  rewrite(f);
  top :=kon^.link;
  while top <>nil do
     begin
          k :=top;
          top :=k^.link;
          write(f,k^);
     end;
     close(f);
end;
После добавления книги, новая запись появляется в начале списка. Сохраняем изменения. Выходим из программы. После запуска программы при просмотре список "переворачивается".
Как исправить?
nurmizmat вне форума Ответить с цитированием
Старый 07.06.2010, 12:35   #5
nurmizmat
 
Регистрация: 30.05.2010
Сообщений: 7
По умолчанию

со списками проблема. подскажите в чем ошибка.
nurmizmat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGrid. ReadOnly. Сохранение изменений cnst_bus БД в Delphi 3 18.01.2010 13:40
Вопрос о сохранении изменений Sebastian Microsoft Office Word 4 09.09.2009 09:43
Защита ЕХЕ от изменений HellMercenariess Компоненты Delphi 3 20.08.2009 01:50
сохранение изменений в DBGrid/DBGridEh, при изменении фокуса ячейки dalien БД в Delphi 6 30.07.2009 15:36
проверка изменений в Memo и сохранение Костян Пират Общие вопросы Delphi 5 20.03.2009 22:27