Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.
-
Upload
giacinta-romani -
Category
Documents
-
view
215 -
download
0
Transcript of Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.
Esercitazione 6 – Esercizio 1
Autore: Riccardo BiancoI Corso
Testo dell’esercizio
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, nonconsiderando gli “*” sull’asse.
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) “*”+ “*”
– 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
altezza = 9 r = riga stampata na = numero asterischiAll’inizio di ogni riga vi sono (80 – 4 – 1) / 2 = 37 spazi bianchi
**** 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
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;
}