Aiuto: Triangolo di carte(numeri)

di il
99 risposte

99 Risposte - Pagina 6

  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo non so mi sembra come se qualcosa non andasse...
    Guarda ti faccio vedere cosa ho fatto fino ad ora, ma l'esecuzione non termina il programma scorre soltanto:
    int main()
    {
        srand(time(0));
        int m[5][5];
    
    do{
                        genera_base(m);
    
                        sottrazioni(m);
    
                        stampa_piramide(m);
       }while(controllo_piramide(m)==1);
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    e che sto impazzendo perchè devo consegnare il pregetto tra pochi giorni, devo scrivere ancora tutti i commenti e ho paura di non farcela a terminarlo
    La fretta è cattiva consigliera!

    In ogni caso mi è venuto un dubbio... secondo te cosa dovrebbe ritornare la funzione controllo_piramide() nel caso in cui m contenga una piramide "valida"? 0 o 1?

    Il main impostato in quel modo cosa dovrebbe fare secondo te?

    icniVad ha scritto:


    ma l'esecuzione non termina il programma scorre soltanto:
    Sicuro? Se aspetti un po' vedi che si ferma... poi dipende anche da quanto sei fortunato!

    In ogni caso prova anche a modificare il main mettendo la funzione stampa_piramide() fuori dal do/while. Cosa succede?

    P.S.
    Ti sarei grato se rispondessi precisamente a tutte le domande che ti ho fatto, anche se nel modificare il codice il programma iniziasse a "funzionare". Altrimenti non ne usciamo più!
  • Re: Aiuto: Triangolo di carte(numeri)

    Va bene, allora:
    -la funzione controllo piramide, deve ritornare 1.
    Quindi nella function controllo_piramide la condizione dell' if sara:
    if(controllo_numero==0) (cioè se ogni numero è diverso ed unico), nel main la funzione la richiamo poi nel ciclo do while con la restituzione del return 1 nella function controllo_piramide guarda il codice tutto sommato sembra scritto bene alla fine...
    Allora ho messo la stampa della piramide nel main in modo tale che si veda dal terminale qualcosa perchè se la metto fuori dal do while non si vede nulla...Poi appena il codice funziona aggiusto tutto promesso..Guarda questo è il codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void genera_base(int m[5][5])
    {
        int *base = m[4];
        for(int i = 0; i < 5; ++i)
        {
            base[i] = 1 + rand() % 15;
            for(int j = 0; j < i; ++j)
            {
                if(base[j] == base[i])
                {
                    --i;
                    break;
                }
            }
        }
    }
    
    void sottrazioni(int m[5][5])
    {
        for(int i = 3; i >= 0; --i)
        {
            for(int j = i; j >= 0; --j)
            {
                m[i][j] = m[i + 1][j] - m[i + 1][j + 1];
                if(m[i][j] < 0)
                {
                    m[i][j] *= -1;
                }
            }
        }
    }
    
    void stampa_piramide(int m[5][5])
    {
        printf("\n\n");
        for(int i = 0; i < 5; ++i)
        {
            for(int j = 4; j >= 0; --j)
            {
                if(j > i)
                {
                    printf("  ");
                }
                else
                {
                    printf("%2d  ", m[i][j]);
                }
            }
            printf("\n\n");
        }
    }
    
    int controllo_numero(int m[5][5], int n)
    {
        int i, j;
        for(i = 0; i < 5; i++)
        {
            for(j = 0; j <=i ; j++)
            {
                    if(m[i][j] == n)
                {
                    return 1;
                }
            }
    }
        return 0;
    }
    
    int controllo_piramide(int m[5][5])
    {
        for(int n=1; n <= 15; ++n)
        {
            if(controllo_numero(m,n)==0);
            {
                return 1;
            }
    
    }
    return 0;
    }
    
    int main()
    
    {
        srand(time(0));
        int m[5][5];
    for(int p=0; p<5; p++)
    {
    do{
                genera_base(m);
                sottrazioni(m);
    }while(controllo_piramide(m)==1);
                stampa_piramide(m);
                /*ho messo questa visualizzazione per vedere e le due function combaciassero nel conteggio dei numeri*/
                for(int n=1; n<=15; ++n)
                {
                printf("%d", controllo_numero(m, n));
                }
    
    
    }
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo, ho preso quel progetto che abbiamo abbozzato al principio e funziona benissimo, guarda...
    Ho modificato la function controllo_piramide e funziona, come consigliato da te escludendo la parte di piramide che non serviva e vaiiiiiiiiiiiiiiiiiii
    Finalmente stavo impazzendooooooooo
    Comunque grazie di cuore per avermi affiancato, seguito, guidato sei stato un grande giuro
    Grazie infinitamenteeeeeeeeeeeeeeeee
    Questo sito e questo forum non lo abbandono, sarò sempre qua a darvi fastidio
    Ma soprattutto se riesco tra un esame e l'altro ad aiutare anch'io chiunque per quello che posso promesso.
    Grazie grazie grazie
  • Re: Aiuto: Triangolo di carte(numeri)

    Ti posto il progetto magari può servire a qualcuno per imparare ed esercitarsi....
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    
    void visualizza_numeri(int numeri[], int num);
    void visualizza_base(int b[][5], int numeri_base);
    void visualizza_array_b(int b[5][5], int rig, int col);
    void genera_numeri_senza_ripetizione_base(int b[][5], int num_norepeat);
    void sottrazioni(int b[][5], int rig, int col);
    int controllo(int b[5][5], int n);
    int controllo_piramide(int b[5][5]);
    
    int main()
    
    {
        int numeri[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    
        srand(time(0));
        int b[5][5];/*={{1},{2,3},{4,5,6},{7,8,9,10},{11,12,13,14,15}};ho fatto la prova, funziona,
        viene 1 quando a tutti i numeri presenti viene assegnato 1 alla funzione controllo tutti i numeri sono uguali*/
        int num=15, numeri_base=5;
        int rig=5, col=5;
    
        printf("Numeri da utilizzare: ");
    
        visualizza_numeri(numeri, num);
    
        printf("\n\n");
    
        printf("Array A pseudo-random di partenza in ultima fila quindi base della piramide: \n\n");
    
        int num_norepeat=5;
        int p;
    for(p=0; p<5; p++)
    {do{
        genera_numeri_senza_ripetizione_base(b,num_norepeat);
    
        sottrazioni(b,rig,col);
    
    
            }while(controllo_piramide(b)==1);
    
                visualizza_base(b,numeri_base);
                printf("\n\n\n");
                printf("%d", controllo_piramide(b));
                printf("\n");
                visualizza_array_b(b,5,5);
                for(int n=1; n<=15; ++n)
        {
    
            printf("%d", controllo(b,n));
    
        }
    
    }
    }
    
    
    
    void visualizza_numeri(int numeri[], int num)
    {
        int i;
        for(i=0; i<num; i++)
        printf("%3d", numeri[i]);
    
    }
    
    
    void visualizza_base(int b[][5], int numeri_base)
    {
        int i;
        for(i=0; i<numeri_base; i++)
        {printf("%3d", b[4][i]);}
    }
    
    void genera_numeri_senza_ripetizione_base(int b[][5], int num_norepeat)
    {
        int i, j;
        int *base=b[4];
        for(i=0; i<num_norepeat; i++)
        {
            base[i]=1+rand()%15;
            for(j=0; j<i; j++)
            {
                if(base[i]==base[j])
                {
                    i--;
                    break;
                }
            }
    
        }
    
    }
    
    void sottrazioni(int b[][5], int rig, int col)
    {
    
        for(rig=3; rig>=0; --rig)
            {
                for(col=rig; col>=0; --col)
                {
                    b[rig][col]=b[rig+1][col]-b[rig+1][col+1];
                    if(b[rig][col]<0)
                        {
                            b[rig][col]=b[rig][col]*-1;
                        }
    
                }
    
            }
    
    }
    
    
    int controllo(int b[5][5], int n)
    {
        int i, j;
        for (i=0; i<5 ; i++ )
        {
            for(j=0; j<=i; j++)
    
            {if ( b[i][j] == n )
    
                {
                    return 1;
                }
    
            }
        }
                    return 0;
    }
    
    
    void visualizza_array_b(int b[5][5], int rig, int col)
    {
    
    int i,j;
        for(i=0; i<rig; i++)
        {
            for(j=col; j>i; --j)
            {printf("     ");}
    
        for(j=0; j<=i; j++)
        printf("  %3d     ", b[i][j]);
    printf("\n\n\n");
    
    }
    }
    
    int controllo_piramide(int b[5][5])
    {
        int n;
        for(n=1; n<=15; ++n)
        {
            if(controllo(b,n)==0)
            {
                return 1;
            }
        }
    return 0;
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Anche se però mi escono sempre le stesse 2 piramidi...
    E devo pulirlo un pò il codice tipo come me lo hai consigliato tu, però sembra funzionare, devo sostituire i contatori agli errori che mi dicesti tu ora faccio tutto...i numeri cmq non si ripetono...
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    Grazie grazie grazie
    Di niente, ma il mio timore si è rivelato fondato... e mi riferisco a questo:

    Nippolo ha scritto:


    P.S.
    Ti sarei grato se rispondessi precisamente a tutte le domande che ti ho fatto, anche se nel modificare il codice il programma iniziasse a "funzionare". Altrimenti non ne usciamo più!
    E anche l'altra mia raccomandazione è stata disattesa, ossia:

    Nippolo ha scritto:


    Sulla scorta di quanto appena detto, indentando meglio il codice e utilizzando nomi appropriati, si ottiene qualcosa del genere:
    ...
    Almeno così abbiamo una base di partenza comune su cui ragionare!
    In ogni caso se la funzione controlla_piramide() deve ritornare 1 nel caso in cui m contenga una piramide valida, allora i due return devono essere invertiti.
    Ecco il codice completo corretto:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void genera_base(int m[5][5])
    {
        int *base = m[4];
        for(int i = 0; i < 5; ++i)
        {
            base[i] = 1 + rand() % 15;
            for(int j = 0; j < i; ++j)
            {
                if(base[j] == base[i])
                {
                    --i;
                    break;
                }
            }
        }
    }
    
    void sottrazioni(int m[5][5])
    {
        for(int i = 3; i >= 0; --i)
        {
            for(int j = i; j >= 0; --j)
            {
                m[i][j] = m[i + 1][j] - m[i + 1][j + 1];
                if(m[i][j] < 0)
                {
                    m[i][j] *= -1;
                }
            }
        }
    }
    
    void stampa_piramide(int m[5][5])
    {
        printf("\n\n");
        for(int i = 0; i < 5; ++i)
        {
            for(int j = 4; j >= 0; --j)
            {
                if(j > i)
                {
                    printf("  ");
                }
                else
                {
                    printf("%2d  ", m[i][j]);
                }
            }
            printf("\n\n");
        }
    }
    
    int controllo_numero(int m[5][5], int n)
    {
        for(int i = 0; i < 5; ++i)
        {
            for(int j = 0; j <= i; ++j)
            {
                if(m[i][j] == n)
                {
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int controllo_piramide(int m[5][5])
    {
        for(int n = 1; n <= 15; ++n)
        {
            if(!controllo_numero(m, n))
            {
                return 0;
            }
        }
        return 1;
    }
    
    int main()
    {
        srand(time(0));
        int m[5][5];
        unsigned int cont = 0;
        do
        {
            genera_base(m);
            sottrazioni(m);
            ++cont;
        }
        while(!controllo_piramide(m));
        printf("NUMERO DI TENTATIVI: %d", cont);
        stampa_piramide(m);
    }
    Il main è stato impostato per generare piramidi affinchè non ne viene trovata una valida, a quel punto oltre a stamparla, mostra anche il numero di tentativi richiesti.
  • Re: Aiuto: Triangolo di carte(numeri)

    Va bene, domani darò una super ultima controllata, sistemerò il tutto e aggiungerò i commenti e finalmente sarà finito
  • Re: Aiuto: Triangolo di carte(numeri)

    [OT]
    Scusate se mi intrometto, ma devo ammettere che mi sono appassionato a questo theread, e l'ho seguito quasi come fosse una serie TV . @icniVad complimenti per la tua dedizione, e @nippolo le mie congratulazioni per la tua competenza pazienza e capacità didattica. Bravi entrambi
    [/OT]
  • Re: Aiuto: Triangolo di carte(numeri)

    Senza saperlo abbiamo dato vita ad un nuovo format!

    A questo punto, rassicurati anche dal fatto che @icniVad abbia completato il proprio progetto, sarebbe interessante apportare le seguenti modifiche (alcune delle quali credo di aver già menzionato in post precedenti):
    - generalizzare il programma per piramidi di base N;
    - utilizzare un array per contenere la piramide, in modo da evitare l'inutile spreco di memoria ( ) che deriva dall'utilizzo di una matrice;
    - generare la base utilizzando un approccio deterministico;
    - interrompere la costruzione della piramide non appena viene posizionato un doppione;
    - utilizzare come metodo di ricerca dei doppioni una rudimentale tabella hash.

    Inoltre si potrebbero fare molte altre considerazioni di carattere logico-matematico, per esempio una piramide la cui base non contiene il massimo sarà sicuramente una piramide non valida!
  • Re: Aiuto: Triangolo di carte(numeri)

    Ragazzi io sono stato contentissimo di conoscervi,
    e resterò sicuramente legato e grato a questo sito ma soprattutto a questo forum, in primo posto a Nippolo che mi ha seguito peggio di
    un professore , perchè oltre alla professionalità, non mi sarei mai aspettato tra l'altro di ritrovare delle persone
    davvero socievoli e simpatiche...
    E comunque trasmettete positività e passione in quello che fate, ovviamente parlo di quello che mi ha trasmesso Nippolo,
    mi sono appassionato ancora di più confrontandomi con lui, quindi grazie di tutto e per la tua disponibilità
    Spero mi seguirete anche in c++ e java se vi va, ovviamente non subito
    Sapete, giusto per...l'unico dubbio che ho....ho fatto un for prima del do-while per ripetere la simulazione 5 volte, ma è normale che mi escono solo 2 "tipi di piramide?"cioè su 5 volte mi escono solo 2 tipi di combinazioni di piramidi che si ripetono...
    Guardate ho aggiunto il for qui:
    for(int p=0; p<5; p++)
       { do
        {
            genera_base(m);
            sottrazioni(m);
            ++cont;
        }
        while(!controllo_piramide(m));
        printf("NUMERO DI TENTATIVI: %d", cont);
        stampa_piramide(m);
    }
    }
  • Re: Aiuto: Triangolo di carte(numeri)

    E' vero abbiamo fatto un format
    Mm...Nippolo lette le tue ultime considerazioni...spero che il prof non mi penalizzi per aver utilizzato una matrice...
    mi stai facendo venire un pò di preoccupazioni
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    Sapete, giusto per...l'unico dubbio che ho....ho fatto un for prima del do-while per ripetere la simulazione 5 volte, ma è normale che mi escono solo 2 "tipi di piramide?"cioè su 5 volte mi escono solo 2 tipi di combinazioni di piramidi che si ripetono...
    Scusa ma qual è lo scopo del programma?
    Io dal primo post leggo:
    Effettuare almeno 5 simulazioni generando dei numeri interi casuali.
    Invece tu stai interpretando la traccia come il dover generare 5 piramidi valide...
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    ma è normale che mi escono solo 2 "tipi di piramide?"cioè su 5 volte mi escono solo 2 tipi di combinazioni di piramidi che si ripetono...
    Lasciami indovinare, queste due soluzioni sono anche speculari?
  • Re: Aiuto: Triangolo di carte(numeri)

    Orion99 scusami avevo dimenticato...mi hai fatto morire quando ho letto della serie tv Comunque grazie per il complimento, ma se non
    fosse stato per Nippolo sarebbe stata dura
    Comunque Nippolo siiiiiiiiiiiiiii sono speculariiiiiiii uno specchio perfetto , però infatti devono essere solo simulazioni hai ragione,
    ho chiesto perchè mi sorgeva questo dubbio ogni tanto
    Però dai sono contento così, il programma può essere migliorato però a me piace tanto anche così poi mi migliorerò pian piano
Devi accedere o registrarti per scrivere nel forum
99 risposte