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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая очередь, Динамическая очередь 
:(
    Опции темы
Toyamatokanava
Дата 22.9.2015, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

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



Задание звучит так, постройте класс, представляющий динамическую очередь из элементов типа Cat. Я так понял, что нужно поставить в очередь строки, но поставить в очередь получилось только символы. Подскажите пожалуйста мою ошибку, так как я новичок.

Код

#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
class queue {
private:
    unsigned size;
    char *q;//буфер из тип чар
    int sloc, rloc;
    //unsigned size;
public:
    
    queue(int s);//прототип конструктора с параметром
    ~queue();//прототип деструктора
    void qput( char *x);//метод поставить в очередь
    int qget(void); //метод отдать очередного
};
queue::queue(int s)
{
    size = s; //переменной класса присвоили значение парамтера
    q = new char[size];//создали динамическиймассив
    if (!q) { cout << "no memories"; return; };
    sloc = rloc = 0;
};
queue::~queue()
{
    delete[] q;//освободили память
    cout << "queue is ruined \n";
    system("pause");
};
void queue::qput( char *x)
{
    if (sloc == size){
        cout << "queue is overfull";
        return;
    };//проверка переполнения
    q[sloc++] = *x;//добавляем элемент, если все хорошо
    return;//выход без значения
};
int queue::qget(void)
{
    if (sloc == rloc) { cout << "queue is empty";
    return 0;
    };//проверка опустошения
    return q[rloc++];
}
int main()
{
    queue cat(5);//
    cat.qput("tom");
    cat.qput("Kitty");
    cout << (char)cat.qget() << "        ";//извлекаем из очереди значения
    cout << (char)cat.qget() << "        ";//извлекаем из очереди значения
    return 0;
}


Это сообщение отредактировал(а) Toyamatokanava - 22.9.2015, 12:37
PM MAIL   Вверх
volatile
Дата 22.9.2015, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Toyamatokanava @  22.9.2015,  12:12 Найти цитируемый пост)
динамическую очередь из элементов типа Cat

а где у вас тип Cat ?  smile 
PM MAIL   Вверх
rudolfninja
Дата 22.9.2015, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Сначала вам надо определить тип Cat. В очереди вместо 
Код

char *q;//буфер из тип чар

делать Cat* cats; - это будет указатель на массив котов. В конструкторе вам надо как-то выделить память под нужное количество элемнтов, я так полагаю, это количество хранится в перемнной size. То есть, в конструкторе делаете:
Код

cats = new Cat[size];

Для нормального добавления элементов у вас в классе должен быть текущий (не максимальный) размер массива. Вот и все.

У вас получаются символы, а не строки, потому что путем
Код

q = new char[size];

Вы выделяете память для обычной строки, в которой может храниться size - 1 элементов.
Код

 return q[rloc++];

возвращает вам всего лишь один символ из этой строки. А тут
Код

(char)cat.qget()

вы это все еще зачем-то приводите к типу char, то есть, к одному символу.
PM MAIL Skype   Вверх
Toyamatokanava
Дата 22.9.2015, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

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



Цитата(rudolfninja @ 22.9.2015,  12:42)

Код

 return q[rloc++];

возвращает вам всего лишь один символ из этой строки. А тут
Код

(char)cat.qget()

вы это все еще зачем-то приводите к типу char, то есть, к одному символу.

Как сделать так, чтобы возвращался массив символов? Подскажите пожалуйста.
PM MAIL   Вверх
math64
Дата 22.9.2015, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

class Cat
{
public:
  Cat(const char* name);
  Cat(); // конструктор по умолчанию
  Cat(const Cat& cat); // конструктор копирования
  ~Cat();
  Cat& operator=(const Cat& cat); // оператор копирования
  const char* name() const { return _name; }
private:
  char _name[32]; // 32 - максимальная длина имени; или  char* _name - чтобы снять это ограничение
};

class CatQueue {
public:
  CatQueue(int size);
  ~CatQueue();
  Cat get();
  void put(const Cat& cat);
private:
  Cat* _cats;
  int _size, _head, _tail;
}

реализацию методов делай сам.
NB: у класса Cat нужно реализовать конструктор по умолчанию, конструктор копирования и оператор копирования.

Это сообщение отредактировал(а) math64 - 22.9.2015, 14:50
PM   Вверх
rudolfninja
Дата 22.9.2015, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Цитата(Toyamatokanava @  22.9.2015,  14:06 Найти цитируемый пост)
Как сделать так, чтобы возвращался массив символов? Подскажите пожалуйста. 

Делать двумерный массив символов =) Или использовать массив из std::string. Рекомендую вам второй вариант.
Объявление будет таким:
Код

string* q;

Далее в конструкторе выделяете память для нужного количества элементов:
Код

q = new string[size];

тогда qput будет таким:
Код

q[slock++] = x; 

А qget:
Код

return q[rlock++].c_str();

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

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



Цитата(rudolfninja @ 22.9.2015,  15:05)
Цитата(Toyamatokanava @  22.9.2015,  14:06 Найти цитируемый пост)
Как сделать так, чтобы возвращался массив символов? Подскажите пожалуйста. 

Делать двумерный массив символов =) Или использовать массив из std::string. Рекомендую вам второй вариант.
Объявление будет таким:
Код

string* q;

Далее в конструкторе выделяете память для нужного количества элементов:
Код

q = new string[size];

тогда qput будет таким:
Код

q[slock++] = x; 

А qget:
Код

return q[rlock++].c_str();


Все равно не получается через строку.(

Код

#include "stdafx.h"
#include <iostream>
#include <string.h>
//#include <string>
using namespace std;
class queue {
private:
    unsigned size;
    string* q;
    int sloc, rloc;
    //unsigned size;
public:
    
    queue(int cat);//прототип конструктора с параметром
    ~queue();//прототип деструктора
    void qput(string x);//метод поставить в очередь
    int qget(void); //метод отдать очередного
};
queue::queue(int cat)
{
    size = cat; //переменной класса присвоили значение парамтера
    q = new string[size];//создали динамическиймассив
    if (!q) { cout << "no memories"; return; };
    sloc = rloc = 0;
};
queue::~queue()
{
    delete[] q;//освободили память
    cout << "queue is ruined \n";
    system("pause");
};
void queue::qput( string x)
{
    if (sloc == size){
        cout << "queue is overfull";
        return;
    };//проверка переполнения
    
    q[sloc++] = x;//добавляем элемент, если все хорошо
    return;//выход без значения
};
int queue::qget(void)
{
    if (sloc == rloc) { cout << "queue is empty";
    return 0;
    };//проверка опустошения
    return *q[rloc++].c_str();
    }
int main()
{
    queue cat(5);//конструктор создал две очереди размером 5 и 100
    cat.qput("tom");
    cat.qput("Kitty");
    cout <<cat.qget() << "        ";//извлекаем из очереди значения
    cout <<cat.qget() << "        ";//извлекаем из очереди значения
    return 0;
}

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



У вас int queue::qget(void) возвращает int.
Перепишите qget так:
Код

char* queue::qget(void)
{
    if (sloc == rloc) { cout << "queue is empty";
    return 0;
    };//проверка опустошения
    return q[rloc++].c_str();
}

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

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



Получилось вот так.


Код

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class queue {
private:
    unsigned size;
    string* q;
    int sloc, rloc;
    //unsigned size;
public:

    queue(int cat);//прототип конструктора с параметром
    ~queue();//прототип деструктора
    void qput(string x);//метод поставить в очередь
    string qget(void); //метод отдать очередного
};
queue::queue(int cat)
{
    size = cat; //переменной класса присвоили значение парамтера
    q = new string[size];//создали динамическиймассив
    if (!q) { cout << "no memories"; return; };
    sloc = rloc = 0;
};
queue::~queue()
{
    delete[] q;//освободили память
    cout << "queue is ruined \n";
    system("pause");
};
void queue::qput(string x)
{
    if (sloc == size){
        cout << "queue is overfull";
        return;
    };//проверка переполнения

    q[sloc++] = x;//добавляем элемент, если все хорошо
    return;//выход без значения
};
string queue::qget(void)
{
    if (sloc == rloc) {
        cout << "queue is empty";
        return 0;
    };//проверка опустошения
    return q[rloc++].c_str();
}
int main()
{
    queue cat(5);//конструктор создал две очереди размером 5 и 100
    cat.qput("tom1");
    cat.qput("tom2");
    cat.qput("tom3");
    std:cout << cat.qget() << "        ";//извлекаем из очереди значения
    cout << cat.qget() << "        ";//извлекаем из очереди значения
    cout << cat.qget() << "        ";//извлекаем из очереди значения
    return 0;
}

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Раз уж у вас тип возвращаемого значения функции qget string, то не обязательно вызывать метод c_str() у возвращаемой строки. Можно просто написать return q[rloc++];
А работает хоть? =)
PM MAIL Skype   Вверх
Toyamatokanava
Дата 22.9.2015, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

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



Цитата(rudolfninja @ 22.9.2015,  16:52)
Раз уж у вас тип возвращаемого значения функции qget string, то не обязательно вызывать метод c_str() у возвращаемой строки. Можно просто написать return q[rloc++];
А работает хоть? =)

Да, и правда можно без перевода в строку). Тут я не подумал.) Да, все работает), спасибо за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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