Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
1

Как реализовать работу со списком строк и списком цифр в классе List?

01.09.2010, 15:42. Показов 2821. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Проблема такая
Есть класс-список:

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
150
151
152
153
154
155
156
157
158
159
160
161
162
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Node
{
    friend class List; //разрешение списку обращаться к своим закрытым частям
public:
    int value;
 
private:
    Node* p_next;
    Node* p_prev;
};
 
class List
{
private:
    Node* p_first;
    Node* p_last;
 
private:
    void copy(const List& list)
    {
        Node* p = NULL;
        while (p = list.get_next(p))
        {
            add(p->value);
        }
    }
public:
    List() : p_first(NULL), p_last(NULL)
    {
        //p_first = NULL;
        //p_last = NULL;
    }
    List(const List& list):  p_first(NULL), p_last(NULL)
    {
        copy(list);
    }
 
    List& operator= (const List& list)
    {
        if(this != &list)
        {
            clear();
            copy(list);
        }
 
        return *this;
    }
 
    ~List()
    {
        clear();
    }
 
    void clear()
    {
        while (p_first)
        {
            Node* p = p_first;
            p_first = p->p_next;
            delete p;
        }
        p_last = NULL;
    }
 
 
    void add(int k)
    {
        Node* p = new Node;
        p->p_prev = p_last;
        p->p_next = NULL;
        p->value = k;
 
        if (p_first == NULL)
        {
            p_last = p;
            p_first = p;
        }
        else
        {
            p_last->p_next = p;
            p_last = p;
        }
    }
    Node* get_next(Node* p) const
    {
        return p != NULL ? p->p_next /*правильное условие*/ : p_first /*неправильное условие*/;
    }
    void print()
    {
        cout << "forward:" << endl;
        for (Node* node = p_first; node != NULL; node = node->p_next)//for (Node* node = p_first; node; node = node->p_next)
        {
            cout << node->value <<" ";
        }
    }
 
 
};
 
void user_print(List& list)
{
    Node* p = NULL;
    while (p = list.get_next(p))
    {
        cout << p->value <<" ";
    }
    cout << endl;
}
/*class Iterator
{
private:
List* list;
 
public:
int get_next()
{
 
return 0;
}
};*/
//
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    List L1;
    for( int i=0; i<11; i++)
    {
        L1.add(i+1);
    }
    //L1.print();
    //функция принт:
    user_print(L1);
 
    List L2 = L1; //то же самое, что List L2(L1)
    user_print(L2);
    L2.add(100);
    user_print(L1);
    user_print(L2);
    
    L1 = L2;
    cout << "L1 = L2" <<endl;
    user_print(L1);
    user_print(L2);
 
    L2.add(255);
    cout << "L1 = L2 (255)" <<endl;
    user_print(L1);
    user_print(L2);
 
    cout << "L1 = L1 " <<endl;
    L1 = L1;
    user_print(L1);
 
    getchar ();
    return 0;
}
В нем нужно реализовать программу для работы со списком строк и списком целых чисел.
Образно должно это выглядеть так:
При запуске в окошке появляется надпись -
Введите 5 строк - вводим их,
После этого появляется надпись -
Введите 5 цифр - вводим их,
После этого снова появляется надпись -
Какой из 2-х списков отобразить ? (допустим N1 или N2)
И, в зависимости от того, какое из 2-х значений мы набираем (N1 , N2) на экран должен выводиться один из 2-х введенных нами ранее списков.


Подскажите, как это организовать? Если возможно, с кодом!
Буду очень благодарен .


P.S. Пытался применить подобный код

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
#include <iostream>
#include <list>
#include <string>
 
using namespace std;
 
int main()
{
  list<int> lint;
  list<string> lstr; 
  int n;
  string s;
 
  for (int i=1; i<=5; ++i) 
    {cin>>n; lint.push_back(n);}
  for (int i=1; i<=5; ++i) 
    {cin>>s; lstr.push_back(s);}
 
  cout<<"Enter 1 or 2 as a num of list"<<endl;
  cin>>n;
  switch(n)
  {
    case 1: 
      for (list<int>::iterator iter =lint.begin(); iter!=lint.end(); ++iter )
        {cout<<*iter;} break;
    case 2:
      for (list<string>::iterator iter =lstr.begin(); iter!=lstr.end(); ++iter )
        {cout<<*iter;} break;
    default: 
      cerr<<"Error!"<<endl;
      return -1;
  }
  getchar();
  return 0;
}
Но он видимо работает с классом list из стандартной библиотеки std и в моем классе не реализуется.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2010, 15:42
Ответы с готовыми решениями:

Десятичное число, представленное списком десятичных цифр, представить списком двоичных разрядов
Всем доброго времени суток, необходимо в Visual Prolog представить десятичное число в виде списка...

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

List (Написать программу для работы со списком и реализовать следующие операции над списками)
Написать программу для работы со списком и реализовать следующие операции над списками: 1)...

Как сделать цикл со списком имен файлов и списком для их переименования
Здравствуйте, прошу помощи уважаемые форумчане. Есть файлы с определенными названиями в разных...

16
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 16:02 2
hatter, это реализуется с помощью шаблонов. Пример шаблонного класса и шаблонной функции:
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
#include <iostream>
#include <cstdlib>
#include <string>
 
// Пример шаблонного класса
template<class T>
class foo
{
 
public:
 
    foo(const T& value)
        : m_tValue(value)
    {}
    friend std::ostream& operator << (std::ostream& os, const foo& rhs)
    {
        os << rhs.m_tValue;
        return os;
    }
 
private:
 
    T   m_tValue;
};
 
//Пример шаблонной функции
template<class T>
T sum(const T& add1, const T& add2)
{
    return add1 + add2;
}
 
int main()
{
    foo<int> ivar(5);
    std::cout << ivar << std::endl;
    foo<std::string> svar("Hello, world!");
    std::cout << svar << std::endl;
    std::cout << sum(3.3, .7) << std::endl;
    std::cout << sum(1, 8) << std::endl;
    return EXIT_SUCCESS;
}
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 16:09  [ТС] 3
Цитата Сообщение от Nameless One Посмотреть сообщение
hatter, это реализуется с помощью шаблонов
Так в этом вся и проблема! Я потому и обратился, т.к не понимаю как этот шаблон создать! Конкретно для моего класса и с такой функцией списков строк и цифр.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 16:11 4
Пример шаблонов - см. выше. А вообще я бы порекомендовал почитать какую-нибудь книжку по С++, чтобы не возникало таких вопросов.
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 16:15  [ТС] 5
Цитата Сообщение от Nameless One Посмотреть сообщение
Пример шаблонов - см. выше. А вообще я бы порекомендовал почитать какую-нибудь книжку по С++, чтобы не возникало таких вопросов.
Передо мной их 2 лежит - читал! Поверь, я не стал бы обращаться, если бы смог разобраться самостоятельно.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 16:22 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вот тебе еще пример, чтобы было легче разобраться - шаблонный стек:
my_stack.hpp
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
#ifndef MY_STACK_HPP
#define MY_STACK_HPP
 
#include <stdexcept>
 
namespace my
{
    template<class T>
    class stack
    {
        struct node
        {
            T       value;
            node*   next;
 
            node(const T& val)
                : value(val), next(NULL) {}
        };
        node*       top;
 
    public:
 
        stack();
        ~stack();
        void push(const T& val);
        T pop();
        bool empty() const;
    };
 
    template<class T>
    stack<T>::stack()
        : top(NULL) {}
 
    template<class T>
    stack<T>::~stack()
    {
        while(top)
        {
            node* temp = top;
            top = top->next;
            delete temp;
        }
    }
 
    template<class T>
    void stack<T>::push(const T &val)
    {
        if(top)
        {
            node* newNode = new node(val);
            newNode->next = top;
            top = newNode;
        }
        else
            top = new node(val);
    }
 
    template<class T>
    T stack<T>::pop()
    {
        if(!top)
            throw(std::runtime_error("Can't pop from the empty stack"));
        T retVal = top->value;
        node* delNode = top;
        top = top->next;
        delete delNode;
        return retVal;
    }
 
    template<class T>
    bool stack<T>::empty() const
    {
        return (top == NULL);
    }
}
 
#endif // MY_STACK_HPP
main.cpp
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
#include <iostream>
#include <cstdlib>
 
#include "my_stack.hpp"
 
int main()
{
    try
    {
        my::stack<int> stk;
        std::cout << "Pushing to the stack..." << std::endl;
        for(size_t i= 0; i < 10; ++i, std::cout << i << " ")
            stk.push(i + 1);
        std::cout << std::endl << "Popping from the stack..." << std::endl;
        while(!stk.empty())
            std::cout << stk.pop() << " ";
        std::cout << std::endl;
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
Цитата Сообщение от hatter Посмотреть сообщение
Передо мной их 2 лежит - читал! Поверь, я не стал бы обращаться, если бы смог разобраться самостоятельно.
Значит, либо книги плохие, либо плохо читал. А какие, собственно, сложности возникли при самостоятельном изучении?

Цитата Сообщение от hatter Посмотреть сообщение
Конкретно для моего класса и с такой функцией списков строк и цифр.
Твой список хранит тип int в поле value. Тебе нужно для value заменить тип int на шаблонный параметр.
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 16:26  [ТС] 7
Цитата Сообщение от Nameless One Посмотреть сообщение

а какие, собственно, сложности возникли при самостоятельном изучении?
Сложность в понимании организации шаблона из класса список
ну то-есть я не могу понять, при моей конкретной задаче я должен реализовать работу со списком строк и цифр в самом классе? а потом уже создать файл шаблона и связать его с классом-список?
Я саму суть не могу понять, как они связаны должны быть.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 16:28 8
Кстати, итератор - это такой шаблон проектирования, который предоставляет доступ к элементам обобщенного контейнера, не заостряя внимание пользователя на внутренней структуре контейнера. В языке С++ под итератором можно упрощенно понимать указатель. Но вот самому писать класс итераторов я бы на твоем месте не стал. Тема очень сложная, тем более что тебе не удалось понять шаблоны. Если уж так хочется использовать stl-подобные итераторы в своем классе, то самый простой способ - это сделать агрегацию stl-контейнера в своем классе
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 16:34  [ТС] 9
Да, с пониманием структур у меня действительно плохо!
я логически представляю себе как это все должно выглядеть, а вот когда дело касается написания - возникают проблемы.
Спасибо тебе за оказанную помощь! Буду разбираться в примерах - что-нибудь, да получится!
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 16:41 10
Цитата Сообщение от hatter Посмотреть сообщение
Сложность в понимании организации шаблона из класса список
ну то-есть я не могу понять, при моей конкретной задаче я должен реализовать работу со списком строк и цифр в самом классе? а потом уже создать файл шаблона и связать его с классом-список?
Я саму суть не могу понять, как они связаны должны быть.
Какой файл шаблона? Ты должен создать шаблонный класс списка, в котором тип элемента списка должен быть шаблонным параметром.
Связываение экземпляра шаблонного класса с "файлом шаблона", если я правильно тебя понял, происходит при создании данного экземпляра с помощью явного указания шаблонного параметра.

Вот так должна выглядеть упрощенная структура твоего класса:
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
// Объявление шаблонного класса
template<class T>
class List
{
    
public:
    
    List(); // Конструктор по умолчанию, создает пустой список
    List(const List<T>& rhs); // Копирующий конструктор, создает новый список на основе данного
    ~List(); // Деструктор
    // ... остальные методы
    
private:
    
    struct node // Объявление структуры-узла
    {
        T value; // Заменили тип элемента списка на шаблонный параметр T
        node* next;
        node* previous;
    };
    node* first; // Указатель на первый узел
    node* last; // Указатель на второй узел
};
 
//Реализация шаблонного класса
template<class T>
List<T>::List()
{
    // ... реализация конструктора по умолчанию
}
 
template<class T>
List<T>::List(const List<T> &rhs)
{
    // ... реализация копирующего конструктора
}
 
// ... и так далее
0
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 16:50  [ТС] 11
то есть я в своем классе использую явный указатель шаблонного параметра, переписываю в него все то, что есть в моем исходном классе, по примеру который ты привел. или я снова неверно понял?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 16:58 12
Под явным указанием шаблонного параметра я имел в виду указание типа списка при создании экземпляра класса список. Т.е. запись вида:
C++
1
2
3
std::list<int> iList; // Вот здесь
iList.push_back(5);
// ...
Цитата Сообщение от hatter Посмотреть сообщение
переписываю в него все то, что есть в моем исходном классе, по примеру который ты привел
Вот здесь ты меня вроде бы понял правильно. Тебе нужно заменить везде тип int для переменной value на шаблонный параметр (у меня в примере шаблонный параметр - T).
Ну и естественно, нужно заменить тип int для всех методов класса, которые возвращают значение элемента списка (в возвращаемом значении метода) или добавляют новый элемент (в типе параметра метода - значения нового элемента)
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 17:14  [ТС] 13
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот здесь ты меня вроде бы понял правильно. Тебе нужно заменить везде тип int для переменной value на шаблонный параметр (у меня в примере шаблонный параметр - T).
Ну и естественно, нужно заменить тип int для всех методов класса, которые возвращают значение элемента списка (в возвращаемом значении метода) или добавляют новый элемент (в типе параметра метода - значения нового элемента)
Понял! И там же, насколько я понимаю, я должен буду реализовать метод для списка строк и цифр, суть которого я описал вначале, так?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 17:38 14
Цитата Сообщение от hatter Посмотреть сообщение
Понял! И там же, насколько я понимаю, я должен буду реализовать метод для списка строк и цифр
Нет, так делать не нужно. Вся суть в том, что шаблонные классы являются обобщенными, т.е. не зависят от того, элементы какого типа они должны хранить. И методы таких классов тоже должны быть обобщенными. Когда будешь писать свой класс, пытайся думать о нем не как о списке строк или цифр, а как о списке каких-либо элементов. Не важно, каких. Посмотри мою реализацию стека: в ней нет ничего про работу с числами, строками и т.д. Но тем не менее, этот стек может работать и с целыми числами, и с дробными, и со строками, и даже с объектами определенных тобою или кем-нибудь другим классов. Выбор объектов, которые должен хранить твой шаблонный класс, происходит в момент создания экземпляра твоего класса. На примере стека: my::stack<int> stk; - я создаю экземпляр класса stack, находящегося в пространстве имен my, указывая тип шаблонного параметра - int. Но с тем же успехом я мог создать экземпляр стека, хранящего элементы типа float, double, char, std::string и т.д.
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
01.09.2010, 17:45  [ТС] 15
ааа! хитро'!
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
01.09.2010, 17:46 16
hatter, в том весь смысл
1
1 / 1 / 1
Регистрация: 01.09.2010
Сообщений: 143
03.09.2010, 22:03  [ТС] 17
Цитата Сообщение от Nameless One Посмотреть сообщение
hatter, в том весь смысл
Все, разобрался! Все заработало! Получилось! Спасибо огромное за помощь и советы, Nameless One !
0
03.09.2010, 22:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.09.2010, 22:03
Помогаю со студенческими работами здесь

Как из таблицы со списком, когда аудитории заняты, собрать таблицу со списком когда они свободны
Есть таблица: ID НомерАудитории Дата ВремяНачалааЗанятия ВремяКонца занятия 1 123 ...

Вывод записей в поле со списком в зависимости от другого поля со списком
Уважаемые асы access, помогите пожалуйста! Сразу хочу признаться, я совсем чайник, только...

Фильтрация поля со списком в зависимости от двух других полей со списком
Добрый день, коллеги Появилась потребность сделать форму на Аксесе. Прошерстил весь форум в...

Вывести две таблицы со списком городов и одну со списком их координат
помогите пожалуйста написать макрос.функцией ВПР не пользоваться.такое условие. задача такая: из...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru