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

Перебор комбинаций - C++

Восстановить пароль Регистрация
 
Ryabchik
17 / 17 / 1
Регистрация: 09.01.2013
Сообщений: 158
25.02.2013, 21:04     Перебор комбинаций #1
Доброго времени суток. Нашел в сети картинку - генератор речей. 4 столбика по 6 фраз в каждом. При переборе слева направо получается связная "общая" фраза.
Перебор комбинаций.
Решил написать программку, которая бы собрала все комбинации этих фраз. Забил их в файл, считываю и соединяю.
Но почему то она обрывается, записав только 1080 комбинаций.
Дело в алгоритме или в чем?

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
#include <iostream>
#include <cstring>
#include <fstream>
 
using namespace std;
 
int main ()
{
    const int x = 6; //число фраз в столбце
    const int y = 100; // максимальный размер фразы
     
    char one [x] [y]; //первый столбик
    char two [x] [y]; // второй
    char three [x] [y]; // третий
    char four [x] [y]; // четвертый
    
    ifstream a ("text.txt", ios :: in); //файл с фразами
    
    for (int i = 0; i < x; i++)
    { a >> one [i]; }
    
    for (int i = 0; i < x; i++)
    { a >> two [i]; }
    
    for (int i = 0; i < x; i++)
    { a >> three [i]; }
    
    for (int i = 0; i < x; i++)
    { a >> four [i]; }
    
    a.close();
    
    ofstream b ("main.txt", ios :: ate, ios :: out);
 
    for (int m = 0; m < x; m++) // первый столбик
    {
        cout << m << endl; // следим за числом проходов
            
        for (int l = 0; l < x; l++) // второй столбик
        {
            for (int k = 0; k < x; k++) // третий столбик
            {
                for (int j = 0; j < x; j++) //четвертый столбик
                {
                    strcat (one [m], " ");
                    strcat (one [m], two [l]);
                    strcat (one [m], " ");
                    strcat (one [m], three [k]);
                    strcat (one [m], " ");
                    strcat (one [m], four [j]);
            
                    b << one [m] << endl; //запись в файл
        
                    strcpy (one [m], ""); // очищаем строку
                }
            }   
        }   
    }
    
    b.close();
}
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 21:04     Перебор комбинаций
Посмотрите здесь:

C++ Помогите с выводом комбинаций
Функция количества комбинаций C++
C++ Перебор комбинаций
C++ Генерация комбинаций из n по m
Количество различных комбинаций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ryabchik
17 / 17 / 1
Регистрация: 09.01.2013
Сообщений: 158
25.02.2013, 22:16  [ТС]     Перебор комбинаций #2
HELP!
gazlan
2857 / 1805 / 271
Регистрация: 27.08.2010
Сообщений: 4,888
Записей в блоге: 1
25.02.2013, 23:58     Перебор комбинаций #3
Уберите фразы. Сделайте вывод счетчиков циклов вида w - x - y - z. Каждый должен пробегать 6 значений. 6 * 6 * 6 * 6 = 1296. Если все ОК, значит ошибка при вводе из файла - что-то не дочитали.
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
26.02.2013, 07:34     Перебор комбинаций #4
Цитата Сообщение от Ryabchik Посмотреть сообщение
C++
1
a >> one [i];
такая штука читает строку до появления первого пробела. чтобы считать всю фразу, надо читать так:
C++
1
a.getline(one [i], y);
Ryabchik
17 / 17 / 1
Регистрация: 09.01.2013
Сообщений: 158
26.02.2013, 21:38  [ТС]     Перебор комбинаций #5
Спасибо, знаю

Добавлено через 8 часов 14 минут
Проблема в том, что программа совершает 6 проходов, а потом windows ее вырубает. В чем дело?

Добавлено через 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
for (int m = 0; m < x; m++) // ïåðâûé ñòîëáèê
    {
        cout << "m" << m << endl; // ñëåäèì Г§Г* ÷èñëîì ïðîõîäîâ
            
        for (int l = 0; l < x; l++) // âòîðîé ñòîëáèê
        {
            cout << "l" << l << endl; // ñëåäèì Г§Г* ÷èñëîì ïðîõîäîâ
            for (int k = 0; k < x; k++) // òðåòèé ñòîëáèê
            {
                cout << "k" << k << endl; // ñëåäèì Г§Г* ÷èñëîì ïðîõîäîâ
                for (int j = 0; j < x; j++) //÷åòâåðòûé ñòîëáèê
                {
                    cout << "j" << j << endl; // ñëåäèì Г§Г* ÷èñëîì ïðîõîäîâ
                    strcat (one [m], " ");
                    strcat (one [m], two [l]);
                    strcat (one [m], " ");
                    strcat (one [m], three [k]);
                    strcat (one [m], " ");
                    strcat (one [m], four [j]);
            
                    b << one [m] << endl; //Г§Г*ГЇГЁГ±Гј Гў ГґГ*éë
        
                    strcpy (one [m], ""); // î÷èùГ*ГҐГ¬ ñòðîêó
                }
            }   
        }   
    }
Вырубается при m = 5 и l,k,j = 0.

Добавлено через 2 минуты
При m = 5, l, k, j = 0 после присоединения третьей строки в j записывается мусор

Добавлено через 23 минуты
Объясните, плиз, откуда берется совершенно левое значение. И почему оно записывается в j именно при m =5 после присоеденения третьей строки.
gazlan
2857 / 1805 / 271
Регистрация: 27.08.2010
Сообщений: 4,888
Записей в блоге: 1
26.02.2013, 22:36     Перебор комбинаций #6
Выход за границы массива, очевидно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
/*
                    strcat (one [m], " ");
                    strcat (one [m], two [l]);
                    strcat (one [m], " ");
                    strcat (one [m], three [k]);
                    strcat (one [m], " ");
                    strcat (one [m], four [j]);
            
                    b << one [m] << endl; //запись в файл
*/        
                    strcpy (one [m], ""); // очищаем строку
printf("%d %d %d %d\n",m,l,k,j);
Изображения
 
Yandex
Объявления
26.02.2013, 22:36     Перебор комбинаций
Ответ Создать тему
Опции темы

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