Podstawy c++,typ wyliczeniowy

Odpowiedz Nowy wątek
2016-08-25 21:42
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

Pozostało 580 znaków

2016-08-25 22:02

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

edytowany 1x, ostatnio: mlyszczek, 2016-08-25 22:03

Pozostało 580 znaków

2016-08-25 22:14
kq
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


a trzeba używać static cast skoro komilator robi to bez tego ?ps ja tu nic nie zmieniałem z int na enum - bartek164 2016-08-25 22:20
No przecież napisałem? "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ć)" - mlyszczek 2016-08-25 22:23
Ech, faktycznie. Muszę poszukać kursów czytania ze zrozumieniem dla gimnazjum. - kq 2016-08-25 22:26
nie ważne .czyli tu nie trzeba stosowac enum w tym zad? bo ja dalej nie wiem jak go zastosowac - bartek164 2016-08-25 22:27
W przypadku kart enum ma sens. - kq 2016-08-25 22:35
to jak sprawić aby rand losowało spośród enum karty { joker = 0, as = 1, krol = 2, dama = 3, jopek = 4 }; i zwracało ...jakie to pokręcone np anpis joker - bartek164 2016-08-25 23:58

Pozostało 580 znaków

2016-08-26 00:40
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

Pozostało 580 znaków

2016-08-26 07:11
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.

edytowany 2x, ostatnio: mlyszczek, 2016-08-26 07:13

Pozostało 580 znaków

2016-08-26 15:34
0

Od C++11 dobrą praktyką jest stosowanie tzw. Strong enum-ów zamiast zwykłych: http://stackoverflow.com/ques[...]ass-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 :)


edytowany 1x, ostatnio: yurai, 2016-08-26 15:34

Pozostało 580 znaków

2016-08-26 15:40
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

edytowany 1x, ostatnio: mlyszczek, 2016-08-26 15:41

Pozostało 580 znaków

2016-08-26 17:13
kq
1

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


Pozostało 580 znaków

2016-08-29 19:06
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?

Pozostało 580 znaków

2016-08-29 20:16
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.

Pozostało 580 znaków

2016-08-29 22:59
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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