![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#31 |
Пользователь
Регистрация: 14.03.2022
Сообщений: 32
|
![]()
Помогите разобраться с участком кода. Вот пример из книги. Пользователь вводит цифрой количество карт, которые ему нужно выдать, и программа выдает ему эти карты. Мне все понято, кроме одного. Кроме функции "int celectnext(int n)". По книге эта функция должна пропускать вытянутые карты, и выдавать только новые карты. Но я все равно никак не могу понять, как это происходит. Вот код.
Код:
|
![]() |
![]() |
![]() |
#32 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
А разве это не должно быть в цикле while
Код:
|
![]() |
![]() |
![]() |
#33 |
Пользователь
Регистрация: 14.03.2022
Сообщений: 32
|
![]()
Ну в моем коде пока еще нет "защиты от выхода за границы массива". Вот эта переменная "n", которая используется в функции "selectnext" - это же n, которая была получена в функции cards? То есть она обозначает случайное число, до 52? А не число карт, которое мы обозначили тоже как n, которое мы вводили в первой функции.
|
![]() |
![]() |
![]() |
#34 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
Тогда функция сама по себе написана не верно. Достаточно проверить выдана ли карта с этим индексом и вернуть в ответ да или нет.
Код:
Смотрите: Если при первом срабатывании cardsremai = 52 и n примет значения от 0 до 51. Скажем что выпало n = 5, тогда cardsremai = 51 и выдали карту с индексом 5. Тогда при втором срабатывании cardsremai = 51 и n примет значения уже от 0 до 50 (51 ещё не выдана, но её индекс уже не будет выбран). Скажем что теперь выпало n = 50, тогда cardsremai = 50 и выдали карту с индексом 50. А теперь при третьем срабатывании cardsremai = 50 и n примет значения от 0 до 49 (51 ещё не выдана, но её индекс уже не будет выбран, хотя 50 карта уже выдана и её индекс уже не нужен). Скажем опять выпало n = 5, тогда карта не будет выдана повторно, хотя сама функция cards этого не учитывает. Последний раз редактировалось macomics; 10.03.2023 в 17:22. |
![]() |
![]() |
![]() |
#35 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,429
|
![]() Код:
Так если по стандарту должны быть нули, то это уже забота компилятора под определённую ОС, добавлять ли специальный код для инициализации или разместить переменную в правильной секции. Про неочевидные ошибки согласен - лучше стараться использовать локальные переменные и явно их инициализировать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() Последний раз редактировалось BDA; 10.03.2023 в 17:26. |
![]() |
![]() |
![]() |
#36 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
BDA, я не читал весь код. Только функцию, которая была указана.
|
![]() |
![]() |
![]() |
#37 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,429
|
![]()
В функции cards выбирается "новый" индекс (только среди невыбранных), который с помощью selectnext преобразуется в "старый" индекс (среди всех существующих карт).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#38 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
А стоило прочитать весь текст программы.
Последний раз редактировалось macomics; 10.03.2023 в 17:34. |
![]() |
![]() |
![]() |
#39 |
Пользователь
Регистрация: 14.03.2022
Сообщений: 32
|
![]()
Ну вот сам код программы из книги. Допустим мы ввели любое число комбинаций, пусть будет 10. Для каждого числа просчитывается своя комбинация. Допустим мы вычислили случайное число от 0 до 52. Пусть это будет 20. Потом эта 20 передается в функцию selext_next_available.
Эта функция начинается с цикла while. Так как i=0. То функция while(card_drawn[i]) начинает опрос нулевого элемента массива card_drawn. Но, так как этот массив является глобальным, этот нулевой элемент массива равняется нулю. Поэтому получаем while(0) и сразу переходим в while(n-->0). А зачем нам отнимать единицу от случайного числа 20? Все равно не могу понять, как это поможет "отметить" эту карту уже вытянутой. |
![]() |
![]() |
![]() |
#40 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
Я вот тоже, прочитав код только одной функции, не разобрался в чем тут дело.
Совет: возьмите отладчик и пройдите программу по шагам, наблюдая за всеми переменными на каждом шаге. Так вы наглядно сможете увидеть что происходит и разобраться в значениях. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопросы по C и C++ | jonikster | Общие вопросы C/C++ | 25 | 17.11.2017 09:10 |
Вопросы | Ilai | Помощь студентам | 5 | 29.10.2014 21:35 |
Вопросы по БД | Rost93 | PHP | 9 | 28.06.2011 22:18 |
Вопросы по С++ | Fantazerishka | Общие вопросы C/C++ | 2 | 19.05.2010 06:52 |