Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
1

Скрытая ошибка в алгоритме

27.01.2017, 04:47. Просмотров 569. Ответов 21
Метки нет (Все метки)

Привет всем. Я тут всю ночь не спал - укреплял свои навыки программирования. Задался сделать программу "Фортуна" называется. Просто игра, в которой выпадают числа и собирается комбинация. Вроде бы всё сделал, но появилась ошибка при проверке, которую я не знаю как исправить. Просто не хватает опыта. Помогите кто может пожалуйста. Ошибка в комбинации двух пар. Вот кодик:
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
        static void Game()
        {
            Random random = new Random();
            int[] slot = new int[5];
            do
            {
                Console.Clear();
                for (int i = 0; i < slot.Length; ++i)
                {
                    slot[i] = random.Next(1, 9);
                    Console.Write("{0} ", slot[i]);
                }
                Console.WriteLine();
                int a = 0;
                int b = 0;
 
                // Комбинации
                #region Пятёрки и четвёрки
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 5 | a == 4) break;
                    else a = 0;
                }
                if (a == 5)
                {
                    Console.WriteLine("Пятёрка!");
                    continue;
                }
                if (a == 4)
                {
                    Console.WriteLine("Четвёрка!");
                    continue;
                }
                #endregion
                #region Полный дом
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 3) 
                    {
                        for (int e = 0; e < slot.Length; ++e)
                        {
                            for (int f = 0; f < slot.Length; ++f)
                            {
                                if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
                                {
                                    b++;
                                }
                            }
                            if (b == 2) break;
                            else b = 0;
                        }
                    }
                    else a = 0;
                    break;
                }
                if (a == 3 & b == 2)
                {
                    Console.WriteLine("Полный дом!");
                    continue;
                }
                #endregion
                #region Тройка
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 3) break;
                    else a = 0;
                }
                if (a == 3)
                {
                    Console.WriteLine("Тройка!");
                    continue;
                }
                #endregion
                #region Две пары
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 2)
                    {
                        for (int e = 0; e < slot.Length; ++e)
                        {
                            for (int f = 0; f < slot.Length; ++f)
                            {
                                if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
                                {
                                    b++;
                                }
                            }
                            if (b == 2) break;
                            else b = 0;
                        }
                    }
                    else a = 0;
                    break;
                }
                if (a == 2 & b == 2)
                {
                    Console.WriteLine("Две пары!");
                    continue;
                }
                #endregion
                #region Пара
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 2) break;
                    else a = 0;
                }
                if (a == 2)
                {
                    Console.WriteLine("Пара!");
                    continue;
                }
                #endregion
                #region Без выигрыша
                    Console.WriteLine("Без выигрыша!");
                #endregion
 
            } while (Console.ReadKey().Key == ConsoleKey.Enter);
        }
Добавлено через 1 минуту
Ошибка заключается в том, что когда первое число не равно остальным. А остальные являются двумя парами, например 14488, то показывается комбинация "Пара!", а не "Две пары!". У меня неправильный алгоритм, но к другому я ещё не пришёл. Всю ночь потратил, чтобы даже до этого додуматься.

Добавлено через 8 минут
Немного изменил код. Добавил a = 0 и b = 0, после каждой комбинации. Пока ищу, может быть это была ошибка.
Кликните здесь для просмотра всего текста
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
        static void Game()
        {
            Random random = new Random();
            int[] slot = new int[5];
            do
            {
                Console.Clear();
                for (int i = 0; i < slot.Length; ++i)
                {
                    slot[i] = random.Next(1, 9);
                    Console.Write("{0} ", slot[i]);
                }
                Console.WriteLine();
                int a = 0;
                int b = 0;
 
                // Комбинации
                #region Пятёрки и четвёрки
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 5 | a == 4) break;
                    else a = 0;
                }
                if (a == 5)
                {
                    a = 0;
                    b = 0;
                    Console.WriteLine("Пятёрка!");
                    continue;
                }
                a = 0;
                b = 0;
                if (a == 4)
                {
                    a = 0;
                    b = 0;
                    Console.WriteLine("Четвёрка!");
                    continue;
                }
                a = 0;
                b = 0;
                #endregion
                #region Полный дом
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 3) 
                    {
                        for (int e = 0; e < slot.Length; ++e)
                        {
                            for (int f = 0; f < slot.Length; ++f)
                            {
                                if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
                                {
                                    b++;
                                }
                            }
                            if (b == 2) break;
                            else b = 0;
                        }
                    }
                    else a = 0;
                    break;
                }
                if (a == 3 & b == 2)
                {
                    a = 0;
                    b = 0;
                    Console.WriteLine("Полный дом!");
                    continue;
                }
                a = 0;
                b = 0;
                #endregion
                #region Тройка
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 3) break;
                    else a = 0;
                }
                if (a == 3)
                {
                    a = 0;
                    b = 0;
                    Console.WriteLine("Тройка!");
                    continue;
                }
                a = 0;
                b = 0;
                #endregion
                #region Две пары
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 2)
                    {
                        for (int e = 0; e < slot.Length; ++e)
                        {
                            for (int f = 0; f < slot.Length; ++f)
                            {
                                if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
                                {
                                    b++;
                                }
                            }
                            if (b == 2) break;
                            else b = 0;
                        }
                    }
                    else a = 0;
                    break;
                }
                if (a == 2 & b == 2)
                {
                    a = 0;
                    b = 0;
                    Console.WriteLine("Две пары!");
                    continue;
                }
                a = 0;
                b = 0;
                #endregion
                #region Пара
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 2) break;
                    else a = 0;
                }
                if (a == 2)
                {
                    a = 0;
                    b = 0;
                    Console.WriteLine("Пара!");
                    continue;
                }
                a = 0;
                b = 0;
                #endregion
                #region Без выигрыша
                Console.WriteLine("Без выигрыша!");
                #endregion
 
            } while (Console.ReadKey().Key == ConsoleKey.Enter);
        }


Добавлено через 2 минуты
Нет, не то. Всё ещё, если первое число не совпадает с остальными 25588, то показывается, что пара. Не знаю что это. Ладно, я пойду отдыхать.

Добавлено через 9 минут
Я не смогу уснуть, пока не решу Придётся заново алгоритм выдумывать. Просто я хочу сделать без встроенных функций массива на подобие Array.sort(); Потому что я ничему не научусь. А я ведь такую силу почувствовал. Будет обидно, что я написал правильный код, но ошибся с каким-нибудь break или условии

Добавлено через 2 минуты
По идее, мой цикл должен проходить и сравнивать все числа в массиве. По другому никак. Но может быть я что-то не понимаю... Дальше идут сравнения на количество одинаковых чисел. Всё хорошо, если пара есть у первого числа и дальше у остальных чисел. Тогда ошибок не возникает. Но, когда первое число бесхозное, то дальше, если есть две пары или полный дом, то показывается либо пара, либо тройка. Не могу сообразить, с чем это связано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2017, 04:47
Ответы с готовыми решениями:

Ошибка в алгоритме сортировки бинарным деревом
Ребят помогите пж, препод задал сделать сортировку с помощью двоичного дерева,...

Логическая ошибка в алгоритме нахождения точек циссоиды
Здравствуйте, товарищи. Нужно построить график циссоиды. Здесь я получаю точки...

Ошибка в алгоритме преобразования выражения в обратную польскую запись
Метод OPLConvert принимает выражение в виде строки, например &quot;2+2*2&quot;. Пока что...

Ошибка в алгоритме метода ветвей и границ - на некоторых графах программа зависает
Добрый день! Ошибка в алгоритме, метод ветвей и границ - поиск минимального...

Ошибка в алгоритме чтения
У меня есть такой код: private void button4_Click(object sender, EventArgs...

21
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 04:53  [ТС] 2
Это не нормально
0
Изображения
 
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 04:54  [ТС] 3
Тут полный дом должен быть.

Чувствую, что всё дело в continue, после комбинаций. Если их убрать, то на консоли будет выскакивать сразу все возможные комбинации. А хотелось, чтобы одна самая сильная.
0
zewer
1672 / 1287 / 160
Регистрация: 07.01.2011
Сообщений: 8,079
Завершенные тесты: 1
27.01.2017, 05:26 4
правила вашей игры то какие? алгоритм словами опишите
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 05:34  [ТС] 5
Цитата Сообщение от zewer Посмотреть сообщение
правила вашей игры то какие? алгоритм словами опишите
Ну, я думал, что предоставленный код отвечает на этот вопрос. Нажимаем на Enter, создаются числа от 1 до 5 в 5 ячейках. Дальше по убыванию от самой сильной комбинации 5 одинаковых, четыре одинаковых числа. Дальше полный дом и ниже. Цель игры делать ставки и выигрывать деньги. Но их я ещё не делал.

Добавлено через 5 минут
Да я точно теперь уверен, что ошибка в алгоритме счёта комбинации. Просто потом попытаюсь разобрать. Сейчас устал просто.
0
zewer
1672 / 1287 / 160
Регистрация: 07.01.2011
Сообщений: 8,079
Завершенные тесты: 1
27.01.2017, 05:38 6
Цитата Сообщение от Будущее Посмотреть сообщение
предоставленный код отвечает на этот вопрос
Цитата Сообщение от Будущее Посмотреть сообщение
создаются числа от 1 до 5
Цитата Сообщение от Будущее Посмотреть сообщение
C#
1
slot[i] = random.Next(1, 9);
не похоже

Добавлено через 1 минуту
Если у меня будет 1 3 1 3 1 то что мне прога должна выдать по вашему алгоритму ?
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 05:38  [ТС] 7
Ну разве это мешает понять ошибку? Просто измените на любое удобное число. Тут же без разницы. Просто шансов собрать выигрышную комбинацию будет меньше.
0
zewer
1672 / 1287 / 160
Регистрация: 07.01.2011
Сообщений: 8,079
Завершенные тесты: 1
27.01.2017, 05:40 8
Цитата Сообщение от Будущее Посмотреть сообщение
Просто измените на любое удобное число.
у меня нет студии под рукой, я смотрю на глаз просто по коду. Никакой возможности выполнить код нету
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 05:40  [ТС] 9
Цитата Сообщение от zewer Посмотреть сообщение
Если у меня будет 1 3 1 3 1 то что мне прога должна выдать по вашему алгоритму ?
Полный дом, судя по правилам. Полный дом это 3 одинаковых плюс 2 одинаковых числа. Просто в случае 1 2 2 2 1 будет просто тройка. А в случае 22445 будет две пары, а в 13355, одна пара.
0
Изображения
 
zewer
1672 / 1287 / 160
Регистрация: 07.01.2011
Сообщений: 8,079
Завершенные тесты: 1
27.01.2017, 05:41 10
Цитата Сообщение от Будущее Посмотреть сообщение
Полный дом, судя по правилам.
уже ближе к теме, можете полностю предоставить правила игры?
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 06:35  [ТС] 11
Цитата Сообщение от zewer Посмотреть сообщение
уже ближе к теме, можете полностью предоставить правила игры?
Изначально я делал подобие детской игры "Фортуна", где игрок просто крутил барабан и ему выпадала комбинация из трёх чисел. В этой версии я сделал 5 чисел и больше комбинаций. Можно без ставок. Просто нажимая на Enter можно получать комбинации из чисел. По моей задумке их будет 10, от 1 до 10. А слотов 5. Я придумал возможные комбинации начиная от самой редкой 5 одинаковых чисел, и заканчивая самой распространённой - без выигрыша. Последняя выигрышная комбинация - пара (два одинаковых числа). Вот и вся программа.

Добавлено через 47 минут
Я спать. Время 6:30 утра. Меня сильно рубит.

Добавлено через 2 минуты

Не по теме:

Не думал, что буду упарываться не по бухлу с тёлками, а по программированию. Зацепило не по-детски.

0
Usaga
Эксперт .NET
5027 / 3355 / 598
Регистрация: 21.01.2016
Сообщений: 13,194
Завершенные тесты: 2
27.01.2017, 07:04 12
Будущее, ты уверен, что вот эти выражения описывают именно то, что ты хотел:
C#
1
if (a == 5 | a == 4) break;
C#
1
if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
C#
1
if (a == 3 & b == 2)
?
0
petrolium
Нарушитель
99 / 33 / 10
Регистрация: 05.10.2013
Сообщений: 154
Записей в блоге: 1
Завершенные тесты: 5
27.01.2017, 08:12 13
ну вот, что здесь хитрого то?
C#
1
2
3
4
 if ((slot[1] == slot[2]) & (slot[3] == slot[4]) & (slot[1] != slot[3]) & (slot[0] != slot[1]))
     {
      Console.WriteLine("Две пары!");
     }
Это a b тебя похоже запутали.

Что нам говорит по этому поводу наш повелитель, господин Рихтер?
«лучший метод борьбы со сложностью — добавление новых типов»

Добавлено через 7 минут
(slot[0] != slot[1]) первое число не должно совпадать со вторым
И
(slot[1] == slot[2]) второе число равно третьему
И
(slot[3] == slot[4]) четвертое число равно пятому
И
(slot[1] != slot[3]) первая пара не равна второй
0
jetyb
158 / 158 / 70
Регистрация: 26.10.2012
Сообщений: 498
Завершенные тесты: 1
27.01.2017, 08:32 14
Слишком замуторно написано: вложенные циклы размером в страницу с особой логикой.
Лучше подумать и воспользоваться имеющимся функционалом LINQ.
(да он медленней, но понятнее)
C#
1
2
3
4
5
6
7
8
9
var groups = slot.GroupBy(num => num).
                Select(group => new {Count = group.Count(), Number = group.Key}).
                OrderBy(v => v.Count).ToArray();
            if (groups[0].Count >= 2)
            {
                Console.WriteLine(groups[1].Count == 2
                        ? $"{groups[0].Count} {groups[0].Number}-ек и два {groups[1].Number}-ек"
                        : $"{groups[0].Count}  {groups[0].Number}-ек");
            }
Фулл стрит подумайте как сделать сами.

Добавлено через 6 минут
только у меня вместо OrderBy должно быть OrderByDescending
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 16:31  [ТС] 15
jetyb, спасибо, но я не умею в ваш LINQ. Я только базовые методы узнал ещё и именно ими хочу всё это дело осуществить. Пока я спал я подумал, что нужно делать проверку на а = 3 во внутреннем цикле и выходить из него, чтобы он дальше а не проверял. Попробую ещё раз.

Добавлено через 2 минуты
petrolium, и Вам спасибо за ответ. Я это понимаю, что можно сделать вручную или использовать готовые функции сравнения, но, как я уже говорил ранее - я учусь. И мне важна логика построения, нежели готовый результат без умения и знаний в голове. Вы уж простите Я и сортировку тоже хотел сделать вручную. В общем, надо разбирать код. от логики не уйдёшь.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Будущее, ты уверен, что вот эти выражения описывают именно то, что ты хотел:
C#Выделить код
1
if (a == 5 | a == 4) break;
C#Выделить код
1
if ((slot[e] != slot[c]) & (slot[e] == slot[f]))
C#Выделить код
1
if (a == 3 & b == 2)
?
Насколько я понял из книги, то | и || это одно и тоже. Просто || это сокращённое сравнение. Я в этом не уверен. Есть разница?
0
movorpovor
1 / 1 / 0
Регистрация: 24.05.2015
Сообщений: 45
27.01.2017, 16:45 16
Цитата Сообщение от Будущее Посмотреть сообщение
Насколько я понял из книги, то | и || это одно и тоже. Просто || это сокращённое сравнение. Я в этом не уверен. Есть разница?
если ставишь одну палку, то полюбому проверятся оба условия, если два, то если для вынесения решения будет хватать первого сравнения, на нем все и остановится. допустим в выражении if(5 < 7 || 5 < 2) будет выполнена только первая проверка, т.к. true мы уже получили, а если одно == true то все выражение равно true.

соответственно если выражение (5 > 7 && 5 < 8) то выполнится только первая проверка, а вторая не будет, т.к. если хотябы одно ==dalse, то и все выражение равно false

Добавлено через 5 минут
а по поводу алгоритма: попробуй сам его проговорить вслух, а уже только потом кодить. например, если я хочу узнать что за комбинация вылезла, я бы взял ее, отсортировал, и смотрел последовательно что в ней присутствует. т.е. если я нашел пару, я ставлю метку - найдена одна пара. дальше если нашел еще одну, ставлю очередную метку - найдена еще одна пара. нашел тройку - ставишь метку найдена тройка. а потом тупо смотришь на то, какие метки у тебя стоят. допустим фуллхаус это комбинация меток "найдена пара" и "найдена тройка"
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 17:51  [ТС] 17
Вот я разобрал отдельно комбинацию полный дом. Посмотрите пожалуйста, что у меня не так в коде.
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
       static void Test1()
        {
            Random random = new Random();
            int[] slot = new int[5]; // Массив под ячейки чисел.
            int a = 0; // Количество одинаковых чисел №1.
            int b = 0; // Количество одинаковых чисел №1.
 
            do
            {
                Console.Clear();
 
                for (int i = 0; i < slot.Length; ++i) // Заполняем массив случайными числами.
                {
                    slot[i] = random.Next(1, 6);
                    Console.Write("{0} ", slot[i]);
                }
 
                Console.WriteLine();
 
                /* Два цикла проходят по массиву slot. Во внутреннем цикле
                 * идёт сравнение на равенство значений двух чисел slot[c] и slot[d].
                 * Если они равны, то a++;
                 * Дальше с становится на +1 и так сравниваются все числа массива друг с другом. Может быть я ошибаюсь.
                 * Если а не равно 3 за первый внутренний цикл, то а сбрасывается до нуля. Так как число под индексом 0
                 * не имеет трёх повторений. Затем сравнивается число под индексом 1 и так далее.
                 * После каждой итерации идёт сравнение а = 3. Если да, то запускаются ещё два внутренних цикла, чтобы аналогичным
                 * образом проверить наличие двух одинаковых чисел, только для этого уже используется переменная b.
                 * И ещё сравнениватся не равно ли новое искомое число с числом a.
                 * Если не равно, то b++. Тут тоже проверяется равно ли b = 2. Если да, то значит у нас а не равно b, где а = 3,
                 * а b = 2. По логике получается полный дом. Когда а = 3 и b = 2, то я ставлю break, чтобы выити из цикла.
                 * Честно говоря я думаю, что у меня здесь ошибка. Дальше выходим из общего цикла и сравниваем а = 3 и b = 2,
                 * то пишем сообщение о комбинации.
                */
 
                for (int c = 0; c < slot.Length; ++c) 
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d])
                        {
                            a++;
                        }
                    }
                    if (a == 3)
                    {
                        for (int e = 0; e < slot.Length; ++e)
                        {
                            for (int f = 0; f < slot.Length; ++f)
                            {
                                if ((slot[e] != slot[c]) && (slot[e] == slot[f]))
                                {
                                    b++;
                                }
                            }
                            if (b == 2) break;
                            else b = 0;
                        }
                    }
                    else
                    {
                        a = 0;
                        break;
                    }
                }
                if ((a == 3 && b == 2))
                {
                    Console.WriteLine("Полный дом!");
                }
 
            } while (Console.ReadKey().Key == ConsoleKey.Enter);
        }
Добавлено через 11 минут
Вот это же выражение верно? Осталось только добавить сравнение на второе число, которое будет равно 2. Но, видимо, у меня это не получилось.
C#
1
2
3
4
5
6
7
8
9
10
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d]) a++; // Сравнивает slot[c] со slot[d]. slot[d] проходит по всему циклу, а затем идёт проверка "а = 3"
                    }
                    if (a == 3) break; // Выходим из цикла "с", если "а = 3".
                    else a = 0; // Если "а != 3", то а сбрасывается до нуля.
                }
                if (a == 3) Console.WriteLine("Тройка!"); // Если a = 3, то выводится сообщение.
Добавлено через 27 минут
Ну сейчас то правильно?
Кликните здесь для просмотра всего текста
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
        static void Test2()
        {
            Random random = new Random();
            int[] slot = new int[5];
            int a = 0;
            int b = 0;
            bool FullHouse = false;
            bool three = false;
            bool two = false;
 
            do
            {
                Console.Clear();
 
                for (int i = 0; i < slot.Length; ++i)
                {
                    slot[i] = random.Next(1, 6);
                    Console.Write("{0} ", slot[i]);
                }
 
                Console.WriteLine();
 
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d]) a++;
                    }
                    if (a == 3) break;
                    else a = 0; 
                }
                if (a == 3) three = true;
 
                for (int c = 0; c < slot.Length; ++c)
                {
                    for (int d = 0; d < slot.Length; ++d)
                    {
                        if (slot[c] == slot[d]) b++;
                    }
                    if (b == 2) break;
                    else b = 0;
                }
                if (b == 2) two = true;
                if (three == true && two == true)
                {
                    FullHouse = true;
                    if (FullHouse == true) Console.WriteLine("Полный дом!");
                }
 
                FullHouse = false;
                three = false;
                two = false;
 
            } while (Console.ReadKey().Key == ConsoleKey.Enter);


Добавлено через 3 минуты
Вроде правильно, просто я изначально мог вручную прописать все возможные комбинации, но я хотел сделать всё максимально автоматизированно, что, собственно, и олицетворяет компьютер.

Добавлено через 16 секунд
Вроде правильно, просто я изначально мог вручную прописать все возможные комбинации, но я хотел сделать всё максимально автоматизированно, что, собственно, и олицетворяет компьютер.

Добавлено через 2 минуты
Просто я тут не делаю проверку является ли число А, числом Б или нет. То есть может быть три одинаковых а и два одинаковых по значению Б. Но пока работает нормально.

Добавлено через 8 минут
Кто-нибудь может объяснить, если я не делаю проверку числа А с числом б на равенство их значений в текущем алгоритме, то почему всё работает? Ведь А может быть равно 2, и во время поиска Б, Б может быть равно тоже 2. Проверяю и всё работает нормально. Ничего не понимаю.
0
Usaga
Эксперт .NET
5027 / 3355 / 598
Регистрация: 21.01.2016
Сообщений: 13,194
Завершенные тесты: 2
27.01.2017, 17:52 18
Цитата Сообщение от Будущее Посмотреть сообщение
Просто || это сокращённое сравнение. Я в этом не уверен. Есть разница?
Нет, это не одно и тоже "|" - это операции битового логического ИЛИ, "&" - битовое логическое И. Совсем не тоже самое, что условные операторы "||" и "&&". Почитай об этом внимательнее.
0
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
27.01.2017, 23:26  [ТС] 19
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
        static void Test2()
        {
            Random random = new Random();
            int[] slot = new int[5];
            int a = 0;
            int b = 0;
            bool FullHouse = false;
            bool three = false;
            bool two = false;
            do
            {
                FullHouse = false;
                while (!FullHouse)
                {
                    FullHouse = false;
                    three = false;
                    two = false;
 
                    Console.Clear();
                    for (int i = 0; i < slot.Length; ++i)
                    {
                        slot[i] = random.Next(1, 10);
                        Console.Write("{0} ", slot[i]);
                    }
                    Console.WriteLine();
                    for (int c = 0; c < slot.Length; ++c)
                    {
                        for (int d = 0; d < slot.Length; ++d)
                        {
                            if (slot[c] == slot[d]) a++;
                        }
                        if (a == 3) break;
 
                        else a = 0;
                    }
                    if (a == 3) three = true;
                    for (int c = 0; c < slot.Length; ++c)
                    {
                        for (int d = 0; d < slot.Length; ++d)
                        {
                            if (slot[c] == slot[d]) b++;
                        }
                        if (b == 2) break;
                        else b = 0;
                    }
                    if (b == 2) two = true;
                    if (three && two)
                    {
                        FullHouse = true;
                        if (FullHouse) Console.WriteLine("Полный дом!");
                    }
                }
            } while (Console.ReadKey().Key == ConsoleKey.Enter);
        }
    }
Добавлено через 1 минуту
Теперь код соответствует ожиданию, но я считаю, что в нём ошибка, так как нет сравнения числа А с числом Б. Проверка ошибок не выдаёт. Либо лыжи не едут, либо я...

Добавлено через 9 минут
Цитата Сообщение от Usaga Посмотреть сообщение
Сообщение от Будущее
Просто || это сокращённое сравнение. Я в этом не уверен. Есть разница?
Нет, это не одно и тоже "|" - это операции битового логического ИЛИ, "&" - битовое логическое И. Совсем не тоже самое, что условные операторы "||" и "&&". Почитай об этом внимательнее.
Как я понял из книги, когда читал, то | это или, при котором проверяется все условия, а || только одно, и, если оно истинно, то проверяются остальные. Если хоть одно из условий ложно, то проверка других прерывается. Думал, что мне нужно, чтобы все условия проверялись независимо от истинности, поэтому я и выбрал |. Я не знаю, как это на практике вообще смотрится, извините

Добавлено через 5 минут
Я увеличил количество ячеек до 10, но всё равно всё работает верно. Ищется именно 3 и 2 количества разных чисел. Ппц. Что не так со мной? Разве мой вопрос о сравнении искомых чисел не имеет места быть? Есть тут гуру?

Добавлено через 4 минуты
Оказывается мой вопрос актуальный, если я хочу найти две пары. Тогда числа надо сравнивать, а то код находит только одну пару и показывает верный результат. А это не верно.

Добавлено через 10 минут
Эврика! Почему-то создание правильного кода приходит раньше, чем его понимание! lol
Я сделал сравнение чисел. Получилось!
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
        static void Test2()
        {
            Random random = new Random();
            int[] slot = new int[5];
            int a = 0;
            int b = 0;
            bool FullHouse = false;
            bool three = false;
            bool two = false;
            int x = 0;
            int y = 0;
            do
            {
                FullHouse = false;
                while (!FullHouse)
                {
                    FullHouse = false;
                    three = false;
                    two = false;
 
                    Console.Clear();
                    for (int i = 0; i < slot.Length; ++i)
                    {
                        slot[i] = random.Next(1, 11);
                        Console.Write("{0} ", slot[i]);
                    }
                    Console.WriteLine();
                    for (int c = 0; c < slot.Length; ++c)
                    {
                        for (int d = 0; d < slot.Length; ++d)
                        {
                            if (slot[c] == slot[d]) a++;
                        }
                        if (a == 2)
                        {
                            x = slot[c];
                            break;
                        }
                        else a = 0;
                    }
                    if (a == 2) three = true;
                    for (int c = 0; c < slot.Length; ++c)
                    {
                        for (int d = 0; d < slot.Length; ++d)
                        {
                            if (x != slot[d])
                            {
                                if (slot[c] == slot[d]) b++;
                            }
                        }
                        if (b == 2)
                        {
                            y = slot[c];
                            break;
                        }
                        else b = 0;
                    }
                    if (b == 2) two = true;
                    if ((three && two))
                    {
                        if (x != y)
                        {
                            FullHouse = true;
                            if (FullHouse) Console.WriteLine("Две пары!");
                        }
                    }
                }
            } while (Console.ReadKey().Key == ConsoleKey.Enter);
        }
Добавлено через 17 минут
Ребят, вы бы хоть чуток меня подбодрили. Я в этом деле новичок. Всем спасибо кто откликнулся и помог! И я понимаю, что копаться в чужом коде сложно, но не могли бы вы подтвердить, что данный код по полному дому и двум парам, с точки зрения расчётов (Но не оптимизации. Я к ней пока не стремлюсь) верный? И я пойду учиться дальше. Спасибо.

Добавлено через 4 часа 42 минуты
Люди! Я понимаю, что затрахал вас своим кодом, но я всё же учусь, и ваши советы не остаются без внимания! Я хочу спросить кое-что ещё. В конце каждой комбинации у меня numbersCount сбрасывается до нуля, чтобы при проверке следующей комбинации не возникало ошибок. Так вот, если я ставлю numbersCount после вычисления комбинации вот тут:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                    #region Пятёрка
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        for (int b = 0; b < slot.Length; ++b)
                        {
                            if (slot[a] == slot[b]) numbersCount++;
                        }
                        if (numbersCount == 5)
                        {
                            five = true;
                            break;
                        }
                        else numbersCount = 0;
                    }
                    if (five)
                    {
                        Console.WriteLine("Пятёрка!");
                        continue;
                    }
                    numbersCount = 0; // Вот тут.
То комбинации расчитываются неверно. А если ставлю вот тут:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                    #region Пятёрка
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        for (int b = 0; b < slot.Length; ++b)
                        {
                            if (slot[a] == slot[b]) numbersCount++;
                        }
                        if (numbersCount == 5)
                        {
                            five = true;
                            break;
                        }
                        else numbersCount = 0;
                    }
                    if (five)
                    {
                        Console.WriteLine("Пятёрка!");
                        numbersCount = 0; // Вот тут.
                        continue;
                    }
То всё нормально.

Вот весь код (правильный). Объясните пожалуйста, если не трудно. Так как в первом случае, когда заканчивается проверка на пятёрку и ничего не находит, нужно сбрасывать numbersCount до нуля, а не сбрасывать его только при нахождении пятёрки. Вроде бы понимаю, но не понимаю, почему не понимаю. Складывается такая тенденция, что всё работает, если я не понимаю, как это работает.

Кликните здесь для просмотра всего текста
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
        static void Game()
        {
            Random random = new Random();
 
            int[] slot = new int[5];
 
            int numbersCount = 0;
 
            do
            {
                bool five = false;
                bool four = false;
                bool three = false;
                bool two = false;
                bool one = false;
 
                while (!five)
                {
                    five = false;
                    four = false;
                    three = false;
                    two = false;
                    one = false;
 
                    Console.Clear();
 
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        slot[a] = random.Next(1, 6);
                        Console.Write("{0} ", slot[a]);
                    }
 
                    Console.WriteLine();
 
                    // КОМБИНАЦИИ
 
                    //----------
                    #region Пятёрка
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        for (int b = 0; b < slot.Length; ++b)
                        {
                            if (slot[a] == slot[b]) numbersCount++;
                        }
                        if (numbersCount == 5)
                        {
                            five = true;
                            break;
                        }
                        else numbersCount = 0;
                    }
                    if (five)
                    {
                        Console.WriteLine("Пятёрка!");
                        numbersCount = 0; // Вот тут правильно.
                        continue;
                    }
 
                    #endregion
                    //----------
                    #region Четвёрка
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        for (int b = 0; b < slot.Length; ++b)
                        {
                            if (slot[a] == slot[b]) numbersCount++;
                        }
                        if (numbersCount == 4)
                        {
                            four = true;
                            break;
                        }
                        else numbersCount = 0;
                    }
                    if (four)
                    {
                        Console.WriteLine("Четвёрка!");
                        numbersCount = 0;
                        continue;
                    }
                    #endregion
                    //----------
                    #region Тройка
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        for (int b = 0; b < slot.Length; ++b)
                        {
                            if (slot[a] == slot[b]) numbersCount++;
                        }
                        if (numbersCount == 3)
                        {
                            three = true;
                            break;
                        }
                        else numbersCount = 0;
                    }
                    if (three)
                    {
                        Console.WriteLine("Тройка!");
                        numbersCount = 0;
                        continue;
                    }
                    #endregion
                    //----------
                    #region Пара
                    for (int a = 0; a < slot.Length; ++a)
                    {
                        for (int b = 0; b < slot.Length; ++b)
                        {
                            if (slot[a] == slot[b]) numbersCount++;
                        }
                        if (numbersCount == 2)
                        {
                            two = true;
                            break;
                        }
                        else numbersCount = 0;
                    }
                    if (two)
                    {
                        Console.WriteLine("Пара!");
                        numbersCount = 0;
                        continue;
                    }
                    #endregion
                    //----------
                }
            } while (Console.ReadKey().Key == ConsoleKey.Enter);
        }
0
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
28.01.2017, 02:55 20
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Program
{
    public static void Main()
    {
        int[] numbers = new int[] { 1, 2, 2, 2, 1 };
        List<int> frequency = numbers.GroupBy(n => n).Select(g => g.Count()).OrderBy(n => n).ToList();
        switch (frequency.Count)
        {
            case 1: Console.WriteLine("Пять одинаковых"); break;
            case 2: Console.WriteLine(frequency[0] == 4 ? "Четыре одинаковых" : "Три плюс два"); break;
            case 3: Console.WriteLine(frequency[0] == 3 ? "Три одинаковых" : "Две пары"); break;
            case 4: Console.WriteLine("Пара"); break;
            case 5: Console.WriteLine("Все разные"); break;
        }
    }
}
0
28.01.2017, 02:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2017, 02:55

IndexOutOfRangeExeption в алгоритме Quick Sort
Доброго времени суток! Кто-то может подсказать, пожалуйста, в чем проблема?...

Найти ошибку в алгоритме обхода графа
Всё работает нормально, но почему то он Выводит не правильные значения... ...

Дерево в алгоритме Хаффмана, разобраться с записью
Здравствуйте! Хотел бы попросить помощи у вас по построению дерева в...


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

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

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