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

Ссылка на нулевой коэффициент полинома

26.04.2019, 19:56. Просмотров 270. Ответов 13
Метки нет (Все метки)

Дан полином который хранится как односвязный список не нулевых коефициентов при степенях. Нужно перегрузить operator[] где в [] будет степень икса, а возвращаться будет коеифицент. При этом т.к operator [] может использоваться как a[3] = 4; нужно что-бы оператор возвращал ссылку на элемент.

C++
1
2
3
4
5
6
7
8
9
10
11
int& Polinom::operator[](int p) 
{
    Element* temp = head;
    while (temp != nullptr)
    {
        if (temp->power == p)
            return temp->koef;
        temp = temp->next;
    }
    return ?;
}
Но из-за того что поленом разрежённый, то есть всё хранится как степень - коефицент, а следовательно если k = 0, то и степени нет, а значит и такой ячейки в списке нет. И когда передаётся степень возможны 3 варианта:
1) Вернётся коефициент
2) Не вернётся ничего потому-что степень равна 0 ( а списка 0 коефициентов нет )
3) Не вернётся ничего потому-что слогаемого с такой степенью в полиноме нет.
2 и 3 можно обобщить и свести к единому случаю, в итоге получается что мы должны вернуть 0, но как это сделать без статических переменных? Ссылку на что я должен вернуть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2019, 19:56
Ответы с готовыми решениями:

Коэффициент достоверности у полинома
Здравствуйте, подскажите, как правильно использовать функцию "corr" в данной ситуации. f1 -...

Найти коэффициент полинома
Найти коэффициент полинома {({x}^{2}+y+{z}^{4})}^7 при коэффициентах {x}^{2}y{z}^{4} 1.Сколько...

Ошибка "ссылка на нулевой объект" в классе, наследуемом от Fragment
Здравствуйте! Я хочу добавить Twitter api, но не могу это правильно сделать. Из-за этого...

Задача интерполяции методом полинома Ньютона и полинома Лагранжа
Решить задачу интерполяции методом полинома Ньютона и полинома Лагранжа 1 2 4 ...

13
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,912
26.04.2019, 23:01 2
Цитата Сообщение от EmikGG Посмотреть сообщение
Ссылку на что я должен вернуть?
В этих случаях ни на что. Здесь лучше всего бросить исключение.
0
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 25
26.04.2019, 23:14  [ТС] 3
Cейчас это выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int& Polinom::operator[](int p)
{
    Element* temp = head;
    while (temp != nullptr)
    {
        if (temp->power == p)
        {
            return temp->koef;
        }
        temp = temp->next;
    }
    
    throw "Такой степени нет в полиноме";
}
Невозможность вернуть 0 как палка в колесе, забирает столько полезных фич.
0
3414 / 1902 / 796
Регистрация: 07.02.2019
Сообщений: 5,123
26.04.2019, 23:16 4
EmikGG, не стоит выбрасывать встроенные типы, определите свой класс или выбросите библиотечное исключение
0
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,912
26.04.2019, 23:23 5
Цитата Сообщение от EmikGG Посмотреть сообщение
Невозможность вернуть 0 как палка в колесе, забирает столько полезных фич.
Если вы хотите вернуть ноль, то возвращайте указатель, а не ссылку.
Нет никаких палок

Добавлено через 49 секунд
Также, как вариант, можете вернуть нечто вроде std::optional<int>.
0
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 25
26.04.2019, 23:27  [ТС] 6
Но ведь потом надо будет разименовывать *mas[1] = 5; Это уже не по канону. Тот момент когда перфекционизм становится выше функционала.
0
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,912
26.04.2019, 23:30 7
Цитата Сообщение от EmikGG Посмотреть сообщение
Но ведь потом надо будет разименовывать *mas[1] = 5;
Если вы собрались так делать, то какое по-вашему поведение должно быть в случае, если бы там была "нулевая" ссылка?
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
26.04.2019, 23:30 8
А я вообще не понимаю острой необходимости хранить именно ненулевые коэффициенты полинома. Вот прям приспичило сэкономить пару байт в массиве коефф-тов! Чем вам не угодил простой массив?
p(x)=x^4+x+25 ==> {1, 0, 0, 1, 25} или {25, 1, 0, 0, 1} ?
вся арифметика с такими массивами пишется на раз два.
0
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 25
26.04.2019, 23:33  [ТС] 9
Kuzia domovenok, не по своей воле я так делаю, лабораторная принуждает. Для меня лично Ваш вариант выглядит значительно лучше.

Добавлено через 1 минуту
DrOffset, неопределённое Хотя изначально по логике я ожидал что-то типо nullptr, но всё оказалось крайне грустно и для существования ссылки нужен не константный объект.
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
26.04.2019, 23:39 10
вся арифметика с такими массивами пишется на раз два.
ну сложишь ты что-то лишний раз с этим нулевым коэффициентом... и что?
будет у тебя допустим сложение полиномов?
C++
1
2
3
4
5
6
for (i=0; i<left.size() && i< right.size(); ++i)
   result.push_back(left[i]+right[i]);
for (; i<left.size(); ++i)
    result.push_back(left[i]);
for (; i<right.size(); ++i)
    result.push_back(right[i]);
а сколько и каких ifов тебе придётся написать, чтобы сложить два полинома с пропусками на месте некоторых моночленов с нулевыми к-тами?
0
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,912
26.04.2019, 23:39 11
Цитата Сообщение от EmikGG Посмотреть сообщение
неопределённое
Если отбросить альтернативные варианты, а рассмотреть ситуацию в общем, когда необходимо вернуть ссылку, но объекта, на который она могла бы ссылаться не существует, то исключение как раз лучше всего описывает эту ситуацию, т.к. не дает "неопределенности" произойти, оставляя во всех остальных, корректных случаях, привычную семантику: mas[1] = 5;.
Есть и другие варианты, в том числе с возможностью просто заглушить "неопределенное" поведение. Но разве вам это нужно? Слишком высокие абстракции для простой лабораторной. Сделайте лучше как в посте #8. Я уверен, если вы подумаете хотя бы полчаса, то сможете и выполнить требования лабораторной, и применить совет из этого поста.
0
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 25
26.04.2019, 23:45  [ТС] 12
Kuzia domovenok, где-то столько. Конечно если рассматривать небольшие полиномы, то смысла в этом мало. Но согласитесь если мы говорим о размерностях в сотни тысяч, а ещё это ярко видно на разрежённых матрицах, так и вовсе много памяти экономится. По этому игра стоит свеч как по мне, если говорить о практическом применении.
Кликните здесь для просмотра всего текста

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
Polinom Polinom::operator+(const Polinom & other)
{
    Polinom result;
    Element* temp = head;
    Element* tempother = other.head;
    Element* tempresult = result.head;
    while (temp != nullptr)
    {
        while (tempother != nullptr && temp->power != tempother->power)
        {
            tempother = tempother->next;
        }
        if (tempother == nullptr)
        {
            if (result.head == nullptr)
            {
                result.head = new Element(temp->koef, temp->power);
                tempresult = result.head;
            }
            else
            {
                tempresult->next = new Element(temp->koef, temp->power);
                tempresult = tempresult->next;
            }
            result.size++;
        }
        else
        {
            if (temp->koef + tempother->koef != 0)
            {
                if (result.head == nullptr)
                {
                    result.head = new Element(temp->koef + tempother->koef, temp->power);
                    tempresult = result.head;
                }
                else
                {
                    tempresult->next = new Element(temp->koef + tempother->koef, temp->power);
                    tempresult = tempresult->next;
                }
                result.size++;
            }
        }
        temp = head;
        temp = temp->next;
        tempother = other.head;
    }
    Element* iterator = result.head;
    while (tempother != nullptr)
    {
        while (temp != nullptr && tempother->power != temp->power)
        {
            temp = temp->next;
        }
        while (iterator != nullptr && iterator->power != tempother->power)
        {
            iterator = iterator->next;
        }
        if (temp != nullptr && iterator == nullptr)
        {
            if (temp->koef + tempother->koef != 0)
            {
                if (result.head == nullptr)
                {
                    result.head = new Element(temp->koef + tempother->koef, temp->power);
                    tempresult = result.head;
                }
                else
                {
                    tempresult->next = new Element(temp->koef + tempother->koef, temp->power);
                    tempresult = tempresult->next;
                }
                result.size++;
            }
        }
        else if (temp == nullptr && iterator == nullptr)
        {
            if (result.head == nullptr)
            {
                result.head = new Element(tempother->koef, tempother->power);
                tempresult = result.head;
            }
            else
            {
                tempresult->next = new Element(tempother->koef, tempother->power);
                tempresult = tempresult->next;
            }
            result.size++;
        }
        tempother = tempother->next;
        temp = head;
        iterator = result.head;
    }
    return result;
}


p.s данный код не претендует на идеальность и не лишён недостатков
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
26.04.2019, 23:53 13
EmikGG, ооо и кстати ещё одна проблема всплывает. (простите все, настроение располагает к критиканству чужих исходников).
Велосипедный список прямо в коде полинома! Зачем вместо того, чтобы разделять сущности и скрывать реализацию, наоборот возводить в квадрат свою работу и в одном и том же месте, складывать коэффициенты полинома и тут же следить за всякими headами и tailами в списке - в совершенно абстрагированной от полиномов теме?
0
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 25
26.04.2019, 23:58  [ТС] 14
Вот по этому так важен оператор [] дабы повысить читабельность и избавиться от нужды в дополнительных классах. Да и просто сжать код.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2019, 23:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нулевой порт. Исходящие соединения. Почему нулевой??
С нулевого порта часто идут udp до прова. Зачем??? Они обычно идут с других портов. Обьясните...

Что лучше сквозная ссылка или одна статейная ссылка с одного домена?
Что лучше сквозная ссылка или одна статейная ссылка с одного домена?

Если нет файла, но есть ссылка, то будет отображаться ссылка на указанную страницу...
Здравствуйте, понадобилась помощь в php)) В общем есть такой код: &lt;?php $file =...

Как перенести продублировать данные из справочника.ЕдиницыИзмерения.Ссылка в справочник КлассификаторЕдиницИзмерения.Ссылка
Ну вапрос таков есть два справочника 1)КлассификаторЕдиницИзмерения и 2) ЕдиницыИзмерения нужна...

Как проверить - есть ли обратная ссылка ссылка?
Добрый вечер! Есть сайт. Обменялся год назад с другими сайтами ссылками. Сейчас хочу проверить...

Загаловок как ссылка - но не ссылка в статье
Как думаете, можно сделать кликабельные загаловки как тут? http://tut.by/ - то есть на главной...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.