Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

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

Колода карт - C++

05.01.2013, 21:22. Просмотров 850. Ответов 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;
}
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2013, 21:22     Колода карт
Посмотрите здесь:

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

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

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

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

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

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

Раздача карт, оценка комбинации и выяснение сколько карт взять, сколько сбросить - C++
Всем добра! Хочу спросить, как решать задачу со сдачей, оценкой карты и после всего этого нужно ещё вычислить, сколько карт нужно...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 21:28     Колода карт #2
srand надо использовать, до того как будете использовать rand()

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

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

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

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

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");
}
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 22:12     Колода карт #12
А почему должна, быть ошибка, в массиве содержится мусор.
eoLithic
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
05.01.2013, 22:15  [ТС]     Колода карт #13
David Sylva,
Пардон, не совсем корректно программа работает.
Слово LOL не выводится, но почему-то компилируется и выводится окно консоли( пустое, правда ).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 22:19     Колода карт
Еще ссылки по теме:

Написать программу, которая предлагает пользователю ввести порядковый номер карты из колоды и выводит в консоль масть и достоинство карты. Колода, - C++
Написать программу, которая предлагает пользователю ввести порядковый номер карты из колоды и выводит в консоль масть и достоинство карты....

Массив карт - C++
Нужно ввести поток карт, для дальнейшей сортировки. Карта представлена как два символа - (вес) + (масть). Вводится сразу два символа, без...

Цикл for и 56 карт - C++
Выводит 14! карт в каждой строке. Я не понял как это получается. // 7_6.cpp: определяет точку входа для консольного приложения. //...

Перетасовка карт в 52 листа - C++
Имитировать перетасовку ново колоды игральных карт в 52 листа многократным приминением операций сдвига и &quot;врезки&quot; так, чтобы никакие две...

Как раздать по 5 карт - C++
Из 5 издания Дэйтелов. Задача Создается массив 4х13 и иниц. случайными значениями от 1 - 52(номер) затем создаются 2 массива: с...


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

Или воспользуйтесь поиском по форуму:
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
05.01.2013, 22:19     Колода карт #14
Цитата Сообщение от eoLithic Посмотреть сообщение
Пардон, не совсем корректно программа работает.
Слово LOL не выводится, но почему-то компилируется и выводится окно консоли( пустое, правда ).
В неициализированном массиве содержится мусор, вот с ним идёт сравнение в цикле.Ладно, главное теперь поняли в чём была соль в глобальном массиве, а дальше разберётесь.
Yandex
Объявления
05.01.2013, 22:19     Колода карт
Ответ Создать тему
Опции темы

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