С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43

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

23.09.2014, 00:23. Показов 854. Ответов 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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2014, 00:23
Ответы с готовыми решениями:

Шеннон-Фано
Вопрос будет о методе сжатия изображения(bmp) методом Шеннона-Фано. Допустим я записываю значение, вероятность появления и битовый код в...

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

Программа зацикливается
Программа зацикливается после ввода размеров массива. Подскажите пожалуйста, где ошибка. #include &lt;iostream&gt; void inn(int **,...

8
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.09.2014, 00:35
Цитата Сообщение от barbsh Посмотреть сообщение
почему то зацикливается и все, хз даже что делать
Debugger
0
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
23.09.2014, 00:51  [ТС]
Я с ним очень долго парился, не нашел, костылил, костылил - результату ноль

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

Добавлено через 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
77 / 52 / 32
Регистрация: 24.03.2013
Сообщений: 1,121
24.09.2014, 01:08
Вот тут смотри, в этом цикле у тебя после того, как находится середина строки потом останавливается на этом символе и всё.... а как я понял, тебе нужно в этом случае как-то выйти из цикла....
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
1 / 1 / 2
Регистрация: 13.09.2014
Сообщений: 43
24.09.2014, 18:50  [ТС]
Обьяснить трудно на словах, какая цель, но попробую:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2014, 18:50
Помогаю со студенческими работами здесь

Программа зацикливается
void __fastcall TForm1::Button1Click(TObject *Sender) { int k; float a,sum,x; a=StrToFloat(Edit1-&gt;Text); k=1; sum=0; ...

программа зацикливается
помогите скажите пожалуйста почему моя программа зацикливается #include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; ...

Программа зацикливается
всё описание я зделал в коде #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; using namespace std; int main()...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru