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

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Будущее
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 32
#1

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

27.01.2017, 04:47. Просмотров 529. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Скрытая ошибка в алгоритме (C#):

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

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

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

Ошибка в алгоритме чтения - C#
У меня есть такой код: private void button4_Click(object sender, EventArgs e) // Загр. из файла { ...

IndexOutOfRangeExeption в алгоритме Quick Sort - C#
Доброго времени суток! Кто-то может подсказать, пожалуйста, в чем проблема? Мучаюсь 2-й день. Алгоритм, в принципе, взят отсюда:...

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

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
1329 / 1018 / 107
Регистрация: 07.01.2011
Сообщений: 6,768
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
1329 / 1018 / 107
Регистрация: 07.01.2011
Сообщений: 6,768
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
1329 / 1018 / 107
Регистрация: 07.01.2011
Сообщений: 6,768
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
1329 / 1018 / 107
Регистрация: 07.01.2011
Сообщений: 6,768
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
2230 / 1898 / 349
Регистрация: 21.01.2016
Сообщений: 7,293
Завершенные тесты: 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
Нарушитель
98 / 32 / 5
Регистрация: 05.10.2013
Сообщений: 176
Записей в блоге: 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
148 / 148 / 47
Регистрация: 26.10.2012
Сообщений: 468
Завершенные тесты: 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
27.01.2017, 16:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2017, 16:31
Привет! Вот еще темы с ответами:

Найти ошибку в алгоритме обхода графа - C#
Всё работает нормально, но почему то он Выводит не правильные значения... Вот код: using System; using System.Collections; ...

Генерация публичного ключа по приватному в алгоритме DSA - C#
Добрый день, народ. Хочу подписать и проверить электронную цифровую подпись используя алгоритм DSA. MSDN генерирует ключи...

Принцип работы рекурсии в алгоритме проверки палиндрома - C#
Имеется не большой код на проверку слова(является ли оно палиндромом).Немного не понимаю,как программа запоминает,что был false в конце.Мне...

Подсчитать количество сравнений в алгоритме бинарного поиска - C#
Здравствуйте, у меня есть массив слов words в котором мы будем находить необходимые слова, с помощью массива wordsForFind, слова нужно...


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

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

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