Consigli su esercizio su liste (C++)

di il
10 risposte

Consigli su esercizio su liste (C++)

Buon giorno, sono uno studente e mi piacerebbe condividere con voi un esercizio di programmazione di c++, per accogliere consigli da programmatori più esperti.
Vi riporto di seguito un esercizio preso da un tema di esame e come l'ho svolto. Grazie in anticipo
Si consideri un programma per gestire la raccolta delle informazioni relative ai biglietti venduti
da un cinema, organizzate in una lista dinamica. Un biglietto è definito da un tipo strutturato
denominato BIGLIETTO, il quale contiene un numero (stringa di 10 caratteri) la data di
vendita e la data dello spettacolo (stringhe nel formato internazionale aaaa-mm-gg ), il giorno
della settimana (intero da 1 a 7, dove 7 corrisponde alla domenica), il tipo di poltrona (carattere
singolo con tre valori, cioè A,B e C) e il prezzo (numero in virgola mobile).
• Si definisca quindi la struttura dati per una lista dinamica dove il campo informativo del nodo è
a sua volta basato sul tipo BIGLIETTO.
Si scriva la funzione denominata
BigliTIpologiaRedditizia che riceve come parametri la lista dei biglietti, un carattere
denominato TipologiaVoluta e un numero in virgola mobile chiamato Soglia. La
funzione calcola la media dei prezzi dei biglietti di tipologia TipologiaVoluta e nel caso
in cui questa media sia maggiore del valore del parametro Soglia restituisce un vettore
(indirizzo del primo elemento) allocato dinamicamente basato sul tipo BIGLIETTO che
contiene i dati dei biglietti con tipologia TipologiaVoluta, ordinato in modo crescente
rispetto al codice del biglietto; in tutti gli altri casi, la funzione restituisce NULL.


#include <cstring>

typedef struct BIGLIETTO {
	char numero[11];
	char Data_vendita[11];
	int giorno; 
	char poltrona;
	float prezzo;
};

typedef struct nodo {
	nodo * next;
	BIGLIETTO info;
};




nodo* BigliTipologiaRedditizia(nodo*listabiglietti, char tipologiaVoluta, float soglia){

nodo* risultato1;
nodo* risultato2;
nodo * aux= NULL;
nodo* Nuovalista;
int count = 0; 
float prezzo = 0;
nodo* Nuovalista2;
nodo* aux2=NULL;
float prezzoUltimobiglietto = 0;

do{
	risultato1= Cercabiglietto(listabiglietti, tipologiaVoluta);
	prezzo= prezzo+(risultato1->info.prezzo);
	Nuovalista= new nodo;
	Nuovalista -> info = risultato1->info;
	Nuovalista->next = aux;
	aux = Nuovalista;
	count ++;
	
	
}while(risultato1!=NULL);

media = prezzo/count;
prezzoUltimobiglietto = float prezzopiualto (Nuovalista);
if(media<=soglia) return NULL;
else {
	for (int i=0; i<count; i++){
		risultato2= TrovaBigliettomenocostoso(Nuovalista, prezzoUltimobiglietto);
		Nuovalista2= new nodo;
		Nuovalista2 -> info = risultato2 -> info;
		Nuovalista2 -> next = aux2; 
		aux2 = Nuovalista2;
		prezzoUltimobiglietto = risultato2->info.prezzo;
	}
}
return Nuovalista2;

}





nodo* Cercabiglietto(nodo* listabiglietti, chat tipo){
	nodo* p;
	string tb = (string) tipo;
	for(p=listabiglietti; p!= NULL; p = p->next){
		if(strcmp(p->info.poltrona, tb) ==0) return p;
	}
	return NULL;
	}
	
	
	nodo* TrovaBigliettomenocostoso (nodo* Nuovalista, float prezzo){
		nodo* p;
		float prezzopiugrande = 0; 
		for(p=Nuovalista; p!= NULL; p=p->next){
			if(p->info.prezzo <= prezzo && p->info.prezzo >= prezzopiugrande) prezzopiugrande = p->info.prezzo;
			return p;
		}
         return NULL;
	}
	
	
	
	
	float prezzopiualto (nodo* Nuovalista){
		nodo* p;
		float prezzo=0;
		
		for(p=Nuovalista; p!=NULL; p=p->next){
			if(p->info.prezzo >= prezzo) prezzo= p-> info.prezzo;
			return prezzo;
		}
		
	}

10 Risposte

  • Re: Consigli su esercizio su liste (C++)

    Non compila. Variabile media non dichiarata, "chat" al posto di "char"...
    insomma, almeno la sistassi dovrebbe essere messa a posto prima di chiedere una mano, o no?
  • Re: Consigli su esercizio su liste (C++)

    Ciao, ovvio che non compili perché manca tra l'altro il main... Ma l'esercizio non lo richiede. Non deve compilare, dovevo solo scrivere quella funzione
  • Re: Consigli su esercizio su liste (C++)

    E come la provi la funzione se non compila???
  • Re: Consigli su esercizio su liste (C++)

    g.lombardo4 ha scritto:


    Ciao, ovvio che non compili perché manca tra l'altro il main...
    Gli errori segnalati non dipendono dall'assenza del main()
  • Re: Consigli su esercizio su liste (C++)

    Weierstrass ho letto adesso bene il tuo messaggio di prima perché prima ero fuori. Comunque a parte quegli errorini, la forma secondo te è buona o ti sembra scritto in modo troppo elementare? Come lo miglioreresti?
  • Re: Consigli su esercizio su liste (C++)

    Il consiglio te l'ha dato oregon. Come pensi di migliorare senza compilare, testare e magari anche debuggare? La forma migliorerà di conseguenza col tempo
  • Re: Consigli su esercizio su liste (C++)

    Mettiamola giu' in modo CATTIVO

    NON SONO ""errorini"" SONO ERRORI CONCETTUALI

    F O N D A M E N T A L I

    E come dire: vado a fare immersioni ma ho la bombola vuota.
    Per saltare in acqua mi getto con la schiena.
    Secondo voi sto facendo l'immersione nel modo giusto?

    E LA BOMBOLA SENZA ARIA DOVE LA METTI?

    Ma che vuoi che sia! E' un ""errorino""
  • Re: Consigli su esercizio su liste (C++)

    Compilare e testare è fondamentale, perché i bug non escono se non li cerchi. Se il professore decidesse di farlo al posto tuo dopo averlo consegnato e non funzionasse, vedresti tanta fatica sprecata. Adesso, anche se compila, sei sicuro che funzioni a dovere?

    Non è un problema se appare troppo elementare, l'importante è che non sia pesante dal punto di vista algoritmico. Poi si migliora col tempo e vedendo codice altrui, ma se non sappiamo ancora se funziona, come facciamo a dire cosa va tolto e cosa no?
    Comunque così a occhio non sembra male.
    L'unica cosa che mi viene da suggerirti è togliere quel "typedef" per dichiarare la struct, che in C++ non serve a meno che tu non voglia dare un secondo nome a un tipo. Se invece stai compilando in C lascialo.
  • Re: Consigli su esercizio su liste (C++)

    La mente umana è incline ad aggiustare e completare le informazioni, se non sono complete o rigorose.
    Un compilatore no.
    Dopo che hai studiato e assimilato dei concetti è fondamentale scontrasi con la "testardaggine" del compilatore, in modo da adattare il tuo atteggiamento naturale e mentale, alla rigorosità della programmazione.
    Entrare in debug, verificare il flusso del programma e i valori delle variabili che cambiano, aiutano molto a percepire il fatto che un programma esegue alla lettera ogni istruzione immessa, fregandonese delle intenzioni non scritte del programmatore.
  • Re: Consigli su esercizio su liste (C++)

    oregon ha scritto:


    E come la provi la funzione se non compila???


    Non voglio mancare di rispetto a nessuno ma , ma la risposta di oregon all'assurdo post
    "...ovvio che non compili ..... l'esercizio non lo richiede. Non deve compilare, dovevo solo scrivere quella funzione"
    mi fa' ridere

    se non sei obbligato a compilare, mi viene da pensare che forse, ma forse, il prof. vuole che scrivi del pseudo-codice
    cioè del codice che descriva i passi logici che deve fare il tuo programma.

    comunque se compili, lo lanci , e fai del debbug inizierai a capire cosa è che non funziona e cosa c'è da migliorare.
    non ti preoccupare il compilatore non morde

    Come diceva il mio prof di Elettronica :
    1 prima ci devi sbattere la testa
    2 srivere su carta usando la matita cosa è che non và
    3 e dopo, ma solo dopo fare delle domande mirate sui vari problemi.

    al di là di come è scritto il codice, o degli errori di sintassi, o bugs, è il metodo su come si approccia il problema fa' la differenza.

    per la cronaca nella struttura struct BIGLIETTO non è presente il campo DataDelloSpettacolo.
Devi accedere o registrarti per scrivere nel forum
10 risposte