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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
#1

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

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

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

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

Описать класс "карта" - C++
Помогите нужно к паре сделать прогу, а я с класами вообще не как задание "описать класс карта(масть и достоинство)содержащий функцию...

Карта - C++
Подскажите пожалуста как обеденить "rank" и "suit" в одну переменную???? for (int i = 0; i < 13; i++) { ...

Map, карта в карте - C++
У меня возник такой вопрос, хочу сделать map в map, например map < string , map <int ,int >> something как мне получить доступ к второй...

интерактивная карта города - C++
в качестве курсового проекта получили задание написать интерактивную карту города,проект решили делать в борланде(возможно, если будет ...

Бьет ли карта k1 карту k2 - C++
Здравствуйте, Господа эксперты! Прошу помощи в решении следующей задачи: struct card { /* масть карт */ enum {spades, clubs,...

Случайная карта из колоды - C++
Решил сделать карточную игру "пьяница". В качестве заготовки пока просто сделать программу которая случайно выбирает из колоды карты(без...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
29.05.2013, 17:11     Класс игральная карта
  #16

Не по теме:

Не мой код - говнокод

Дело вкуса

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
29.05.2013, 17:33     Класс игральная карта #17
Цитата Сообщение от ITcrusader Посмотреть сообщение
названо плохим стилем (тоже дает возможность создания массивов, векторов, как описано выше).
Плохим стилем является объявление значений по-умолчанию для конструктора. Долго и нудно разглагольствовать, может быть позже у меня будет демагогическое настроение. В двух словах -- усложняет поддержку кода.

Добавлено через 3 минуты
Естественно, земля вертится, количество вариантов бесконечно, так что бывают случаи, когда конструкторы с дефолтными значениями параметров оправданы. Да и вообще, опыт появляется от прыганья по граблям. Так что никакой демагогии не дождетесь -- пишите, как считаете нужным.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.05.2013, 21:03     Класс игральная карта #18
Разница, которую я вижу в отличии кода с двумя конструкторами:
C++
1
2
Card() : suit(0), rank(0) {}
Card(int suit, int rank) : suit(suit), rank(rank) {}
от кода с одним, но с параметрами по умолчанию:
C++
1
Card(int suit=0, int rank=0) : suit(suit), rank(rank) {}
Это, как минимум, добавление во втором случае возможности вызова, конструктора с одним параметром, что может быть использовано для неявного преобразования int в Card.
В некоторых случаях это нежелательно. Однако, добавление explicit к конструктору позволит исключить возможность такого преобразования:
C++
1
excplicit Card(int suit=0, int rank=0) : suit(suit), rank(rank) {}
Чем ещё может усложнить поддержку кода наличие параметров по умолчанию в конструкторе, мне не ясно.
Надеюсь, уважаемый lemegeton всё же снизойдет до подробностей.
Можно даже без демагогии, но с конкретными примерами.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
29.05.2013, 21:40     Класс игральная карта #19
lemegeton, я, в свою очередь, могу сказать, что дискуссию тож неохота разводить - на работе не так удобно отписывать сюда И спорить тоже не нужно, лишь просто заинтересовался характеристикой "плохой стиль", и подумал, что, быть может, чего-то интересного не знаю, а если не знаю - стремлюсь узнать.

Что касается вопроса сопровождения - возможно да, иногда усложняет, не натыкался, но да
Цитата Сообщение от lemegeton Посмотреть сообщение
Естественно, земля вертится, количество вариантов бесконечно, так что бывают случаи, когда конструкторы с дефолтными значениями параметров оправданы.
т.е. все зависит от предметной области и требуемых ограничений на политику работы с классом, взять, хотя бы, мой пример с точками, где такой прием, не насаждаю, кажется мне коротким и удобным.

P.S. этот пост не имеет целью продолжить дискуссию на эту тему, думаю, мы пришли к консенсусу
Tulosba
29.05.2013, 21:54
  #20

Не по теме:

Цитата Сообщение от ITcrusader Посмотреть сообщение
дискуссию тож неохота разводить
Форум - не место для дискуссий?

lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
30.05.2013, 08:31     Класс игральная карта #24
Karata, старина? А как насчет: а сам на основе уже имеющегося кода? Что не получится - спросишь совета или пришлешь запрос на код-ревью, если все сложится. Уверен, это тебе принесет больше пользы.

Скажу больше:
когда ты делаешь сам и у тебя не получается что-то - ты получишь здесь больше отзывов на проблему, нежели формулируя просьбу в формате: "Напишите код, который..."
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.05.2013, 14:05     Класс игральная карта #29
Karata, Пусть преподаватель сделает харакири. Не думаю, что кто-то будет писать такой бред. Собственно, lemengton уже объяснил почему задание бредовое, пример класса карта у вас есть - остальное сами, иначе зачем вы учитесь на своей специальности?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 14:35     Класс игральная карта
Еще ссылки по теме:

Не строится карта кода в VS2015 - C++
Вот лог построения Серьезность Код Описание Проект Файл Строка Предупреждение MSB8004 Output Directory does not end with a trailing...

Задача по теме карта (map) - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;map&gt; #include &lt;sstream&gt; int main() { ...

Карта на основе битового поля - C++
Здравствуйте. Реализую собственный алокатор памяти. Мне нужно знать где свободная память, а где нет. Для этого хочу использовать битовые...

C++11 карта не принимает присваиваемые значения - C++
Определение enuma и карты: enum class template_line {first, second, third, fourth, fifth}; typedef std::map&lt; template_line,...

Разработка контейнера типа Карта (Map) - C++
Приветсвую всех форумчан! Имеется задача разработать решение реализующее динамическую структуру данных (контейнер) типа «Карта»(map,...


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

Или воспользуйтесь поиском по форуму:
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
30.05.2013, 14:35  [ТС]     Класс игральная карта #30
специальность бизнес-информатика, и наврятли с++ мне пригодится..
Yandex
Объявления
30.05.2013, 14:35     Класс игральная карта
Ответ Создать тему
Опции темы

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