Programma in C problemi con le struct

di il
8 risposte

Programma in C problemi con le struct

Buonasera sono nuovo di questo gruppo ho letto il regolamento...
devo fare una funzione per calcolare il voto più comune ricevuto da tutti gli studenti in tutte le materie.
il professore già mi da questa funzione ... ma non riesco a farlo...
int voti_comune(laureando *elenco, int dim_elenco);
void voti_comune(laureando *elenco, int dim_elenco)
{
	int i=0;
	int j=0;
	int z=0;
	int *vett;//vettore dove vado a mettere i valori dei voti presi una sola volta//
	int k=0;
	
	vett = (int*)malloc(sizeof(int)*dim_elenco);
	
	for(i=0;i<dim_elenco;i++)
	{
		for(j=0;j<num_materie;j++)
		{	
			do
			{
				if(*elenco[i].esami[j].voto==*elenco[i].esami[j+1].voto)
					vett[k++] = *elenco[i].esami[j+1].voto;
				
				else
					vett[k++] = *elenco[i].esami[j].voto;
					vett[k++] = *elenco[i].esami[j+1].voto;
			}while(k<dim_elenco);
		}
	}
	
	for(k=0;k<num_materie;k++)
	{
		printf("%d\n",vett[k]);
	}
	

}

sono arrivato qua a sviluppare... il mio intento era creare un altro vettore da cui fare la scansione con l'altro vettore in modo da avere la molteplicità e dopo far stampare il numero con la sua molteplicità... questa è una mia idea... ma se qualcuno può darmi qualche spunto sul codice è ben accetto ... grazie!!!

8 Risposte

  • Re: Programma in C problemi con le struct

    Non riesco a capire i termini della questione. Potresti cercare d'essere più esplicito?
    A spanne, direi che il quesito richiede di verificare quante volte ricorre ogni voto, quindi di riportare qual è il voto che ricorre più volte per ogni esame. Se così fosse, vett potrebbe essere costituito da una quantità fissa di elementi, pari al valore dei voti (tipo: voti da 0 a 10, solo interi -- 11 valori in tutto); ogni volta che incontrassi un certo voto, potresti incrementare l'elemento nella posizione corrispondente.
    Mi viene un altro dubbio: con "per ogni esame" intendi che ogni tipo di esame dovrà avere il suo rilevamento di voto più comune o che basterà un unico rilevamento che accomuni tutti gli esami, indipendentemente dal loro tipo?
    Ah, potrebbe anche essere utile vedere come son fatte le strutture.
  • Re: Programma in C problemi con le struct

    AldoBaldo ha scritto:


    Non riesco a capire i termini della questione. Potresti cercare d'essere più esplicito?
    A spanne, direi che il quesito richiede di verificare quante volte ricorre ogni voto, quindi di riportare qual è il voto che ricorre più volte per ogni esame. Se così fosse, vett potrebbe essere costituito da una quantità fissa di elementi, pari al valore dei voti (tipo: voti da 0 a 10, solo interi -- 11 valori in tutto); ogni volta che incontrassi un certo voto, potresti incrementare l'elemento nella posizione corrispondente.
    Mi viene un altro dubbio: con "per ogni esame" intendi che ogni tipo di esame dovrà avere il suo rilevamento di voto più comune o che basterà un unico rilevamento che accomuni tutti gli esami, indipendentemente dal loro tipo?
    Ah, potrebbe anche essere utile vedere come son fatte le strutture.
    Ciao aldo in pratica dobbiamo riferirci a tutti i voti inseriti a prescindere dalla materia e da li calcolare i voti più comuni.
    typedef struct esami {
    	char materia[20];
    	int voto; 
    	int cfu;
    }esame;
    
    typedef struct laur {
    	char nome[20];
    	char cognome[20];
    	char matricola[9];
    	esame esami[num_materie];
    	
    }laureando;
    queste sono le struct con cui io lavoro... potresti dirmi un esempio di codice per cercare solo il voto che si ripete più volte e in caso stamparlo? grazie.
  • Re: Programma in C problemi con le struct

    Sì, ora mi è più chiaro. Qual è la gamma dei voti possibili? Da che minimo a che massimo? (vedo che sono valori interi, quindi il metodo che ipotizzavo pare essere praticabile, a meno che la gamma sia assurda, tipo da 0 a 1000000000 ).
  • Re: Programma in C problemi con le struct

    simonito ha scritto:


    [potresti dirmi un esempio di codice per cercare solo il voto che si ripete più volte e in caso stamparlo? grazie.
    Ma potresti anche fare uno sforzo e proporre tu qualcosa da correggere prima che AldoBaldo ti dia una soluzione pronta ...
  • Re: Programma in C problemi con le struct

    Di base, l'idea sarebbe di definire due costanti che delimitino la gamma dei voti possibili, ad esempio...
    #define VOTO_MIN  0
    #define VOTO_MAX 10
    A questo punto, si può definire un vettore di interi in grado di contenere l'intera gamma dei voti, minimo e massimo compresi. Avendo dimensioni fisse, non serve scomodare l'allocazione dinamica della memoria dinamica. Il vettore viene inizializzato in modo da contenere tutti zeri.
    int eQV[VOTO_MAX-VOTO_MIN+1] = {0};
    (eQV = "elenco quantità voti")

    Se scorri uno per uno l'elenco dei laureandi e, in un ciclo annidato, l'elenco degli esami sostenui da ogni candidato, puoi incrementare l'elemento di eQV che corrisponde al voto assegnato al laureando. Ad esempio, se il primo laureando ha preso un 6, incrementi eQV[6]; se ha preso un 8, incrementi eQV[8]. E' facile cogliere che alla fine dei cicli, eQV[0] conterrà la quantità degli zeri assegnati, eQV[1] conterrà la quantità degli uno, eQV[2] la quantità dei due... e, da ultimo, eQV[10] conterrà la quantità dei dieci assegnati.

    Trovare il voto assegnato con maggiore frequenza significa semplicemente trovare il valore massimo nell'ambito del vettore eQV.

    Non ti mostro il codice completo perché non voglio suscitare vespai, però è veramente semplice.

    P.S. Se dovesse venir fuori che devi "scorporare" la frequenza di assegnazione dei voti in base alla materia, basterebbe definire una matrice bidimensionale anziché un vettore.
  • Re: Programma in C problemi con le struct

    Sei ancora molto lontano, ad esempio num_materie da dove salta fuori?

    in qualità di principiante ti consiglio, invece di andare "a capocchia" (tipica modalità dilettantesca), di PENSARE.
    PENSA, e SCRIVI le "cose" che ti servono (prima passata: top-down).
    Quando hai individuato "cosa" ti necessita, inizia a implementarle, una per una (bottom-up).
    A quel punto metti tutto insieme, una sorta di "Lego", ed avrai il tuo programma.

    Procedere "a tentoni" è il modo migliore per imparare pessime abitudini, che rischi poi di portarti dietro "per sempre"
  • Re: Programma in C problemi con le struct

    Beh credo di averci ragionato pure troppo... è due giorni che sto fermo qua... ora ho aggiustato un po vi posto il codice che teoricamente dovrebbe riempire il vettore temp con i voti senza duplicati ma quando faccio l'esecuzione mi stampa un voto e un numero diverso dal secondo voto inserito. num_materie = 2 è stato definito a inizio programma.
    void voti_comune(laureando *elenco, int dim_elenco) 
    {
    	
    	int temp[num_materie];
    	int i = 0;
    	int j = 1;
    
    	/*Il primo numero di array è per forza unico*/
    	temp[0] = elenco[0].esami[0].voto;
    	
    	/*Se non sono presenti, aggiungo gli altri numeri di array a temp*/
    	for(i = 0; i <num_materie; i++) 
    		{
    			for(j=1;j<num_materie;j++)
    			{
    				if(elenco[i].esami[j].voto != temp[j])
    				   	temp[j] = elenco[i].esami[j].voto ;
    				   	
    	        }
    	   		
    		}	
    
    	/*Stampo i numeri rimasti*/
    	for(i = 0; i < num_materie; i++)
    	   	printf("%d\n", temp[i]);
    	
    
    }
  • Re: Programma in C problemi con le struct

    E' bello scoprire d'esser stati davvero utili!
Devi accedere o registrarti per scrivere nel forum
8 risposte