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;
}
Scarica

slides_3