Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128

Перечисление чисел

03.04.2015, 18:23. Показов 7383. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Я не являюсь программистом, но в моём деле мне необходима помощь компьютера. И ради этого я начал изучать программирование. Я установил Visual Studio и нашёл несколько статей для новичков в С++. Пока я их изучаю, я хочу написать свою задачу вам, чтобы, мало ли, мир не без добрых людей, поможете мне.:

Есть 3 ячейки: a b c
Есть количество чисел от 1 до 5, для каждой ячейки.
Надо произвести расчёт чисел в автоматическом режиме от меньшего к большему, начиная с ячейки с.
Запись чисел должна будет идти в текстовый документ, откуда все вычисления можно будет скопировать.
После достижения комбинации 1 1 5 она должна быть записана, а далее необходимо, чтобы число ячейки с, сбросилось до 1. А число в ячейке b сменилось на 2. И так далее до комбинации 5 5 5.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2015, 18:23
Ответы с готовыми решениями:

Перечисление в BC++
В русском языке как, правило после букв Ж, Ч, Ш, Щ, пишется И, А, У, а не Ы, Я, Ю, (за исключением слов ЖЮРИ, БРОШЮРА, ПАРАШЮТ). Проверить...

перечисление месяцев
написать консольную программу на С++, которая использует перечисление для идентификации месяцев года значениями номеров месяца от 1 до 12....

Не работает перечисление
Сам код: #include <iostream> #include <string> using namespace std; #include <windows.h> #include <process.h> enum typ...

59
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 20:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от yellyex Посмотреть сообщение
Renji, вау! И куда этот шедевр вставлять?
Никуда не вставлять. Он самодостаточен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<fstream>
using namespace std;
void func(ostream&stream,int*count,int level)
{
    for(int i=1;i<=14;++i)
        if(count[i-1]<4)
        {
            ++count[i-1];
            stream<<i;
            if(level==7)
                stream<<endl;
            else
                func(stream,count,level+1);
            --count[i-1];
        }
}
int main()
{
    ofstream stream("text.txt");
    int count[14]={0};
    func(stream,count,1);
    return 0;
}
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 20:30  [ТС]
Renji, ну мне же надо, чтобы комбинации записывались в текстовый документ. Кое как вставил Ваш код в тот, что был. Вроде без ошибок и запускается, но эффекта никакого. Начальная комбинация 2 2 2 2 2 2 2, а хотя по плану должна быть 2 2 2 2 3 3 3.
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
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
 
using namespace std;
 
void func(ostream&stream, int*count, int level)
{
    for (int i = 1; i <= 14; ++i)
    if (count[i - 1]<4)
    {
        ++count[i - 1];
        stream << i;
        if (level == 7)
            stream << endl;
        else
            func(stream, count, level + 1);
        --count[i - 1];
    }
}
 
int main()
 
{
    ofstream stream("text.txt");
 
    for (int a = 2; a <= 14; ++a)
    for (int b = 2; b <= 14; ++b)
    for (int c = 2; c <= 14; ++c)
    for (int d = 2; d <= 14; ++d)
    for (int e = 2; e <= 14; ++e)
    for (int f = 2; f <= 14; ++f)
    for (int g = 2; g <= 14; ++g)
    {
        cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << " " << g << endl;
        stream << a << " " << b << " " << c << " " << d << " " << e << " " << f << " " << g << endl;
    }
 
        int count[14] = { 0 };
        func(stream, count, 1);
 
    getch();
    return 0;
}
Да, Ваш код действительно работает сам. Но в текстовом документе происходит бардак. Начальная комбинация 1111222, а далее идут отдельные числа столбиком 3 4 5 6 7 и так до 14 и 32, а потом начинается полный бред

Добавлено через 14 минут
Почему нельзя использовать те условия, что я предложил ранее. Просто я не знаю, как точно их реализовать в коде. Но мне кажется, что алгоритм верный. Надеюсь на это.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 20:41
Лучший ответ Сообщение было отмечено yellyex как решение

Решение

Цитата Сообщение от yellyex Посмотреть сообщение
Да, Ваш код действительно работает сам. Но в текстовом документе происходит бардак. Начальная комбинация 1111222, а далее идут отдельные числа столбиком 3 4 5 6 7 и так до 14 и 32, а потом начинается полный бред
Да, пардон:
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
void func(ostream&stream,int*count,int level,char*line)
{
    if(level==7)
        stream<<line<<endl;
    else
    {
        for(int i=2;i<=14;++i)
            if(count[i-1]<4)
            {
                ++count[i-1];
                line[level]="01234567890ABCDEF"[i];
                func(stream,count,level+1,line);
                --count[i-1];
            }
    }
}
int main()
{
    ofstream stream("text.txt");
    int count[14]={0};
    char line[8]={0};
    func(stream,count,0,line);
    return 0;
}
Цитата Сообщение от yellyex Посмотреть сообщение
Почему нельзя использовать те условия, что я предложил ранее.
Потому что без вспомогательного массива-счетчика, запись условия станет монструозных размеров.
0
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 20:59  [ТС]
У меня всё начинается с 2 и заканчивается 14. Алгоритм для ограничения количества чисел в одной комбинации до 4 единиц. Есть 7 переменных a b c d e f g.

ЕСЛИ:

ИЛИ:

И: (вариант 1)

a =! b
a =! c
a =! d

И: (вариант 2)

a =! b
a =! c
a =! e

И: (вариант 3)

a =! b
a =! c
a =! f

И: (вариант 4)

a =! b
a =! c
a =! g

ТО, записать комбинацию. Просто таких И, может быть много, но, в целом, я считаю, что это верно.

Добавлено через 3 минуты
Renji, Вы теперь официально признаны ВЛАСТЕЛИНОМ ВСЕЛЕННОЙ! Теперь я знаю, о ком думать, когда засыпаю!

А, как в Ваш код поставить пробелы между числами? Это важно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 21:01
Цитата Сообщение от yellyex Посмотреть сообщение
И ещё нашёл маленький недочёт в Вашей работе! После того, как числа заканчиваются 222233D, следующая комбинация не 2222342, а 2222343!
В 2222342 пять двоек, поэтому код эту комбинацию отбрасывает.
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 21:02  [ТС]
Renji, нет нет! Вы правы! Это не маленький недочёт в Вашей работе, а огромный недочёт в моей голове. Всё правильно Вы сделали! Остались только пробелы Надеюсь функция кончается? А то бы мне хотелось в конце всё таки открыть текстовый документ.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 21:07
Цитата Сообщение от yellyex Посмотреть сообщение
А, как в Ваш код поставить пробелы между числами? Это важно.
line[level] line[level*2]
char line[8]={0}; char line[14]="0 1 2 3 4 5 6";//ну или просто 13 пробелов.
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 21:08  [ТС]
Renji, секунду, я попробую.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 21:14
Цитата Сообщение от yellyex Посмотреть сообщение
Renji, я уже так делал, поэтому и спросил про пробелы. В текстовом документе начинается бардак.
Точно вот так?
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
void func(ostream&stream,int*count,int level,char*line)
{
    if(level==7)
        stream<<line<<endl;
    else
    {
        for(int i=2;i<=14;++i)
            if(count[i-1]<4)
            {
                ++count[i-1];
                line[level*2]="01234567890ABCDEF"[i];
                func(stream,count,level+1,line);
                --count[i-1];
            }
    }
}
int main()
{
    ofstream stream("text.txt");
    int count[14]={0};
    char line[14]="0 1 2 3 4 5 6";
    func(stream,count,0,line);
    return 0;
}
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 21:22  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
line[level] line[level*2]
char line[8]={0}; char line[14]="0 1 2 3 4 5 6";//ну или просто 13 пробелов.
Теперь я снова верю в Деда Мороза и Снегурочку!!! Вы просто сказка!!!

Конечный код:
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
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
 
using namespace std;
 
void func(ostream&stream, int*count, int level, char*line)
{
    if (level == 7)
        stream << line << endl;
    else
    {
        for (int i = 2; i <= 14; ++i)
        if (count[i - 1]<4)
        {
            ++count[i - 1];
            line[level * 2] = "01234567890ABCDEF"[i];
            func(stream, count, level + 1, line);
            --count[i - 1];
        }
    }
}
int main()
{
    ofstream stream("text.txt");
    int count[14] = { 0 };
    char line[14] = "             ";
    func(stream, count, 0, line);
 
    getch();
    return 0;
}
Добавлено через 8 минут
Renji, скажите пожалуйста ещё. Функция точно кончается? А то у меня блокнотик весит уже 1Гб!!!
То есть по определению всё должно закончится на комбинации D D D D D D D
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 21:29
Цитата Сообщение от yellyex Посмотреть сообщение
Renji, скажите пожалуйста ещё. Функция точно кончается? А то у меня блокнотик весит уже 1Гб!!!
13 вариантов символа. Семь символов. Итого - 13^7 = 62 748 517 комбинаций. По 14 символов на комбинацию - должно выйти чуть меньше 900 мегабайт. Попробуйте запустить с for (int i = 2; i <= 7; ++i) - тоже виснет?
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 21:48  [ТС]
Renji, я попробую.

Добавлено через 17 минут
Так в полной версии текстовый документ весит 918576 Кб. Но консоль так и остаётся открытой.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 21:53
Цитата Сообщение от yellyex Посмотреть сообщение
Так в полной версии текстовый документ весит 918576 Кб. Но консоль так и остаётся открытой.
getch() уберите/нажмите любую клавишу.

Добавлено через 1 минуту
UPD И в 01234567890ABCDEF второй ноль лишний.
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
03.04.2015, 21:56  [ТС]
Renji, спасибо. Мне второй ноль нужен. Я его заменил на буквенный символ, как и последующие буквы на свои символы. Количество то же. Я так понимаю цифры 0 и 1 вначале можно удалить?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
03.04.2015, 22:00
Мой вариант для разнообразия:
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
#include <cstddef>
#include <algorithm>
#include <fstream>
#include <functional>
#include <iterator>
#include <iostream>
#include <map>
#include <vector>
 
using namespace std;
 
template<class T>
using PrintCombinationsIterator = typename vector<T>::const_iterator;
 
template<class T>
void PrintCombinations(size_t size, T from, T to,
    function<void(PrintCombinationsIterator<T>, PrintCombinationsIterator<T>)> callback)
{
    vector<T> items(size, from);
    while (true)
    {
        callback(items.begin(), items.end());
        typename vector<T>::reverse_iterator i;
        for (i = items.rbegin(); i != items.rend() && *i == to; ++i)
            *i = from;
        if (i == items.rend())
            return;
        ++*i;
    }
}
 
template <class It>
auto Count(It b, It e) -> map<typename iterator_traits<It>::value_type, size_t>
{
    map<typename iterator_traits<It>::value_type, size_t> result;
    while (b != e)
    {
        result[*b]++;
        ++b;
    }
    return result;
}
 
class Printer
{
public:
    Printer(ostream& os) : os_(os) { }
    void operator()(PrintCombinationsIterator<unsigned> b, PrintCombinationsIterator<unsigned> e)
    {
        auto condition = [](const pair<unsigned, size_t>& p) { return p.second <= 4; };
        auto transformation = [](unsigned n) { return "0123456789ABCDEF"[n]; };
        map<unsigned, size_t> counts = Count(b, e);
        if (!all_of(counts.begin(), counts.end(), condition))
            return;
        transform(b, e, ostream_iterator<char>(os_, " "), transformation);
        os_ << '\n';
    }
private:
    ostream& os_;
};
 
int main()
{
    ofstream ofs("output.txt", ios::out | ios::trunc);
    PrintCombinations<unsigned>(7, 2, 14, Printer(ofs));
}
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2015, 22:03
Цитата Сообщение от yellyex Посмотреть сообщение
Я так понимаю цифры 0 и 1 вначале можно удалить?
Можно, но придется писать "234567890ABCDEF"[i-2];
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
04.04.2015, 00:14  [ТС]
Спасибо всем, кто отозвался помочь Мои последующие трудности после того, как откроется блокнот. Изъять все комбинации с четырьмя одинаковыми числами. Затем с тремя одинаковыми. Затем с тремя одного достоинства и двумя другого достоинства. Ну и так далее, вплоть до полного отсутствия каких-либо пар. Поэтому я изначально делал алгоритм расфасовки. Но, чувствую, после всего здесь произошедшего, он просто не годится. Но главное то уже сделано. И это меня окрыляет.

Добавлено через 3 минуты
Я хотел бы уточнить. Вот программа записывает полученные комбинации чисел в текстовый блокнот. Но он получается слишком большой и не открывается даже в течении часа! Можно сделать так, чтобы после определённого количество килобайт, начинал записываться другой блокнот и так далее?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
04.04.2015, 00:33
Цитата Сообщение от yellyex Посмотреть сообщение
Я хотел бы уточнить. Вот программа записывает полученные комбинации чисел в текстовый блокнот. Но он получается слишком большой и не открывается даже в течении часа! Можно сделать так, чтобы после определённого количество килобайт, начинал записываться другой блокнот и так далее?
Можно периодически делать stream.close();stream.open("new_name.txt ");. Только не поможет - получите тысячу файлов по мегабайту и все равно замучаетесь открывать-закрывать. Тут что-то в самой методике менять надо. Гигабайт текста явно для чтения человеком не предназначен.
1
1 / 1 / 0
Регистрация: 03.04.2015
Сообщений: 128
04.04.2015, 00:52  [ТС]
Итак. Сейчас у меня уже ночь и я отправляюсь спать. Теперь я хочу рассказать, почему мне нужны были пробелы между числами. Это нужно было для того, чтобы добавить ещё числа. Но теперь уже от 1 до 4. Эти числа будут стоять сразу после каждой основной из четырнадцати чисел. И теперь каждое из основных числе будет сменяться на следующее по возрастанию не от основной цифры, стоящей справа от неё, а уже от второстепенной цифры, которая также будет стоять справа от неё, но уже без пробела. Хотя можно вместо полного слияния добавить нижний слеш ( _ ). То есть мои комбинации примут следующий вид:

2_1 2_1 2_1 2_1 3_1 3_1 3_1
2_1 2_1 2_1 2_1 3_1 3_1 3_2
2_1 2_1 2_1 2_1 3_1 3_1 3_3
2_1 2_1 2_1 2_1 3_1 3_1 3_4
2_1 2_1 2_1 2_1 3_1 3_1 4_1
2_1 2_1 2_1 2_1 3_1 3_1 4_2
2_1 2_1 2_1 2_1 3_1 3_1 4_3
2_1 2_1 2_1 2_1 3_1 3_1 4_4
2_1 2_1 2_1 2_1 3_1 3_1 5_1
2_1 2_1 2_1 2_1 3_1 3_1 5_2
2_1 2_1 2_1 2_1 3_1 3_1 5_3
2_1 2_1 2_1 2_1 3_1 3_1 5_4
...
2_1 2_1 2_1 2_1 3_1 3_2 3_1
2_1 2_1 2_1 2_1 3_1 3_2 3_2
2_1 2_1 2_1 2_1 3_1 3_2 3_3
2_1 2_1 2_1 2_1 3_1 3_2 3_4

Затем, когда кончатся второстепенные числа, уже сменится и основное число. И так далее. Или буквы подставить вместо чисел, чтобы понятнее было. abcd.

Пока не представляю, как я это сделаю, главное ведь знать, что делать. С утра посмотрим

Добавлено через 3 минуты
Renji, можно и поменять. Например сделать расчёты сначала до 5. То есть от 2 2 2 2 3 3 3 до 5 5 5 5 4 4 4. Затем закрывать. Копировать данные из блокнота в другой блокнот. Затем начинать уже от 5 5 5 5 4 4 4 и до 9 9 9 9 8 8 8 например и так далее до 14.

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Гигабайт текста явно для чтения человеком не предназначен.
Да мне только комбинации скопировать да и всё. Мне их рассортировать ещё потом надо будет просто по силе.

Я просто не знаю, может быть есть какие-нибудь текстовые редакторы, которые поддерживают большие объёмы?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.04.2015, 10:44
Цитата Сообщение от yellyex Посмотреть сообщение
Я просто не знаю, может быть есть какие-нибудь текстовые редакторы, которые поддерживают большие объёмы?
Ну, всё равно не будешь же вручную гигабайтный файл редактировать и эти комбинации сортировать. Дальше тоже прогой надо обрабатывать. Или лучше изначально писать то, что надо.
А так вообще вопрос интеренсый. Если только посмотреть без редактирования - Far и Total Commander по F3 открываюют файл без предварительного чтения целиком.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.04.2015, 10:44

Перечисление переменных
int startPos = 0, endPos; Вот так записать можно? У меня вроде работает, а если с точки зрения классического &quot;правописания&quot;?

Перечисление Com портов
В общем есть такая задачка, есть девайс, который передают данные по блютузу....в комп через USB воткнут приемник, который работает с компом...

Перечисление в структуре
Здравствуйте! Я создала перечисление в структуре struct DCBSettings { enum ...

Перечисление enum
Здравствуйте. Хотелось бы узнать, возможно ли &quot;пройтись&quot; по всем значениям перечисления, увеличивая переменную этого перечисления? Вот...

Enum Перечисление
Есть номиналы монет, которые занесены в 2 перечисления (enum): рубли и монеты. Набрать определенную сумму минимальным количеством монет. ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru