Disegnare rombo asterischi con cicli

di il
2 risposte

Disegnare rombo asterischi con cicli

Ciao a tutti, credevo di aver capito i cicli nidificati ma con questo programma mi sn accorto di nn averli capiti poi così bene . Il rombo che devo ottenere ha raggio 5

posto il codice
#include <stdio.h>
int main (void) {
    int counter=0; /* contatore per vedere la parte di rombo da considerare*/
    int spaziomax;
    int spazio;
    int s;
    int altezza;
    int asterischi=1;
    int riga;
    int a;
    int sotto; 
    int k;
    
    printf("Inserisci un numero dispari:");
    scanf("%d", &altezza);
    
    spaziomax=(altezza+1)/2;
    
    
    for(riga=1 ; riga<=altezza; riga++){      /*stampa un tot di righe*/
               if (counter<1) {           /*finche il contatore è minore di 1 stampa la parte superiore del rombo*/
               spazio=spaziomax-riga;
               for (a=1;a<=asterischi; a++){
               for (s=1 ; s<=spazio ; s++){
                 printf(" ");
                 }
               printf("*");
               printf("\n");
               asterischi +=2;
               }
               }
               else /*considera la parte inferiore del rombo*/
               { altezza -= 2; 
               spazio=1;
               for (k=1;k<= altezza; k++){
               for (s=1;s<=spazio;s++){
                   printf(" ");
                   }
                   printf("*");
                   printf("\n");
                   spazio++;
                   altezza-=2;}
                   }
                   counter++;
                   }
                   }
                 fflush(stdin);
                 getchar();
                 return 0;
                 }
si crea un loop infinito .
Inoltre vorrei sapere se è possibile utilizzando solo i cicli ridurre il numero di istruzioni e variabili

2 Risposte

  • Re: Disegnare rombo asterischi con cicli

    Ok ho risolto da solo, a breve posterò la risposta così che altri ne possano giovare
  • Re: Disegnare rombo asterischi con cicli

    #include <stdio.h>
    int main(void) {
        int m,i,k,n=1;
        printf("Inserisci il numero che costituirà il raggio");
        scanf("%d", &n);
        
        for(m=0 ; m<2 ; m++){
                for(i=1; i<=n ; i++){
                         if (m==0){
                         for (k=1; k<=n-i;k++){
                             printf(" ");
                             }
                             for(k=1; k <2*i;k++){
                                printf("*");
                                }
                             }
                             if (m==1){
                                       for(k=1;k<=i;k++){
                                       printf(" ");
                                       }
                                       for(k=1; k<(n-i)*2;k++){
                                                printf("*");
                                                }
                                                }
                                                printf("\n");
                             }
                             }
                             fflush(stdin);
                             getchar();
                             return 0;
                             }
                             

    1)Inserisci il numero che costituirà il raggio del rombo
    scanf("%d",&n);

    2) Usare un istruzione che sarà eseguita 2 volte sulle base del contatore. Userò un ciclo e immaginando di dividere il rombo in 2 triangoli deciderò quale parte stampare a schermo per prima.

    for (m=0; m<2; m++)

    3) usiamo 2 cicli:
    -esterno: per contare le righe del rombo
    -interno:per stampare gli spazi


    esterno: for (i=1; i<=n;i++), i sarebbe la riga,la inizializzo a 1 e dico finche minore o uguale al raggio aggiungi 1

    1----*
    2---***
    3--*****
    4-*******
    5*********

    supponendo che raggio =5 finchè i<=5 aggiungi una riga

    if(m==0) serve a decidere se stiamo stampando la prima o la seconda parte del rombo

    interno
    for (k=1; k<=n-1;k++) un ciclo per stampare gli spazi che andranno prima degli asterischi.
    K è inizializzato a 1,finchè è minore di n-i aggiungi 1.
    Allora se all'inizio è 1, e abbiamo detto che n=5,ne risulta n-i=4.
    Finchè k<=4 aggiungi 1 e stampa spazi.
    In questo caso k=1 -->stampa uno spazio e aggiungi 1---->k=2-----> stampa un altro spazio e aggiungi 1 (lo spazio sarà stampato accanto dato che nn ho dato istruzioni diverse quali newline),aggiungi 1 e così via fino a 4.
    Continua poi a leggere il programma.

    4)ora tocca stampare gli asterischi. La prima riga stamperà solo un * in quanto all'inizio il valore di i è 1.

    for (k=1; k<2*i;k++){
    printf("*");

    Allora poichè La prima volta che viene eseguito il ciclo i=1,k=1 e k deve essere < 2, sarà stampato un solo asterisco.
    (La seconda volta i=2, K sarà sempre =1 perchè è ricominciato il ciclo e k è stato reinizializzato, k deve essere minore di 4,stamperà 3 asterichi.)

    Ora il calcolatore continuerà la lettura del programma salterà la parte del programma in cui m=1 e eseguirà la newline portando il cursore a capo.

    5) per stampare l'altra parte del rombo inverto il ciclo. Dovrò stampare un solo spazio all'inizio poi dovrò aumentare.
    if (m==1)
    for (k=1;k<=i;k++);
    printf(" ");

    Quindi nel momento in cui nella prima parte del rombo il contatore di rige i diventa = n (5 nel nostro caso) il contatore m sale di 1 e quindi passa a m==1,quindi questa seconda parte.

    Ora i è di nuovo 1 essendo cambiato m. Come regola ogni qual volta si passa a un ciclo più esterno la variabile di quello più interno viene re-inizializzata. Essendo i=1 sarà stampato un solo spazio. Poi quando il ciclo ricomincierà,il contatore aumenterà e ne saranno stampati altri.

    6) ciclo per stampare asterischi
    for (k=1;k<=(n-i)*2;k++){ //k<(5-1)*2--->k<8 saranno stampati 7 asterischi
    printf("*"); }
    }
    printf("\n");
    }
    }
    return 0;
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte