Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

12
Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso

Transcript of Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

Page 1: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

Esercitazione 6 – Esercizio 1

Autore: Riccardo BiancoI Corso

Page 2: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

Testo dell’esercizio

Page 3: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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|

Page 4: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

*****

****

***

*** *****

****

*****

*****************************

f(x) = |x|

La corrispondenza con f(x) sarebbe perfetta, nonconsiderando gli “*” sull’asse.

90°

x

y

0

Page 5: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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

Page 6: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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…

Page 7: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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

Page 8: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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)

Page 9: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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).

Page 10: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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

Page 11: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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;

}

Page 12: Esercitazione 6 – Esercizio 1 Autore: Riccardo Bianco I Corso.

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;

}