03. Cicli annidati: screensaver
Traccia:
Implementare un programma che richiede all'utente di inserire un numero naturale minore di 40 e realizza una sorta di screensaver che riproduce ciclicamente all'infinito l'immagine riportata in basso.
Il numero inserito dall'utente corrisponde al numero di caratteri che devono essere visualizzati sul rigo più lungo.
Strategia:
La variabilità dell'immagine e' determinata dagli spazi bianchi iniziali (space) presenti su ogni riga.
Il numero di caratteri ":" (colon) è costante su ogni riga e corrisponde esattamente al numero inserito dall'utente.
Nella costruzione dell'immagine è possibile distinguere una fase crescente, durante la quale il numero di space nella riga corrente aumenta rispetto al passo precedente, e una fase decrescente nella quale il numero di space diminuisce rispetto al passo precedente.
Appaiono esattamente N righe nella fase crescente e N nella fase decrescente: si tenga conto che appaiono consecutivamente due righe con N-1 space (una è da attribuire alla fase crescente e una alla fase decrescente) e due righe con 0 space (anche in questo caso appartengono una ad una fase e una all'altra).
Per ogni fase sarà implementato un ciclo per "contare" il numero di righe. Nella riga i-ma saranno inseriti i space. Il conteggio delle righe sarà:
Da 0 a N-1 nella fase crescente
Da N-1 a 0 nella fase decrescente
Nella riga i-ma il numero di space sarà contato tramite un ciclo che si "muoverà" tra 0 e i-1.
In ogni riga saranno inseriti N caratteri colon tramite un semplice ciclo al termine del quale sarà aggiunto il carattere di fine riga "\n".
Note:
Nel programma è inserita una breve pausa per rendere più gradevole l'esecuzione. Questo è ottenuto tramite la funzione Sleep() che riceve come parametro la durata della pausa espressa in millesimi di secondo.
Questa funzione, in ambiente Windows, è resa disponibile dalla libreria windows che richiede l'include <windows.h>. Questa libreria non è standard per il C per cui il programma non è compilabile su piattaforme differenti (Linux, macOS, Android).
Per la compatibilità in ambiente Linux occorre:
al posto dell'istruzione #include <windows.h> utilizzare #include <unistd.h>
al posto dell'istruzione Sleep(100); utilizzare sleep(1);
Svolgimento:
#include <stdio.h>
#include <windows.h>
int main()
{
int N, i, k;
printf("Inserire N (con N<=40): ");
scanf("%d", &N);
while (1){
for (i=0; i<N; i++){
for (k=0; k<i; k++)
printf(" ");
for (k=0; k<N; k++)
printf(":");
printf("\n");
Sleep(100);
}
for (i=N-1; i>=0; i--){
for (k=0; k<i; k++)
printf(" ");
for (k=0; k<N; k++)
printf(":");
printf("\n");
Sleep(100);
}
}
return 0;
}
Inserire N (con N<=40): 30
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::
Sito: 7ecnologie
Sezione: 08. C language
Capitolo: 02. Introduzione al C
Paragrafo: 09. Ciclo for
Approfondimento: 03. Cicli annidati: screensaver
Indice dei capitoli: 00. Risorse - 01 Ambiente di sviluppo - 02. Introduzione al C - 03. Le librerie - 04. Tutorial - 05. Esercizi svolti - 98. Esercizi
Indice dei paragrafi: 01. Hello World - 02. Variabile di tipo int - 03. Input da tastiera - 04. Controllo condizionale if - 05. Operatori logici - 06. Ciclo while - 07. Operatore modulo - 08. Array - 09. Ciclo for - 10. Ciclo do/while - 11. Variabili di tipo float - 12. Funzione random() - 13. Impostazione del set di caratteri - 14. Definizione di funzioni - 15. Passaggio di parametri: gli array - 16. Variabili: visibilità e durata - 17. Il tipo char - 18. I file - 19. Funzioni matematiche
Indice degli approfondimenti: 01. Istruzione continue - 02. Cicli annidati: scomposizione in fattori - 03. Cicli annidati: screensaver