4° Appello – 09/07/2019 - Parte pratica

MAIN.CPP
#include iostream
#include cstdlib
#include ctime
#include “dati.h”

int main(int argc, char** argv) {
	srand(time(0));
	TcodaFIFO* ff = new TcodaFIFO(10);
	Tforesta f;
	
	for(int i=0; i<5; i++) { initForesta(&f); addForesta(ff,f); }
	stampaForeste(ff);
	printf("piante %d\n", rimuoviESalvaForeste(ff, COLLINARE));
		
	return 0;
}

DATI.H
#include cstring
#include cstdlib

#ifndef __DATI_H__
#define __DATI_H__
	
	#define DIM 2
	
	typedef enum Tpianta { MONTANO, COLLINARE, TROPICALE } Tpianta;
	typedef struct Tforesta{
		char nomeForesta[20];
		unsigned int numeroPiante;
		float altezzaMedia;
		Tpianta tipoPianta;
		Tforesta () {
			strcpy(nomeForesta, "");
			numeroPiante = 0;
			altezzaMedia = 0;
			tipoPianta = MONTANO;				
		}
		void stampa() const{
			switch(tipoPianta){
				case MONTANO:
					printf("%s(%s) %.2f %d", nomeForesta, "MONTANO", altezzaMedia, numeroPiante);		
					break;
				case COLLINARE:
					printf("%s(%s) %.2f %d", nomeForesta, "COLLINARE", altezzaMedia, numeroPiante);
					break;
				case TROPICALE:
					printf("%s(%s) %.2f %d", nomeForesta, "TROPICALE", altezzaMedia, numeroPiante);
					break;
			}
		}
	} Tforesta;
	
	typedef struct TcodaFIFO {
		int n, dim, head, tail;
		Tforesta *s;
		TcodaFIFO () {
			n = 0;
			dim = 100;
			head = 0;
			tail = 0;
			s = new Tforesta[dim];			
		}
		TcodaFIFO (int x){
			n = 0;
			dim = x;
			head = 0;
			tail = 0;
			s = new Tforesta[dim];			
		}
		
		~TcodaFIFO(){delete [] s;}
		
		void stampa() const{
			int i;
			for(i=head-1; i>=tail; i--){
				s[i].stampa();printf("\n");
			}
		}
	} TcodaFIFO;
	// Inserimento e cancellazione dalla testa (head)
	
	void initForesta(Tforesta* f){
		int numeroPianteIN = 0;
		int randTipoPianta = rand()%(TROPICALE-MONTANO+1)+MONTANO;
		printf("Nome foresta: ");
		fflush(stdin); scanf("%s", f->nomeForesta);
		
		printf("Numero di piante: ");
		scanf("%d", &numeroPianteIN);
		f->numeroPiante = numeroPianteIN;
		
		while(numeroPianteIN<1000 || numeroPianteIN>9999){
			printf("\nErr.\n");
			printf("Numero di piante: ");
			scanf("%d", &numeroPianteIN);
		}
		
		f->altezzaMedia = (rand()%(200000 - 10000 +1)+10000)/100.0;
		
		switch(randTipoPianta){
			case MONTANO:
				f->tipoPianta = MONTANO;
				break;
			case COLLINARE:
				f->tipoPianta = COLLINARE;
				break;
			case TROPICALE:
				f->tipoPianta = TROPICALE;
				break;
		}
	}
	
	void addForesta(TcodaFIFO* foreste, Tforesta f){
		if((foreste->n)==(foreste->dim)){
			printf("Coda piena.\n");
		}else{
			foreste->s[foreste->head] = f;
			(foreste->head)++;
			(foreste->n)++;
		}
	}
	
	void stampaForeste(TcodaFIFO* foreste){
		foreste->stampa();printf("\n");
	}
	
	int rimuoviESalvaForeste(TcodaFIFO* foreste, Tpianta tp){
		int i;
		int tot = 0;
		FILE* fp;
		
		if(fp=fopen("piante.txt", "w")){
			foreste->head = (foreste->head)-1;
			for(i=(foreste->head); i>=(foreste->tail); i--){
				if((foreste->s[i]).tipoPianta == tp){
					tot++;
					fprintf(fp,"%s %d\n", foreste->s[i].nomeForesta, foreste->s[i].numeroPiante);				
				}
				(foreste->head)--;
			}
			fclose(fp);	
		}else{
			printf("Errore nell'apertura del file.\n");
		}
		
		return tot;			
	}
	
#endif

Domanda, nella funzione initForesta come fa a riconoscere il nome delle piante in questa istruzione?
int randTipoPianta = rand()%(TROPICALE-MONTANO+1)+MONTANO; Nel senso ritorna un valore intero tra 0 e 2 l’ho capito, ma non capisco come mai il programma capisce per esempio che TROPICALE è 2.
Pensavo che per capirlo avesse bisogno che nella parte sinistra dell’= ci fosse Tpianta così lui sa che è un enum. Scusate se la domanda puo sempreare superflua ma ci sono queste cose che ancora non capisco

Rispondo brevemente.
I “tipi” specificati con enum possono essere “visti” come interi.
In questo caso:
MONTANO = 0
COLLINARE = 1
TROPICALE = 2
Sulle slide è spiegato più dettagliatamente.

Continuo questo argomento perchè avevo questo dubbio:
non sarebbe stato sufficiente fare :

f->tipoPianta=rand()%(TROPICALE-MONTANO+1)+MONTANO;

senza lo switch? alla fine tropicale, montano e collinare sono numeri… o forse il tipo enum accetta solo il nome, tipo “TROPICALE”?
Grazie :slight_smile:

@Stefano probabilmente non lo vedo io ma mi sembra che tu non rimuova effettivamente le foreste dall’array. :thinking: