• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Задача: Класс Колода карт, использование в карточных играх

  • Автор темы BoltozaR
  • Дата начала
B

BoltozaR

Задачу надо написать в двух вариантах. Один в статической памяти, другой - динамическая память. Лучше писать с коментами на функции. Соответственная умеренная плата(После проверки). По вопросам писать в асю - 422-787-597
Вот оно...

1.Разработать класс "игральные карты" в соответствии со следующим заданием:
Состояние класса -
Колода игральных карт описывается состоянием (масть и ранг) определённого числа карт (например, от 1 до 52). Для описания карты целесообразно использовать структуру. Память под массив выделяется статически, во время компиляции, и задается массивом фиксированного размера. В группе карт не может быть одинаковых карт.
Протокол класса -
Определяет возможности создания и инициализации экземпляров класса и правила их использования (методы класса).
Предусмотреть следующие возможности:
-- пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию;
-- создание экземпляров класса с инициализацией количеством карт, значения которых определяются с помощью генератора случайных чисел;
-- создание экземпляров класса с инициализацией начальным состоянием одной карты;
-- ввод экземпляров класса из входного потока и вывод((*) псевдографического рисунка) в выходной поток (с помощью перегруженных операторов <<и>> ;
--добавить карту к группе, значение которой получается с помощью генератора случайных чисел (с помощью перегруженного префиксного оператора ++);
--получить масть карты по её номеру в группе (с помощью перегруженного оператора () );
-- получить ранг карты по её номеру в группе (с помощью перегруженного оператора [] );
-- упорядочить карты по масти и убыванию ранга;
-- выделить из группы карт подгруппу карт заданной масти.
2. Проектирование класса рекомендуется начать с представления состояния класса, учитывающего заданные операции, а затем реализации конструкторов и перегруженного оператора вывода. Для отладки и исчерпывающего тестирования других методов разработанного класса реализовать диалоговую программу, которая позволяет вводить параметры, отлаживаемых методов. Для обработки ошибочных ситуаций использовать механизм исключительных ситуаций.
3. Повторить разработку класса при условии, что память под массив структур необходимой длины выделяется динамически, во время выполнения программы (с помощью оператора new; память задается указателем на структуру в состоянии класса).
Дополнить интерфейс класса следующими возможностями:
-- создание экземпляра класса с его инициализацией другим экземпляром класса (копирующий конструктор);
-- переопределение экземпляра класса (с помощью перегруженного оператора присваивания).
4. Написать прикладную программу, использующую разработанный класс.

Добавлено: Задача будет сдаваться в Visual Studio 5
язык C++
 
D

DarkKnight

Если хотя бы запостишь начало своих идей и кодов - помогу... Причем бесплатно...
 
E

evked

DarkKnight125? а ты уже решил эту задачу???
У меня просто некоторые проблемы с реализацией интерфейсной части возникли :angry2:
 
D

DarkKnight

У меня просто некоторые проблемы с реализацией интерфейсной части возникли
Реализацию не писал, времени не было как то, да и я и забыл про эту задачу... Автор ее не аппал..
Но алгоритм мне был понятен еще когда первый раз ее прочитал...
Так что спрашивай, в чем именно застопорился?
 
E

evked

Добавлено:
Код:
 #include <iostream>
using namespace std;
struct Karta{
int mast, rang;
Karta():mast(-1),rang(-1);
}
class Koloda{
int n;
Karta kol[52];
public:
Koloda(int n=0){
Karta tmp;
for(int i=0;i<n;i++){
tmp.mast=rand()%5;
tmp.rang=rand()%14;
kol[i]=tmp;
}
}

;
Koloda(const Karta& first){
if(first) n=1,kol[0]=first;
else n=0;}
friend istream&operator >>(istream& is, Koloda& kol){
Karta tmp;
;
friend ostream&operator <<(ostream&, const Koloda&);
Koloda & operator ++(const Karta& dob);
int operator ()(int nom) const;
int & operator [](int nom) const;
Koloda& sort();
Koloda vyb(int mas) const;
};
Koloda :: Koloda(

int main (int argc, char *argv[])
{
srand (time(NULL));
cout << "Hello world!" << endl;

return 0;
}

Добавлено: вот, я не знаю какую библиотеку для rand подключать, ну и с вводом / выводом не понятно
 
H

hosm

>вот, я не знаю какую библиотеку для rand подключать
ну что за детский сад? никогда хотя бы так не пробовали?=)
<style type="text/css">@import url(http://www.google.com/cse/api/branding.css);</style><div class="cse-branding-bottom" style="background-color:#FFFFFF;color:#000000"> <div class="cse-branding-form"> <form action="http://www.google.ru/cse" id="cse-search-box" target="_blank"> <div> <input type="hidden" name="cx" value="partner-pub-9522070088145711:itpxzrl8xir" /> <input type="hidden" name="ie" value="windows-1251" /> <input type="text" value="rand с++" name="q" size="31" /> <input type="submit" name="sa" value="Поиск" /> </div> </form> </div> <div class="cse-branding-logo">
poweredby_FFFFFF.gif
</div> <div class="cse-branding-text"> Найдется все!   </div></div>
#include <stdlib.h>
Для time еще вроде time.h надо. но уточните сами =)
 
E

evked

>вот, я не знаю какую библиотеку для rand подключать
ну что за детский сад? никогда хотя бы так не пробовали?=)
<style type="text/css">@import url(http://www.google.com/cse/api/branding.css);</style><div class="cse-branding-bottom" style="background-color:#FFFFFF;color:#000000"> <div class="cse-branding-form"> <form action="http://www.google.ru/cse" id="cse-search-box" target="_blank"> <div> <input type="hidden" name="cx" value="partner-pub-9522070088145711:itpxzrl8xir" /> <input type="hidden" name="ie" value="windows-1251" /> <input type="text" value="rand с++" name="q" size="31" /> <input type="submit" name="sa" value="Поиск" /> </div> </form> </div> <div class="cse-branding-logo">
poweredby_FFFFFF.gif
</div> <div class="cse-branding-text"> Найдется все!   </div></div>
#include <stdlib.h>
Для time еще вроде time.h надо. но уточните сами =)
нда, что-то я сглупил малость, исправлюсь
 
D

DarkKnight

evked, Колоду лучше делать очередью... Так будет удобнее...
Вот подумай сам, выкиним всю теорию... Остановимся на практике...
Карточная колода... В ней лежат карты... Еще не напоминает очередь (ну или хотя бы стэк ?)
В самом низу(в конце) - козырь (он светится)... И указатель на конец очереди мы тоже всегда можем показать.....
А самое главное удобство...
Вот смотри... Рассмотрим дурака (для скорости возьмем 36 карт)
6..Т (1..9, где 1-Шесть, 9-ТУЗ), 4 масти
Заполним очередь колоды(карты), прям по порядку (это наши карты)
Заполним очередь колоды (игра), из очереди колоды(карты) методом rand()%36..35..34. и т.д. (при этом выкидывая из очереди элементы которые уже взяли)
Вот и перемешали карты ...
А на выходе получаем очередь колода(игра), где указатель на начало очереди - это верхняя карта колоды на раздачу, а указатель на конец очереди (это наш козырь из под низа)
 
E

evked

слушай, можешь проверить что я тут наваял
а знания об очередях мои заканчиваются на fifo и lifo(((
Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct Karta{
int mast, rang;
Karta():mast(-1),rang(-1){};
};
class Koloda{
int n;
Karta kol[52];
public:
Koloda(int );

Koloda(const Karta& first){
if(n) kol[n]=first;
else n=0;}
friend istream&operator >>(istream& , Koloda&);
friend ostream&operator <<(ostream&, const Koloda& );
Koloda & operator ++();
int operator ()(int) const;
int & operator [](int ) const;
Koloda& sort();
Koloda vyb(int mas) const;
};
istream&operator>>(istream & is, Koloda & kol){
Karta tmp;
if(kol.n+1<52){
is>>tmp.mast>>tmp.rang;
kol.n+=1;}
kol.kol[kol.n]=tmp;
return is;
}
ostream&operator <<(ostream& os, const Koloda& kol) {
if(kol.n){
//os<<kol.n<<endl;
for(int i=0;i<kol.n;i++)
os<<i<<") "<<kol.kol[i].mast<<" "<<kol.kol[i].rang<<endl;}
else
os<< "пустая колода"<<endl;
return os;
}
Koloda ::Koloda(int k=0){
n=k;

for(int i=0;i<k&&i<52;){
int m=rand()%4;
int r=rand()%13;
int fl=1;
// cout<<"*"<<endl;
for (int j=0;j<k;j++)
if(kol[j].mast==m&&kol[j].rang==r){
fl=0;
break;		 
}
if(fl){
kol[i].mast=m;
kol[i].rang=r;
i++;	  
}
}

};
Koloda & Koloda :: operator++(){
Karta tmp1,tmp2;
int flag=0;
if (n+1<53){
for(int i=n;i<n+1;){
int m=rand()%4;
int r=rand()%13;
int fl=1;
// cout<<"*"<<endl;
for (int j=0;j<n;j++)
if(kol[j].mast==m&&kol[j].rang==r){
fl=0;
break;		 
}
if(fl){
kol[i].mast=m;
kol[i].rang=r;
n+=1;
break;	 
}
}
}
else
throw "колода полная";
return *this;
}
int Koloda :: operator ()(int nom)const{
Karta tmp=kol[nom];
cout<<tmp.mast<<endl;
}
int & Koloda :: operator[](int nom)const{
Karta tmp=kol[nom];
cout<<tmp.rang<<endl;
}
Koloda & Koloda :: sort(){

for(int i=0;i<n-1;i++){
Karta tmp1=kol[i];
for(int j=i+1;j<n;j++){
Karta tmp2=kol[j];
if (tmp1.mast=tmp2.mast)
if (tmp1.rang<tmp2.rang){
Karta temp;
temp.mast=kol[i].mast;
temp.rang=kol[i].rang;
kol[i].mast=kol[j].mast;
kol[i].rang=kol[j].rang;
kol[j].mast=temp.mast;
kol[j].rang=temp.rang;
}
else
if (tmp1.mast>tmp2.mast){
Karta temp;
temp=tmp1;
tmp1=tmp2;
tmp2=temp;
}
}
}
}
Koloda Koloda :: vyb(int m)const{
Koloda newkol(0);
int j=0;
for(int i=0;i<n;i++){
if (kol[i].mast==m){
newkol.n+=1;
newkol.kol[j].mast=kol[i].mast;
newkol.kol[j].rang=kol[i].rang;
j++;
}
}
return newkol;
}


int main (int argc, char *argv[])
{
srand (time(NULL));
Koloda kar1(10),kar2;
++kar1;
cout<<kar1<<endl;
kar1.sort();
int poi=kar1(3);
int poiu=kar1[3];
kar2=kar1.vyb(0);
cout<<kar2<<endl;
cout << "Hello world!" << endl;

return 0;
}
 
D

DarkKnight

Ок... гляну... только не сегодня голова по швам трещит.. Завтра гляну.... Рейтинг повышу, что бы не забыть...
 
E

evked

я в общем разобрался немного, и вот что получилось, оно даже правильно работает))) осталось пределать в динамику... помоги если сможешь

Добавлено:
Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct Karta{
int mast, rang;
Karta():mast(-1),rang(-1){};
};
class Koloda{
int n;
Karta *kol;
public:
Koloda():n(0) {}
Koloda(int);
~Koloda();
Koloda (const Koloda &);	  
Koloda(const Karta& first){
n=1;
kol[0].mast=first.mast;
kol[0].rang=first.rang;

}
Koloda & operator =(const Koloda &);
friend istream&operator >>(istream& , Koloda&);
friend ostream&operator <<(ostream&, const Koloda& );
Koloda & operator ++();
int operator ()(int) const;
int & operator [](int ) const;
Koloda& sort();
Koloda vyb(int mas) const;
};

istream&operator>>(istream & is, Koloda & kol){
Karta tmp;
kol = Koloda();
int num = 0;
is >> num;
if(num > 0 && num < 52){
kol.n = num;
for(int j = 0; j<num; j++) {
//cout<<" введите масть(0-3): ";
is>>tmp.mast;
if(tmp.mast >=0 && tmp.mast <= 3)
//cout<<"введите ранг (0-12): ";
is>>tmp.rang;
else
throw "неверно задана масть";
if(tmp.rang >= 0 && tmp.rang <= 12) {
kol.kol[j].mast=tmp.mast;
kol.kol[j].rang=tmp.rang;
}
else
throw "неверно задан ранг";
}
}
else
throw "неверный размер колоды";
return is;
}
ostream&operator <<(ostream& os, const Koloda& kol) {
cout<<kol.n<<endl;
if(kol.n==1){
os<<"0)"<<kol.kol[0].mast<<" "<<kol.kol[0].rang<<endl;
}
else{
if(kol.n){
os<<kol.n<<endl;
for(int i=0;i<kol.n;i++)
os<<i<<") "<<kol.kol[i].mast<<" "<<kol.kol[i].rang<<endl;
}
else
os<< "пустая колода"<<endl;
}
return os;
}
Koloda ::Koloda(int k){
n=k;
if(n > 0 && n < 52) { 
for(int i=0;i<k&&i<52;){
int m=rand()%4;
int r=rand()%13;
int fl=1;
for (int j=0;j<k;j++)
if(kol[j].mast==m && kol[j].rang==r){
fl=0;
break;		
}
if(fl){
kol[i].mast=m;
kol[i].rang=r;
i++;
}
}
}
else
throw "неверный размер колоды";
}
Koloda & Koloda :: operator++(){
Karta tmp1,tmp2;
int flag=0;
if (n+1<53){
for(int i=n;i<n+1;){
int m=rand()%4;
int r=rand()%13;
int fl=1;
// cout<<"*"<<endl;
for (int j=0;j<n;j++)
if(kol[j].mast==m&&kol[j].rang==r){
fl=0;
break;		
}
if(fl){
kol[i].mast=m;
kol[i].rang=r;
n+=1;
break;	
}
}
}
else
throw "колода полная";
return *this;
}
int Koloda :: operator ()(int nom)const{
if (nom > n)
throw "карт в колоде меньше";
else{
Karta tmp=kol[nom];
cout<<tmp.mast<<endl;
}
}
int & Koloda :: operator[](int nom)const{
Karta tmp=kol[nom];
cout<<tmp.rang<<endl;
}
Koloda & Koloda :: sort(){

for (int i=0;i<n;i++)
for(int j=0;j<n-1;j++){
if (kol[i].mast>kol[j].mast){
int m,r; m=kol[i].mast; r=kol[i].rang;
kol[i].mast=kol[j].mast; kol[i].rang=kol[j].rang;
kol[j].mast=m; kol[j].rang=r;
}
}
for (int i=0; i<n;i++)
for(int j=0;j<n-1;j++){
if(kol[i].mast==kol[j].mast&&kol[i].rang>kol[j].rang){
int r; r=kol[i].rang;
kol[i].rang=kol[j].rang;
kol[j].rang=r;
}
}
return *this;
} 
Koloda Koloda :: vyb(int m)const{
Koloda newkol;
int j=0, fl=0;
for(int i=0;i<n;i++){
if (kol[i].mast==m){
fl=1;
newkol.n+=1;
newkol.kol[j].mast=kol[i].mast;
newkol.kol[j].rang=kol[i].rang;
j++;
}
}
if (!fl) cout << "такой масти в колоде нет" << endl;
return newkol;
}


int main (int argc, char *argv[])
{
srand (time(NULL));
int a, flagok=0; Koloda kolo(6);
cout << "Исходная колода: " << kolo << endl;
do { cout <<"Пустой конструктор-0"<<endl
<<"1. Инициализация количеством карт"<<endl
<<"2. Инициализация одной картой"<<endl
<<"3. ввод вручную"<<endl
<<"4. Добавить карту(генератор случайных чисел)"<<endl
<<"5. узнать масть"<<endl
<<"6. узнать ранг"<<endl
<<"7. упорядочить по убыванию"<<endl
<<"8. карты одной масти"<<endl
<<"9. выход"<<endl
<<"Введите требуемый вариант: ";
cin>>a;
switch (a){
case 0: {Koloda kolod; cout<<kolod; break;}
case 1:{
int par;
cout<<"введите количество карт: ";
try {
cin>>par;
Koloda kolod(par);		  
cout<<kolod<<endl;}
catch (const char *msg){cout<<msg<<endl;};
break;}
case 2:{
Karta kart; cout<<"введите масть: "; cin>>kart.mast;cout<<endl;
cout<<"введите ранг: "; cin>>kart.rang; cout<<endl;
Koloda koloda(kart);
cout<<koloda<<endl;
break;
}
case 3:{
int k;
Karta kart;
cout<<"введите масть: "; cin>>kart.mast;
cout<<"введите ранг: "; cin>>kart.rang;
Koloda kolod(kart);
cout << "Колода до ввода: " << kolod << endl;			
cout<<"введите количество карт, а затем пары ьасть-ранг: ";
try{
cin>>kolod;
}
catch (const char *msg){cout<<msg<<endl;};
cout<<"Кодода после ввода: "<<kolod<<endl;
kolo = kolod;
break;
}
case 4:{
cout << "Колода до добавления: " << kolo;
try {
++kolo;
cout << "Колода после добавления: " << kolo <<endl;
}
catch (const char *msg){cout<<msg<<endl;};

break;}
case 5:{
cout << "введите номер карты: ";
int nomer;
cin >> nomer;
kolo(nomer);
break;
}
case 6:{cout << "введите номер карты: ";
int nomer;
cin >> nomer;
kolo[nomer];
break;};
case 7:{kolo.sort();
cout << kolo << endl;
break;
};
case 8:{
cout << "введите желаемую масть: ";
int mas;
cin >> mas;
Koloda kar2;
// cout << kar2 << " fdg" << endl;
kar2=kolo.vyb(mas);
cout << kar2 << endl;
break;
};
case 9: {flagok=1; break;}
}
}
while(!flagok);

cout << "Hello world!" << endl;

return 0;
}
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!