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

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::