Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 30
1

Родовые функции и классы

23.05.2018, 20:24. Показов 1947. Ответов 6
Метки нет (Все метки)

на 10 строке кода нужно реализовать операцию индексирования, которая возвращала бы ссылку на найденный элемент в массиве. Ели элемент не найден, то нужно создать новый элемент с этим индексом и разместить его в массиве. Помогите пожалуйста дописать функцию.
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
#include <iostream>
#include <list>
#include <windows.h>
using namespace std;
 
template <class T> class List
{
    list <T> spisok;
public:
    T &operator[](int n)//Нужно доработать
    {
        typename list <T>::iterator a = spisok.begin();
        typename list <T>::iterator b = spisok.end();
        for(;a!=b;a++)
        return *a;
    }
    List()
    {
 
    }
    List(const T &a)
    {   typename list <T>::iterator c = spisok.begin();
        typename list <T>::iterator b = spisok.end();
        for(;c!=b;c++)
        spisok.push_back(a);
    }
    T operator=(T b)
    {
        spisok.push_back(b);
    }
    int gets()
    {
        return spisok.size();
    }
};
void show(List <double> dob)
{
   if(dob.gets() > 0)
   {
       cout << "List of doubles includes:\n";
       for(int i = 0; i < dob.gets(); i++)
        cout << dob[i] << " ";
       cout << endl;
   }
   else cout << "List of doubles is empty \n";
}
void show(List <char> cob)
{
    if(cob.gets() > 0)
        {
            cout << "List of chars includes:\n";
            for(int i = 0; i < cob.gets(); i++)
                cout << cob[i] << " ";
                cout << endl;
        }
        else cout << "List of chars is empty\n";
 
}
main()
{
    List <double> dob;
    List <char> cob;
    int ch = 0;
    double a;
    char b;
    cout << "Menu: \n1. Add doubles \n2. Add chars \n3. Show all \n4. Copy \n5. Exit\n";
    while(ch != 5)
    {
 
        cin >> ch;
        if(ch == 1)
        {
            cin >> a;
            dob = a;
        }
        if(ch == 2)
        {
            cin >> b;
            cob = b;
        }
        if(ch == 3)
        {
            show(dob);
            show(cob);
        }
        if(ch == 4)
        {
            List <double> ddob(dob);
            show(ddob);
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2018, 20:24
Ответы с готовыми решениями:

Родовые классы
Создать родовой класс в котором реализовать вычисления: в одномерном массиве, состоящем из n...

Родовые классы. Ошибка link.exe
template &lt;class qType&gt; class queue { qType q; int tail, head; public: queue() { head =...

Массив и родовые функции
В одномерном массиве, состоящем из Н вещественных элементов, используя родовые функции, вычислить...

родовые класы
Измените класс queue так, чтобы можно было сохранять и доставать обекты второго класа с...

6
278 / 250 / 209
Регистрация: 14.11.2016
Сообщений: 948
23.05.2018, 20:53 2
Как-то глупо если индекс не найден, то создавать элемент с таким индексом. А если элементов 5, а индекс 19, тогда придется создавать ещё дополнительно 15 элементов? Это по заданию так надо? Лучше наверно исключение бросить.
C++
1
#include <stdexcept>
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
T& operator[](int n)
{
    int count = 0;
    for (T &it : spisok)
    {
        if (count == n)
        {
            return it;
        }
        else
        {
            ++count;
        }
    }
    throw std::out_of_range("index out of range");
}
const T& operator[](int n) // для const объектов
{
    int count = 0;
    for (const T &it : spisok)
    {
        if (count == n)
        {
            return it;
        }
        else
        {
            ++count;
        }
    }
    throw std::out_of_range("index out of range");
}
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 30
23.05.2018, 21:29  [ТС] 3
не работает, нужно без исключений сделать, и да это нужно по заданию. Забыл уточнить, что работа идет с разрежённым массивом, моя вина. Другие советовали просто создать переменную int index и сделать для нее итератор. Потом обращаться к ней через a->index и сравнивать. Беда в том, что компилятор ругается на такое
0
471 / 423 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
23.05.2018, 21:34 4
Devestagion, ну если нету то возьми и добавь нужное количество 0 до этого индекса и с этим индексом введенное значение.
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 30
23.05.2018, 22:00  [ТС] 5
я бы добавил, но беда вся в том, что я не могу организовать поиск по индексу, в начале вроде бы писал об этом
0
471 / 423 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
23.05.2018, 23:03 6
Devestagion, а что его организовывать?
Если размер листа < Введенного индекса, добавлять, пока не станет равным. Значение по индексу задать.

Добавлено через 16 минут
Не переделывал ничего, кроме оператора [].
P.s. Зачем писать 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
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
#include <iostream>
#include <list>
#include <windows.h>
using namespace std;
 
template <class T> 
class List
{
    list <T> spisok;
public:
    T& operator[](int n)//Нужно доработать
    {
        while (spisok.size() < n)
        {
            T temp = T();
            spisok.push_back(temp);
        }
        typename list <T>::iterator a = spisok.begin();
        typename list <T>::iterator b = spisok.end();
        for (; a != b; a++)
            return *a;
    }
    List()
    {
 
    }
    List(const T &a)
    {
        typename list <T>::iterator c = spisok.begin();
        typename list <T>::iterator b = spisok.end();
        for (; c != b; c++)
            spisok.push_back(a);
    }
    int gets()
    {
        return spisok.size();
    }
};
 
void show(List <double> dob)
{
    if (dob.gets() > 0)
    {
        cout << "List of doubles includes:\n";
        for (int i = 0; i < dob.gets(); i++)
            cout << dob[i] << " ";
        cout << endl;
    }
    else cout << "List of doubles is empty \n";
}
 
void show(List <char> cob)
{
    if (cob.gets() > 0)
    {
        cout << "List of chars includes:\n";
        for (int i = 0; i < cob.gets(); i++)
            cout << cob[i] << " ";
        cout << endl;
    }
    else cout << "List of chars is empty\n";
 
}
 
int main()
{
    List <double> dob;
    List <char> cob;
    cout << dob[16] << endl;
    show(dob);
    return 0;
}
Вообще, конечно, надо всё переделывать тут.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    T& operator[](int n)//Нужно доработать
    {
        while (spisok.size() < n)
        {
            T temp = T();
            spisok.push_back(temp);
        }
 
        int i = 0;
        list<T>::iterator it = spisok.begin();
        while (true)
        {
            if (i == n)
                return (*it);
            i++;
        }
    }
По идее будет так. Но лучше юзни вектор, куда проще и меньше мороки.
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 30
23.05.2018, 23:28  [ТС] 7
спасибо за помощь огромное, к сожалению вектора нельзя юзать, + запоминает только 1ый элемент почему то. Я что то уже перестал понимать как должна работать эта метода....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2018, 23:28

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin
Братаны, выручайте!:help: Общая постановка. Пользовательский класс Х должен содержать необходимые...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
Братаны, выручайте! Общая постановка. Пользовательский класс Х должен содержать необходимые...

классы,функции
1. Плоская геометрическая фигура а) круг (целочислен. координаты центра окружности, радиус) б)...

Классы и функции
Вопрос по поводу &quot;идеологии&quot; написания классов. Как лучше писать реализации? Есть ли смысл...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru