Esercizio in C, alcuni dubbi!

di il
8 risposte

Esercizio in C, alcuni dubbi!

Questa e' la traccia dell'esercizio:

Un docente universitario intende tenere traccia dei voti d’esame ottenuti dagli studenti nel suo insegnamento. In particolare, egli tiene lo stesso insegnamento nei corsi di laurea in Informatica delle sedi di Torino e Milano. Per tenere traccia delle informazioni è necessario memorizzare la matricola dello studente, il suo cognome e nome, il corso di laurea a cui appartiene, il voto conseguito e l’anno in cui è stato sostenuto l’esame.
Progetta una soluzione per tenere traccia delle informazioni accademiche considerando che:
• il docente deve poter caricare le informazioni degli esami sostenuti;
• per ogni corso di laurea, indipendentemente dall’anno, deve essere possibile visualizzare la media dei voti;
• per ogni anno, indipendentemente dal corso di laurea, deve essere possibile visualizzare il numero di studenti che hanno conseguito 30;
• il docente deve poter visualizzare l’anno in cui è stato conseguito il più alto numero di 30.

Non riesco a capire come fare per visualizzare per ogni anno il numero di studenti che hanno preso 30 e poi l'anno in cui ci sono stati piu' 30! Mi sapreste dare una mano gentilmente?

Per il il punto 1 (caricare le informazioni degli esami) e per il punto 2 (la media dei voti) l'ho ragionata in questo modo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define LEN 1000

/* STRUTTURA DATI PER IL SINGOLO STUDENTE */
typedef struct {
	int MATR;
	char COGN [MAX];
	char NOME [MAX];
	int VOTO;
	int ANNO;
}STUDENTE;

/* STRUTTURA DATI PER L'ELENCO DEGLI STUDENTI */
typedef struct {
	STUDENTE STUD [LEN];
	int NUM_STUD;
}ELENCO;

/* PROTOTIPI DI FUNZIONE */
ELENCO INSERIMENTO_DATI ();
void OPERAZIONI_E_STAMPA (ELENCO EL, int SOMMA, int MEDIA);

/* GESTIONE ESAMI - PROGRAMMA PRINCIPAELE */
int main ()
{
	ELENCO elenco;
	int SCELTA, somma, media;
		printf ("\n[1] - CORSO DI INFORMATICA: SEDE TORINO.");
			printf ("\n[2] - CORSO DI INFORMATICA: SEDE MILANO.");
			printf ("\nScegli il corso (digitare 1 o 2): ");
			scanf ("%d", &SCELTA);
			while (SCELTA <1 && SCELTA>2) {
				printf ("\nScelta non valida! Riprova..");
				printf ("\nScegli il corso: ");
				scanf ("%d", &SCELTA);
			}


				switch (SCELTA)
				{	case 1: system ("cls");
				        printf ("*** CORSO DI INFORMATICA - SEDE DI TORINO***\n\n");
				        elenco = INSERIMENTO_DATI ();
				        printf("\n\n");
				        OPERAZIONI_E_STAMPA (elenco, somma, media);
				        system ("pause");
					    break;

				case 2: system ("cls");
		                printf ("*** CORSO DI INFORMATICA - SEDE DI MILANO***\n\n");
		                elenco = INSERIMENTO_DATI ();
		                printf("\n\n");
				        OPERAZIONI_E_STAMPA (elenco, somma, media);
		     	        system ("pause");
		                break;
				default: printf ("\n");
				}

	system ("pause");
	return 0;
}


/* DICHIARAZIONE DI FUNZIONI */


/* INSERIMENTO DATI TABELLA */
ELENCO INSERIMENTO_DATI () {

	ELENCO EL;
	int I;

	printf ("\nInserisci il numero di studenti: ");
	scanf ("%d", &EL.NUM_STUD);
	while (EL.NUM_STUD<=0) {
		printf ("\nHai inserito un numero non valido!");
		printf ("\nInserisci il numero di studenti: ");
		scanf ("%d", &EL.NUM_STUD);
	}
	    printf ("\n\n");
		printf ("*******************************************************************************\n");
		printf ("***                   INSERIRE INFORMAZIONI STUDENTE                        ***\n");
		printf ("*******************************************************************************\n");

	for (I=0; I<EL.NUM_STUD;I++) {

	printf ("\n\nInserire informazioni studente n.%d", I+1);
	printf ("\n\nInserire numero di matricola: ");
	scanf ("%d", &EL.STUD[I].MATR);
	while (EL.STUD[I].MATR <= 0) {
		printf ("\nHai inserito un numero non valido!");
		printf ("\nInserire numero di matricola: ");
		scanf ("%d", &EL.STUD[I].MATR);
	}
	printf ("\nInserire il cognome: ");
	scanf ("%s", EL.STUD[I].COGN);
	printf ("\nInserire il nome: ");
	scanf ("%s", EL.STUD[I].NOME);
	printf ("\nInserire il voto dell'esame: ");
	scanf ("%d", &EL.STUD[I].VOTO);
	while (EL.STUD[I].VOTO <0) {
		printf ("\nHai inserito un voto non valido!");
		printf ("\nInserire il voto: ");
		scanf ("%d", &EL.STUD[I].VOTO);
	}
	printf ("\nInserire l'anno dell'esame: ");
	scanf ("%d", &EL.STUD[I].ANNO);
	while (EL.STUD[I].ANNO <0) {
		printf ("\nHai inserito un anno non valido!");
		printf ("\nInserire l'anno dell'esame: ");
		scanf ("%d", &EL.STUD[I].ANNO);
	}
	}
 return EL;
}



/* STAMPA TABELLA E VARIE OPERAZIONI */
void OPERAZIONI_E_STAMPA (ELENCO EL, int SOMMA, int MEDIA) {
	int I;
	I=0;
	SOMMA=0;

	do {
		SOMMA = SOMMA + EL.STUD[I].VOTO;
		I++;
	}
	while (I<EL.NUM_STUD);
		MEDIA = SOMMA / I;


		/* TABELLA AGGIORNATA */
		for (I=0; I<EL.NUM_STUD;I++) {
		printf ("\nNumero di matricola: %d", EL.STUD[I].MATR);
		printf ("\nCognome: %s", EL.STUD[I].COGN);
		printf ("\nNome: %s", EL.STUD[I].NOME);
		printf ("\nVoto: %d", EL.STUD[I].VOTO);
		printf ("\nAnno: %d", EL.STUD[I].ANNO);
		printf ("\n\n");
		}
		printf ("\nLa media dei voti e': %d\n\n", MEDIA);


}

8 Risposte

  • Re: Esercizio in C, alcuni dubbi!

    RISPONDETE PLEASE!
  • Re: Esercizio in C, alcuni dubbi!

    Intanto stai calmo e abbassa la voce.
    Non riesco a capire come fare per visualizzare per ogni anno il numero di studenti che hanno preso 30 e poi l'anno in cui ci sono stati piu' 30! Mi sapreste dare una mano gentilmente?
    Parti dal primo problema, calcolare il numero di studenti che hanno preso 30 per ciascun anno.
    Come faresti a mano? Prendo l'anno minimo e l'anno massimo e faccio una tabella (un array, magari con dimensione max 50... 50 anni di insegnamento sono tanti...) con i conteggi...
  • Re: Esercizio in C, alcuni dubbi!

    candaluar ha scritto:


    Intanto stai calmo e abbassa la voce.
    Non riesco a capire come fare per visualizzare per ogni anno il numero di studenti che hanno preso 30 e poi l'anno in cui ci sono stati piu' 30! Mi sapreste dare una mano gentilmente?
    Parti dal primo problema, calcolare il numero di studenti che hanno preso 30 per ciascun anno.
    Come faresti a mano? Prendo l'anno minimo e l'anno massimo e faccio una tabella (un array, magari con dimensione max 50... 50 anni di insegnamento sono tanti...) con i conteggi...

    Sono riuscito a calcolare quante persone hanno preso 30, ma non riesco a inserire l'anno..
    int NUM_TRENTA=0;
    for (I=0; I<EL.NUM_STUD; I++) {
    if (EL.STUD[I].VOTO==30)
    {
    	NUM_TRENTA++;
    
    }
    }
    printf ("\nNumero di persone che hanno preso 30: %d.", NUM_TRENTA);
    printf ("\n\n\n");
  • Re: Esercizio in C, alcuni dubbi!

    Hai sviluppato un programma complesso, con strutture, array e chi più ne ha più ne metta.
    Cosa ti costa fare un array temporaneo di interi che parte con indice 0=ANNO MINIMO e alimenti questo array?
  • Re: Esercizio in C, alcuni dubbi!

    candaluar ha scritto:


    Hai sviluppato un programma complesso, con strutture, array e chi più ne ha più ne metta.
    Cosa ti costa fare un array temporaneo di interi che parte con indice 0=ANNO MINIMO e alimenti questo array?
    Ho provato in questo modo, ma non va..
    int ANNO, ANNO_MIN=2000, ANNO_MAX=2014;
    		int NUM_PERS_TRENTA;
    		for (ANNO=ANNO_MIN; ANNO<ANNO_MAX; ANNO++) {
    		NUM_PERS_TRENTA=0;
    		for (I=0; I<EL.NUM_STUD; I++)  {
    		if (EL.STUD[I].ANNO==ANNO && EL.STUD[I].VOTO==30) {
    			NUM_PERS_TRENTA++ ;
    		}
    		}
    		printf ("\nNumero di persone che hanno preso 30 nell'anno%d: %d.", ANNO, NUM_PERS_TRENTA);
    		}
  • Re: Esercizio in C, alcuni dubbi!

    E dov'è l'array??? Implementa questo algoritmo:
    1-determina anno minimo e anno massimo
    2-determina n numero anni di insegnamento come anno massimo - anno minimo + 1
    3- alloca un array di n interi
    4- inizializza tutto l'array a 0
    5- cicla sui dati: se il voto è 30 calcola indice come anno-anno minimo e incrementa array[indice]
    6- trova l'indice con valore maggiore
    7- stampa anno minimo + indice
  • Re: Esercizio in C, alcuni dubbi!

    candaluar ha scritto:


    E dov'è l'array??? Implementa questo algoritmo:
    1-determina anno minimo e anno massimo
    2-determina n numero anni di insegnamento come anno massimo - anno minimo + 1
    3- alloca un array di n interi
    4- inizializza tutto l'array a 0
    5- cicla sui dati: se il voto è 30 calcola indice come anno-anno minimo e incrementa array[indice]
    6- trova l'indice con valore maggiore
    7- stampa anno minimo + indice

    Di "allocare" un array col docente non ne abbiamo MAI parlato.. :/
    boh non sto capendo nulla!
    int ANNO [] = {2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014};
    	int ANNO_MIN = 2000;
    	int ANNO_MAX= 2014;
    	int N = ANNO_MAX - ANNO_MIN + 1;
  • Re: Esercizio in C, alcuni dubbi!

    Se non sai come "allocare" allora sostituisci "allocare" con predisponi un array di interi di max 100 elementi.
    Comunque, l'algoritmo te l'ho scritto, prova ad eseguirlo a mente e se c'è qualche passaggio che non capisci chiedi, non scrivere codice se non hai capito l'algoritmo.
Devi accedere o registrarti per scrivere nel forum
8 risposte