Aiuto: Triangolo di carte(numeri)

di il
99 risposte

99 Risposte - Pagina 4

  • Re: Aiuto: Triangolo di carte(numeri)

    Ciao Nippolo, sto provando a far funzionare questo codice che mi hai consigliato ma nulla, non funziona e non so perchè mi dà sempre 0 come risultato, guarda te lo posto:
    #include <stdio.h>
    
    
    int fun(int b[5], int n);
    
    int main()
    
    {
        int b[5]={1,3,5,6,7};
        printf("%d", fun(b,6));
    
    }
    
    int fun(int b[5], int n)
    {
        int i;
        for(i=0; i<5; ++i)
        {
            if(b[i] == n)
            {
            return 1;
        }
            return 0;
        }
    
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Ecco qua in questo modo funziona, ho dovuto spostare il return 0, al di fuori del ciclo for: e vaiiii grazie si prosegue!!!!
    int fun(int b[5], int n)
    {
        int i;
        for(i=0; i<5; i++)
        {
            if(b[i]==n)
            {
    
            return 1;
        }
    
    }
        return 0;
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    ho dovuto spostare il return 0, al di fuori del ciclo for
    Ovviamente bisogna scorrere tutto l'array b per poter affermare che non contiene n!

    Adesso bisogna implementare la stessa funzione, solo che al posto di un vettore abbiamo una matrice:
    int fun_2(int b[5][5], int n);
  • Re: Aiuto: Triangolo di carte(numeri)

    Si grazie veramente di cuore appena fatto ti aggiorno
  • Re: Aiuto: Triangolo di carte(numeri)

    Ecco qua ho ordinato anche un pò la generazione dei numeri..
    Ora cercherò di applicare questo concetto per il controllo di più numeri.
    E poi cercherò di inserire il tutto nel progetto... Ti aggiorno più tardi
    #include <stdio.h>
    
    int controllo(int b[][5], int n);
    void genera_numeri(int b[][5], int r, int c);
    void visualizza(int b[][5], int r, int c);
    
    int main()
    
    {
            int b[5][5], r=5, c=5;
            genera_numeri(b,r,c);
            visualizza(b,r,c);
            printf("\n\n");
            printf("%d", controllo(b,14));
    }
    
    void genera_numeri(int b[][5], int r, int c)
    {
        int i, j;
        for(i=0; i<r; i++)
        {
            for(j=0; j<c; j++)
            {b[i][j]=1+rand()%15;}
    
        }
    
    }
    
    void visualizza(int b[][5], int r, int c)
    {
        for(r=0; r<5; r++)
        {
            for(c=5; c>r; --c)
            {printf("    ");}
    
    
            for(c=0; c<=r; c++)
    
                printf(" %3d    ", b[r][c]);
                printf("\n\n");
    }
    }
    
    int controllo(int b[][5], int n)
    {
    
    int i, j;
        for(i=0; i<5; i++)
        {
            for(j=0; j<5; j++)
            {
                if(b[i][j]==n)
                {
                return 1;
                }
    
            }
        }
                return 0;
    
         }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Ma a cosa serve la funzione genera_numeri()? E dov'è finita la parte che si occupa di generare una base della piramide con tutti numeri diversi? E quella che si occupa delle sottrazioni?
  • Re: Aiuto: Triangolo di carte(numeri)

    Nono, questo è solo un esempio che mi sono ricreato per vedere se funzionasse la ricerca in una matrice di un numero.
    Dopo integro nel progetto e ti posto il risultato...
    Ora però sto cercando da questo esempio che ho fatto, di comparare non un numero ma più numeri n e sto cercando di implementare.
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo guarda questo è il progetto principale, ho pulito un pò il main e sto cercando di inserire il richiamo function controllo nel main con una condizione, ma non ci riesco come potrei fare?
    #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);
    
    void 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];
        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;
    
        genera_numeri_senza_ripetizione_base(b,num_norepeat);
        visualizza_base(b,numeri_base);
    
    
        printf("\n\n\n");
    
        sottrazioni(b,rig,col);
    
        visualizza_array_b(b,5,5);
    }
    
    
    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<5; 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<5; 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 ( int i = 0 ; i < 5 ; i ++ )
        {
            for(j=0; j>5; j++)
    
            {if ( b[i][j] == n )
    
                {
                    return 1;
                }
    
            }
        }
                    return 0;
    }
    
    
    void visualizza_array_b(int b[5][5], int rig, int col)
    {
    
        for(rig=0; rig<5; rig++)
        {
            for(col=5; col>rig; --col)
            {printf("     ");}
    
        for(col=0; col<=rig; col++)
        printf("  %3d     ", b[rig][col]);
    printf("\n\n\n");
    
    }
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Ho fatto un ciclo per vedere le occorrenze dei 15 numeri nell'array nella parte finale e sembra funzionare mi dà 1 e 0 per ogni numero presente e non.
    Mi manca di impostare la condizione, avevo pensato ad un do-while..
    /*controllo numeri presenti da 1 a 15*/
    
       
        for(n=1; n<=15; n++)
        {
    
            printf("%d", controllo(b,n));
    
        }
  • Re: Aiuto: Triangolo di carte(numeri)

    Alcune considerazioni:

    - perché dichiari le variabili all'esterno del for? Non sarebbe più chiaro qualcosa del genere?
    for(int i = 0; i < 5; ++i)
    - a cosa servono gli argomenti numeri_base e num_norepeat, rispettivamente nelle funzioni visualizza_base() e genera_numeri_senza_ripetizione_base, visto che poi non li utilizzi?
    - perché nelle funzioni sottrazioni() e visualizza_array_b() passi come argomenti le variabili (rig e col) su cui si baseranno i due cicli for in esse contenuti?
    - le funzioni visualizza_numeri() e visualizza_base() sono superflue, in quanto i numeri ovviamente sono quelli che vanno da 1 a 15 e inoltre stampando la piramide si può osservare tranquillamente anche la base;
    - la funzione controllo() così scritta ritornerà sempre 0... nella condizione del secondo for hai utilizzato maggiore al posto di minore. Una volta corretto avrai che la funzione controllerà la presenza di n nell'intera matrice b, ma a noi interessano solo gli elementi che costituiscono la piramide, e quindi gli elementi che si trovano al di sopra della diagonale principale non vanno considerati.

    icniVad ha scritto:


    Ho fatto un ciclo per vedere le occorrenze dei 15 numeri nell'array nella parte finale e sembra funzionare mi dà 1 e 0 per ogni numero presente e non.
    Mi manca di impostare la condizione, avevo pensato ad un do-while..
    Molto semplicemente puoi implementare una funzione
    int controlla_piramide(int b[5][5])
    {
        for(int n = 1; n <= 15; ++n)
        {
            if(controllo(b, n) == 0)
            {
                ...
    }
    che ritorna 1 se la piramide è valida e 0 altrimenti.
  • Re: Aiuto: Triangolo di carte(numeri)

    Che errore!Non me ne ero accorto del maggiore nel secondo for..mi sn distratto
    Per le variabili che mi hai chiesto, le ho utilizzate adesso, perchè mi diceva che le function ovviamente avevano un secondo parametro non dichiarato nel momento dell'esecuzione del programma e quindi le ho dichiarate,
    poi per quelle funzioni che mi hai detto sono superflue, è vero hai ragione, le ho messe per
    completamento giusto per...secondo te mi penalizzerebbero?o potrebbero aiutarmi a dare più completezza al programma per il prof?
    Ah infine ho corretto quella cosa sui parametri rig e col. Solo che nella funzione sottrazione ho provato a sostituirli, mi si sballa tutto e li ho lasciati...
    Ora cerco di implementare questa funzione che mi hai consigliato...grazie mille. Tra poco ti aggiorno
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo guarda allora la funzione da te consigliata l'ho implementata, e ho inserito un do-while per inserirla nel main, non so se è l'idea giusta, ed il programma scorre velocemente senza apparentemente darmi il risultato finale...
    Ecco la funzione(ho solo variato la parte if(controllo(b,n))==0, per mantenere l'idea che tutti i numeri nella ricerca mi danno 1):
    int controllo_piramide(int b[5][5])
    {
        int n;
        for(n=1; n<=15; ++n)
        {
            if(controllo(b,n)==1)
            {
                return 1;
            }
        }
    return 0;
    }
    
    Tra un attimo ti posto tutto il prog.
  • Re: Aiuto: Triangolo di carte(numeri)

    Ecco il programma completo:
    #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_piaramide(int b[5][5]);
    
    void 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, n, fine=controllo_piramide(b);
    
    do{
        genera_numeri_senza_ripetizione_base(b,num_norepeat);
        visualizza_base(b,numeri_base);
    
    
        printf("\n\n\n");
    
        sottrazioni(b,rig,col);
    
    
    
        printf("\n");
        /*controllo numeri che ci sono di n da 1 a 15 presenti*/
    
        printf("%d", controllo_piramide(b));
    
    printf("\n\n");
    }while(fine==1);
    
            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 ( int i = 0 ; i<5 ; i ++ )
        {
            for(j=0; j<5; 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)==1)
            {
                return 1;
            }
        }
    return 0;
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo, il compilatore non mi da errori scritto in questo modo il programma guarda l'ho corretto un pò...ma lo stesso scorre velocissimo una volta inviato e non mi da un risultato, sto impazzendo...
    Guarda...
    #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;
    
    do{
        genera_numeri_senza_ripetizione_base(b,num_norepeat);
        visualizza_base(b,numeri_base);
    
    
        printf("\n\n\n");
    
        sottrazioni(b,rig,col);
    
        printf("\n");
        /*controllo numeri che ci sono di n da 1 a 15 presenti*/
    
        printf("%d", controllo_piramide(b));
    
    printf("\n\n");
    
    
    for(int n=1; n<=15; n++)
        {
    
            printf("%d", controllo(b,n));
    
        }
    
    printf("\n\n");
    
    
    }
    
            while(controllo_piramide(b)==1);
    
    
                visualizza_array_b(b,5,5);
    
    
    }
    
    
    
    
    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<5; 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)==1)
            {
                return 1;
            }
        }
    return 0;
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Dietro front, l'ho implementata come mi hai consigliato forse perciò mi sn bloccato
    int controllo_piramide(int b[5][5])
    {
        int n;
        for(n=1; n<=15; ++n)
        {
            if(controllo(b,n)==0)
            {
                return 1;
            }
        }
    return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
99 risposte