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

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

03.04.2015, 18:23. Показов 6973. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru