Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Turbo Pascal] Динамические структуры данных, очередь 
V
    Опции темы
Dower
Дата 29.3.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно написать программу, работающую по следующему меню:
1. Добавить в очередь
2. Выбрать из очереди
3. Распечатать очередь

например: очередь за талонами к врачу (имя, фамилия).

И если это возможно, хотя бы вкратце поясните код.

PM MAIL   Вверх
t_gran
Дата 30.3.2010, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Код

type
   TPNode= ^TNode;
   TNode= record
      name, surname: string;  // Имя, фамилия
      next: TPNode;           // Указатель на следующий узел
   end;
   
   TQueue= record             // Непосредственно сама очередь
      head, tail: TPNode;     // Указатель на голову и хвост
   end;

{-----------------------------------------------}
// Добавление в конец (хвост) очереди
procedure Push(var theQueue: TQueue; theName, theSurname: string);
var
   node: TPNode;
begin
   new(node);                    // Новый узел
   node^.name:= theName;         // Задаём имя новому узлу
   node^.surname:= theSurname;   // Задаём фамилию
   node^.next:= nil;             // Т.к. этот узел теперь будет последним, то значит
                                 // он не на что не ссылается.
   if (theQueue.tail = nil) then // Вариант когда в очереди нет ни одного элемента
   begin
      theQueue.head:= node;      // Соответственно и голова и хвост будут указывать
      theQueue.tail:= node;      // на вновь созданный узел
   end
   else
   begin
      theQueue.tail^.next:= node;// Иначе просто добавляем в хвост очереди
      theQueue.tail:= node;
   end;
end;
{-----------------------------------------------}
// Извлекаем с начала очереди, если извлечение прошло удачно, то
// возвращаем true, иначе false
function Pop(var theQueue: TQueue; var theName, theSurname: string): boolean;
var
   node: TPNode;
begin
   if (theQueue.head = nil) then    // Если очередь пуста, то выходим
   begin
      Pop:= false;
      exit;
   end;
   node:= theQueue.head;            // Переприсваеваем указатель на удаляемый элемент
   theQueue.head:= node^.next;      // Указатель на голову в списке спускаем ниже
   if (theQueue.head = nil) then    // Если удаляемый элемент был последний в очереди
      theQueue.tail:= nil;
   theName:= node^.name;
   theSurname:= node^.surname;
   dispose(node);                   // Удаляем узел
   Pop:= true;
end;
{-----------------------------------------------}
procedure Print(theQueue: TQueue);
begin
   while (theQueue.head <> nil) do
   begin
      writeln(theQueue.head^.name, ' ', theQueue.head^.surname);
      theQueue.head:= theQueue.head^.next;
   end;
end;
{-----------------------------------------------}

var
   name, surname: string;
   queue: TQueue;

begin
   queue.head:= nil;
   queue.tail:= nil;
   writeln('Test: Push -> Pop');
   Push(queue, 'A_name', 'A_surname');
   Push(queue, 'B_name', 'B_surname');
   Push(queue, 'C_name', 'C_surname');
   while (Pop(queue, name, surname)) do
      writeln(name, ' ', surname);
   writeln;
   writeln('Test: Push -> Print');
   Push(queue, 'D_name', 'D_surname');
   Push(queue, 'E_name', 'E_surname');
   Push(queue, 'F_name', 'F_surname');
   Print(queue);
end.



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Dower
Дата 30.3.2010, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня она почему-то не запускается, но и не выдает никаких ошибок.
PM MAIL   Вверх
t_gran
Дата 30.3.2010, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Цитата

У меня она почему-то не запускается

Да ну?!  smile
Вы в этом точно уверены!? smile 

Если вы используете TP7, то вы должны знать, что среда после выполнения программы не делает задержку и чтобы посмотреть результат выполнения то необходимо всего лишь нажать Alt+F5. Но многие энтузиасты делают проще, они просто ставят задержку типа какого-нибудь readkey. Если же вы используете FPC (как и я), то вы должны знать, что консольная программа всю информацию выводит в консоль, а это значит её нужно запустить через cmd, или опять же делать искусственную задержку.

В доказательство что программа работоспособна прикрепляю исходник с бинарником.

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  queue.zip 13,99 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Dower
Дата 31.3.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может я что не так понял в задании или не правильно разобрался с кодом вашей программы, но разве в программе не должно присутствовать меню. Я думал будет меню и при нажатии определенной цифры должно предлагаться либо добавить новую запись в очередь, либо выбрать, либо распечатать.

Это сообщение отредактировал(а) Dower - 31.3.2010, 14:49
PM MAIL   Вверх
t_gran
Дата 1.4.2010, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Цитата

Может я что не так понял в задании или не правильно разобрался с кодом вашей программы, но разве в программе не должно присутствовать меню. Я думал будет меню и при нажатии определенной цифры должно предлагаться либо добавить новую запись в очередь, либо выбрать, либо распечатать.

Наверное, но в чём проблема-то? Я думал у вас ступор с самими списками(очередями), а не с какими-то меню. А вам тут всё нужно на блюдечке с голубой каёмочкой.
Код

uses crt;

type
   TPNode= ^TNode;
   TNode= record
      name, surname: string;  // Имя, фамилия
      next: TPNode;           // Указатель на следующий узел
   end;
   
   TQueue= record             // Непосредственно сама очередь
      head, tail: TPNode;     // Указатель на голову и хвост
   end;

{-----------------------------------------------}
// Добавление в конец (хвост) очереди
procedure Push(var theQueue: TQueue; theName, theSurname: string);
var
   node: TPNode;
begin
   new(node);                    // Новый узел
   node^.name:= theName;         // Задаём имя новому узлу
   node^.surname:= theSurname;   // Задаём фамилию
   node^.next:= nil;             // Т.к. этот узел теперь будет последним, то значит
                                 // он не на что не ссылается.
   if (theQueue.tail = nil) then // Вариант когда в очереди нет ни одного элемента
   begin
      theQueue.head:= node;      // Соответственно и голова и хвост будут указывать
      theQueue.tail:= node;      // на вновь созданный узел
   end
   else
   begin
      theQueue.tail^.next:= node;// Иначе просто добавляем в хвост очереди
      theQueue.tail:= node;
   end;
end;
{-----------------------------------------------}
// Извлекаем с начала очереди, если извлечение прошло удачно, то
// возвращаем true, иначе false
function Pop(var theQueue: TQueue; var theName, theSurname: string): boolean;
var
   node: TPNode;
begin
   if (theQueue.head = nil) then    // Если учередь пуста, то выходим
   begin
      Pop:= false;
      exit;
   end;
   node:= theQueue.head;            // Переприсваеваем указатель на удляемый элемент
   theQueue.head:= node^.next;      // Указатель на голову в списке спускаем ниже
   if (theQueue.head = nil) then    // Если удаляемый элемент был последний в очереди
      theQueue.tail:= nil;
   theName:= node^.name;
   theSurname:= node^.surname;
   dispose(node);                   // Удоляем узел
   Pop:= true;
end;
{-----------------------------------------------}
procedure Print(theQueue: TQueue);
begin
   while (theQueue.head <> nil) do
   begin
      writeln(theQueue.head^.name, ' ', theQueue.head^.surname);
      theQueue.head:= theQueue.head^.next;
   end;
end;
{-----------------------------------------------}
procedure PrintHead(theCaption: string);
var
   i: integer;
begin
   writeln;
   writeln(theCaption);
   for i:= 1 to length(theCaption) do
      write('-');
   writeln;
end;
{-----------------------------------------------}
var
   ch: char;
   name, surname: string;
   queue: TQueue;

begin
   queue.head:= nil;
   queue.tail:= nil;
   writeln('[a]dd [d]elete [p]rint [q]uit');
   repeat
      ch:= readkey;
      case ch of
         'a':  begin
                  PrintHead('APPEND');
                  write('name: ');
                  readln(name);
                  write('surname: ');
                  readln(surname);
                  Push(queue, name, surname);
               end;
         'd':  begin
                  PrintHead('DELETE');
                  if (Pop(queue, name, surname)) then
                     writeln('Ok')
                  else
                     writeln('Error');
               end;
         'p':  begin
                  PrintHead('PRINT');
                  Print(queue);
               end;
      end;
   until (ch = 'q');
end.



Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  queue.zip 16,49 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Dower
Дата 1.4.2010, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Огромное вам спасибо за решение.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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