Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso
Testo dellesercizio Stampare su video una figura come la seguente, inserendo in input da tastiera laltezza (n. righe). Tale figura devessere centrata rispetto allo schermo. ***** **** *** ** * ** *** **** ***** (nellesempio: altezza = 9)
Risoluzione Il problema della centratura è secondario. Il problema principale è la creazione della figura. – Studio del problema nel suo dominio specifico – La figura ricorda la funzione modulo y = |x|
***** **** *** ** * ** *** **** ***** **** *** ** * ** *** **** ***** f(x) = |x| La corrispondenza con f(x) sarebbe perfetta, non considerando gli * sullasse. 90° x y 0
Spiegazione del metodo usato Esempio altezza = 9 asterischi = altezza / 2 Ad ogni riga mi chiedo: – Ho stampato altezza righe? stampo abs(asterischi) *+ * – lasterisco in più serve a disegnare gli * sullasse decremento asterischi
Spiegazione del metodo usato In questo modo, quando asterischi = 0 – Stampo un solo asterisco – Decremento asterischi ( = -1) – Al passo successivo valuto asterischi in valore assoluto e quindi stampo 1 + |-1| = 2 asterischi – Decremento asterischi ( = - 2) – e così via…
Vantaggi Evito di valutare con costrutti if se incrementare o decrementare la variabile asterischi – Minor tempo nellesecuzione Adopero un algoritmo che si fonda su basi geometrico - matematiche – Procedimento più sistematico
Problema della centratura Dopo aver ottenuto la figura come richiesto dallesercizio, occorre centrarla rispetto allo schermo. Sappiamo che il numero di colonne della schermata relativa al prompt è pari a 80. Quindi: – altezza 0) altezze maggiori sfaserebbero la figura nella schermata – altezza numero dispari (specifica dellesercizio)
Problema della centratura Concentriamoci sulla prima riga: se ho a disposizione 80 caratteri e devo stampare 5 asterischi, devo avere: 37 + ***** (+ 37 ) Generalizzando, per ogni riga: 1.Stampo n spazi bianchi n = (colonne – asterischi – 1) / 2. 2.Stampo gli * desiderati. 3.Vado a capo (evitando di stampare altri n spazi).
Esecuzione altezza = 9r = riga stampatana = numero asterischi Allinizio di ogni riga vi sono (80 – 4 – 1) / 2 = 37 spazi bianchi **** r = 1na = 4 r = 2na = 3 *** r = 3na = 2 ** * * * * * * * * * * * ** *** **** r = 4na = 1 r = 5na = 0 r = 6na = -1 r = 7na = -2 r = 8na = -3 r = 9na = -4
disegna #include #define COLONNE 80 void disegna(int altezza) { int spazi, asterischi, i = 0, j = 0; asterischi = (altezza / 2); spazi = (COLONNE – asterischi - 1) / 2; while (i<altezza) { for (j=0; j<spazi; j++) printf(" "); for (j=0; j<abs(asterischi) + 1; j++) printf("*"); i++; asterischi--; printf("\n"); } return; }
main main() { int n; printf("Inserisci n dispari (1 -> 79): "); scanf("%d", &n); while ((n%2 == 0) || (n COLONNE - 1)) { printf("\nNon hai inserito un numero dispari o non è compreso fra 1 e 79!\n"); printf("Inserisci n dispari (1 -> 79): "); scanf("%d", &n); } disegna(n); system("PAUSE"); return 0; }