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

Сбой данных. Списки списков. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
14.04.2012, 17:55     Сбой данных. Списки списков. #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
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
#include <iostream>
#include <locale>
#include <string>
#include <conio.h>
#include <math.h>
using namespace std;
 
struct Mnolen
{
    char s[5];
    int k;
    Mnolen *next;
};
struct System
{
    Mnolen m;
    System *next;
};
int main()
{
    setlocale(LC_ALL,"");
    Mnolen *e = new Mnolen;             //для хранения списка-многочлена
    Mnolen *first = new Mnolen;         //указатель на первый элемент многочлена
    System *sys = new System;           //для списка-системы
    System *nach = new System;          //первый элемент системы
    System *prom = new System;          //элемент системы для промежуточных вычислений
    System *itog = new System;          //ответ
    int count = 0, summ = 0, cp = 0;
    sys->m = *e;
    nach = sys;
    while (2)
    {
        e = new Mnolen;
        first = e;
        while (1)
        {
            cout<<"Введите переменную и коэфициент:"<<endl;  //задание многочленов
            cin>>e->s;
            if (e->s[0] == '0') break;
            cin>>e->k;
            e->next = new Mnolen;
            e = e->next;
        }
        e = first;
        /*while (e->s[0] != '0')
        {
            cout<<e->k<<":"<<e->s<<endl;
            e = e->next;
        }*/
        if (first->s[0] == '0') break;
        sys->m = *e;                        //запись многочленов в систему
        sys->next = new System;
        sys->next->m.s[0] = '0';
        sys = sys->next;
    }
    sys = nach;
    /*while (3)
    {
        *e = sys->m;
        while (e->s[0] != '0')
        {
            cout<<e->k<<":"<<e->s<<" - ";
            e = e->next;
        }
        cout<<";"<<endl;
        if (sys->next->m.s[0] == '0') break;
        sys = sys->next;
    }*/
    sys = nach;
    prom = nach;
    while (5)   //проход по системе и сравнение многочленов
    {
        sys = nach;
        cp = 0;
        while (4)
        {           
            summ = 0;
            while (prom->m.s[0] != '0')         //проход по элементам многочлена, сравниваемого с другими
            {                                   //элементами системы
                e = &sys->m;//Здесь!
                while (e->s[0] != '0')          //проход по элементам многочлена. Сравнение переменных
                {                               //и в случае равенства плюсование к сумме произведения коэфициентов
                    if (strcmp(prom->m.s, e->s) == 0)
                    {
                        summ = summ + (prom->m.k)*(e->k);
                        cout<<"+";              
                    }
                    e = e->next;
                    /*else
                    {
                        summ = 999;
                        e = e->next;
                        //prom->m = *prom->m.next;
                        break;
                    }*/ 
                }
                prom->m = *prom->m.next;
            }
            if (summ == 0)          //если многочлены ортогональны - +1 к количеству
                    cp++;           //ортогональных с проверяемым многочленов
            cout<<";"<<endl;
            if (sys->next->m.s[0] == '0') break;
            sys = sys->next;
        }
        if (cp > count)         //если у данного многочлена количество ортогональных 
        {                       //с ним многочленов больше, чем у других проверенных
            count = cp;         //присваиваем его к итогу.
            itog = prom;
        }
        if (prom->next->m.s[0] == '0') break;
        prom = prom->next;
    }
    *e = itog->m;
    while (e->s[0] != '0')
    {
        cout<<e->k<<":"<<e->s<<endl;
        e = e->next;
    }
    getch();
    return 0;
}
Дело вот в чём: В этой
C++
1
e = &sys->m;
строчке происходит сбой. Элементы всех структур начинают указывать на себя же. По сути, больше всего сбой подвергается именно nach, хотя он не изменятеся по алгоритму. Причём сбой происходит после второго обращения к ней. При этом, ранее для тестинга, выводил саму матрицу, используя ту же строчку, и всё хорошо работало, хотя и обращался к такой строчке при выводе многократно.
В чём, собственно, проблема? Почему происходит сбой? Как это исправить или как иначе произвести это присвоение?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
22.04.2012, 19:39  [ТС]     Сбой данных. Списки списков. #21
first - указатель на начало многочлена. На начало системы указывает nach. Прежде чем проверять на ортогональность, я делал вывод системы. Выводил всё верно. И дальше на аналогии прохода по системе при выводе описал проход при сравнении.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.04.2012, 20:50     Сбой данных. Списки списков. #22
Цитата Сообщение от Dan299 Посмотреть сообщение
first - указатель на начало многочлена. На начало системы указывает nach
А чё ж не написал в комментах-то? Сутки потеряли.
Короче, я делаю всегда так, чтобы указатель next последнего элемента списка указывал на ноль. Я смотрел в стандарте, но вроде там такого нет, но если он указывает не на NULL, это нехорошо. Это, считай, мы если пробегаемя по списку, то ОБЯЗАТЕЛЬНО заранее должны знать его размер. А если не знаем? Как тогда остановимся? Никак залезем непонятно в какую область памяти и кранты всему.

По-моему. У тебя последний элемент списка nach указывает НЕ НА NULL, вот я проверяю (ввожу один или два многочлена):
C++
1
2
3
4
    while (nach!=NULL) {
     printf ("эту строку я вижу вечно\n");
     nach= nach->next;
    }
Сделай, чтобы последний элемент списка nach указывал на NULL и чтобы последний элемент каждого списка-многочлена также указывал на NULL (последнее я не проверял, но по коду вижу, что ты нигде к NULL не приравниваешь ничё.)

...Не уверен, что это поможет, но со стандартизированным кодом работать легче. Да и вдруг и правда поможет?

Добавлено через 15 минут
А я понял, ты по коэффициентам проверяешь что ли концы списков?
То есть если в структуре
C++
1
2
3
4
5
6
struct Mnolen
{
    char s[5];
    int k;
    Mnolen *next;
};
s[0]== '0', то это конец многочлена,так? И этот элемент мы как коэффициент+переменую не рассматриваем, а она у на только служит для обозначения гшраницы многочлена?
А вот как определяется конец списка многочленов я не понимаю.

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Всё ж таки, последовал бы ты моему совету, использовал бы NULL для указания конца списков
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
23.04.2012, 09:05  [ТС]     Сбой данных. Списки списков. #23
Мы итак уже 2 недели потеряли не понятно на что. Так что чё уж сутки. Тем более меня весь день дома не было.
Да. Многочлен ограничивается нулём. А система нулевым многочленом. Т.е. у которого первая же переменная ноль.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
23.04.2012, 10:46     Сбой данных. Списки списков. #24
C++
1
Многочлен ограничивается нулём. А система нулевым многочленом. Т.е. у которого первая же переменная ноль
Чё ж раньше-то не написал? Всё ж таки необычные концы списков, можно было бы и разъяснить комментах или как.
Продолжим.

C++
1
Проблема заключается в том, что внутри проверки на ортогональность при переходе prom->m = prom->m->next одновременно переходит и значение nach, который по сути должен оставаться неизменным на протяжении всей проги. И хотя он конретно никуда не переходит, но почему то самопроизвольно меняется при изменении prom->m. В чём дело? Как исправить?
Всё ж таки мне непонятно до конца. Я так понял, nach до
C++
1
prom->m = prom->m->next
имеет одно значение, а после- другое? Проверяю, добавляю код проверки nach:

C++
1
2
3
                printf ("тут nach= %x\n", (unsigned int)nach);
                prom->m = prom->m->next;
                printf ("а тут nach= %x\n", (unsigned int)nach);
Тестирую:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Введите переменную и коэфициент:
q
2
Введите переменную и коэфициент:
0
Введите переменную и коэфициент:
w
3
Введите переменную и коэфициент:
0
Введите переменную и коэфициент:
0
+тут nach= 3d4250
а тут nach= 3d4250
;
тут nach= 3d4250
а тут nach= 3d4250
;
тут nach= 3d4250
а тут nach= 3d4250
;
2:q
Как видно, nach ни разу не меняется. Чё там куда переходит, непонятно

+++++++++++++++++++++++++++++++++++++++++++++++++

Если nach и в самом деле иногда меняется, тебе следовало бы написать, при вводе каких значений это происходит. Я же просил:
Просто дай данные на которых программа спотыкается вот и всё. Потом дальше будем разбираться.
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
23.04.2012, 16:45  [ТС]     Сбой данных. Списки списков. #25
Цитата Сообщение от kravam Посмотреть сообщение
Чё ж раньше-то не написал? Всё ж таки необычные концы списков, можно было бы и разъяснить комментах или как.
Продолжим.
так вроде описал как данные вводить. Оттуда же видно что и как.


Цитата Сообщение от kravam Посмотреть сообщение
Как видно, nach ни разу не меняется. Чё там куда переходит, непонятно
Я отслеживал этот момент при пошаговом проходе f10. Смотрел какие значения nach. После перехода prom он меняется. Изза чего в принципе на ортогональность вроде проверяется только первый многочлен.

Цитата Сообщение от kravam Посмотреть сообщение
Если nach и в самом деле иногда меняется, тебе следовало бы написать, при вводе каких значений это происходит. Я же просил:
Такая фигня при абсолютно любых данных. Я много вариантов пробовал и оно везде так.

Добавлено через 3 минуты
Цитата Сообщение от kravam Посмотреть сообщение
printf ("тут nach= %x\n", (unsigned int)nach);
prom->m = prom->m->next;
printf ("а тут nach= %x\n", (unsigned int)nach
и ты кстати проверяешь сам nach. А по сути у него меняется поле m.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
23.04.2012, 17:47     Сбой данных. Списки списков. #26
Цитата Сообщение от Dan299 Посмотреть сообщение
и ты кстати проверяешь сам nach. А по сути у него меняется поле m.
да?..
Ну тогда так, я не знаю, удивит тебя или нет, но nach->m меняется именно в тех случаях, когда nach->m
(которая меняться не должна, если я правильно понял) и prom->m (которую ты ЯВНО меняешь) лежат по одному и тому же адресу. Поменял prom->m== поменялась nach->m. Это одна и та же переменая, просто с разными именами. Так что всё предсказуемо.

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
#include <windows.h>
#include <iostream>
#include <locale>
#include <string>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
using namespace std;
struct Mnolen
{
    char s[5];
    int k;
    Mnolen *next;
};
struct System
{
    Mnolen *m;
    System *next;
};
int main()
{
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 
 
    setlocale(LC_ALL,"");
    Mnolen *e = new Mnolen;
    Mnolen *first = new Mnolen;
    System *sys = new System;
    System *nach = new System;
    System *prom = new System;
    System *itog = new System;
    int count = 0, summ = 0, cp = 0, b = 5;
    nach = sys;
    while (2)
    {
        e = new Mnolen;
        first = e;
        while (1)
        {
            cout<<"Ââåäèòå ïåðåìåГ*Г*ГіГѕ ГЁ êîýôèöèåГ*ГІ:"<<endl;
            cin>>e->s;
            if (e->s[0] == '0') break;
            cin>>e->k;
            e->next = new Mnolen;
            e = e->next;
        }
        e = first;
        if (first->s[0] == '0') break;
        sys->m = e;
        sys->next = new System;
        sys->next->m = new Mnolen;
        sys->next->m->s[0] = '0';
        sys = sys->next;
    }
 
 
    
    
 
    prom = nach;
    while (5)
    {
        first = prom->m;
        sys = nach;
        cp = 0;
        b = 5;
        while (b != 0)
        {           
            summ = 0;
            e = sys->m;
            prom->m = first;
            while (prom->m->s[0] != 48)
            {
                e = sys->m;
                while (e->s[0] != '0')
                {
                    if (strcmp(prom->m->s, e->s) == 0)
                    {
                        summ = summ + (prom->m->k)*(e->k);
                        cout<<"+";              
                    }
                    e = e->next;
                }
                
                printf ("\nГІГіГІ nach->m= %x\n", (unsigned int)nach->m);
                if ((unsigned int)&(nach->m)== (unsigned int)&(prom->m)) {  
                 printf ("ГЁ Г¤Г*, &(nach->m)== &(prom->m), äåéñòâèòåëüГ*Г® %x== %x\n",\
                        (unsigned int)&(nach->m), (unsigned int)&(prom->m));
                 printf ("ïîýòîìó Г№Г*Г± nach->m áóäåò ÄÐÓÃÎÅ\n");
                }        
                prom->m = prom->m->next;
                printf ("Г* ГІГіГІ nach->m= %x\n\n", (unsigned int)nach->m);
            }
            if (summ == 0)
                    cp++;
            cout<<";"<<endl;
            if (sys->next->m->s[0] == '0') b = 0;
            sys = sys->next;
        }
        if (cp > count)
        {
            count = cp;
            itog->m = first;
        }
        if (prom->next->m->s[0] == '0') break;
        prom = prom->next;
    }
    e = itog->m;
    while (e->s[0] != '0')
    {
        cout<<e->k<<":"<<e->s<<endl;
        e = e->next;
    }
    getch();
    return 0;
}
Добавлено через 3 минуты
Ты же сам написал:
C++
1
prom = nach;
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
24.04.2012, 17:49  [ТС]     Сбой данных. Списки списков. #27
Я в принципе подумывал, что может потому что на одну ссылку указывает. Но хз как это исправить. И всё таки надеялся, что в разных переменных поле будет разный адрес иметь.

Добавлено через 22 часа 12 минут
Так как это исправить?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.04.2012, 18:29     Сбой данных. Списки списков. #28
Ну я не знаю, как. Если бы ты расписал

1) алгоритм проверки на ортогональность (у тебя ни одного коммента ведь нет), это увеличило бы шансы на то, что кто-нибудь поможет. Способствовать этому также будет если ты

2) конец списка обозначишь NULL. Ну и также своими словами на пальцах, в двух словах,

3) что такое ортогональные многочлены. А то слишком заумно в инете. Я бы так сделал.

Глядишь, кто-нибудь и откликнулся бы. Такие дела.
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
24.04.2012, 18:54  [ТС]     Сбой данных. Списки списков. #29
Коментарии сначала были. Потом там менялись только пара строчек.
NULL я не хочу делать. Потому что и с пользовательской стороны проще через ноль и в алгоритме обработать. По сути списки всё равно налом заканчиваются, просто выходят уже на нуле.


И такая мысль была. Если например список системы оформить в виде класса и у него nsch сделать полем. Это может решить проблему? Или можно какнибудь зафиксировать nach в имеющейся проге, чтобы он никогда не менялся?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.04.2012, 19:58     Сбой данных. Списки списков. #30
Ну если есть комменты разъясни что такое ортогональные, попробую помочь.
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
24.04.2012, 20:17  [ТС]     Сбой данных. Списки списков. #31
Цитата Сообщение от Dan299 Посмотреть сообщение
У ортогональных многочленов скалярное произведение равно 0. Т.е. сумма произведений коэфициентов при одинаковых степенях (переменных) равна 0.
Например два многочлена 2x+3y+4z=0 и 3x-2y=0. Они ортогональны потому, что
2*3 + 3*(-2) + 4*0 =0
(коэффициенты при х)+(коэффициенты при у)+(коэффициенты при z)=0
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.04.2012, 22:02     Сбой данных. Списки списков. #32
И вновь я вынужден попросить данные, на которых твоя программа спотыкается, во например на этом она не спотыкается

2x+4y= 0
4x- 2y= 0

Может, с программой всё ОК?
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
25.04.2012, 13:03  [ТС]     Сбой данных. Списки списков. #33
Тут норм выдаёт потому что первый многочлен подходит ответу. А прога просто всегда выдаёт как ответт первый многочлен.

Добавлено через 2 минуты
Например.
5y = 0
6x = 0
3x + 2y = 0
7z = 0
По сути ответ чётвёртый многочлен. Он ортогонален 3м остальным, а первые два только двум, третий - только одному. Но она выдаёт ответ первый многочлен. Потому что она всегда выдаёт первый многочлен.
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
26.04.2012, 13:07  [ТС]     Сбой данных. Списки списков. #34
Сделал я эту прогу. Вроде работает верно. Решил добавить ещё одну переменную. Спасибо, что пробовал помочь. Вот код, если кому-то понадобиться (хотя немного сомнительно, что он преподам понравится ^.^)
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
#include <iostream>
#include <locale>
#include <string>
#include <conio.h>
#include <math.h>
using namespace std;
struct Mnolen
{
    char s[5];
    int k;
    Mnolen *next;
};
struct System
{
    Mnolen *m;
    System *next;
};
int main()
{
    setlocale(LC_ALL,"");
    Mnolen *o = new Mnolen;
    Mnolen *e = new Mnolen;
    Mnolen *first = new Mnolen;
    System *sys = new System;
    System *nach = new System;
    System *prom = new System;
    System *itog = new System;
    int count = 0, summ = 0, cp = 0, b = 5;
    nach = sys;
    while (2)
    {
        e = new Mnolen;
        first = e;
        while (1)
        {
            cout<<"Введите переменную и коэфициент:"<<endl;
            cin>>e->s;
            if (e->s[0] == '0') break;
            cin>>e->k;
            e->next = new Mnolen;
            e = e->next;
        }
        e = first;
        if (first->s[0] == '0') break;
        sys->m = e;
        sys->next = new System;
        sys->next->m = new Mnolen;
        sys->next->m->s[0] = '0';
        sys = sys->next;
    }
 
    prom = nach;
    while (5)
    {
        first = prom->m;
        sys = nach;
        cp = 0;
        b = 5;
        while (b != 0)
        {           
            summ = 0;
            e = sys->m;
            o = first;
            while (o->s[0] != 48)
            {
                e = sys->m;
                while (e->s[0] != '0')
                {
                    if (strcmp(o->s, e->s) == 0)
                    {
                        summ = summ + (o->k)*(e->k);
                        //cout<<"+";                
                    }
                    e = e->next;
                }
                o = o->next;
            }
            if (summ == 0)
                    cp++;
            //cout<<";"<<endl;
            if (sys->next->m->s[0] == '0') b = 0;
            sys = sys->next;
        }
        if (cp > count)
        {
            count = cp;
            itog->m = first;
        }
        if (prom->next->m->s[0] == '0') break;
        prom = prom->next;
    }
    e = itog->m;
    cout<<"Многочлен ортогональный наибольшему числу других многочленов системы:"<<endl;
    while (e->s[0] != '0')
    {
        cout<<e->k<<e->s;
        if (e->next->k > 0)
            cout<<"+";
        if ((e->next->k < 0) && (e->next->k > -1000))
            cout<<"-";
        e = e->next;
    }
    cout<<"=0";
    getch();
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
26.04.2012, 21:11     Сбой данных. Списки списков. #35
Не решил
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
Введите переменную и коэфициент:
x
5
Введите переменную и коэфициент:
y
2
Введите переменную и коэфициент:
0
Введите переменную и коэфициент:
x
4
Введите переменную и коэфициент:
y
3
Введите переменную и коэфициент:
0
Введите переменную и коэфициент:
x
2
Введите переменную и коэфициент:
y
2
Введите переменную и коэфициент:
0
Введите переменную и коэфициент:
0
Многочлен ортогональный наибольшему числу других многочленов системы:
3998080D=+3998088Ђ=+3998096?=+3998104ђ=+3998112&#152;=+3998120*=+3998128Ё=+399
8136°=+3998144ё=+3998152А=+3998160И=+3998168Р=+3998176Ш=+3998184а=+399819
2и=+3998200р=+3998208ш=+3998216+399822=+3998232=+3998240=+3998248 =+399
8256(=+=0
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
26.04.2012, 21:46  [ТС]     Сбой данных. Списки списков. #36
kravam, Просто у меня там не учтён вариант отсутствия решения. Т.е. там у тебя нету подходящих, т.е. нет решения. А так вроде работает.... Кстати, да.. надо добавить на случай отсутствия решения.. Спасибо. Да и вообще спасибо, что пытался помочь))
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
26.04.2012, 22:24     Сбой данных. Списки списков. #37
К ознакомлению. Вот так или примерно так должны обстоять дела с комментами. Остался последний рывок- пробежаться по многочленам и найти таки ортогональные; завтра если чё сделаю

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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#include <windows.h>
#include <stdio.h>
#include "stdio.h"
#include <iostream>
#include <vector> 
#include <algorithm>
using namespace std;
 
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
//Класс "коэффициент и переменная"
class ko_i_per {
 
 public: 
   ko_i_per () { 
    printf ("вводи коэффициент и переменную, 0 как коэффициент- конец ввода, 0 как первый коэффициент-\
             последний многочлен\n");
    cin>> k; 
    if (k)
     cin>> p;
   };
 
 //Возвращает адрес себя
 ko_i_per* adres_seba () {return this;}
 
 int koef () {return k;}
 char per () {return p;}
 
 //Коэффициент
 int k;
 
 //Переменная
 char p;
 
 //адрес объекта такого типа;
 ko_i_per* ko_i_per_ ;
 
 
};
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 
//Класс "многочлен"
class mnogochlen {
 
 public: 
  mnogochlen ():first(NULL), last (NULL) {
   printf ("создался многочлен\n");
  }
  
 
 //Ввод многочлена                                                   
 void vvod_mnogochlena () {
  do {
   ko_i_per* temp= new ko_i_per;
   this->add(*temp);
  } 
  while (!(this->poslednii_ili_net));
 }
 
 
 
 //Самая главная операция- прибавление переменной ko_i_per в         
 //многочлен                                                         
 void add (ko_i_per& ko_i_per__) {
 
 
  //Самое главное, на что нужно смотрет при прибавлении очередной    
  //переменной это на коэффициент                                    
  if (ko_i_per__.koef ()!= 0) {
   
   //Если это самая-самая первая переменная, то делаем так:          
   //                                                                
   if (first== NULL) { 
    first= ko_i_per__.adres_seba();
    last = ko_i_per__.adres_seba();
   }
   
   //Ну и собсно вставляем переменную в многочлен                    
   else {
    last->ko_i_per_= ko_i_per__.adres_seba();   
    last= ko_i_per__.adres_seba();   
   }
  }
 
  
  //А вот тут много интереснее.                                       
  else {
   if (first!= NULL) 
    last->ko_i_per_= NULL;
   poslednii_ili_net= true;
  }
 }
 
 
 //Возвращает адрес себя
 mnogochlen* adres_seba () {return this;}
 
 //Если этот флаг поднят, то к многочлену "прибавлена" переменная с  
 //коэффициентом ноль                                                
 bool poslednii_ili_net;
 
 //КАждый многочлен, понятное дело, должен содержать указатель на    
 //свой нулевой элемент типа ko_i_per. В конструкторе этот указатель 
 //инициализируется NULL                                             
 ko_i_per* first; 
 
 //Каждый многочлен, понятное дело, должен содержать также указатель 
 //на свой ПОСЛЕДНИЙ элемент типа ko_i_per                           
 ko_i_per* last; 
 
 //адрес объекта такого типа;
 mnogochlen* mnogochlen_ ;
 
 
};
                              //+
                              //+
                              //+
                              //+
                              //+
                              //+
                              //+
//Если два многочлена ортогональны, функция возвращается true, иначе
// false                                                            
bool f_ort (mnogochlen& ,mnogochlen&);
 
int main () {
 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
                         //Ввод многочлена 
                         //Ввод многочлена 
                         //Ввод многочлена 
 
 //Это будет начало и конец списка многочленов                   
 //При проходе списка ориентироваться только на начало и на      
 //NULL, last это технологическая переменная для кропания списка 
 mnogochlen* nach= NULL;
 mnogochlen* last= NULL;
 
 //Поехали заполнять многочлены в цикле и сразу же кропаем из них список
 while (true) {
 
  mnogochlen* mnogochlen__= new mnogochlen;
  
  //Вводим многочлен, считаю правильно делать так а не возиться с      
  //каждой переменной, ибо мы не работаем с переменными по отдельности.
  //ВСякий ввод переменных сводится к вводу многочлена                 
  mnogochlen__->vvod_mnogochlena ();
 
  //Теперь вставляем его в список                                      
 
  //Смотрим, это последний многочлен или нет?
  if (mnogochlen__->first== NULL) {
   if (nach!= NULL) 
    last->mnogochlen_= NULL;
   break;
  }
 
  else {
   //Если это первый многочлен в списке
   if (nach== NULL) {
    nach= mnogochlen__->adres_seba();
    last= mnogochlen__->adres_seba();
   }
   //В противном случае
   else {
    last->mnogochlen_= mnogochlen__->adres_seba();         
    last= mnogochlen__->adres_seba();         
   }
  }
 
 
 }
 
                         //Конец ввод многочлена 
                         //Конец ввод многочлена 
                         //Конец ввод многочлена 
 
 
 
 
 
 
                            //Вывод на консоль
                            //Вывод на консоль
                            //Вывод на консоль
 
 //ну тут можно было бы перегрузить оператор << для 
 //класса mnogochlen, ну да не буду выделываться    
 mnogochlen* temp= nach;
 while (temp) {
  ko_i_per* temp_= temp->first;
  while (temp_) {
   cout<< temp_->k<< temp_->p<<" ";  
   temp_= temp_->ko_i_per_;
  }
  cout<< endl;;  
  temp= temp->mnogochlen_;
 }        
                          //Конец вывод на консоль
                          //Конец вывод на консоль
                          //Конец вывод на консоль
 
 
 //Поиск чего там надо
 //Вот щас надо в цикле пробегаться по многочленам и сравнивать их меж собой
 //Функция для этого дела уже есть
 //БОг даст завтра накропаю. А щас спать.
 
 
 printf ("конец\n");
 getchar ();
 getchar ();
 
 return 0;
}
 
 
 
 
bool f_ort (mnogochlen& x, mnogochlen& y) {
 
 //Первое, объявляем два вектора элементов char;             
 //В первый помещаем переменныe многочлена x,                
 //Во второй переменные многочлена y                         
  
 vector <char> x_; 
 vector <char> y_; 
 
 //Пробегаемся по многочлену x
 ko_i_per* temp_= x.first;
 while (temp_) {
  x_.push_back (temp_->p);
  temp_= temp_->ko_i_per_;
 }
 //ТО же и с многочленом y
 temp_= y.first;
 while (temp_) {
  y_.push_back (temp_->p);
  temp_= temp_->ko_i_per_;
 }
 
 //Сортирнём вектора
 sort (x_.begin(), x_.end());
 sort (y_.begin(), y_.end());
 
 
 //Отлично, теперь создадим вектор tem, в который войдут только те переменные, которые
 //есть в ОБОИХ многочленах                                                           
 vector <char> tem;
 tem.resize (min(x_.size(), y_.size()));
 vector <char>::iterator tt;
 tt = set_intersection(x_.begin(), x_.end(), y_.begin(), y_.end(), tem.begin()); 
 tem.resize (tt- tem.begin());
 //Так, сделали.
 
 
 //Теперь пробегаемся по многочленам и перемножаем и складываем коэффициенты
 //А это вот будет осовная переменная                                       
 //Сумма тык скыть
 int osn= 0;
 for (int i= 0; i< tem.size(); i++) {
 
  temp_= x.first;
  while (temp_) {
   if (temp_->per()== tem[i])
    break;
   temp_= temp_->ko_i_per_;
  } 
 
  ko_i_per* _temp= y.first; 
  while (_temp) {
   if (_temp->per()== tem[i])
    break;
   _temp= _temp->ko_i_per_;
  } 
  osn= temp_->koef()+ _temp->koef();
 }
 
 if (!osn)
  return false;
 return true;
  
}
Добавлено через 4 минуты
Пока не тестировал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2012, 14:45     Сбой данных. Списки списков.
Еще ссылки по теме:

C++ Шаблон структуры данных - массив указателей на заголовки списков
C++ Списки.Создание списков
C++ Линейные списки. Создание списков на основе имеющегося

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

Или воспользуйтесь поиском по форуму:
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
27.04.2012, 14:45  [ТС]     Сбой данных. Списки списков. #38
kravam, на совсем понял, что ты делаешь. Ведь я выше писал, что прога работает и всё находит...
Yandex
Объявления
27.04.2012, 14:45     Сбой данных. Списки списков.
Ответ Создать тему
Опции темы

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