Форум программистов, компьютерный форум CyberForum.ru

Список котов. - C++

Восстановить пароль Регистрация
 
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
21.11.2011, 03:29     Список котов. #1
Привет, друзья.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Cat:
{
public:
    Cat() { itsAge = 1;}
    ~Cat() {}
    void SetAge(int age) { itsAge = age; }
    int GetAge() const { return itsAge; }
 
private:
    int itsAge;
};
 
struct //создать список котов
 
void main()
{
    int birth;
 
    while(true) 
    {
        cin >> birth;
        if(birth == 1)
        {
            // в список котов добавляется новый Кот.
            cout << "added a new cat" << endl;
        }
        if(birth == -1)
        {
           // из списка удаляется кот
           cout << "deleted a one cat" << endl;
        }
    
        cout << "Number of kittens:" << ?? << endl;
    }
 
    cin.get()
}
Вопрос содержится в коде.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 03:43     Список котов. #2
Цитата Сообщение от res Посмотреть сообщение
Вопрос содержится в коде.
что-то не вижу вопроса
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
21.11.2011, 05:03  [ТС]     Список котов. #3
Создать список, в который будут добавляться и удаляться "коты".
Можно вектором или лист. Надеюсь вопрос теперь понятен.
magistr011
 Аватар для magistr011
6 / 6 / 0
Регистрация: 22.10.2011
Сообщений: 164
21.11.2011, 05:13     Список котов. #4
res, код у тебя неправельный, ничего общего с классами (кроме слов: class, public, private)
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
21.11.2011, 05:38  [ТС]     Список котов. #5
magistr011, А у тебя слово "неправильный" не правильное.
Суть не в этом же.

Ладно, сейчас снова попытаюсь сделать с динамическими массивами.
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
21.11.2011, 06:08     Список котов. #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* 
 * File:   DoubleList.h
 * Author: iWord
 *
 * Created on 10 Октябрь 2011 г., 20:20
 */
 
#ifndef DOUBLELIST_H
#define DOUBLELIST_H
#include <stdio.h>
 
class DoubleLinkedList {
  typedef int ElementType;
  class ListNode {
   public:
    ListNode(int i = 0) : item(i), prev(NULL), next(NULL) {}
    ListNode* prev;
    ListNode* next;
    ElementType item;
  };
 
  ListNode* curnode;
  ListNode firstnode;
  ListNode lastnode;
 
  ListNode* GetLast() {
    ListNode* lastNode = &firstnode;
 
    while (lastNode->next != &lastnode) {
      lastNode = lastNode->next;
    }
 
    return lastNode;
  }
  
  ListNode* GetFirst() {
    ListNode* firstNode = &lastnode;
 
    while (firstNode->prev != &firstnode) {
      firstNode = firstNode->prev;
    }
 
    return firstNode;
  }
 
 public:
  DoubleLinkedList() : curnode(NULL) {
      printf("\nКонструктор начал работу");
    firstnode.next = &lastnode;
    lastnode.prev = &firstnode;    
    printf("\nКонструктор закончил работу");
  }
  
  ~DoubleLinkedList(){
       printf("\033[44m \033[37m \033[1m Деструктор начал работу \033[m \033[m \033[m \n");
       curnode->prev-> next= curnode -> next;
       curnode -> next->prev=curnode -> prev;
       printf(" \033[31m \033[1m Память освобождена \033[m \033[m \n");
       printf("\033[44m \033[37m \033[1m Деструктор завершил работу \033[m \033[m \033[m \n");
  }
 
  void Add(int num) {
    ListNode* newnode = new ListNode(num);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset();
  }
 
  bool HasNext() {
    return curnode && curnode != &lastnode;
  }
 
  int Next() {
    int value = curnode->item;
    curnode = curnode->next;
    return value;
  }
 
  bool HasPrev() {
    return curnode && curnode != &firstnode;
  }
 
  int Prev() {
    int value = curnode->item;
    curnode = curnode->prev;
    return value;
  }
  
  void Reset(bool tobegin = true) {
    if (tobegin) 
      curnode = firstnode.next;
    else
      curnode = lastnode.prev;
}
  void Entry(int count,int method){
      int item, item_1;
      char buffer[500];
      time_t time_var;
      time_var = time(NULL);
      srand(time(NULL));
      
      for (int i = 1; i <= count; i++) {
          if (method == 0){
              printf(" \033[36m \033[1m Введите элемент очереди \033[m \033[m \n");
              fgets(buffer, 120, stdin);
              item = atoi(buffer);
          }else if(method != 0){
              item = rand() % 100 ;
              item_1 = item;
              for (int i = 1; i <= item_1; i++) {
                item = item * (-1);
            }
          }
    ListNode* newnode = new ListNode(item);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset(); 
        }
  }
  
  int isEmpty(){
      if (curnode -> prev == NULL){
          return 1;
      }else{
          return 0;
      }
  }
  
int Value(int coord){
    Reset(true);
    for (int i = 1; i < coord; i++) {
        Next();
        }
    return curnode -> item;
}
};
#endif  /* DOUBLELIST_H */
Вот тебе реализация списка. думаю под себя заточить и сам сможешь.
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
21.11.2011, 06:08     Список котов. #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* 
 * File:   DoubleList.h
 * Author: iWord
 *
 * Created on 10 Октябрь 2011 г., 20:20
 */
 
#ifndef DOUBLELIST_H
#define DOUBLELIST_H
#include <stdio.h>
 
class DoubleLinkedList {
  typedef int ElementType;
  class ListNode {
   public:
    ListNode(int i = 0) : item(i), prev(NULL), next(NULL) {}
    ListNode* prev;
    ListNode* next;
    ElementType item;
  };
 
  ListNode* curnode;
  ListNode firstnode;
  ListNode lastnode;
 
  ListNode* GetLast() {
    ListNode* lastNode = &firstnode;
 
    while (lastNode->next != &lastnode) {
      lastNode = lastNode->next;
    }
 
    return lastNode;
  }
  
  ListNode* GetFirst() {
    ListNode* firstNode = &lastnode;
 
    while (firstNode->prev != &firstnode) {
      firstNode = firstNode->prev;
    }
 
    return firstNode;
  }
 
 public:
  DoubleLinkedList() : curnode(NULL) {
      printf("\nКонструктор начал работу");
    firstnode.next = &lastnode;
    lastnode.prev = &firstnode;    
    printf("\nКонструктор закончил работу");
  }
  
  ~DoubleLinkedList(){
       printf("\033[44m \033[37m \033[1m Деструктор начал работу \033[m \033[m \033[m \n");
       curnode->prev-> next= curnode -> next;
       curnode -> next->prev=curnode -> prev;
       printf(" \033[31m \033[1m Память освобождена \033[m \033[m \n");
       printf("\033[44m \033[37m \033[1m Деструктор завершил работу \033[m \033[m \033[m \n");
  }
 
  void Add(int num) {
    ListNode* newnode = new ListNode(num);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset();
  }
 
  bool HasNext() {
    return curnode && curnode != &lastnode;
  }
 
  int Next() {
    int value = curnode->item;
    curnode = curnode->next;
    return value;
  }
 
  bool HasPrev() {
    return curnode && curnode != &firstnode;
  }
 
  int Prev() {
    int value = curnode->item;
    curnode = curnode->prev;
    return value;
  }
  
  void Reset(bool tobegin = true) {
    if (tobegin) 
      curnode = firstnode.next;
    else
      curnode = lastnode.prev;
}
  void Entry(int count,int method){
      int item, item_1;
      char buffer[500];
      time_t time_var;
      time_var = time(NULL);
      srand(time(NULL));
      
      for (int i = 1; i <= count; i++) {
          if (method == 0){
              printf(" \033[36m \033[1m Введите элемент очереди \033[m \033[m \n");
              fgets(buffer, 120, stdin);
              item = atoi(buffer);
          }else if(method != 0){
              item = rand() % 100 ;
              item_1 = item;
              for (int i = 1; i <= item_1; i++) {
                item = item * (-1);
            }
          }
    ListNode* newnode = new ListNode(item);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset(); 
        }
  }
  
  int isEmpty(){
      if (curnode -> prev == NULL){
          return 1;
      }else{
          return 0;
      }
  }
  
int Value(int coord){
    Reset(true);
    for (int i = 1; i < coord; i++) {
        Next();
        }
    return curnode -> item;
}
};
#endif  /* DOUBLELIST_H */
Вот тебе реализация списка. думаю под себя заточить и сам сможешь.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.11.2011, 09:54     Список котов. #8
Связные списки такие списки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
 
// простенькие классы для двусвязного списка.
// не содержат методов с количеством строк, большим пяти
 
// базовый класс для элемента двусвязного списка
// не содержит данных, содержит некоторую логику построения списка
struct NodeBase {
  NodeBase *prev;
  NodeBase *next;
  // по-умолчанию, при создании нода указывает на саму себя
  NodeBase() : prev(this), next(this) {}
  // альтернативно можно задать предыдущий и следующий элемент списка
  NodeBase(NodeBase *prev_, NodeBase *next_) : prev(prev_), next(next_) {
    // и он сам себя добавит между элементами prev и next
    prev->next = next->prev = this;
  }
  // при удалении исключим элемент из связного списка
  virtual ~NodeBase() {
    prev->next = next;
    next->prev = prev;
  }
};
 
// класс элемент связного списка
// содержит данные
template <class ValueType>
struct Node : public NodeBase {
  ValueType data;
  Node(NodeBase *prev, NodeBase *next, const ValueType &data_)
    : NodeBase(prev, next), data(data_) {};
};
 
template <class ValueType>
class DoubleLinkedList {
 public:
  // чтобы не писать каждый раз Node<ValueType>
  typedef Node<ValueType> NodeType;
  DoubleLinkedList() : base() {}
  // при удалении объекта класса связный список очищается
  ~DoubleLinkedList() {
    clear();
  }
  // добавление в конец связного списка
  void pushBack(const ValueType &value) {
    // создание ноды, которая сама себя вставит в список
    // предыдущий элемент = предыдущему элементу базового элемента
    // следующий элемент = базовому элементу
    new NodeType(base.prev, &base, value);
  }
  // добавление в начало связного списка
  void pushFront(const ValueType &value) {
    // аналогично добавлению в конец
    new Node<ValueType>(&base, base.next, value);
  }
  // получение последнего элемента списка
  const ValueType &back() const {
    return static_cast<NodeType*>(base.prev)->data;
  }
  // получение первого элемента списка
  const ValueType &front() const {
    return static_cast<NodeType*>(base.next)->data;
  }
  // удаление последнего элемента с возвращением его значения
  ValueType popBack() {
    // получение значения последнего элемента
    ValueType result = back();
    // удаление последнего элемента
    delete base.prev;
    // возвращение результата
    return result;
  }
  ValueType popFront() {
    // получение значения первого элемента
    ValueType result = front();
    // удаление последнего элемента
    delete base.next;
    // возвращение результата
    return result;
  }
  // проверка на пустоту связного списка
  bool isEmpty() {
    return base.next == &base;
  }
  // удаление всех элементов связного списка
  void clear() {
    // пока связный список не пустой
    while (!isEmpty())
      // удаляется первый элемент списка
      delete base.next;
  }
  // получение элемента на позиции n.
  const ValueType &at(size_t n) const {
    // получение первого элемента
    NodeBase *i = base.next;
    // проход по n элементов
    while (n-- > 0)
      // переход на следующий элемент
      i = i->next;
    return static_cast<NodeType*>(i)->data;
  }
  // подсчет количества элементов связного списка
  size_t size() {
    size_t result = 0;
    // проход по всем элементам списка
    for (NodeBase *i = base.next; i != &base; i = i->next)
      ++result;
    return result;
  }
 private:
  NodeBase base;
};
 
// класс кота
class Cat {
 public:
  Cat() : age(1) {}
  explicit Cat(int age_) : age(age_) {}
  int getAge() const { return age; }
  void setAge(int value) { age = value; }
  // оператор вывода кота
  friend std::ostream &operator<<(std::ostream &stream, const Cat &cat) {
    return stream << "Cat, age: " << cat.getAge();
  }
 private:
  int age;
};
 
int main(int argc, char *argv[]) {
  DoubleLinkedList<Cat> list;
  // добавление в конец списка
  list.pushBack(Cat(1));
  list.pushBack(Cat(2));
  list.pushBack(Cat(3));
  // размер списка
  std::cout << "List size: " << list.size() << std::endl;
  // получение элемента списка по его порядковому номеру
  std::cout << "At 1: " << list.at(1) << std::endl;
  // вывод всех элементов списка с удалением
  while (!list.isEmpty())
    std::cout << list.popFront() << "; ";
  std::cout << std::endl;
}
Bers
Заблокирован
21.11.2011, 11:21     Список котов. #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
зачем все так сильно усложнять?
И кстати СПИСОК котов не имеет ничего общего с контейнером list

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <vector>
 
class Cat
{
public:
    Cat() { itsAge = 1;}
    ~Cat() {}
    void SetAge(int age) { itsAge = age; }
    int GetAge() const { return itsAge; }
 
private:
    int itsAge;
};
 
class ListCat   //список котов
{
public:
    ListCat(){}
    void Add() { myListCat.push_back( Cat()  ); }
    void Delete() { myListCat.pop_back(); }
    unsigned int HowManyCat() cinst { return myListCat.size(); }
protected:
    std::vector<Cat> myListCat;
};
 
 
int main()
{
    using namespace std;
    int birth;
    ListCat myCats; //список моих котов
 
    while(true) 
    {
        cin >> birth;
        if(birth == 1)
        {
            // в список котов добавляется новый Кот.
            myCats.Add(); //добавили кота
            cout << "added a new cat" << endl;
        }
        if(birth == -1)
        {
            // из списка удаляется кот
            myCats.Delete(); //удалили кота
            cout << "deleted a one cat" << endl;
        }
        cout << "Number of kittens:" << myCats.HowManyCat() << endl;
    }
 
    cin.get();  return 0;
}
Добавлено через 2 минуты
Услышали слово "список" и тут же начали велосипедить.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
22.11.2011, 06:01  [ТС]     Список котов. #10
Bers, молодчик

Добавлено через 10 часов 28 минут
Не стану создавать новую тему, отпишу вопрос прямо тут.
Если я хочу удалить "кота" по указателю, то чем отличается первый вариант от второго (и безопасно)?

Вариант 1. Векторы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class VectorCat 
{
public:
    void Add(Cat* pCat)
    {
        myVectorCat.push_back(pCat);
    }
    bool Remove(Cat* pCat)
    {
        for(std::vector<Cat*>::iterator it = myVectorCat.begin(); it < myVectorCat.end(); ++it)
        {
            if(pCat == (*it))
            {
                myVectorCat.erase(it);
                return true;
            }
        }
        return false;
    }
 
    unsigned int GetCatsCount() const { return myVectorCat.size(); }
protected:
    std::vector<Cat*> myVectorCat;
};
Вариант 2. Списки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ListCat  
{
public:
    void Add(Cat* pCat)
    {
        myListCat.push_back(pCat);
    }
    bool Remove(Cat* pCat)
    {
        if(myListCat.size() >0)
        {
            myListCat.remove(pCat);
            return true;
        }
 
        return false;
    }
 
    unsigned int GetCatsCount() const { return myListCat.size(); }
 
protected:
    std::list<Cat*> myListCat;
};
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
22.11.2011, 08:24     Список котов. #11
Цитата Сообщение от Bers Посмотреть сообщение
зачем все так сильно усложнять?
О, это мы уже проходили.
C++
1
2
3
4
#include <anystllib>
...
...
...
Комментарий ТЦ: "а можно проще?"
или: "это мы не проходили" (тили-тили)

Или думаешь, тут все дружно забыли про STL?

Цитата Сообщение от Bers Посмотреть сообщение
Услышали слово "список" и тут же начали велосипедить.
Ну, для начала, я пишу так, как мне интересно, а как не интересно -- обычно не пишу. Я же не на работе.
В этом разделе всем всегда нужны именно виласипеды. Преподаватели требуют от студиозусов именно их и очень часто запрещают использование STL.
Цитата Сообщение от Bers Посмотреть сообщение
И кстати СПИСОК котов не имеет ничего общего с контейнером list
Предпочтение компоновки -- известная best practice, но "ничего общего" -- явный перебор. Даже лексически -- "СПИСОК не имеет ничего бщего с контейнером, реализующим список" как-то неправильно.

Добавлено через 10 минут
Цитата Сообщение от res Посмотреть сообщение
Если я хочу удалить "кота" по указателю, то чем отличается первый вариант от второго (и безопасно)?
Уважаемый, зачем вам хранить указатели на котов? Почему не хранить сами объекты вместо ссылок на них?
Обычно list быстрее работает с добавлением/удалением элементов, vector быстрее при работе со случайным доступом.

Алгоритм, работающий и с листами и с векторами:
C++
1
2
3
4
5
6
#include <algorithm>
...
std::list<cat> i = std::find(myListCat.begin(), myListCat.end(), cat)
if (i != myListCat.end())
  myListCat.erase(i);
...
Добавлено через 1 минуту
Цитата Сообщение от res Посмотреть сообщение
(и безопасно)?
Скорее всего небезопасно. Чаще всего вообще не безопасно работать с указателями. Храните объекты, а не указатели на них.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 08:32     Список котов.
Еще ссылки по теме:

C++ Необходимо создать список, элемент которого может быть список
Создать список, после каждого отрицательного числа вставить в список 0 C++
Напечатать пронумерованный список список первых 10 наиболее популярных газет C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
22.11.2011, 08:32     Список котов. #12
lemegeton, хорош мозги полоскать. Задача была написана на русском языке.
Yandex
Объявления
22.11.2011, 08:32     Список котов.
Ответ Создать тему
Опции темы

Текущее время: 17:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru