Programmazione ed
Esercitazioni di Programmazione


Esame pratico di programmazione del 10/07/2008 - Soluzioni

Le soluzioni qui proposte sono solo indicative, vi sono molti modi per poter svolgere lo stesso esercizio!

Sono proposte alcune soluzioni alle tipologie di esercizi assegnati nell'esame pratico del corso di programmazione del 10/07/2008.

Esercizio 1

/* int mese_piu_piovoso(Pioggia_Anno pioggia);
La funzione mese_piu_piovoso restituisce l'intero corrispondente al mese in cui è caduta più pioggia, rispetto alla tabella bidimensionale di valori passata (se restituisce 2 vuol dire che guardando alla tabella passata, marzo è stato il mese in cui sono caduti più centimetri di pioggia). */

int mese_piu_piovoso(Pioggia_Anno pioggia) {
	int maxM;
	double maxSum = 0.0;
	double sum;	
	int m;
	int d;
	
	for(m = 0; m < 12; m++) {
		sum = 0.0;
		for(d = 0; d < 31; d++)
			sum += pioggia[d][m];
		if(sum > maxSum) {
			maxSum = sum;
			maxM = m;
		}
	}
	return maxM;
}


Esercizio 2

/* double min_diff(Pioggia_Anno pioggia);
La funzione min_diff identifica, nella tabella passata come parametro attuale, i due giorni in cui la quantità di pioggia caduta è diversa da 0.0 ed ha i valori più vicini, e restituisce la differenza di tali valori. */

double min_diff(Pioggia_Anno pioggia) {
	int m;
	int d;
	double minDiff = -1.0;
	int i;
	int j;
	
	for(m = 0; m < 12; m++) {
		for(d = 0; d < 31; d++) {
			if(pioggia[d][m] > 0.0) {
				/* controllo i giorni successivi dello stesso mese */
				for(i = d + 1; i < 31; i++)
					if(minDiff < 0 || fabs(pioggia[i][m] - pioggia[d][m]) < minDiff)
						minDiff = fabs(pioggia[i][m] - pioggia[d][m]);
				/* controllo il d-esimo giorno  dei mesi successivi */
				for(i = m + 1; i < 12; i++)
					if(fabs(pioggia[d][i] - pioggia[d][m]) < minDiff)
						minDiff = fabs(pioggia[d][i] - pioggia[d][m]);
				/* Controllo i giorni successivi e i mesi successivi */
				for(i = d + 1; i < 31; i++) {
					for(j = m + 1; j < 12; j++) {
						if(fabs(pioggia[i][j] - pioggia[d][m]) < minDiff)
							minDiff = fabs(pioggia[i][j] - pioggia[d][m]);
					}
				}				
			}
		}
	}
	return minDiff;
}


Esercizio 3

/* Pioggia_Anno *crea(double k);
La procedura crea deve restituire l'indirizzo di una nuova tabella di tipo Pioggia_Anno, allocata nello heap, ed inizializzata nel modo seguente:
- ad ogni cella significativa in un anno non bisestile deve essere assegnato il valore k
- alle celle non significative deve essere assegnato invece il valore 0.0
Ad esempio: se a è la tabella creata, alla cella a[12][4], che corrisponde al 13 maggio, sarà assegnato il valore k, mentre alla cella a[30][10], che corrisponderebbe al 31 novembre, e che quindi non è una cella significativa, sarà assegnato il valore 0.0. */

Pioggia_Anno *crea(double k) {
	Pioggia_Anno *pioggia = (Pioggia_Anno *)malloc(sizeof(Pioggia_Anno));
	int m;
	int d;
	
	for(m = 0; m < 12; m++) {
		for(d = 0; d < 31; d++) {
			switch(m) {
				case 1:
					if(d < 28) (*pioggia)[d][m] = k;
					else (*pioggia)[d][m] = 0.0;
					break;
				case 3:
				case 5:
				case 8:
				case 10:
					if(d < 30) (*pioggia)[d][m] = k;
					else (*pioggia)[d][m] = 0.0;
					break;
				default:
					(*pioggia)[d][m] = k;
					break;
			}
		}
	}
	return pioggia;
}