Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso Testo dell’esercizio • Stampare su video una figura come la seguente, inserendo in input da tastiera l’altezza (n. righe). Tale figura dev’essere centrata rispetto allo schermo. ***** **** *** ** * ** *** **** ***** (nell’esempio: 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| y 90° ***** **** *** ** * ** *** **** ***** ***** **** *** ** * ** *** **** ***** 0 x La corrispondenza con f(x) sarebbe perfetta, non considerando gli “*” sull’asse. Spiegazione del metodo usato Esempio • altezza = 9 • asterischi = altezza / 2 Ad ogni riga mi chiedo: – Ho stampato altezza righe? • stampo abs(asterischi) “*”+ “*” – l’asterisco in più serve a disegnare gli “*” sull’asse • 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 nell’esecuzione • Adopero un algoritmo che si fonda su basi geometrico - matematiche – Procedimento più sistematico Problema della centratura • Dopo aver ottenuto la figura come richiesto dall’esercizio, occorre centrarla rispetto allo schermo. • Sappiamo che il numero di colonne della schermata relativa al prompt è pari a 80. • Quindi: – altezza < 80 (e, ovviamente, > 0) • altezze maggiori “sfaserebbero” la figura nella schermata – altezza numero dispari (specifica dell’esercizio) 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 r = 1 na = 4 r = 2 na = 3 r = 3 na = 2 r = 4 na = 1 r = 5 na = 0 r = 6 na = -1 r = 7 na = -2 r = 8 na = -3 r = 9 na = -4 altezza = 9 r = riga stampata na = numero asterischi All’inizio di ogni riga vi sono (80 – 4 – 1) / 2 = 37 spazi bianchi disegna #include <stdio.h> #include <stdlib.h> #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 < 1) || (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; }