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

Колода карт

05.01.2013, 21:22. Показов 4419. Ответов 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
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
 
void draw_a_card();
int select_next_available ( int n );
 
char *suits[4] = { "hearts", "diamonds", "spades", "clubs" };
char *ranks[13] = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
int card_drawn[52];
int cards_remaining = 52;
 
int main()
{
    int n, i;
    
    srand( time( 0 ) ); // А вот эту запись можно писать где угодно в программе
                             //  чтобы активизировать действительно "случайный" генератор чисел?
                             // Или же в определенном месте?
    while( 1 )
    {
           cout<<"Enter number of cards you want to draw ( 0 to exit ): ";
           cin>>n;
           if ( n == 0 ) break;
           for ( i = 0; i < n; i++ )
               draw_a_card();
               }
   system("pause");
}
 
void draw_a_card()
{
     int r, s, card, n;
     
     n = rand() % cards_remaining--;
     card = select_next_available( n );
     r = card % 13;  // Не понял логику автора, зачем так извращаться, если можно просто написать
     s = card / 13;   //                   rand() % 13;     и    rand() % 4;
     
     cout<<ranks[r]<<" of "<<suits[s]<<endl;
     }
 
int select_next_available( int n )
{
    int i = 0;
    
    while( card_drawn[i] ) // Вот тут мой мозг сломался: что за чудо-условие цикла? Продолжать пока не card_drawn[i]?
           i++;                  // Фиг с ним, если бы было в массиве что-то было, можно было принять это как булево
                                  // значение, но ведь массив card_drawn вообще не инициализирован!
    while( n-- > 0 )
    {
           i++;
           while( card_drawn[i] )
                  i++;
                  }
    card_drawn[i] = true;  // Разве можно присвоить типу int булево значение?
    return i;
}
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2013, 21:22
Ответы с готовыми решениями:

Реализовать структуру "Колода карт"; сформировать случайную перетасовку карт для трёх игроков
Создать структуру колоды карт, состоящую из двух полей- переменных перечислимого типа &quot;масть&quot; и &quot;старшинство&quot;....

Колода карт
реализация колоды карт :wall:

Клас колода карт
Класс CardDeck (колода карт). Класс сохраняет массив из 32 карт (cards), а также текущую карту (currentCard). Надо написать функцию для...

13
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 21:28
srand надо использовать, до того как будете использовать rand()

Добавлено через 48 секунд
Цитата Сообщение от eoLithic Посмотреть сообщение
while( card_drawn[i] )
то же самое, что while(card_drawn[i]!=0)
1
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 21:29  [ТС]
Цитата Сообщение от David Sylva Посмотреть сообщение
то же самое, что while(card_drawn[i]!=0)
Интересно, не встречал такую форму записи. Но ведь массив не проинициалирован! С чем же сравнивать ноль?
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 21:39
Цитата Сообщение от eoLithic Посмотреть сообщение
Интересно, не встречал такую форму записи. Но ведь массив не проинициалирован! С чем же сравнивать ноль?
Как не проинициализирован? массив card_drawn[i], i номер индекса, с этим элементом и сравнивается.
Цитата Сообщение от eoLithic Посмотреть сообщение
card_drawn[i] = true;
Да.

Добавлено через 6 минут
По преобразованием типов, значение типа bool автоматически преобразуется в целые числа 0 или ё при использовании в выражении целочисленного типа.
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 21:40  [ТС]
David Sylva,
Если глянуть на код программы, то видно, что массив card_drawn объявлен, но не проинициализирован.
В условии цикла указанo просто while( card_drawn[i] ) . Я не понял что это значит, вы сказали, что это то же самое, что while ( card_drawn[i] != 0 ) . То есть i-ый элемент массива сравнивается с нулем при каждой итерации цикла. Верно? Но ведь в массива card_drawn вообще нет никаких значений!

Разъясните, пожалуйста, где я неправ.
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 21:56
Смотри, в чём дело, когда первый раз вызывается цикл
Цитата Сообщение от eoLithic Посмотреть сообщение
while( card_drawn[i] ) // Вот тут мой мозг сломался: что за чудо-условие цикла? Продолжать пока не card_drawn[i]?
* * * * * *i++;
, ничего не происходит, но потом по ходу исполнения программы, вот тут присваивается значение
Цитата Сообщение от eoLithic Посмотреть сообщение
card_drawn[i] = true;
, то есть когда будем вызывать в следующий раз, там уже будет значение 1.

Добавлено через 1 минуту
И самое главное, массив объявлен глобально, поэтому он весь про инициализирован 0.
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 21:59  [ТС]
David Sylva,
Цитата Сообщение от David Sylva Посмотреть сообщение
while( card_drawn[i] )
А почему ничего не происходит? Ведь условие цикла абсолютно нелогичное, сравнивание пустоты с нулем. Разве не должна вылазить ошибка при компиляции?
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 22:02
Цитата Сообщение от eoLithic Посмотреть сообщение
А почему ничего не происходит? Ведь условие цикла абсолютно нелогичное, сравнивание пустоты с нулем. Разве не должна вылазить ошибка при компиляции?
там 0, я просто сразу не увидел, что массив глобальный (мой косяк извини).
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 22:04  [ТС]
David Sylva,
В смысле там 0? Я думал, что если объявить массив так array[5] = { 0 }; , то все элементы массива будут равны нулю. Получается, если просто объявить массив так array[5]; , то по умолчанию все забивается нулями?
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 22:08
Цитата Сообщение от eoLithic Посмотреть сообщение
В смысле там 0? Я думал, что если объявить массив так array[5] = { 0 }; , то все элементы массива будут равны нулю. Получается, если просто объявить массив так array[5]; , то по умолчанию все забивается нулями?
Смотри в чём дело, данный массив объявлен глобально, то есть все элементы инициализируются 0, если массив объявлен локально надо инициализировать самому.
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 22:09  [ТС]
Ааа... Тут такой трюк практикуется, что ли. Спасибо за помощь.
Но! Смотрите какая штука. Вот этот код компилируется в ДевС++. На этот раз массив локальный(!). Почему нет ошибки компиляции?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    int array[5];
    int i = 0;
    while ( array[i] )
    {
          cout<<"LOL"<<endl;
          i++;
          }
    
    system("pause");
}
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 22:12
А почему должна, быть ошибка, в массиве содержится мусор.
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 22:15  [ТС]
David Sylva,
Пардон, не совсем корректно программа работает.
Слово LOL не выводится, но почему-то компилируется и выводится окно консоли( пустое, правда ).
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 22:19
Цитата Сообщение от eoLithic Посмотреть сообщение
Пардон, не совсем корректно программа работает.
Слово LOL не выводится, но почему-то компилируется и выводится окно консоли( пустое, правда ).
В неициализированном массиве содержится мусор, вот с ним идёт сравнение в цикле.Ладно, главное теперь поняли в чём была соль в глобальном массиве, а дальше разберётесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2013, 22:19
Помогаю со студенческими работами здесь

Колода карт (тусовка и освобождение памяти)
Собственно столкнулся с двумя вопросами : 1) Каким образом перетусовать колоду карт? Ничем путнее, чем умножить кол-во карт на 8 (N) и...

Колода карт, считать данные из файла в кодировке Unicode
Здравствуйте, я имею необычную задачу, а именно, хочу считать из файла данные такого типа 2♥ 3♥ 4♥ 5♥ 6♥...

Создать класс "Колода карт"
Создать колоду карт. Конструкторы колоды должны инициализировать колоду упорядочено и случайным образом. Создать производный класс от...

Иерархия: класс "карта", "колода карт"
(Иерархия). Создать класс карта, имеющая ранг и масть. Карту можно перевернуть и открыть. Создать класс – колода карт, содержащий карты....

Сколькими способами из колоды (36 карт) можно выбрать неупорядоченный набор из 6 карт, удовлетворяющих условию
Сколькими способами из колоды 36 карт можно выбрать неупорядоченный набор из 6 карт, чтобы в этом наборе было бы точно: 2 дамы, 1 туз, 2...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru