Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двунаправленный список 
:(
    Опции темы
Dobermann
Дата 4.6.2008, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Вообщем задача: Вывести текстовый файл на экран. эт я знаю как сделать 
теперь ВОПРОС:  Как с помощью двунаправленного списка листать построчно выведенный на экран текст?!?!?!
Наброски:
Код

uses crt;
type fff = ^qqq;
     qqq = record
         s: array[1..1000] of string;
       v,n: fff;
      end;
var
     f: text;
     w: fff;
     c: char;
   k,i: integer;
.............................................

Считываю файл с помощью указателя:

  
Код

assign(f,'e:\111.txt'); reset(f);
  k:=0; new(w);
  while not eof(f) do
    begin
      k:=k+1;
      readln(f,w^.s[k]);
    end;

Вывел текст
 
Код

 for i:=1 to k do writeln(w^.s[i]);

И ПРИПЛЫЛ  smile 
Код

  repeat
      c:=readkey;
      case ord(c) of
        119: begin
                   writeln(w^.s[i+1]);     я то строку заново вывожу
             end;
        115: begin
                   writeln(w^.s[i-1]);       здесь так же
             end;
      end;
  until ord(c)=13;
end.

Возможен еще вариант:
Вывести 50 первых строк текста на экран, а остальные дописывать по одной, НО тут уже не нужны указатели  smile 
HELP    smile 
Наверное уже поздно соображать что-либо

Это сообщение отредактировал(а) Dobermann - 4.6.2008, 01:37
PM   Вверх
volvo877
Дата 4.6.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Dobermann @  4.6.2008,  01:28 Найти цитируемый пост)
Вывести 50 первых строк текста на экран, а остальные дописывать по одной, НО тут уже не нужны указатели
Это как сказать... Если сделать список указателей на строки, и держать в какой-либо переменной (назовем ее first_line, изначально равна началу списка) адрес той строки, с которой начинается вывод на экран (верхняя строка, начиная от нее выводить сколько так у тебя? 50? 25 строк?), то получается очень удобно. А при необходимости прокрутки - 

Код
...
if first_line^.next <> nil then first_line := first_line^.next; { <-- при прокрутке "вверх"}
if first_line^.pred <> nil then first_line := first_line^.pred; { <--- при прокрутке "вниз"}
...

PM MAIL   Вверх
Dobermann
Дата 4.6.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



volvo877
Тогда подскажи еще: как эти указатели заставить реагировать на ord( c ) чтобы прокручивать?!?!?! ИЛИ может знаешь как по-другому прокрутить...(мозгов только на readkey хватило).
В текстовом файле может быть и 1000 строк - я имел ввиду, что на экране только 50 помещается...


Это сообщение отредактировал(а) Dobermann - 4.6.2008, 16:51
PM   Вверх
volvo877
Дата 4.6.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Что тебе не нравится с ReadKey? Все прекрасно прокручивает:

Код

uses crt;

type
  pstr = ^tstr;
  tstr = string[127];

  plist = ^tlist;
  tlist = record
    s: pstr;
    next, prev: plist;
  end;

procedure read_file(var first: plist;
          const fn: string);
var
  f: text;
  st: tstr;
  p, last: plist;

begin
  assign(f, fn);
  reset(f);

  first := nil; last := nil;
  while not eof(f) do begin
    readln(f, st);
    new(p);
    new(p^.s); p^.s^ := st;
    p^.next := nil; p^.prev := last;

    if first = nil then first := p
    else last^.next := p;

    last := p;
  end;

  close(f);
end;

const n_lines = 24;

procedure print_list(first_line: plist);
var n: integer;
begin
  clrscr;
  n := 0;
  while (first_line <> nil) and (n < n_lines) do begin
    writeln(first_line^.s^);
    first_line := first_line^.next;
    inc(n);
  end;
end;

procedure process(first_line: plist);
var ch: char;
begin
  repeat
    ch := readkey;
    case ch of
      #0:
      case readkey of
        #72: { up }
          begin
            if first_line^.prev <> nil then begin
              first_line := first_line^.prev;
              print_list(first_line);
            end;
          end;
        #80: { dn }
          begin
            if first_line^.next <> nil then begin
              first_line := first_line^.next;
              print_list(first_line);
            end;
          end;
      end;
    end;
  until ch = #27;
end;

var first: plist;
begin
  read_file(first, 'ex_zoo.txt');
  process(first);

  { не забываем освободить память }
end.

PM MAIL   Вверх
Dobermann
Дата 4.6.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Спасибо!!!  smile 
Не закрывай тему, скорей всего еще будут вопросы

Это сообщение отредактировал(а) Dobermann - 4.6.2008, 17:44
PM   Вверх
Dobermann
Дата 4.6.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Что есть почитать про работу с ASCII.
 Просто я не пойму зачем сперва #0
Код

 case ch of
      #0:

Да и не знал, что #72 - это вверх
Код

      case readkey of
        #72: { up }

Только знаю про # и все =)
Вообщем хочу почитать где-что обозначает:
Код

#80: { dn }
until ch = #27;
#72: { up }
 #0:

Извиняюсь!!!, знаю что вопрос не по разделу
PM   Вверх
volvo877
Дата 4.6.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата
я не пойму зачем сперва #0
Затем, что у клавиш управления курсором и у всех F.. коды не обычные, а расширенные: первый байт = #0, и только второй идентифицирует клавишу... Так что при обработке "стрелка вверх"/"стрелка вниз" сначала будет прочитан #0, и только потом - #72 или #80.

Если же сделать как делают многие: просто ждать появления #72 или #80, без нуля перед ними - то получишь баг: код #72 - это код клавиши "h", а #80 - код "p", так что твой текст будет прокручиваться и по нажатию этих клавиш...

Ну, а #27 - это обычный, не расширенный код кнопки Escape, его надо ловить отдельно от расширенных, ибо с "нуля" он не начинается...

PM MAIL   Вверх
Dobermann
Дата 4.6.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



volvo877
Эт я понял. Просто не знал, что сначала обязательно нужен #0. Я так и подумал - что в алфавит попаду без #0
Ну так а у тебя есть список этих " клавиш управления курсором и у всех F.. " ??? Или где его можно посмотреть.... 
А то я с гугла только в ASCII и в ANSI попадаю...
p.s.: thanks

PM   Вверх
Dobermann
Дата 5.6.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



volvo877, можешь дать описания строкам после которых я поставил коммент???
Теоретически я знаю, что они делают, а конкретно по проге(что этот код делает для файла(проги)?!?!?!), сделаешь???
Код

begin
  assign(f, fn);
  reset(f);

  first := nil; last := nil;
  while not eof(f) do
  begin
    readln(f, st);
    new(p);
    new(p^.s);         //
    p^.s^ := st;          //
    p^.next := nil;          //
    p^.prev := last;          //
 
    if first = nil then first := p          //
    else last^.next := p;          //

    last := p;           //
  end;

  close(f);
end;

PM   Вверх
volvo877
Дата 5.6.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Для начала запомни, что новые элементы добавляются в конец списка, а не в начало, как многие любят делать...

Смотри:
Код
begin
  assign(f, fn);
  reset(f);
  first := nil; last := nil;
  while not eof(f) do
  begin
    readln(f, st);
    new(p); // здесь выделяем память под новый элемент списка

    // но ведь у нас не список строк, а список УКАЗАТЕЛЕЙ на строки,
    // поэтому теперь надо еще выделить место под саму строку
    new(p^.s);

    p^.s^ := st; // а теперь прочитанную из файла строку копируем в элемент списка

    // считаем, что ЭТОТ элемент - последний, вдруг больше в файле ничего нет?
    p^.next := nil; 

    // а перед этим элементом - тот, который до выделения памяти под новый
    // элемент считался последним, т.е. Last
    p^.prev := last; 

    // дальше - делаем вот что. Если First еще NIL, значит только что был
    // создан первый элемент списка, тогда запоминаем его в First, иначе
    // P - это уже не первый элемент, значит, надо "протянуть" связь из
    // бывшего последним (Last) ко вновь выделенному

    if first = nil then first := p // запоминаем первый элемент списка
    else last^.next := p; // протягиваем связь от последнего к новому

    last := p; // как бы не было, все равно новый элемент становится последним
  end;
  close(f);
end;
Вот и все... smile
PM MAIL   Вверх
Dobermann
Дата 5.6.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



volvo877,  smile  smile  smile  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.