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

Цикл for и 56 карт - C++

Восстановить пароль Регистрация
 
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
18.08.2010, 22:44     Цикл for и 56 карт #1
Выводит 14! карт в каждой строке.
Я не понял как это получается.

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
// 7_6.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
 
using namespace std;
 
enum Suit {clubs, diamonds, hearts, spades};
enum Man {Jake, Nik, Bob, Arni};
const int jack =10;
const int queen=11;
const int king =12;
const int ace = 13;
 
 
 
 
class card
{
private:
    int number;
    Suit suit;
public:
    card()
    {};
    void set(int n, Suit s)
    {
        suit =s;
        number =n;
    }
    void display();
};
 
void card::display()
{
    if(number>=2 && number<10)
        cout << number;
    else
    {
        switch(number)
        {
        case jack: cout << 'J'; break;
        case queen: cout << 'Q'; break;
        case king: cout << 'K'; break;
        case ace: cout << 'A'; break;
        }
    }
    switch(suit)
    {
    case clubs: cout << static_cast<char>(5);break;
    case diamonds: cout << static_cast<char>(4);break;
    case hearts: cout << static_cast<char>(3);break;
    case spades: cout << static_cast<char>(6);break;
    }
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    card deck[52];
    int j;
 
    cout << endl;
    for(j=0;j<52;j++)
    {
        int num = (j%13)+2;
        Suit su = Suit(j/13);
        deck[j].set(num,su);
        
        // выводил сразу для проверки...
        /*deck[j].display();
        cout << "   ";
        if(!((j+1)%13))
            cout << endl;*/
    }
 
    cout << "Deck:\n";
    for(j=0;j<52;j++)
    {
        deck[j].display();
        cout << "   ";
        if(!((j+1)%13))
            cout << endl;
    }
 
    // перемешиваем
    srand(time(NULL));
    for(j=0;j<52;j++)
    {
        int k = rand()%52;
        card temp = deck[j];
        deck[j] = deck[k];
        deck[k] = temp;
    }
    ////////////////
 
    cout << "\nShuffel deck:\n";
    for(j=0;j<52;j++)
    {
        deck[j].display();
        cout << "   ";
        if(!((j+1)%13))
            cout << endl;
    }
 
 
    getch();
    return 0;
}
Еще вопрос, касающийся остатка от деления
C++
1
int num = (j%13)+2;
Как при j равном, скажем, единице, мы получаем число 3?
1/13 = 0,076
0,076 +2 = 2,076
Откуда 3?
Объясните пожалуйста данную арифметическую операцию.

в случае:
C++
1
if(!((j+1)%13))
я понимаю. Мол, если остаток равен нулю, то...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2010, 22:44     Цикл for и 56 карт
Посмотрите здесь:

Колода карт C++
C++ Как раздать по 5 карт
Массив карт C++
Колода карт C++
Клас колода карт C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
18.08.2010, 23:15     Цикл for и 56 карт #2
Цитата Сообщение от half-node Посмотреть сообщение
int num = (j%13)+2
Цитата Сообщение от half-node Посмотреть сообщение
1/13 = 0,076
мне кажется, что код немного не соответствует тому, что вы считаете. в коде берется остаток от деления, а вы считаете как деление.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 09:59  [ТС]     Цикл for и 56 карт #3
Цитата Сообщение от fasked Посмотреть сообщение
мне кажется, что код немного не соответствует тому, что вы считаете. в коде берется остаток от деления, а вы считаете как деление.
остаток от деления при 1/13 = 076... почему для меня и загадка...откуда единица появляется.

по основному вопросу есть идеи?)
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.08.2010, 10:02     Цикл for и 56 карт #4
half-node, остаток от деления 1 на 13 будет равен 1:
1|13
0|0
1 <- это и есть остаток
Читаем, что такое остаток от деления.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 10:08  [ТС]     Цикл for и 56 карт #5
Цитата Сообщение от Nameless One Посмотреть сообщение
half-node, остаток от деления 1 на 13 будет равен 1:
1|13
0|0
1 <- это и есть остаток
Читаем, что такое остаток от деления.
Я ошибаюсь, или можно это как-то объяснить человеческим языком?)
что значит 0|0?
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.08.2010, 10:10     Цикл for и 56 карт #6
Вспомни, как в школе ты делил числа в столбик. Это я так схематично попытался это изобразить
По ссылке все расписано человеческим языком.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 10:12  [ТС]     Цикл for и 56 карт #7
А...Все, спасибо. По крайней мере "зацепка"
По поводу основного вопроса, откуда отображение еще одной карты в каждой масти?
Тут нужно сделать пояснение: прорисовывается только
C++
1
2
3
4
5
6
7
switch(suit)
        {
        case clubs: cout << static_cast<char>(5);break;
        case diamonds: cout << static_cast<char>(4);break;
        case hearts: cout << static_cast<char>(3);break;
        case spades: cout << static_cast<char>(6);break;
        }
эта часть. Т.е. картинка масти. Ни цифры слева, ни т.п. нет
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.08.2010, 10:16     Цикл for и 56 карт #8
half-node, а что вообще должна твоя программа делать, я так и не понял.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 10:17  [ТС]     Цикл for и 56 карт #9
Создает колоду карт, в количестве 52 штуки.
Каждой присваивается масть.
Выводим на экран.
Потом эта колода перемешивается...и выводится на экран.

такая вот бесполезная
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.08.2010, 10:19     Цикл for и 56 карт #10
half-node, щас сделаем
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.08.2010, 10:43     Цикл for и 56 карт #11
Цитата Сообщение от half-node Посмотреть сообщение
Я ошибаюсь, или можно это как-то объяснить человеческим языком?
иначе говоря, это операция деления по модулю. или просто взятие модуля (не путать с тем, что в школе называли модулем числа, то есть операцией abs (абсолютной величины). как только это не называется
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 10:47  [ТС]     Цикл for и 56 карт #12
Цитата Сообщение от fasked Посмотреть сообщение
иначе говоря, это операция деления по модулю. или просто взятие модуля. как только это не называется
Если взять число 0.076 по модулю, оно разве не будет равно нулю? )
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.08.2010, 10:50     Цикл for и 56 карт #13
Цитата Сообщение от half-node Посмотреть сообщение
Если взять число 0.076 по модулю, оно разве не будет равно нулю? )
модульная арифметика применима только к целым числам
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 10:51  [ТС]     Цикл for и 56 карт #14
Цитата Сообщение от fasked Посмотреть сообщение
модульная арифметика применима только к целым числам
Вы меня окончательно запутали )))

Добавлено через 36 секунд
Хотя, с остатком я кажется понял. Просто чуть позже попрактикуюсь, дабы понять
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.08.2010, 10:54     Цикл for и 56 карт #15
Цитата Сообщение от half-node Посмотреть сообщение
Вы меня окончательно запутали
В первом столбике остаток от деления, во втором деление (для целых чисел)
Код
0 % 5 = 0 || 0 / 5 = 0
1 % 5 = 1 || 1 / 5 = 0
2 % 5 = 2 || 2 / 5 = 0 
3 % 5 = 3 || 3 / 5 = 0
4 % 5 = 4 || 4 / 5 = 0
5 % 5 = 0 || 5 / 5 = 1
6 % 5 = 1 || 6 / 5 = 1
7 % 5 = 2 || 7 / 5 = 1
и так далее. тенденция ясна?
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 10:56  [ТС]     Цикл for и 56 карт #16
Цитата Сообщение от fasked Посмотреть сообщение
и так далее. тенденция ясна?
Вполне, спасибо!
С этим более или менее разобрался. Осталось просто попрактиковаться, чтобы уже до конца понять что откуда.
Но вот вопрос по поводу отображения лишнего символа - еще в силе.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.08.2010, 11:29     Цикл for и 56 карт #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
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
#include <iostream>
#include <cstdlib>
#include <algorithm>
 
enum suit
{
    diamonds = 0,
    spades,
    hearts,
    clubs
};
 
class card
{
    suit su;
    int value;
 
public:
 
    card (int val)
        : su (suit (val / 13)), value ((val % 13) + 2)
    {
    }
 
    card ()
        : su (suit (0)), value (0)
    {
    }
 
    friend std::ostream & operator << (std::ostream& os, const card & rhs)
    {
        // Выводим достоинство карты
        switch (rhs.value)
        {
        case 11:
            os << "J";
            break;
        case 12:
            os << "Q";
            break;
        case 13:
            os << "K";
            break;
        case 14:
            os << "A";
            break;
        default:
            os << rhs.value;
        }
        // Выводим масть карты
        switch (rhs.su)
        {
        case clubs:
 
            os << " Clubs"; //os << static_cast<char>(5);
            break;
        case diamonds:
            os << " Diamonds"; //os << static_cast<char>(4);
            break;
        case hearts:
            os << " Hearts"; //os << static_cast<char>(3);
            break;
        case spades:
            os << " Spades"; //os << static_cast<char>(6);
        }
        return os;
    }
};
 
class deck
{
    static const size_t D_SIZE = 52;
    card m_deck[D_SIZE];
 
public:
 
    deck ()
    {
        for (size_t i = 0; i < D_SIZE; ++i)
            m_deck[i] = card (i);
    }
 
    void shuffle ()
    {
        std::random_shuffle (m_deck, m_deck + D_SIZE);
    }
 
    void display () const
    {
        for (size_t i = 0; i < D_SIZE; ++i, std::cout << std::endl)
            std::cout << m_deck[i];
    }
};
 
int main (void)
{
    deck hand;
    std::cout << "Before shuffling: " << std::endl;
    hand.display ();
    hand.shuffle ();
    std::cout << "After shuffling: " << std::endl;
    hand.display ();
    return EXIT_SUCCESS;
}
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 11:41  [ТС]     Цикл for и 56 карт #18
Понимаете в чем дело))
Многое из того, что Вы мне здесь показали - я вообще впервые вижу. Я ж еще только учусь.
Строки типа:
C++
1
friend std::ostream & operator << (std::ostream& os, const card & rhs)
меня пока-что вообще в ступор вводят.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.08.2010, 11:44     Цикл for и 56 карт #19
half-node, это перегрузка дружественного оператора вывода в поток, для того, чтобы можно было написать так:
C++
1
2
card c(34);
std::cout << c << std::endl;

Не по теме:

ЗЫ. Если проходите классы, то и перегрузку операторов тоже должны проходить. Перегрузка оператора вывода - вообще классический случай, он должен быть в любой книжке описан

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2010, 11:49     Цикл for и 56 карт
Еще ссылки по теме:

Редактор карт на C++, SFML C++
C++ Программа перетасовки карт
C++ Генерация набора карт

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

Или воспользуйтесь поиском по форуму:
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
19.08.2010, 11:49  [ТС]     Цикл for и 56 карт #20
перегрузку функций проходил, операторов - пока что нет.
Дело в том, что Лафоре учит от легкого к сложному.
Например, сначала он предложил изучить структуры, потом функции, классы, потом массивы и строки, уже потом указатели (о ссылках он рассказывал в главе о функциях) и т.д и т.п.

Добавлено через 2 минуты
http://www.piter.com/book.phtml?978594723302
Yandex
Объявления
19.08.2010, 11:49     Цикл for и 56 карт
Ответ Создать тему
Опции темы

Текущее время: 00:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru