2° Appello - 06/02/2018 - Parte Pratica

Non vi dico quanto ci ho messo a capire che avevo dimenticato un +1 da qualche parte… No comment.

Main.cpp

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <time.h>
#include "dati.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	TcodaFIFO* p = new TcodaFIFO(10);
	Tveicolo v;
	srand(time(0));
	for(int i=0; i<5; i++) { 
		creaVeicolo(&v);
		addVeicolo(p,v);
	}
	stampaVeicolo(p);
	delAuto(p, 2000);
	return 0;
}

Dati.h

#ifndef DATI_H
#define DATI_H

#include <iostream>
#include <cstdlib>
#include <string.h>

using namespace std;

typedef enum Ttipo{ AUTO, MOTO, AUTOBUS } Ttipo;

const char* s_tipo(Ttipo t){
	switch(t){
		case AUTO: return "AUTO";
		case MOTO: return "MOTO";
		case AUTOBUS: return "AUTOBUS";		
	}
}

typedef struct Tveicolo{
	char marca[20];
	int cil;
	float kw;
	Ttipo tipo;
	void stampa(){
		printf("%s %d %f %s\n",marca,cil,kw,s_tipo(tipo));
	}
}Tveicolo;


typedef struct TcodaFIFO{
	int n, dim, head, tail;
	Tveicolo *s;
	TcodaFIFO(int x){
		dim = x; 
		n = 0; 
		head = 0; 
		tail = 0;
		s = new Tveicolo[x];
	}
	~TcodaFIFO(){
		delete[] s;
	}
	void stampa(){
		cout<<n<<endl;
		cout<<head<<" "<<tail<<endl;
		if(n==0){
            printf("Coda vuota\n");
            return;
        }
        int i=head;
        do{
        	cout<<i<<endl;
            s[i].stampa();
            i=(i+1)%dim;
        }while(i!=tail);
	}
	bool isfull(){
		return n==dim;
	}
	bool isempty(){
		return n==0;
	}
	Tveicolo get(){
		Tveicolo d=s[head];
		head=(head+1)%dim;
		n--;
		return d;
	}
}TcodaFIFO;

void creaVeicolo(Tveicolo* v){
	switch(rand()%3){
		case 0: v->tipo=AUTO; break;
		case 1: v->tipo=MOTO; break;
		case 2: v->tipo=AUTOBUS; break;
		default: printf("Errore nella selezione del veicolo\n");
	}
	do{
		cout<<"Cil = ";
		cin>>v->cil;
	}while(v->cil<900 || v->cil>4000);
	v->kw=(float)(v->cil)/17;
	cout<<"Marca = ";
	cin>>v->marca;
}

void addVeicolo(TcodaFIFO* c,Tveicolo v){
	if(!c->isfull()){
		c->s[c->tail]=v;
		c->tail=(c->tail+1)%(c->dim);
		c->n=c->n+1;
	}
}

void stampaVeicolo(TcodaFIFO* c){
	c->stampa();
}

void delAuto(TcodaFIFO* c,int cil){
	Tveicolo v;
	FILE* f_txt;
	while(!c->isempty()){
		v=c->get();
		cout<<v.cil<<endl;
		if(v.tipo==AUTO && v.cil<cil){
			f_txt=fopen("auto.txt","a");
			if(f_txt==NULL){
				cout<<"Errore nell'apertura del file"<<endl;
			}
			fprintf(f_txt,"%s CILINDRATA=%d KW=%.2f\n",v.marca,v.cil,v.kw);
			fclose(f_txt);
		}
	}
}




#endif

che cosa vuol dire questa istruzione? specialmente il ~? Nel programma di prog1 non lo trovo!

Quel metodo è il distruttore, che è il metodo che viene richiamato a fine del programma per distruggere eventuali variabili allocate durante l’esecuzione della funzione. In questo caso è necessario inserirlo perché si alloca tramite il costrutture la variabile s tramite una new.
Se non si modifica il distruttore in questo modo, si perde quello spazio di memoria che era stato allocato, senza che si possa recuperare.

Il simbolo di tilde (~) a che serve?

La tilde denota che quello è il distruttore. Il Distruttore è definito come ~[Nome costruttore]{Istruzioni}

1 Mi Piace

Un banale dubbio: poichè s è un puntatore, non dovrebbe essere prima necessario derefenziarlo per poi accedere alla i-esima casella (e usare il metodo stampa)?

int i=head;
do{
cout<<i<<endl;
s[i].stampa();
i=(i+1)%dim;
}while(i!=head);

Altra cosa,mi sa che in questa stampa la condizione sia while(i!=tail) e non (i!head)

Essendo che io accedo ad un array, non serve utilizzare l’operatore di deferenziazione, in quanto, se ti ricordi, l’array viene interpretato come indirizzo.

No! Ricordati che il funzionamento di questa stampa funziona fino a che non arrivo ad avere indice pari alla testa perché se no tralascio l’ultimo elemento dell’array; ricordati che funziona come un array circolare.

Ah grazie!!

Mm però se sono utilizzati solo cinque elementi su un array di dimensione 10 tu scorri elementi non inizializzati, anche se è circolare; ho guardato su un esercizio di laboratorio sulle FIFO con array e la faceva così:

`	void stampa(){
	if(n==0) return;
	int i=head;
	do{
		cout << s[i] << " "; 
		i = (++i)%dim;
	}while(i!=tail);
}

`

You are right, non ci avevo pensato XD