Pella86

Lezione 5a - strutture dati

Oct 14th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. enum Seme{
  7.     cuori = 0,
  8.     quadri = 1,
  9.     fiori = 2,
  10.     picche = 3,
  11. };
  12.  
  13. //enumerazione per i valori
  14. enum Valori{
  15.     Asso = 1,
  16.     Fante = 11,
  17.     Donna = 12,
  18.     Re = 13,
  19. };
  20.  
  21.  
  22. //funzione che stampa la carta
  23. string stampa_carta(int valore, int seme){
  24.  
  25.         // seme switch block
  26.         string nome_seme; // dichiarazione variabile nome del seme
  27.  
  28.         switch(seme){
  29.             case 0:
  30.                 nome_seme = "cuori";
  31.                 break;
  32.             case 1:
  33.                 nome_seme = "quadri";
  34.                 break;
  35.             case 2:
  36.                 nome_seme = "fiori";
  37.                 break;
  38.             case 3:
  39.                 nome_seme = "picche";
  40.                 break;
  41.             default:
  42.                 nome_seme = "seme non definito";
  43.         }
  44.  
  45.         // valore switch block
  46.         string nome_valore; // dichiarazione variable nome delvalore
  47.  
  48.         switch(valore){
  49.             case 1:
  50.                 nome_valore = "Asso";
  51.                 break;
  52.             case 11:
  53.                 nome_valore = "Fante";
  54.                 break;
  55.             case 12:
  56.                 nome_valore = "Donna";
  57.                 break;
  58.             case 13:
  59.                 nome_valore = "Re";
  60.                 break;
  61.             default:
  62.                 // conversione numero a stringa
  63.                 char buffer[33];
  64.                 itoa(valore, buffer, 10);
  65.                 nome_valore = buffer;
  66.         }
  67.  
  68.         // costruiamo ora per intero il nome della carta
  69.         string nome_carta = nome_valore + " di " + nome_seme;
  70.  
  71.         return nome_carta;
  72. }
  73.  
  74.  
  75.  
  76.  
  77.  
  78. // ora abbiamo dei prototipi per amministrare le carte.
  79. // delle enumerationi che ci aiutano a scrivere in modo umano
  80. // delle carte rappresentate da due interi.
  81.  
  82. // C++ offre classi e strutture per estendere la manipolazione dei tipi di base
  83. // ora abbiamo i due interi che sono in libertà e indipendenti tra loro
  84. // ma non esiste una carta con un valore senza un seme o un seme senza un valore.
  85. // dunque possiamo unire i due interi rappresentanti la carta in una struttura dati
  86. // una struttura dati è semplicemente un composto di dati primari
  87. // potrebbe essere una stringa e un intero, più stringhe, più interi, ecc ecc.
  88.  
  89. // la struttura adibita alla carta chiamata "Carta" ora conterra 2 membri.
  90. // un intero che definisce il seme e uno che definisce il valore.
  91. // Nel main si scriverea Carta (nome variabile); poi si procede all'
  92. // inizializazione dei membri.
  93. // (nome variabile).valore = 10;
  94. // (nome seme).seme = quadri (definito come 1 nella enum semi v. sopra)
  95.  
  96. // è una concezione astratta.
  97. struct Carta{
  98.     int valore;
  99.     int seme;
  100. };
  101.  
  102. //------------------------------------> vedi esempio alla riga xx
  103.  
  104. // La struttura sopra richiede ora una dichiarazione (1)
  105. // un inizializzazione (2)
  106. // e se vogliamo una stampa (3)
  107. // nell esempio vediamo già che ci serve una funzione per stampare i valori
  108. // in modo umano (con asso al posto di 1 e il nome del seme)
  109. // e inoltre dobbiamo fare una cosa scomoda, richiamare gli attributi della
  110. // carta singolarmente (con (nome variabile).valore e (nome variabile).seme)
  111. // questo è relativamente scomodo.
  112.  
  113. // Possiamo invece usare delle funzioni che lo faranno per noi.
  114.  
  115. // funzione di inizializzazione.
  116. // la funzione prenderà una referenza a una carta esistente.
  117. // l'& nella dichiarazione degli argomenti fa in modo che la variabile sia
  118. // modificata internamente alla funzione, e la variabile si ricordi della
  119. // modifica dopo l'esecuzione della funzione
  120. void inizializza_carta(Carta& carta, int valore, int seme){
  121.     carta.valore = valore; //assegna alla carta di input il valore
  122.     carta.seme = seme; // assegna il seme al membro seme
  123.  
  124.     // return xxx; > da notare come la funzione non "ritorna" niente, dato che
  125.     // modifica già la nostra carta via referenza
  126. }
  127.  
  128. // ---------------------------------------> vedi esempio alla riga xx
  129.  
  130. // per ora ogni volta che dobbiamo stampare la carta con la funzione
  131. // stampa_carta dobbiamo passare i due vaolri separatamente
  132. // ma potremmo definire una funzione che accetta la carta come tale.
  133. string stampa_struct_carta(Carta carta){
  134.     return stampa_carta(carta.valore, carta.seme);
  135. }
  136.  
  137. // ---------------------------------------> vedi esempio alla riga xx
  138.  
  139.  
  140. // Lezione 5a - Strutture
  141. int main()
  142. {
  143.     cout << "------Il mazzo------" << endl;
  144.     // il nostro programma per generare tutte le carte in un mazzo da
  145.     // 52 carte
  146.  
  147.     // ciclo seme ( da 0 a 3)
  148.     int seme = 0; // dichiariamo una variabile seme
  149.     while(seme <= 3){ // fino a che seme sara minore uguale a tre
  150.  
  151.         // ciclo valore (da 1 a 13)
  152.         int valore = 1; // dichiarazione e assegnazione del valore iniziale
  153.         while(valore <= 13){ // fino a che la variabile valore non è 13, esegui le istruzioni
  154.                 cout << stampa_carta(valore, seme) << endl;
  155.             valore++; // fa aumentare il valore di uno
  156.         }
  157.         seme++; // incrementa il seme
  158.     }
  159.  
  160.     cout << endl;
  161.     cout << "------Carte singole------" << endl;
  162.  
  163.     // creare una carta singola con la struttura dati.
  164.  
  165.     // punto 1: dichiarare il nome variabile
  166.     Carta asso_picche;
  167.  
  168.     //cout << asso_picche.valore << " di " << asso_picche.seme << endl;
  169.     // 2686728 di 2686916 l'outpud è un valore indefinito, infatti chiamare la
  170.     // dei membri non inizializzati è un errore e si chiama undefined behavior
  171.     // è un errore molto difficile da detettare dato che accade a run time e non
  172.     // a compile time
  173.  
  174.     // punto 2: inizializzare i membri.
  175.     asso_picche.valore = Asso; //asso definito come 1 nella enum sopra
  176.     asso_picche.seme = picche; //picche definitio come 3 nella enum sopra
  177.  
  178.     // punto 3: stampare la carta
  179.     // stampa dei valori
  180.     cout << asso_picche.valore << " di " << asso_picche.seme << endl;
  181.  
  182.     // stampa formattata con i nomi giusti sia del valore che dei semi
  183.     cout << stampa_carta(asso_picche.valore, asso_picche.seme) << endl;
  184.  
  185.     // definiamo una nuova carta
  186.     Carta re_fiori;
  187.  
  188.     inizializza_carta(re_fiori, Re, fiori);
  189.  
  190.     cout << re_fiori.valore << " di " << re_fiori.seme << endl;
  191.  
  192.     cout << stampa_carta(re_fiori.valore, re_fiori.seme) << endl;
  193.  
  194.     // definiamo una nuova carta
  195.  
  196.     Carta donna_cuori;
  197.     inizializza_carta(donna_cuori, Donna, cuori);
  198.     cout << stampa_struct_carta(donna_cuori) << endl;
  199.  
  200.  
  201.  
  202.  
  203.     return 0;
  204. }
  205.  
  206.  
  207.  
  208.  
  209.  
  210. /* OUTPUT
  211. ------Il mazzo------
  212. Asso di cuori
  213. 2 di cuori
  214. 3 di cuori
  215. 4 di cuori
  216. 5 di cuori
  217. 6 di cuori
  218. 7 di cuori
  219. 8 di cuori
  220. 9 di cuori
  221. 10 di cuori
  222. Fante di cuori
  223. Donna di cuori
  224. Re di cuori
  225. Asso di quadri
  226. 2 di quadri
  227. 3 di quadri
  228. 4 di quadri
  229. 5 di quadri
  230. 6 di quadri
  231. 7 di quadri
  232. 8 di quadri
  233. 9 di quadri
  234. 10 di quadri
  235. Fante di quadri
  236. Donna di quadri
  237. Re di quadri
  238. Asso di fiori
  239. 2 di fiori
  240. 3 di fiori
  241. 4 di fiori
  242. 5 di fiori
  243. 6 di fiori
  244. 7 di fiori
  245. 8 di fiori
  246. 9 di fiori
  247. 10 di fiori
  248. Fante di fiori
  249. Donna di fiori
  250. Re di fiori
  251. Asso di picche
  252. 2 di picche
  253. 3 di picche
  254. 4 di picche
  255. 5 di picche
  256. 6 di picche
  257. 7 di picche
  258. 8 di picche
  259. 9 di picche
  260. 10 di picche
  261. Fante di picche
  262. Donna di picche
  263. Re di picche
  264.  
  265. ------Carte singole------
  266. 1 di 3
  267. Asso di picche
  268. 13 di 2
  269. Re di fiori
  270. Donna di cuori
  271. */
Advertisement
Add Comment
Please, Sign In to add comment