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

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

29.05.2013, 08:30. Показов 6328. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru