Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
barbsh
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
#1

Шеннон-Фано, зацикливается программа - C++

23.09.2014, 00:23. Просмотров 448. Ответов 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
100
101
102
103
104
105
106
#include <iostream>
#include <string>
 
using namespace std;
 
struct Node
{
    char symbols;
    string text;
    int kolvo;
    Node *next;
    
};
 
 
void vvod(Node **text, char input)
{   Node *temp = new Node;
    temp -> symbols = input;
    temp -> kolvo = 1;
    temp -> next = NULL;
    if (*text)
    {
        Node *p = *text;
        for (;p; p = p->next)
            if (p -> symbols == input){
                (p -> kolvo)++;
                return;
            }
        
        for (p = *text;p -> next; p = p->next);
        p -> next = temp;
    }
    else
        *text = temp;
}
 
 
void vivod(Node **text)
{
    for (Node *p = *text; p; p = p->next)
        cout << p -> symbols << " = " << p -> kolvo << " " << p ->text << endl;
}
 
void sortir(Node *text){
    for (Node *p = text; p -> next; p = p -> next)
        if (p -> kolvo < p -> next -> kolvo)
        {
            int temp_kolvo = p -> kolvo;
            char temp_symbols = p -> symbols;
            p -> kolvo = p -> next -> kolvo;
            p -> symbols = p -> next -> symbols;
            p -> next -> kolvo = temp_kolvo;
            p -> next -> symbols = temp_symbols;
        }
}
 
void coding(Node *text, Node *start, Node *stop, unsigned long N)
{
    int index = 0;
    Node *p = text;
    for (; p; p = p -> next)
        if (index <= N/2){
            index += p -> kolvo;
            p -> text += '0';
        }
        else break;
    if (start !=p -> next)
        coding(text, start, p -> next, index);
    
    index = 0;
    Node *temp = p -> next;
    for (; p; p = p -> next){
         index += p -> kolvo;
         p -> text += '1';
    }
    
    if (temp !=stop)
    coding(text, temp, stop, index);
    
}
 
 
int main()
{
    setlocale (LC_ALL, "rus");
    string input;
    
    Node *text = NULL;
    cin >> input;
        
    unsigned long kolvo = input.length();
    cout << kolvo << endl;
    for (int i = 0; i < kolvo; i++)
    {
        vvod(&text, input[i]);
    }
    sortir(text);
    Node *p = text;
    
    for (; p -> next; p = p -> next);
    coding(text, text, p, kolvo);
    sortir(*text);
    vivod(&text);
    
    return 0;
}

http://www.cyberforum.ru/cpp-beginners/thread827645.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2014, 00:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шеннон-Фано, зацикливается программа (C++):

Шеннон-Фано
Помогите пожалуйста, дали курсовую, неделю не могу сделать уже. В кратце: 1....

Программа зацикливается
void __fastcall TForm1::Button1Click(TObject *Sender) { int k; float...

программа зацикливается
помогите скажите пожалуйста почему моя программа зацикливается...

Программа зацикливается
всё описание я зделал в коде #include &lt;iostream&gt; #include &lt;cstring&gt;...

Программа зацикливается
Программа зацикливается после ввода размеров массива. Подскажите пожалуйста,...

8
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
23.09.2014, 00:35 #2
Цитата Сообщение от barbsh Посмотреть сообщение
почему то зацикливается и все, хз даже что делать
Debugger
0
barbsh
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
23.09.2014, 00:51  [ТС] #3
Я с ним очень долго парился, не нашел, костылил, костылил - результату ноль

Добавлено через 13 минут
Помогите, пожалуйста
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 01:02 #4
Цитата Сообщение от barbsh Посмотреть сообщение
Помогите, пожалуйста
Это код не компилируется. 102 строка:
C++
1
sortir(*text);
0
barbsh
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
23.09.2014, 01:08  [ТС] #5
ой, text
а не *
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 01:12 #6
Разбирайтесь с рекурсией в coding(), выхода нет.
1
barbsh
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
24.09.2014, 00:40  [ТС] #7
Спасибо, буду разбираться

Добавлено через 19 часов 48 минут
Вот такая херня получилась, все равно не рабит(
Подскажите пожалуйста
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
#include <iostream>
#include <string>
 
using namespace std;
 
struct Node
{
    char symbols;
    string text;
    int kolvo;
    Node *next;
    
};
 
 
 
void vvod(Node **text, char input)
{
    Node *temp = new Node;
    temp->symbols = input;
    temp->kolvo = 1;
    temp->next = 0;
    if (*text){
        Node *p = *text;
        for (; p; p = p->next)
            if (p->symbols == input){
                (p->kolvo)++;
                return;
            }
        
        for (p = *text; p->next; p = p->next);
        p->next = temp;
    }
    else
        *text = temp;
}
 
 
void vivod(Node **text)
{
    for (Node *p = *text; p; p = p->next)
        cout << p->symbols << " = " << p->kolvo << " " << p->text << endl;
}
 
void sortir(Node *text){
    for (Node *p = text; p->next; p = p->next)
        if (p->kolvo < p->next->kolvo)
        {
            int temp_kolvo = p->kolvo;
            char temp_symbols = p->symbols;
            p->kolvo = p->next->kolvo;
            p->symbols = p->next->symbols;
            p->next->kolvo = temp_kolvo;
            p->next->symbols = temp_symbols;
        }
}
 
void coding(Node *start, Node *stop, unsigned long N)
{
    if (start == 0) return;
    if (start->next == 0)return;
    if (start->next == stop || start->next->next==0){
        start->text += '0';
        start->next->text += '1';
        return;
    }
    unsigned long index = 0;
    Node *p = start;
    for (; p->next; p = p->next)
        if (index <= N / 2){
            index += p->kolvo;
            p->text += '0';
        }
        else break;
    coding(start, p->next, index);
    index = 0;
    p = p->next;
    Node *temp = p->next;
    for (;stop; p = p->next){
        index += p->kolvo;
        p->text += '1';
    }
    coding(temp, stop, index);
}
 
 
int main()
{
    setlocale(LC_ALL, "rus");
    string input;
    
    Node *text = NULL;
    cin >> input;
    
    unsigned long kolvo = input.length();
    cout << kolvo << endl;
    for (int i = 0; i < kolvo; i++)
    {
        vvod(&text, input[i]);
    }
    coding(text, NULL, kolvo);
    sortir(text);
    vivod(&text);
    return 0;
}
Добавлено через 3 часа 36 минут
Понял что ошибка в начале функции coding
Но найти все еще не могу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (start == 0) return;
    if (start->next == 0)return;
    if (start->next == stop || start->next->next==0){
        start->text += '0';
        start->next->text += '1';
        return;
    }
    unsigned long index = 0;
    Node *p = start;
    for (; p->next; p = p->next)
        if (index <= N / 2){
            index += p->kolvo;
            p->text += '0';
        }
        else break;
 
        coding(start, p->next, index);
0
serggg
56 / 40 / 22
Регистрация: 24.03.2013
Сообщений: 1,080
Завершенные тесты: 1
24.09.2014, 01:08 #8
Вот тут смотри, в этом цикле у тебя после того, как находится середина строки потом останавливается на этом символе и всё.... а как я понял, тебе нужно в этом случае как-то выйти из цикла....
C++
1
2
3
4
5
6
7
8
for (; p->next; p = p->next)
        if (index <= N / 2){
            index += p->kolvo;
            p->text += '0';
        }
        else break;
 
        coding(start, p->next, index);
Что нужно сделать по условию-то?
0
barbsh
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
24.09.2014, 18:50  [ТС] #9
Обьяснить трудно на словах, какая цель, но попробую:
1. Посчитать сколько раз встречается каждый символ.
2. Упорядочить по невозрастанию повторений
3. Найти примерную середину повторений и вверх записывается 0, а вниз 1, и так до тех пор пока не все числа не получат свой двоичный код

Добавлено через 1 час 32 минуты
Исправил вот так, теперь он выводит все, не зацикливается на одном, но 0 и 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
void coding(Node *start, Node *stop, unsigned long N)
{
    if (start == 0) return;
    if (start->next == 0)return;
    if (start->next == stop || start->next->next==0){
        start->text += '0';
        start->next->text += '1';
        return;
    }
    unsigned long index = 0;
    Node *p = start;
        while(index <= N / 2){
            index += p->kolvo;
            p->text += '0';
        }
 
        coding(start, p->next, index);  // трабла
    index = 0;
    p = p->next;
    Node *temp = p->next; // трабла с temp
    for (;stop; p = p->next){
        index += p->kolvo;
        p->text += '1';
    }
    coding(temp, stop, index); // соответственно и здесь
}
А приписывает из этой части, т.е. тупо через один 0 и 1
C++
1
2
3
4
5
6
if (start == 0) return;
    if (start->next == 0)return;
    if (start->next == stop || start->next->next==0){
        start->text += '0';
        start->next->text += '1';
        return;
Добавлено через 17 минут
В общем, скоро с ума сойду)
Если завтра не сдам - выселяют из общаги, буду жить на улице
0
24.09.2014, 18:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2014, 18:50
Привет! Вот еще темы с решениями:

Зацикливается программа
Нужно сделать стек из элементов и вывести все положительные значения. Программа...

Почему зацикливается программа?
Нужно найти сумму элементов матрицы 4x4 на побочной диагонали. Если...

Программа зацикливается в цикле for
Помогите разобраться с программой вводит массив нормально, но потом...

Программа зацикливается. Почему?
Когда заполняю матрицу с клавиатуры - работает нормально. Когда заполняю...


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

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

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