typy wyliczeniowe i wzrost początkowej wartości

0

Piszę w C++, jeśli stworze typ wyliczeniowy enum i np. utworzę w nim 4 pozycję jeden = 1 dwa = 2 itd. to jak mogę te wartości potem zmieniać ?

0

Wiem że mogę to inaczej zrobić ale na lekcji z pascala ja piszę w c++ bo się dogadałem z nauczycielem, i rok temu napisałem ładny program według polecenia że wartość się zmienia. No i jak dostanę takie polecenie na sprawdzianie w C++ to co mam zrobić ?

0

chyba pomyliłeś sobie enum ze strukturą. wartości w typie wyliczeniowym są stałe. jak dla danego typu przypiszesz jeden=1, dwa=2 to nie możesz ich zmienić (w ogóle po co ktoś miałby to robić?)

najlepiej napisz co to za program to doradzimy jaki typ/strukturę najlepiej wybrać.

0

hah nie pomyliłem ^^
Znalazłem stary programik w pascalu:

Uses crt;

type
    TCzesci=(kot,pies,mamut,tygrys,lew);
    TMagazyn=array[TCzesci] of Integer;

const
     Nazwa:array[TCzesci] of string =
                          ('kot','pies','mamut','tygrys','lew');

Label powrot;

Var
c1,c2:char;
pom,y:byte;
tab1:array[1..3] of string;
tab2:array[1..6] of string;

Animals:TCzesci;
Magazyn:TMagazyn;


FUNCTION licz:longint;
BEGIN

IF pom=1 THEN inc(magazyn[animals]);
IF pom=2 THEN inc(magazyn[animals]);
IF pom=3 THEN inc(magazyn[animals]);
IF pom=4 THEN inc(magazyn[animals]);
IF pom=5 THEN inc(magazyn[animals]);

END;

PROCEDURE wypisywanie(poz,tlo,napis:byte);
BEGIN
textbackground(tlo);
textcolor(napis);
gotoxy(32,11+poz);
writeln(tab1[poz]);
END;

PROCEDURE wypisywanie2(poz,tlo,napis:byte);
BEGIN
textbackground(tlo);
textcolor(napis);
gotoxy(32,11+poz);
writeln(tab2[poz]);
END;

PROCEDURE wypisz;
BEGIN

 FOR animals:=kot TO lew DO
                BEGIN
                Write(Nazwa[Animals]);
                Writeln(Magazyn[Animals]);
                END;
END;

PROCEDURE nowywpis;
LABEL powrot;
BEGIN

powrot:
clrscr;
wypisz;
       tab2[1]:='kot';
       tab2[2]:='pies';
       tab2[3]:='mamut';
       tab2[4]:='tygrys';
       tab2[5]:='lew';
       tab2[6]:='Zakoncz';

       FOR pom:=1 TO 6 DO wypisywanie2(pom,0,15);
pom:=1;

REPEAT
REPEAT
wypisywanie2(pom,15,0);

c1:=readkey;
c2:=' ';
                IF c1=#0 THEN c2:=readkey;
                wypisywanie2(pom,0,15);
                IF c2='H' THEN dec(pom);
                IF c2='P' THEN inc(pom);

                IF pom=7 THEN pom:=1;
                IF pom=0 THEN pom:=6;

UNTIL (c1=#27) OR (c1=#13);
                IF pom=1 THEN animals:=kot;
                IF pom=2 THEN animals:=pies;
                IF pom=3 THEN animals:=mamut;
                IF pom=4 THEN animals:=tygrys;
                IF pom=5 THEN animals:=lew;
                IF pom=6 THEN break;
                licz;
                goto powrot;

UNTIL c1=#27;

END;


PROCEDURE wczytajwpis;
BEGIN
clrscr;
FOR animals:=kot TO lew DO
                BEGIN
                Write(Nazwa[Animals]);
                Writeln(Magazyn[Animals]);
                END;
readln;

END;

PROCEDURE menu;
BEGIN

     tab1[1]:='Nowy wpis';
     tab1[2]:='Wczytaj wpis';
     tab1[3]:='Zakoncz';
clrscr;
FOR pom:=1 TO 3 DO wypisywanie(pom,0,15);
pom:=1;


REPEAT
wypisywanie(pom,15,0);

c1:=readkey;
c2:=' ';
                IF c1=#0 THEN c2:=readkey;
                wypisywanie(pom,0,15);
                IF c2='H' THEN dec(pom);
                IF c2='P' THEN inc(pom);

                IF pom=4 THEN pom:=1;
                IF pom=0 THEN pom:=3;

UNTIL (c1=#27) OR (c1=#13);
                IF pom=1 THEN nowywpis;
                IF pom=2 THEN wczytajwpis;
                IF pom=3 THEN halt;

END;

BEGIN
clrscr;

REPEAT
menu;
UNTIL false;

END.

Czy da się też to zrobić w C++ ?

0

Napisz co ten program ma robić (nie chce mi się go czytać) - wtedy zaproponujemy odpowiednie struktury.

0

Nie potrzeba mi struktur bo dobierać narzędzia potrafię, ale jeśli mam na sprawdzianie napisać program przy użyciu konkretnego narzędzia to muszę się dostosować, i nie mogę struktur zamiast typów użyć.

Tworzę typ zwierzęta i tworzę 4 zmienne o nazwach zwierząt. No i wybieram ile mam zwierząt danego typu, ale nie mogę utworzyć nowe zmiennej na przechowywanie tych inf. tylko te dane muszą być przechowywane w moim własnym typie, tak jak to w pascalu napisałem.

0

jesteś pewny że nie chodzi o coś takiego?

struct zwierzeta_t {
  int kot, pies, mamut;
};

int main (void) {
  zwierzeta_t zwierzeta;
  zwierzeta.kot = 3;
  zwierzeta.pies = 5;
  zwierzeta.mamut = 0; // wyginęły
  zwierzeta.kot = 5; // przybyło kotów
  return 0;
}

z twojego opisu wynika że coś takiego również by pasowało:

typedef int zwierzeta;

int main (void) {
  zwierzeta kot, pies, mamut;
  kot = 3;
  pies = 5;
  mamut = 0; // wyginęły
  kot = 5; // przybyło kotów
  return 0;
}
0

na 100% nie robiliśmy jeszcze struktur i mimo że je potrafię to MUSZĘ dostosować sie do polecenia i używać TYPU WYLICZENIOWEGO ENUM.

Jak się komuś nie chce czytać:

type
TCzesci=(kot,pies,mamut,tygrys,lew);
TMagazyn=array[TCzesci] of Integer;

i fragment 2

IF pom=1 THEN inc(magazyn[animals]);
IF pom=2 THEN inc(magazyn[animals]);
IF pom=3 THEN inc(magazyn[animals]);
IF pom=4 THEN inc(magazyn[animals]);
IF pom=5 THEN inc(magazyn[animals]);

0

Możliwe do uzyskania w C++ ?

0

Nie sądzę. Jak można to obejść w inny sposób ?

#include <iostream>

using namespace std;

enum TZwierzeta
{
    kot,
    pies,
    lew,
    tygrys
};

int main()
{
    int magazyn[TZwierzeta];
}

0

ja czegoś nie kumam co robi ten kod?

IF pom=1 THEN inc(magazyn[animals]);
IF pom=2 THEN inc(magazyn[animals]);
IF pom=3 THEN inc(magazyn[animals]);
IF pom=4 THEN inc(magazyn[animals]);
IF pom=5 THEN inc(magazyn[animals]);

można go spokojnie zamienić na

inc(magazyn[animals]);

nie chce mi się analizować tego kodu, ale TCzesci=(kot,pies,mamut,tygrys,lew); to po prostu enum z C.
Każdy element jest tak jakby aliasem na kolejną cyfrę i możesz to osiągnąć zarówno w Pascalu jak i C jedyną rzeczą której nie możesz chyba robić w C to operować na zbiorach których de facto tutaj nie używasz.

0

if pobrany klawisz = 1 to wartość danej zmiennej tablicowej rośnie o jeden. W c++ nie da się przypisać do tablicy stałych z typu.

1

Wyjaśnijmy jeszcze raz wszystko na spokojnie...

Taki kod w pascalu:

 
type
    TCzesci=(kot,pies,mamut,tygrys,lew);
    TMagazyn=array[TCzesci] of Integer;

Co w praktyce mogło by być rozwinięte mniej więcej tak:

 
type
    TCzesci=(0,1,2,3,4);
    TMagazyn=array[0..4] of Integer;

Oznacza to, że TMagazyn to typ tablicowy 5-elementowy od 0 do 4, każdy z elementów jest int'em.
W C++ jedynym problemem jest to, że nie możemy sprawdzić ile elementów ma enum tak jak jest to w Pascal'u, zamiast tego można wprowadzić dodatkowe wart. First i Last, ale jak to zrealizujesz to twoja sprawa.

W C++ było by to tak:

 
  enum TCzesci {kot,pies,mamut,tygrys,lew, First=kot, Last=lew};
  int TMagazyn[Last]; //tablica Last-elementowa

i masz w tym momencie utworzoną tablicę do elementów której możesz odwoływać się tak
TMagazyn[ tygrys ] = 40;
natomiast to z tym "klawiszem" to pomyłka nie ma to prawa zadziałać tak jak opowiadasz

0

O to chodziło !
Nie znałem tego sposobu, dziękuję :)

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