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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
29.05.2013, 08:30     Класс игральная карта #1
Помогите описать класс карта нужно описать ее масть и номер с двумя конструкторами, один обязательно с параметрами, помогите нужно сделать к завтрашней паре, а да еще конструктор должен обязательно задействован, и пожалуйста с переменными флоат если это возможно, но не со строками..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 08:30     Класс игральная карта
Посмотрите здесь:

Иерархия геометрических объектов: клас точка->класс квадрат->класс прямоугольник C++
C++ описать класс карта
C++ Класс домов и класс улиц для учета поступлений квартплаты. Массив
Класс, производный класс, паблик-класс C++
C++ Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
29.05.2013, 22:37     Класс игральная карта #21
Цитата Сообщение от 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;
}
В реальном коде, которому лет десять, все гораздо, гораздо сложнее.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 06:26  [ТС]     Класс игральная карта #22
Цитата Сообщение от Karata Посмотреть сообщение
можете помочь, нужно описать производный класс,содержащий поле козырь и функцию, проверяющую кроет ли карта указанную в качестве параметра другую карту с учетом козыря.
Я так понял это наследование...
Может вы этот пост не увидили, но можете помочь с написанием еще такой програмы!!
alkagolik
30.05.2013, 06:33
  #23

Не по теме:

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

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

Скажу больше:
когда ты делаешь сам и у тебя не получается что-то - ты получишь здесь больше отзывов на проблему, нежели формулируя просьбу в формате: "Напишите код, который..."
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
30.05.2013, 08:52     Класс игральная карта #25
Цитата Сообщение от 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;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.05.2013, 10:54     Класс игральная карта #26
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;
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
30.05.2013, 11:50     Класс игральная карта #27
Цитата Сообщение от Tulosba Посмотреть сообщение
работает совершенно не так, как работает конструктор, создающий инструмент из двух валют
Тут опечатка. Инструмент работает точно так же, не так работает конструктор. Саб-классы не нужны, нужно только по-другому инициализировать объект.

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

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

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

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

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

И в общем вот что нужно сделать: нужно описать производный класс,содержащий поле козырь и функцию, проверяющую кроет ли карта указанную в качестве параметра другую карту с учетом козыря.
Помогите пожалуйста!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.05.2013, 14:05     Класс игральная карта #29
Karata, Пусть преподаватель сделает харакири. Не думаю, что кто-то будет писать такой бред. Собственно, lemengton уже объяснил почему задание бредовое, пример класса карта у вас есть - остальное сами, иначе зачем вы учитесь на своей специальности?
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 14:35  [ТС]     Класс игральная карта #30
специальность бизнес-информатика, и наврятли с++ мне пригодится..
ITcrusader
30.05.2013, 14:40
  #31

Не по теме:

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

Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.05.2013, 14:43     Класс игральная карта #32
Цитата Сообщение от Karata Посмотреть сообщение
специальность бизнес-информатика, и наврятли с++ мне пригодится..
Тут дело не в C++. А в концепции разработки архитектуры системы в принципе.

Не по теме:

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

ITcrusader
30.05.2013, 14:47
  #33

Не по теме:

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

Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 15:29  [ТС]     Класс игральная карта #34
Блин и что-же теперь делать, сам такую прогу не напишу....
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.05.2013, 16:12     Класс игральная карта #35
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;
}
И про харакири преподавателю не забудьте поведать.
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 16:52  [ТС]     Класс игральная карта #36
Цитата Сообщение от ForEveR Посмотреть сообщение
И про харакири преподавателю не забудьте поведать.
Так, а можно сделать чтобы словами писала что эта карта кроет.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.05.2013, 16:55     Класс игральная карта #37
Karata, Он и должен писать один. Первая карта "сильнее" второй.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.05.2013, 17:36     Класс игральная карта #38
Цитата Сообщение от Karata Посмотреть сообщение
Так, а можно сделать чтобы словами писала что эта карта кроет.
C++
1
std::cout << (first.isStronger(second) ? "stronger" : "weaker") << std::endl;
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
30.05.2013, 18:56     Класс игральная карта #39
Продолжая дискуссию насчет конструктора с параметрами по-умолчанию.

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

Добавлено через 1 минуту
Видимо препод когда-то читал Дейкстров, а потом решил в задание добавить "что-то свое"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 19:10     Класс игральная карта
Еще ссылки по теме:

C++ Иерархия: класс "карта", "колода карт"
Реализовать класс Goods используя для представления цены класс Money C++
Отдельно класс данных, класс формул и главный класс C++

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

Или воспользуйтесь поиском по форуму:
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 19:10  [ТС]     Класс игральная карта #40
C++
1
2
3
std::cout << getCardRankName(first.getRank()) << " " << getCardSuitName(first.getSuit()) << " " << 
 (first.isStronger(second) ? "Кроет" : "Не кроет") << " " 
 << getCardRankName(second.getRank()) << " " << getCardSuitName(second.getSuit()) << std::endl;
сделал такой вывод, но еще хочу сделать чтоб в программе выводился козырь, но не получается
Yandex
Объявления
30.05.2013, 19:10     Класс игральная карта
Ответ Создать тему
Опции темы

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