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ć ?
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ć ?
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ć.
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++ ?
Napisz co ten program ma robić (nie chce mi się go czytać) - wtedy zaproponujemy odpowiednie struktury.
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.
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;
}
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]);
Możliwe do uzyskania w C++ ?
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];
}
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.
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.
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
O to chodziło !
Nie znałem tego sposobu, dziękuję :)