for-loop поможет получить неправильный вывод - PullRequest
0 голосов
/ 23 мая 2019

Я пишу код, используя классы, и получаю неправильный вывод, это мои определения функций:

void PrintCard(int c)
{
    int Rank = c%13;
    int Suit = c/13;
    const char NameSuit[5] = "SCDH";
    const char NameRank[14] = "23456789XJQKA";
    cout << NameRank[Rank] << NameSuit[Suit];
}

CardSet::CardSet()
{
    Card = NULL;
    nCards = 0;
}

CardSet::CardSet(int c)
{
    Card = new int[c];
    for(int i = 0; i > c; i++)
    {
        Card[i] = (i % 52);
    }
}

CardSet::~CardSet()
{
     delete[] Card;
}

bool CardSet::IsEmpty() const
{
    return nCards == 0;
}

void CardSet::Print() const
{
    for(int i=0; i > nCards; i++)
    {
        PrintCard(i);
    }     
} 

int CardSet::Size() const
{
    return nCards;
}

Это мой главный

    cout << "Testing constructors, Print(), Size() & IsEmpty():" << endl;
    CardSet CardSet1; // empty cCardSet
    CardSet CardSet2(12); // CardSet with 12 cards
    if(CardSet1.IsEmpty()) cout<<"CardSet1 is empty"<<endl;
    else cout<<"CardSet1 has "<< CardSet1.Size() <<" cards" << endl;
    if(CardSet2.IsEmpty()) cout<<"CardSet2 is empty"<<endl;
    else cout<<"CardSet2 has "<< CardSet2.Size() <<" cards" << endl;
    cout << "Printout of CardSet1: ";
    CardSet1.Print();
    cout << "Printout of CardSet2: ";
    CardSet2.Print();
    cout << endl;

когда я компилирую, я получаю правильное значение (0) для cardset1, однако для cardset2 вместо вывода значения 12, что должно быть выводом, я получаю очень большие числа, которые меняются каждый раз, когда я компилирую. я думаю, что-то не так с моими циклами for или распределением памяти.

вот так выглядит определение класса:

class CardSet
{
    public:
        CardSet();
        CardSet(int);
        ~CardSet();
        int Size() const;
        bool IsEmpty() const;
        void Shuffle();
        int Deal();
        void Deal(int,CardSet&,CardSet&);
        void Deal(int,CardSet&,CardSet&,CardSet&,CardSet&);
        void AddCard(int);
        void MergeShuffle(CardSet&);
        void Print() const;
    private:
        int* Card;
        int nCards;
};

любая помощь будет принята с благодарностью !!

Приветствия

Ответы [ 3 ]

2 голосов
/ 23 мая 2019

В CardSet::CardSet изменить это

for(int i = 0; i > c; i++)

на это

for (int i = 0; i < c; i++)

Также в CardSet::Print изменить это

for(int i=0; i > nCards; i++)

На это:

for (int i = 0; i < nCards; i++)

Наконец, добавьте nCards = c; к CardSet::CardSet.

2 голосов
/ 23 мая 2019
void CardSet::Print() const
{
  for(int i=0; i > nCards; i++)
  {
    PrintCard(i);
  }     
} 

должно быть

void CardSet::Print() const
{
  for(int i=0; i < nCards; i++)
  {
    PrintCard(i);
  }     
} 

, чтобы исправить окончание теста, и у вас та же проблема с CardSet::CardSet(int c), которая должна быть

CardSet::CardSet(int c)
{
   nCards = c;
   Card = new int[c];
   for(int i = 0; i < c; i++)
   {
     Card[i] = (i % 52);
   }
}

, где nCards также должен быть установлен.

В для тест показывает, продолжается ли цикл, а не заканчивается ли он

for (inits; test; changes) ...

эквивалентно

init;
while (test) {
   ...
   changes;
}

Из-за этого в PrintCard не выполняется разделитель cout << NameRank[Rank] << NameSuit[Suit];, поэтому может потребоваться добавить что-то вроде пробела в Print :

void CardSet::Print() const
{
  for(int i=0; i < nCards; i++)
  {
    PrintCard(i);
    cout << ' ';
  }     
} 

или PrintCard для разделения двух полей, таких как

cout << NameRank[Rank] << ' ' << NameSuit[Suit] << endl;

Обратите внимание, что вы можете упростить

const char NameSuit[5] = "SCDH";
const char NameRank[14] = "23456789XJQKA";
cout << NameRank[Rank] << NameSuit[Suit];

до

cout << "23456789XJQKA"[Rank] << "SCDH"[Suit];

Или, если вы действительно хотите иметь массивы, я призываю вас не указывать размер, чтобы избежать проблем, если вы измените буквенную строку и забудете также изменить размер, поэтому

const char NameSuit[] = "SCDH";
const char NameRank[] = "23456789XJQKA";

Например, имеющий:

#include <iostream>

using namespace std;

class CardSet
{
    public:
        CardSet();
        CardSet(int);
        ~CardSet();
        int Size() const;
        bool IsEmpty() const;
        void Shuffle();
        int Deal();
        void Deal(int,CardSet&,CardSet&);
        void Deal(int,CardSet&,CardSet&,CardSet&,CardSet&);
        void AddCard(int);
        void MergeShuffle(CardSet&);
        void Print() const;
    private:
        int* Card;
        int nCards;
};

void PrintCard(int c)
{
    int Rank = c%13;
    int Suit = c/13;

    cout << "23456789XJQKA"[Rank] << ' ' << "SCDH"[Suit] << endl;
}

CardSet::CardSet()
{
  Card = NULL;
  nCards = 0;
}

CardSet::CardSet(int c)
{
  nCards = c;
  Card = new int[c];
  for(int i = 0; i < c; i++)
  {
    Card[i] = (i % 52);
  }
}

CardSet::~CardSet()
{
  delete[] Card;
}

bool CardSet::IsEmpty() const
{
  return nCards == 0;
}

void CardSet::Print() const
{
  for(int i=0; i < nCards; i++)
  {
    PrintCard(i);
  }     
} 

int CardSet::Size() const
{
  return nCards;
}

int main(void)
{
  CardSet cs(5);

  cs.Print();
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
2 S
3 S
4 S
5 S
6 S
pi@raspberrypi:/tmp $ 
0 голосов
/ 23 мая 2019

Вы должны просмотреть его (цикл)

void CardSet::Print() const
{
    for(int i=0; i > nCards; i++)//@@ reconsider it
    {
      PrintCard(i);
    }     
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...