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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Задача на структуры данных , lifo-очереди 
:(
    Опции темы
ktejke
Дата 23.12.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



никак не могу сообразить, как обратиться к элементам очереди.

в задании нужно создать кнопку, при нажатии которой будет выводиться сумма четных элементов очереди.


вот отрывок из методички по этому заданию: 

III. Динамические очереди
Введение
Очереди являются универсальными структурами данных. По своей организации оче-реди делятся на прямые ( fifo - first in first out) и обратные ( lifo - last in first out). Существуют также их различные комбинации. Наибольшее распространение получили динамические очереди, реализуемые на основе связных списков.
Целью настоящей работы является начальное знакомство с организацией данных в виде простой lifo - очереди и ее реализация в среде визуального программирования. 
Элементами динамической очереди служат экземпляры класса List. В соответствии с объявлением этого класса (листинг ниже) каждый список содержит два обычных элемента  целого типа  info и link, в которых размещаются число (полезная информация) и адрес следующего связного  списка (служебная информация). Кроме этого, в классе List имеется статический элемент  top - адрес начала  очереди (один на все экземпляры). Его значение инициализируется при объявлении нулем (так как при создании экземпляра класса List очередь пуста). 
Конструктор класса List  выполняет заполнение данными нового списка и подключение его к существующей очереди, а деструктор – удаление уничто-жаемого списка из очереди. Сама же память под элемент очереди выделяется оператором new, а освобождается после использования оператором delete.
В классе List имеются два статических метода: show - показать списки и gettop - вернуть адрес вершины очереди. Следующий листинг содержит объяв-ление класса List и сразу же определяет некоторые его методы. В отчет поместите блок - схему деструктора класса.

Создайте в личном каталоге папку lifo , откройте новое приложение и разместите на форме  три кнопки. Очередь будет управляться щелчком левой клавиши мыши на соответствующей кнопке формы. Для этого подготовьте 
(с помощью мастера приложений) заготовки для обработчиков событий 
OnClick по каждой из кнопок. Кроме этого, в системе должна освобождаться динамическая память в случае, когда форма закрывается, но в очереди еще имеются элементы. Один из вариантов – определить обработчик события за-крытия формы. Подготовьте заготовку и для данного обработчика.
В header - файле формы разместите объявление класса List (смотри предыдущий листинг). В cpp – файле формы следует набрать код для невстро-енного метода  show , а также для обработчиков событий


в header-файле: 

Код


class List {static List* top;
int info;
List *link;
public: List ( int i)
{   link=top; //подключение списка к существующему
info = i; // заполнение информационной части списка 
top = this; // на вершине очереди - текущий список
// вывод сообщения о создании элемента очереди
char istr[10],str[40];//временные строки для MessageBox
_ltoa( this->info, istr, 10 );//функция, преобразующая
                                                                  //десятичное целое в строку
strcpy(str,"Создается элемент списка :");//формирование начала строки
strcat(str,istr);
MessageBox(0,str,"Создание",MB_OK); };//диалог MessageBox
~List (){
List *p;
char istr[10],str[40];
_ltoa( this->info, istr, 10 );
if(top==this)top= link;// элемент удаляется с вершины
else {
    for(p=top;p;p=p->link)if(p->link == this)break;
     if(p) p-> link = link;
     else                {
MessageBox(0,"Элемент не найден !",””, MB_OK);
 exit(1);              } }
//вывод сообщения об удалении элемента из очереди
strcpy(str,"Удаляется элемент списка :");
strcat(str,istr);
MessageBox(0,str,"Удаление",MB_OK); };
static void show();// демонстрация содержимого очереди
static List *gettop(){return top;}; };





в cpp-файле: 
Код


#include<stdlib.h>
#include<string.h>
#pragma hdrstop
#include "stat.h"
#pragma resource "*.dfm"
TForm1 *TForm1;
List* List::top=0;//top должен быть объявлен как глобальный
int element; //переменная, используемая для заполнения списков
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void List::show()
{    List *p; char istr[10],str[40];// просмотр списков
if(!top)MessageBox(0,"Список пуст","Нет элементов",MB_OK);
for(p=top;p;p=p->link)
{ _ltoa( p->info, istr, 10 );
strcpy(str,"Элемент списка :");
strcat(str,istr);
MessageBox(0,str,"Просмотр",MB_OK);
}     }
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Visible=false;// скрываем форму на время MessageBox
  new List(element=rand());// добавляем в очередь элемент
  Visible=true;// восстанавливаем статус формы
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{ List *p; // вспомогательный указатель
  Visible=false;
  p = List::gettop();
  if( p ) delete p; //удаление элемента с вершины очереди
  Visible=true;}
void __fastcall TForm1::Button3Click(TObject *Sender)
{ Visible=false;
  List::show();
  Visible=true;}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{   //освобождение памяти при закрытии формы
List* p;// вспомогательный указатель
Visible=false;
while( p=List::gettop())delete p;//цикл по удалению остав-
 }                                                                         шихся списков из очереди



помогите, пожалуйста!  smile 

Это сообщение отредактировал(а) ktejke - 23.12.2008, 15:14
PM MAIL   Вверх
ktejke
Дата 23.12.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



все умники спят что ли? =(
PM MAIL   Вверх
Dmi3ev
Дата 24.12.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Цитата

_ltoa( p->info, istr, 10 );
strcpy(str,"Элемент списка :");
strcat(str,istr);
MessageBox(0,str,"Просмотр",MB_OK);

ты это называешь элементом? тогда у тебя уже есть пример (p->info)


--------------------

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

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


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

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

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

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


 




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


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

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