Podstawy c++,typ wyliczeniowy

0
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wypisnieKart(short ikarty[]) {
  for (short i = 0; i < 5; ++i) {
    cout << ikarty[i] << ",";
  }
}
short losowanie(short pojemnik[]) {
  for (short i = 0; i < 5; ++i) {
    pojemnik[i] = rand() % 5 + 1;
  }

  return 0;
}

int main() {
  cout << "\\\\\\\\Gra karciana/////" << endl;
  srand(time(NULL));
  enum karty { joker = 0, as = 1, krol = 2, dama = 3, jopek = 4 };
  short mojeKarty[5];
  losowanie(mojeKarty);
  wypisnieKart(mojeKarty);

  return 0;
}
 

mam wyświetlić losowe karty (5 razy) spośród zmiennej enum(mam ją użyć do zadania)
nie wiem jak mam zrobić aby program losował z pomiędzy zmiennej enum. i potem wyświetlić nazwe kart

1

Enum to nic innego jak constant int. Możesz śmiało rzutować int na enum i enum na int

enum e
{
  ONE = 1,
  TWO,
  THREE,
  FOUR
};

int main(void)
{
  enum e e;
  int i;
  e = 2; /* teraz e to TWO */
  i = THREE; /* teraz w zmiennej i jest wartość 3
  return 0;
}

Generalnie wartości w enum (czyli ONE, TWO, THREE) można traktować jakby to byłby najzwyklejsze w świecie #define. A z kolei zmienne np enum e e traktować jako zwykły int (to jest implementation specifi ale na potrzeby Twojego prostego zdania tak możesz na to potrzeć) Czyli enum e e to praktycznie to samo co int e. Enumem po prostu dajemy znać programiście jakie wartości taka zmienna powinna posiadać. Czasami może być potrzeba zrzutowania inta na enuma czyli enum e e; e = (enum e)50

4

unscoped enum ma implementation-defined underlying type. Nie musi to być int. Dodatkowo, jeśli chcesz castować z-do enumów to używaj static_cast

0
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

/*void wypisnieKart(short ikarty[])
{
    for(short i=0;i<5;++i)
    {
        cout<<ikarty[i]<<",";
    }
}*/
short losowanie(short pojemnik[]) {
  for (short i = 0; i < 5; ++i) {
    pojemnik[i] = rand() % 5 + 1;
    if (pojemnik[i] == 1) {
      cout << "Joker,";
    } else if (pojemnik[i] == 2) {
      cout << "As,";
    } else if (pojemnik[i] == 3) {
      cout << "Krol,";
    } else if (pojemnik[i] == 4) {
      cout << "Dama,";
    } else if (pojemnik[i] == 5) {
      cout << "Jopek,";
    }
  }

  return 0;
}

int main() {
  cout << "\\\\\\\\Gra karciana/////" << endl;
  srand(time(NULL));
  enum karty { joker = 1, as = 2, krol = 3, dama = 4, jopek = 5 };
  short mojeKarty[5];
  losowanie(mojeKarty);
  // wypisnieKart(mojeKarty);

  return 0;
}
 

czy o takie zastoswanie enum chodzi ...czy jest ono dobrze zastosowane? niby robi swoją role czyli informuje

0

Prawie dobrze,tylko zamiast liczb 1,2,3... użyj wartości z enuma (np if (pojemnik[i] == dama). W takim przypadku enum musisz zadeklarować wyżej w globalnym scopie, bo inaczej funkcja losowanie nie wie nic o enumie.

0

Od C++11 dobrą praktyką jest stosowanie tzw. Strong enum-ów zamiast zwykłych: http://stackoverflow.com/questions/18335861/why-is-enum-class-preferred-over-plain-enum
Raz, że bezpieczniejsze typowo, dwa, że mamy pełną kontrolę nad underlying type i pisząc np.

 enum class karty : uint8_t  { joker = 1, as = 2, krol = 3, dama = 4, jopek = 5 };

oszczędzamy po 3B (pod gcc) na każdej karcie. Wow :)

0

yurai, no nie do końca, bo deklracja enuma NIE trafia do pamięci. Dopiero definicja jego trafi, więc jak zrobisz enum e e to dopiero wtedy underlying type wchodzi w grę i odłożysz na stos tyle ile faktycznie będzie miał ten typ. Bez definicji, enum można traktować trochę jak define'y

1

Dodatkowo unscoped enumy też mogą mieć fixed type.

0
 #include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;
enum karty { joker = 1, as = 2, krol = 3, dama = 4, jopek = 5 };

short losowanie(short pojemnik[]) {
  for (short i = 0; i < 5; ++i) {
    pojemnik[i] = rand() % 5 + 1;
    if (pojemnik[i] == joker) {
      cout << "Joker,";
    } else if (pojemnik[i] == as) {
      cout << "As,";
    } else if (pojemnik[i] == krol) {
      cout << "Krol,";
    } else if (pojemnik[i] == dama) {
      cout << "Dama,";
    } else if (pojemnik[i] == jopek) {
      cout << "Jopek,";
    }
  }

  return 0;
}

int main() {
  cout << "\\\\\\\\Gra karciana/////" << endl;
  srand(time(NULL));
  short mojeKarty[5];
  losowanie(mojeKarty);


  return 0;
}

tak wygląda koncowy wynik -moje pytanie enum działa tylko na zmiennych int?

0

Nie do końca. Enum działać MOŻE na wszystkich typach liczb całkowitych. Tj, nie ma problemu zrobić unsigned char a = ENUM_VALUE, dopóki ENUM_VALUE nie przekracza wartości 255. Jak w takim przypadku wartość ENUM_VALUE będzie większa, to wartość zostanie obcięta.

0

a mam jeszcze jedna sprawe do tego zadania .dlaczego for (short i = 0; i < 5; ++i) {cout<<i;} program wypisuje 0 1 2... a nie Od razu zwieksza wartość o 1 czyli powinno wtedy być 1 2 3... bo zapis ++i i i++ w pętli nie robi różnicy

1

Nie ma znaczenia. Pętla for może być zamieniona na while w taki sposób:

for(FOO; BAR; BAZ){
	QUX;
}
FOO;
while(BAR){
	QUX;
	BAZ;
}

Jak widzisz BAZ wykonuje się na końcu pętli, i czy jest to i++ czy ++i nie ma znaczenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1