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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
#1

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

14.04.2012, 17:55. Просмотров 1579. Ответов 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
#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, хотя он не изменятеся по алгоритму. Причём сбой происходит после второго обращения к ней. При этом, ранее для тестинга, выводил саму матрицу, используя ту же строчку, и всё хорошо работало, хотя и обращался к такой строчке при выводе многократно.
В чём, собственно, проблема? Почему происходит сбой? Как это исправить или как иначе произвести это присвоение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2012, 17:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сбой данных. Списки списков. (C++):

Списки.Создание списков - C++
Помогите с программой ,пожалуйста)Нужно составить список.Я вроде все правильно делаю а компилятор ругается на какую то фигню( #include...

Кольцевые списки на базе двунаправленных списков - C++
Всем привет! Помогите решить задачу: Пусть L обозначает кольцевой двунаправленный список с включенным заглавным звеном. Написать функцию...

Списки: реализовать слияние трёх списков в один - C++
Подскажите пожалуйста, как реализовать слияние трёх списков в один.

Линейные списки. Создание списков на основе имеющегося - C++
Всем привет! Есть задача: используя линейные списки создать функции: 1. Создания списка, элементы которого будут вводиться с клавиатуры...

Хранение и обработка данных с использованием линейных списков - C++
Люди, помогите пожалуйста!!! Дали задание к курсовой работе. Сделать надо любое из двух (какое легче) но сделать не могу ни 1, ни 2 ...

«Хранение и обработка данных с использованием линейных списков». - C++
Вот мне к курсовой работе дали задание.Я не могу его понять, что от меня требуется. Что за система n на прямой? Чем координата от точки...

37
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
19.04.2012, 10:06 #16
Короче есть список элементов типа Mnolen, что он такое я представляю. Что такое список система я ума не приложу, а главное мне не понять, зачем тут ещё какой-то список (система) нужен? Если бы я понял про эту самую систему, я может быть разобрался в твоём коде, а так... Список система удаляю за ненадобностью.


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
#include <iostream>
#include <locale>
#include <string>
#include <conio.h>
#include <math.h>
using namespace std;
 
struct Mnolen {
    char s;
    int k;
    Mnolen *next;
};
 
int main() {
 
    
 
    Mnolen *e;                   //для хранения списка-многочлена
    Mnolen *first= NULL;         //указатель на первый элемент многочлена
 
    char temp;
    
    //Допрашиваем пользователя на предмет будет список пустой или нет
    do {
     cout<< "В связном списке будет хоть один элемент?"<< endl;
     temp= getch ();
    }
    while (temp!= 'y'&& temp!= 'n');
 
    
    
    //Если список непустой
    if (temp== 'y') {
     e= new Mnolen; 
     first = e;      
     
     //В одном цикле и введём весь список; и не надо никаких вложенных циклов;
     while (true) {
      cout<<"Введите переменную и коэфициент, последующий ввод ноля будет означать конец списка"<<endl;  //задание многочленов
      cin>>e->s;
      cin>>e->k;
      cin>> temp;
      if (temp== '0') {
       e->next = NULL;
       break;
      }
      e->next= new Mnolen;
      e= e->next;
     }
    }
 
 
 
    return 0;
}
Вот и всё, вот утебя есть список first элементов. Делай с ним что хочешь. Элемент next последнего элемента указывает на NULL. И не надо ничё больше.

Добавлено через 1 минуту
Потом в конце надо освободить память с помощью delete, но это отдельная история.
0
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
19.04.2012, 18:18  [ТС] #17
kravam, ты сразу не мог об этом спросить? Я думал, что код с заданием выложил. Не заметил. Задание такое: Дана система многочленов. Нужно найти среди них тот, который ортогонален наибольшему числу многочленов. Хранить эту систему обязательно в виде СПИСКА СПИСКОВ!
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
19.04.2012, 20:12 #18
Ну сисчема многочленов я так понимаю это какой-то перечень многочленов. То есть список многочленов я сделаю, это и будет система. Но список списков... Я могу, но не возьмусь, это будет полное убожество. Может быть, знай я что такое ортогональные многочлены, я бы поменял своё мнгение но в инете непонятно написано, заумно как-то.
0
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
20.04.2012, 21:52  [ТС] #19
Каждый многочлен задан списком. В свою очередь система задана тоже списком из многочленов... С этим у меня всё правильно. Проблема только в проверке ортогональности попарно всех многочленов.
У ортогональных многочленов скалярное произведение равно 0. Т.е. сумма произведений коэфициентов при одинаковых степенях (переменных) равно 0.

Добавлено через 1 час 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
#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, 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;
                }
                prom->m = prom->m->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;
    while (e->s[0] != '0')
    {
        cout<<e->k<<":"<<e->s<<endl;
        e = e->next;
    }
    getch();
    return 0;
}

Проблема заключается в том, что внутри проверки на ортогональность при переходе prom->m = prom->m->next одновременно переходит и значение nach, который по сути должен оставаться неизменным на протяжении всей проги. И хотя он конретно никуда не переходит, но почему то самопроизвольно меняется при изменении prom->m. В чём дело? Как исправить?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
21.04.2012, 21:13 #20
Цитата Сообщение от Dan299 Посмотреть сообщение
Каждый многочлен задан списком.
То есть каждый многочлен это список из таких элементов

struct Mnolen
{
char s[5];
int k;
Mnolen *next;
};

где k коэффициент, char s[5] переменнная, я правильно понял? И сразу, если правильно, то ограничения на количество переменных нет?

Добавлено через 38 минут
Так и ещё такой вопрос, допустим есть список многочленов. Покажи мне переменную, которая указывает на начало списка многочленов или по-другому: указывает на нулевой элемент списка многочленов

это first? Если это first, то я знаю где искать ошибку.

Добавлено через 4 минуты
Корче ладно, не буду тянуть кота за хвост, но почему тебе прежде, чем проверять там что-то на ортогональность, не проверить список на количество многочленов? Если ты вводишь два многочлена (для простоты каждый с двумя перменными) и если ты думаешь, что их у тебя в списке действительно два, то ошибаешься.

Введи два многочлена и убедись сам, я всего лишь добавил проверку списка многочленов на размер;

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
#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;
    }
 
    
    //Вот я добавил проверку- а сколько многочленов
    int i= 0;
    while (first!=NULL) {
     first= first->next;
     i++;
    }
    if (i== 2)
     printf ("всё круто");
    else  {
     printf ("всё плохо, ты ввёл два многочлена, а получил %d\n", i);
     getchar ();
    }
    //Вот я добавил проверку- а сколько многочленов
    
 
    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;
                }
                prom->m = prom->m->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;
    while (e->s[0] != '0')
    {
        cout<<e->k<<":"<<e->s<<endl;
        e = e->next;
    }
    getch();
    return 0;
}
При том, конечно, условии, что first указывает на нулевой элемент списка многочленов. Вывод: неправильный код ввода.
0
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
22.04.2012, 19:39  [ТС] #21
first - указатель на начало многочлена. На начало системы указывает nach. Прежде чем проверять на ортогональность, я делал вывод системы. Выводил всё верно. И дальше на аналогии прохода по системе при выводе описал проход при сравнении.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
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 для указания конца списков
0
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
23.04.2012, 09:05  [ТС] #23
Мы итак уже 2 недели потеряли не понятно на что. Так что чё уж сутки. Тем более меня весь день дома не было.
Да. Многочлен ограничивается нулём. А система нулевым многочленом. Т.е. у которого первая же переменная ноль.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
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 и в самом деле иногда меняется, тебе следовало бы написать, при вводе каких значений это происходит. Я же просил:
Просто дай данные на которых программа спотыкается вот и всё. Потом дальше будем разбираться.
0
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.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
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;
0
Dan299
1 / 1 / 0
Регистрация: 17.09.2011
Сообщений: 39
24.04.2012, 17:49  [ТС] #27
Я в принципе подумывал, что может потому что на одну ссылку указывает. Но хз как это исправить. И всё таки надеялся, что в разных переменных поле будет разный адрес иметь.

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

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

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

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

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


И такая мысль была. Если например список системы оформить в виде класса и у него nsch сделать полем. Это может решить проблему? Или можно какнибудь зафиксировать nach в имеющейся проге, чтобы он никогда не менялся?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
24.04.2012, 19:58 #30
Ну если есть комменты разъясни что такое ортогональные, попробую помочь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2012, 19:58
Привет! Вот еще темы с ответами:

Копирование данных из выпадащих списков - есть ли такая программа? - C++
Всем приветы! Сорри, если написал не в ту тему. Очень нужна помощь вот по какому вопросу: есть один сайт государственной технической...

Шаблон структуры данных - массив указателей на заголовки списков - C++
Мне выдали задание на курсовую работу: &quot;Шаблон структуры данных - массив указателей на заголовки списков. Элемент списка содержит...

Структуры данных: Списки - C++
Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: • Номер УДК; • ...

Структуры данных: списки - C++
Нужно сделать программу на с++ на тему &quot;структуры данных: списки&quot;, что именно можно придумать? языком владею слабо, сроки очень поджимают,...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
24.04.2012, 19:58
Ответ Создать тему
Опции темы

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