Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40

Класс игральная карта

29.05.2013, 08:30. Показов 6317. Ответов 40
Метки нет (Все метки)

Помогите описать класс карта нужно описать ее масть и номер с двумя конструкторами, один обязательно с параметрами, помогите нужно сделать к завтрашней паре, а да еще конструктор должен обязательно задействован, и пожалуйста с переменными флоат если это возможно, но не со строками..
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2013, 08:30
Ответы с готовыми решениями:

Создать класс карта
Помогите пожалуйста! Создать класс карта, содержащий в качестве параметров ранг и масть. Карту можно перевернуть и открыть. Дополнительно...

Создать класс карта по условию
Доброго времени суток ув. форумчане. Попалась следующая задача, код к реализации программы есть, но не могу понять в чём там ошибки....

Игральная кость
Игральную кость бросают 8 раз. Найти вероятность того, что шестёрка появится хотя бы один раз.

40
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
29.05.2013, 22:37
Цитата Сообщение от Tulosba Посмотреть сообщение
Чем ещё может усложнить поддержку кода наличие параметров по умолчанию в конструкторе, мне не ясно.
Надеюсь, уважаемый lemegeton всё же снизойдет до подробностей.
Чуть-чуть.

Ну перво-наперво, в реальной жизни вам почти не понадобятся конструкторы, в которых бы реально пригодились параметры по-умолчанию. Ну не имеют они большого смысла. А вот конструкторы, различающиеся лишь количеством параметров -- достаточно часто.

Во-вторых, на взгляд будет довольно затруднительно определить, какой же конструктор вызывается.

В третьих. В бою, особенно рефакторинговом, часто бывает так, что объект приходится собирать из нескольких других. Бывают случаи, когда алгоритм создания объекта зависит лишь от количества параметров.
А у вас уже есть ваш конструктор с параметрами по-умолчанию.
... и общий привет. Попробуйте перегрузить конструктор с одним параметром того же типа. С учетом, что для С++ нет IDE с мало-мальски приличным рефакторингом, особенно если в ходу шаблоны.

Ну и начинаются архитектурные паттерны. Я, конечно, совершенно за фабричные методы и частенько их использую вместо конструкторов, но именно что вместо.

Пример:
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
#include <iostream>
 
class Currency {
 public:
  Currency(const char *) {}
  /* ... */
};
 
class Instrument {
 public:
  // инструмент состоит из двух валют
  Instrument(const Currency &a = Currency("USD"), const Currency &b = Currency("JPY"))
    : a(a), b(b) {
    std::cout << "Two!" << std::endl;
  }
  // мне нужно создавать инструмент из одной валюты, который работает
  // работает совершенно не так, как работает конструктор,
  // создающий инструмент из двух валют
  Instrument(const Currency &c) : a(getCurrencyPair(b)), b(c) {
    std::cout << "One!" << std::endl;
  }
  static const Currency getCurrencyPair(const Currency &currency) {
    /* ... */
    return Currency("smthng");
  }
 private:
  Currency a, b;
};
 
int main(int , char**) {
  Currency currency("#USD");
 
  // собственно вот
  Instrument instrument(currency);
 
  return 0;
}
В реальном коде, которому лет десять, все гораздо, гораздо сложнее.
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 06:26  [ТС]
Цитата Сообщение от Karata Посмотреть сообщение
можете помочь, нужно описать производный класс,содержащий поле козырь и функцию, проверяющую кроет ли карта указанную в качестве параметра другую карту с учетом козыря.
Я так понял это наследование...
Может вы этот пост не увидили, но можете помочь с написанием еще такой програмы!!
0
30.05.2013, 06:33

Не по теме:

Karata, твое предложение совсем не похоже на вопросительное или "просительное". Оно явно утвердительное. Да еще и восклицательное! Хех, веселый мужик.

0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
30.05.2013, 08:31
Karata, старина? А как насчет: а сам на основе уже имеющегося кода? Что не получится - спросишь совета или пришлешь запрос на код-ревью, если все сложится. Уверен, это тебе принесет больше пользы.

Скажу больше:
когда ты делаешь сам и у тебя не получается что-то - ты получишь здесь больше отзывов на проблему, нежели формулируя просьбу в формате: "Напишите код, который..."
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
30.05.2013, 08:52
Цитата Сообщение от Karata Посмотреть сообщение
Может вы этот пост не увидили, но можете помочь с написанием еще такой програмы!!
Цитата Сообщение от alkagolik Посмотреть сообщение
Karata, твое предложение совсем не похоже на вопросительное или "просительное". Оно явно утвердительное. Да еще и восклицательное! Хех, веселый мужик.

Не по теме:

"При виде надписи с тремя восклицательными знаками не устоял бы ни один житель Анк-Морпорка." (с) Т. Пратчетт


Градус бредовости реализации в задании ТЦ растет, как я погляжу.
Суть в том, что "козырность" карты не является свойством карты. Она является свойством игры, определяющей правила определения козырности и есть ли такое понятие в игре вообще. Еще раз, поведение, определяющее "козырность" является внешним относительно любой карты. Простыми словами -- не карта определяет свою "козырность", а правила игры и конкретная игра. Поэтому определение, является ли карта "козырной" неуместно внутри класса, описывающего карту. Можно сделать отдельной функцией или методом другого класса.

Можно, например, так:
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
#include <iostream>
 
class Card {
 public:
  Card() : suit(0), rank(0) {}
  Card(int suit, int rank) : suit(suit), rank(rank) {}
  int getSuit() const { return suit; }
  int getRank() const { return rank; }
  void setSuit(int suit) { this->suit = suit; }
  void setRank(int rank) { this->rank = rank; }
 private:
  int suit;
  int rank;
};
 
// trump по английски "козырь"
bool isTrump(const Card &card, int trumpSuit) {
  return card.getSuit() == trumpSuit;
}
 
const char *getCardRankName(int rank) {
  static const char RANK_NAMES[][10] = {"2", "3", "4", "5", "6", "7",
    "8", "9", "10", "jack", "queen", "king", "ace"};
  return RANK_NAMES[rank];
}
 
const char *getCardSuitName(int suit) {
  static const char SUIT_NAMES[][10] = {"spades", "hearts", "diamonds",
    "clubs"};
  return SUIT_NAMES[suit];
}
 
 
int main(int, char **) {
  // козырь бубны
  int trumpSuit = 2; // diamonds
  
  for (int suit = 0; suit < 4; ++suit) {
    for (int rank = 0; rank < 13; ++rank) {
      Card card(suit, rank);
      std::cout << getCardRankName(card.getRank()) << " of " <<
        getCardSuitName(card.getSuit()) << ((isTrump(card, trumpSuit))
        ? " trump" : "") << std::endl;
    }
  }
 
  return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.05.2013, 10:54
lemegeton, понятно, что код с валютным инструментом даже не скомпилируется. Однако, если уж программист задает конструктор с параметрами по умолчанию, то надо рассмотреть все варианты поведения этого конструктора (в зависимости от кол-ва явно передаваемых параметров). Если в каком-либо из вариантов поведение должно отличаться от общего, вводить умолчания не следует. Тут я с Вами соглашусь. При этом, если инструмент должен вести себя разительно иначе
Цитата Сообщение от lemegeton Посмотреть сообщение
работает совершенно не так, как работает конструктор, создающий инструмент из двух валют
при разном кол-ве параметров, то скорее всего это должен быть другой инструмент, и, как следствие, другой класс.
В таком случае из Вашего кода вообще нужно убрать конструктор с двумя параметрами:
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
#include <iostream>
 
class Currency {
 public:
  Currency(const char *) {}
  /* ... */
};
 
class Instrument {
 public:
  // инструмент состоит из двух валют
  /* // Не нужен. Или переносится в другой класс.
  Instrument(const Currency &a = Currency("USD"), const Currency &b = Currency("JPY"))
    : a(a), b(b) {
    std::cout << "Two!" << std::endl;
  } */
  // мне нужно создавать инструмент из одной валюты, который работает
  // работает совершенно не так, как работает конструктор,
  // создающий инструмент из двух валют
  Instrument(const Currency &c) : a(getCurrencyPair(b)), b(c) {
    std::cout << "One!" << std::endl;
  }
  static const Currency getCurrencyPair(const Currency &currency) {
    /* ... */
    return Currency("smthng"); // В частности должен вернуть "USD" для параметра "JPY"
  }
 private:
  Currency a, b;
};
 
int main(int , char**) {
  Currency currency("#USD");
 
  // собственно вот
  Instrument instrument(currency);
 
  return 0;
}
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
30.05.2013, 11:50
Цитата Сообщение от Tulosba Посмотреть сообщение
работает совершенно не так, как работает конструктор, создающий инструмент из двух валют
Тут опечатка. Инструмент работает точно так же, не так работает конструктор. Саб-классы не нужны, нужно только по-другому инициализировать объект.

Мне, наверно, не привести краткого примера достаточно сложного кода, чтобы стало понятно, что я имею в виду, а большой кусок вычленять лень.

Так что проехали.

Добавлено через 9 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
Если в каком-либо из вариантов поведение должно отличаться от общего, вводить умолчания не следует.
Проблема возникнет не тогда, когда будете вводить такой конструктор, а тогда, когда он уже введен и лет семь использовался по полной программе, и вам нужен другой способ создания объекта.

Порефакторить уже существующие сотни кода будет довольно сложно, учитывая особенности вывода ошибок компиляторов, и вы вынуждены будете ввести архитектурное решение типа фабрики или билдера. В итоге будет у вас два разных способа создать объект -- с помощью конструктора и, например, фабрикой. При этом может оказаться недостаточно очевидным, в чем разница между созданием фабрикой и конструктором и коллегам придется лезть в код или документацию.

Собственно, не велика беда, если проект подзапущен.
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 13:53  [ТС]
В общем моё задание звучит так:
Изменить программу предыдущего задания, организовав на основе существующего класса производный класс.Производный клас также должен содержать не менее 2-ух конструкторов.
Исходная программа должна содержатся в 2-ух файлах. В 1 описание класса, во 2-ром реализация, т.е работа с объектами.
p.s Тема называется наследование.

И в общем вот что нужно сделать: нужно описать производный класс,содержащий поле козырь и функцию, проверяющую кроет ли карта указанную в качестве параметра другую карту с учетом козыря.
Помогите пожалуйста!
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.05.2013, 14:05
Karata, Пусть преподаватель сделает харакири. Не думаю, что кто-то будет писать такой бред. Собственно, lemengton уже объяснил почему задание бредовое, пример класса карта у вас есть - остальное сами, иначе зачем вы учитесь на своей специальности?
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 14:35  [ТС]
специальность бизнес-информатика, и наврятли с++ мне пригодится..
0
30.05.2013, 14:40

Не по теме:

Мне всегда нравилось название этой специальности:)
Значения обоих слов - предельно ясны, а то, что они образуют вместе - загадка)))

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.05.2013, 14:43
Цитата Сообщение от Karata Посмотреть сообщение
специальность бизнес-информатика, и наврятли с++ мне пригодится..
Тут дело не в C++. А в концепции разработки архитектуры системы в принципе.

Не по теме:

ITcrusader, ну как загадка... на википедии вон даже статья есть.

1
30.05.2013, 14:47

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
на википедии вон даже статья есть
Серьезная статья:)

0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 15:29  [ТС]
Блин и что-же теперь делать, сам такую прогу не напишу....
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.05.2013, 16:12
Karata,
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
#include <iostream>
#include <stdexcept>
 
class Card {
 public:
  Card() : suit(0), rank(0) {}
  Card(int suit, int rank) : suit(suit), rank(rank) {}
  int getSuit() const { return suit; }
  int getRank() const { return rank; }
  void setSuit(int suit) { this->suit = suit; }
  void setRank(int rank) { this->rank = rank; }
 private:
  int suit;
  int rank;
};
 
const char *getCardRankName(int rank) {
  static const char RANK_NAMES[][10] = {"2", "3", "4", "5", "6", "7",
    "8", "9", "10", "jack", "queen", "king", "ace"};
  return RANK_NAMES[rank];
}
 
const char *getCardSuitName(int suit) {
  static const char SUIT_NAMES[][10] = {"spades", "hearts", "diamonds",
    "clubs"};
  return SUIT_NAMES[suit];
}
 
class GameCard : public Card
{
public:
   explicit GameCard(int suit, int rank) : Card(suit, rank), trumpSuit(0)
   {
   }
   void setTrumpSuit(int suit)
   {
      trumpSuit = suit;
   }
   bool isStronger(const GameCard& other)
   {
      if (!trumpSuit)
      {
         throw std::invalid_argument("Invalid trump suit");
      }
      return (this->getSuit() == other.getSuit() && this->getRank() > other.getRank()) ||
         (this->getSuit() == trumpSuit && other.getSuit() != trumpSuit) ||
         ((this->getSuit() == trumpSuit && other.getSuit() == trumpSuit) &&
          this->getRank() > other.getRank());
   }
private:
   int trumpSuit;
};
 
int main(int, char **) {
  // козырь бубны
  int trumpSuit = 2; // diamonds
 
  GameCard first(2, 5);
  first.setTrumpSuit(trumpSuit);
  GameCard second(2, 4);
  std::cout << first.isStronger(second) << std::endl;
 
  return 0;
}
И про харакири преподавателю не забудьте поведать.
2
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 16:52  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
И про харакири преподавателю не забудьте поведать.
Так, а можно сделать чтобы словами писала что эта карта кроет.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.05.2013, 16:55
Karata, Он и должен писать один. Первая карта "сильнее" второй.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.05.2013, 17:36
Цитата Сообщение от Karata Посмотреть сообщение
Так, а можно сделать чтобы словами писала что эта карта кроет.
C++
1
std::cout << (first.isStronger(second) ? "stronger" : "weaker") << std::endl;
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.05.2013, 18:56
Продолжая дискуссию насчет конструктора с параметрами по-умолчанию.

Уж лучше целиком и полностью управлять процессом, нежели поручить что-либо машине.
Конечно, не надо вдаваться в крайности, например конструктор с точками, что приводил ITcrusader, вполне имеет место на жизнь. Все относительно, но вот подумать несколько раз, прежде чем использовать подобные махинации (параметр = начальное значение) все же стоит.

Добавлено через 1 минуту
Видимо препод когда-то читал Дейкстров, а потом решил в задание добавить "что-то свое"
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 19:10  [ТС]
C++
1
2
3
std::cout << getCardRankName(first.getRank()) << " " << getCardSuitName(first.getSuit()) << " " << 
 (first.isStronger(second) ? "Кроет" : "Не кроет") << " " 
 << getCardRankName(second.getRank()) << " " << getCardSuitName(second.getSuit()) << std::endl;
сделал такой вывод, но еще хочу сделать чтоб в программе выводился козырь, но не получается
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2013, 19:10

Игральная кость
Игральную кость подбросили 4 раза,какова вероятность того что выпадет четное число?

игральная кость
Игральная кость бросается 120 раз. Какова вер-ть того, что 6 очков выпадут от 18 до 24 раз. Помогите, пожалуйста, не понять.

игральная кость
Игральную кость бросают 500 раз. Найти вероятность события, состоящегося в том, что шестерка выпадает: ровно 60 раз; не более 100 раз.

Игральная кость (поправить код)
Игральная кость бросается N раз. Определить сколько раз впадает значения 1, 2, 3, 4, 5, 6. (Разрабатывается в виде подпрограммы и затем...

Игральная кость бросается 1 раз
Игральная кость бросается 1 раз. Найти вероятность следующих событий: а) появление не менее 4 очков; б) появление не более 4 очков.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru