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

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

Войти
Регистрация
Восстановить пароль
 
Ryabchik
18 / 19 / 1
Регистрация: 09.01.2013
Сообщений: 164
#1

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

25.02.2013, 21:04. Просмотров 666. Ответов 5
Метки нет (Все метки)

Доброго времени суток. Нашел в сети картинку - генератор речей. 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();
}
Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 21:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перебор комбинаций (C++):

Перебор комбинаций - C++
Здравствуйте! Возникла такая задача. Дан одномерный массив из N цифр,нужно составить все возможные комбинации чисел из этих цифр(числа...

Перебор комбинаций с исключениями - C++
Здраствуйте!Хочу попробовать сделать задачу:есть число n которое указывает количество цифр и есть число k которое указывает количество...

Быстрый перебор всех комбинаций 32 байтов - C++
Здравствуйте, как можно очень быстро перебрать все комбинации 32 байтов, с записью результата в string для сравнения строк ? то-есть...

Перебор всевозможных комбинаций, изменяемая длина и диапазон - C++
Обгуглился уже, где - то может и видел то, что нужно, но в силу тупизны счёл не тем. Брут в общем. Есть длина строки, массив с...

Генерация комбинаций из n по m - C++
Здравствуйте! Написала функцию для генерации комбинаций. Подскажите в чем ошибка, выдает не все варианты. int Generare(int Key, int...

Подсчет Комбинаций - C++
решите, пожалуйста, эту задачку, заранее спасибо Постановка задачи Вы должны точно вычислить значение C(N, K) для заданного N а K....

5
Ryabchik
18 / 19 / 1
Регистрация: 09.01.2013
Сообщений: 164
25.02.2013, 22:16  [ТС] #2
HELP!
0
gazlan
3135 / 1911 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
25.02.2013, 23:58 #3
Уберите фразы. Сделайте вывод счетчиков циклов вида w - x - y - z. Каждый должен пробегать 6 значений. 6 * 6 * 6 * 6 = 1296. Если все ОК, значит ошибка при вводе из файла - что-то не дочитали.
0
ya_noob
_
314 / 148 / 9
Регистрация: 08.10.2011
Сообщений: 432
26.02.2013, 07:34 #4
Цитата Сообщение от Ryabchik Посмотреть сообщение
C++
1
a >> one [i];
такая штука читает строку до появления первого пробела. чтобы считать всю фразу, надо читать так:
C++
1
a.getline(one [i], y);
0
Ryabchik
18 / 19 / 1
Регистрация: 09.01.2013
Сообщений: 164
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 после присоеденения третьей строки.
0
gazlan
3135 / 1911 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 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);
1
Изображения
 
26.02.2013, 22:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 22:36
Привет! Вот еще темы с ответами:

Количество различных комбинаций - C++
Добра всем. Задача: есть &quot;слово&quot; нужно написать программу, которая подсчитала бы количество комбинаций букв этого слова, т.е. лсово, лосво...

Функция количества комбинаций - C++
Есть ли функция на C++ которая возвращает количество комбинаций для заданного числа элементов в excel это функция ЧИСЛКОМБ(число;...

Вычисление числа комбинаций - C++
Вопрос, конечно элементарный но сам запутался. Какое количество комбинаций можно получить из трех чисел. Вообщем похоже на бинарный код. ...

Генератор комбинаций с повторениями - C++
Вот код он выводит все комбинации с повторениями от 1 до 3 и можно увеличить до 9. Беда в том что он начинаем генерировать с 1 const int...


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

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

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