Aiuto: Triangolo di carte(numeri)

di il
99 risposte

99 Risposte - Pagina 2

  • Re: Aiuto: Triangolo di carte(numeri)

    Hai ragione ho lasciato anche degli appunti tra le righe del codice in effetti che non centrano.
    Allora, fatta la piramide utilizzando un solo array come mi hai consigliato tu,
    l'ho popolata di numeri random nella function visualizza, ora stavo cercando il modo di:
    -trovare un sistema per far si che ogni numero di k, fosse la sottrazione della riga i sottostante;
    -tutti i numeri della piramide fossero unici.
    Non mi viene tanto semplice impostare questa condizione. Pensi che stia sbagliando la logica?Troppa confusionaria?
  • Re: Aiuto: Triangolo di carte(numeri)

    Allora... se vuoi utilizzare un array innanzitutto esso deve essere di 15 elementi e non 5. Inoltre dovresti anche escogitare un modo per associare ogni elemento (esclusi quelli della base) agli altri due di cui ne è la differenza (in valore assoluto), e la cosa non è propria semplicissima.
    Quindi per il momento puoi anche continuare con il metodo utilizzato inizialmente che considerava gli elementi di una matrice quadrata 5x5 esclusi quelli che si trovano al di sopra della diagonale principale.
    Come struttura volendo potresti anche implementare (utilizzando l'allocazione dinamica) un array di array di diversa lunghezza.

    Poi, come già detto nell'altro post, devi fare in modo che tra gli elementi della base non ci siano doppioni. La cosa può essere fatta in vari modi, deterministici o meno; tu inizia a proporre qualcosa e poi ne riparliamo.

    Del resto ce ne occupiamo poi.
  • Re: Aiuto: Triangolo di carte(numeri)

    Va bene allora riscrivo il codice in modo più chiaro, avevo fatto un array da 5 numeri perchè è scritto nella traccia, comunque ho avuto un idea appena finito posto il codice.
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo ecco sono arrivato fino a qui, ho:
    -creato un array con numeri differenti;
    -inserito nell'ultima riga della piramide;
    -fatto tutte le sottrazioni;
    Ora mi manca:
    -che tutti i numeri della piramide siano difìfferenti;
    -ripetere per 5 volte la simulazione...
    Guarda ti mostro fin dove sono riuscito a fare spero tu riesca ad aiutarmi a continuare..
    #include<stdio.h>
    #include<stdlib.h>
    
    
    void visualizza_array_a(int a[5], int n);
    void visualizza_array_b(int b[5][5], int rig, int col);
    
    
    void main()
    
    {
        int numeri[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        srand(time(NULL));
        /*Visualizzo i 15 numeri*/
        int t;
        printf("Numeri: ");
        for(t=0; t<15; t++)
        {printf("%3d", numeri[t]);}
        printf("\n\n");
    
        /*Creo e visualizzo i numeri senza ripetizioni in un array da 5
        che andranno poi nella base della piramide*/
        int a[5], i, j;
        printf("Array A pseudo-random di partenza in ultima fila: ");
        for(i=0; i<5; i++)
        {a[i]=1+rand()%15;
        for(j=0; j<i; j++)
        {
            if(a[i]==a[j]){
            i--;
            break;
            }
        }}
        /*Visualizzo l'array da 5 di partenza*/
        visualizza_array_a(a,5);
    
    
        int b[5][5];
    
        printf("\n\n\n\n");
        /*Copio i 5 numeri dall'array di 5 alla base della piramide*/
        int v;
        for(v=0; v<5; v++)
        {b[4][v]=a[v];}
    
    /*Gestisco le operazioni di sottrazione con 2 cicli for annidati e un if per avere il valore assoluto e
    non avere numeri negativi in sottrazione*/
        int colonna, riga;
    
    
           for(riga=3; riga>=0; --riga)
        {   for(colonna=4; colonna>=0; --colonna)
    
    
    {
            b[riga][colonna-1]=b[riga+1][colonna]-b[riga+1][colonna-1];
    
            if(b[riga][colonna-1]<0)
              b[riga][colonna-1]=b[riga][colonna-1]*-1;}
    }
    
    
    
        printf("\n\n\n");
        visualizza_array_b(b,5,5);
    }
    
    
    
    void visualizza_array_a(int a[5], int n)
    {
        int i;
        for(i=0; i<5; i++)
        printf("%3d", a[i]);
    }
    
    
    
    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)

    Praticamente si tratta del codice iniziale con qualche piccola modifica...
    Per quanto riguarda l'indentazione, ci sono ancora ampi margini di miglioramento!

    In ogni caso ti faccio notare che la parte che si occupa delle sottrazioni, oltre a calcolare valori che non ti servono (quelli che si trovano al di sopra della diagonale principale), accede anche a locazioni di memoria che non appartengono alla matrice b.
    A cosa accede
    b[riga][colonna-1]
    per colonna uguale a 0?

    Invece la parte relativa alla creazione di un array con numeri differenti, sebbene basata su un approccio non deterministico, può andar bene.
    Volendo puoi anche evitare di utilizzare un array a di appoggio, basta infatti fare qualcosa del genere:
        int b[5][5];
        int *ptr = b[4];
        for(unsigned int i = 0; i < 5; ++i)
        {
            ptr[i] = 1 + rand() % 15;
            for(unsigned int j = 0; j < i; ++j)
            {
                if(ptr[i] == ptr[j])
                {
                    --i;
                    break;
                }
            }
        }
    Ora mi manca:
    -che tutti i numeri della piramide siano difìfferenti;
    -ripetere per 5 volte la simulazione...
    Nel ripetere la simulazione non vedo alcuna difficoltà... basta utilizzare un ciclo.
    Per controllare che i numeri della piramide siano differenti basta cercare nella porzione utile di matrice i numeri da 1 a 15, nel momento in cui non trovi un numero ti fermi in quanto la piramide evidentemente presenta dei doppioni.
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo, detto fatto! Ho seguito il tuo prezioso consiglio e ho eliminato l'array a. Grazie mille
    Ora cercavo di migliorare e capire la problematica delle sottrazioni, ho cercato di risolvere ciò che mi hai detto delle allocazioni di
    memoria che non appartengono manco all'array b, ma non ci riesco proprio, appena tocco qualcosa dal seguente codice mi si scombina tutto.
  • Re: Aiuto: Triangolo di carte(numeri)

    Ti taggo il codice corretto
    #include<stdio.h>
    #include<stdlib.h>
    
    
    
    void visualizza_array_b(int b[5][5], int rig, int col);
    
    
    void main()
    
    {
        int numeri[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        srand(time(NULL));
        /*Visualizzo i 15 numeri*/
        int t;
        printf("Numeri: ");
        for(t=0; t<15; t++)
        {printf("%3d", numeri[t]);}
        printf("\n\n");
    
        /*Creo e visualizzo i numeri senza ripetizioni in un array da 5
        che andranno poi nella base della piramide*/
        printf("Array A pseudo-random di partenza in ultima fila: ");
        /*Visualizzo l'array da 5 di partenza*/
        int b[5][5], 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;
                }
            }
    
        }
    
        int k;
        for(k=0; k<5; k++)
        {printf("%3d", b[4][k]);}
    
        printf("\n\n\n\n");
        /*Gestisco le operazioni di sottrazione con 2 cicli for annidati e un if per avere il valore assoluto e
        non avere numeri negativi in sottrazione*/
        int colonna, riga;
    
    
           for(riga=3; riga>=0; --riga)
        {   for(colonna=4; colonna>=0; --colonna)
    
    
    {
            b[riga][colonna-1]=b[riga+1][colonna]-b[riga+1][colonna-1];
    
            if(b[riga][colonna-1]<0)
              b[riga][colonna-1]=b[riga][colonna-1]*-1;
    }
    }
    
    
    
        printf("\n\n\n");
        visualizza_array_b(b,5,5);
    }
    
    
    
    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)

    Il codice che ho cercato di modificare è questo:
    b[riga][colonna-1]=b[riga+1][colonna]-b[riga+1][colonna-1];
  • Re: Aiuto: Triangolo di carte(numeri)

    Prova a ragionare partendo dalla seguente impostazione:
    for(int riga = 3; riga >=0; --riga)
    {
        for(int colonna = riga; colonna >= 0; --colonna)
        {
            b[riga][colonna] = ...
  • Re: Aiuto: Triangolo di carte(numeri)

    Siiiiiiiiii e vai!!!Andata anche questa, non ti ringrazierò mai abbastanza
    Ti posto il codice che mi hai indicato completo
    int colonna, riga;
    
    
           for(riga=3; riga>=0; --riga)
        {   for(colonna=riga; colonna>=0; --colonna)
    
    
    {
            b[riga][colonna]=b[riga+1][colonna]-b[riga+1][colonna+1];
    
            if(b[riga][colonna]<0)
              b[riga][colonna]=b[riga][colonna]*-1;
    
    }
    }
    
    
    Ora cerco di implementare qualcosina per fare il controllo dei numeri come mi hai detto tu prima, ti terrò aggiornato.
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo guarda. ho pensato di inserire una function confronto nel programma per avere numeri unici nella matrice, secondo te sbaglio?
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    
    void visualizza_array_b(int b[5][5], int rig, int col);
    int confronto(int *numero1, int *numero2, int b[][5]);
    
    void main()
    
    {
        int numeri[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        srand(time(0));
        /*Visualizzo i 15 numeri*/
        int t;
        printf("Numeri: ");
        for(t=0; t<15; t++)
        {printf("%3d", numeri[t]);}
        printf("\n\n");
    
    
        /*Creo e visualizzo i numeri senza ripetizioni in un array da 5
        che andranno poi nella base della piramide*/
        printf("Array A pseudo-random di partenza in ultima fila: ");
        /*Visualizzo l'array da 5 di partenza*/
        int b[5][5], 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;
                }
            }
    
        }
    
        int k;
        for(k=0; k<5; k++)
        {printf("%3d", b[4][k]);}
    
        printf("\n\n\n\n");
        /*Gestisco le operazioni di sottrazione con 2 cicli for annidati e un if per avere il valore assoluto e
        non avere numeri negativi in sottrazione*/
        int colonna, riga, numero1, numero2;
    
           for(riga=3; riga>=0; --riga)
        {   for(colonna=riga; colonna>=0; --colonna)
    
    
    {
            b[riga][colonna]=b[riga+1][colonna]-b[riga+1][colonna+1];
    
            if(b[riga][colonna]<0)
              b[riga][colonna]=b[riga][colonna]*-1;
    
        }
    }
    /*VORREI PORRE QUI UN IF CON LA FUNCTION TIPO:
    if (confronto)
    { return 0;
    return 1;}
    PERO' NON MI ESCE PIU' NULLA"
    /*Fare una ricerca se nella matrice sono presenti i numeri da 1 a 15*/
    
        printf("\n\n\n");
        int uguali=confronto(numero1,numero2,b);
      while(uguali!=1);
     {   visualizza_array_b(b,5,5);}
    
    }
    
    
    int confronto(int *numero1, int*numero2, int a[5][5]) {
    	int i,j,k;
        int uguali = 0;
    	for (i=0;i<5;i++) {
    		for (j=i+1;j<5;j++) {
    			for (k=0;k<5;k++) {
                    if (a[i][k]==a[j][k]) {
    					uguali = 1;
    			    } else {
    					uguali = 0;
    	                break;
    			    }
    		    }
    			if (uguali) {
    	            *numero1 = i;
    	            *numero2 = j;
    				return uguali;
    	        }
            }
        }
    	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)

    Sinceramente non ho capito cosa stai cercando di fare!

    Quello che ti serve è implementare una funzione
    int fun(int m[5][5], int n);
    che ritorna 1 se il numero n si trova nella porzione utile (ossia tra gli elementi della diagonale principale e tra quelli ad essa sottostanti) della matrice m e 0 altrimenti.

    Ovviamente ci sarebbero anche metodi più efficienti per controllare che la piramide non contenga doppioni (il che equivale a dire che essa è formata da tutti i numeri che vanno da 1 a 15), ma questo mi sembra il più semplice.
    Inoltre volendo si potrebbero anche fare dei controlli in tempo reale e interrompere la "costruzione" della piramide nel momento in cui viene aggiunto un doppione.
  • Re: Aiuto: Triangolo di carte(numeri)

    Volevo con la function "confronto", confrontare tutti i numeri(numero per numero) della piramide dopo le sottrazioni e vedere se ci fossero doppioni, e nel caso ci fossero stati far si di tornare al punto di partenza e come una loop tornare all'inizio, cioè tipo con un do while porre una condizione del tipo: inizia tutto da capo fino a che i numeri non saranno tutti diversi. Ma purtroppo non sono stato abbastanza bravo nello sviluppare l'idea..
    Ovviamente seguirò il tuo consiglio e spero di diventare bravo quanto te esercitandomi, ma non capisco quindi devo aggiungere un'altro array 2d?
    cioè m[5][5]?
    Provo da solo a sviluppare questa function, non so se ci riesco perchè non ho molto ben capito come svilupparla perchè un procedimento tale non l'ho mai visto, però ci provo, grazie sempre del tuo affiancamento in questo progetto sto davvero apprezzando molto il tuo prezioso aiuto ti tengo aggiornato.
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    Volevo con la function "confronto", confrontare tutti i numeri(numero per numero) della piramide dopo le sottrazioni e vedere se ci fossero doppioni, e nel caso ci fossero stati far si di tornare al punto di partenza e come una loop tornare all'inizio, cioè tipo con un do while porre una condizione del tipo: inizia tutto da capo fino a che i numeri non saranno tutti diversi.
    Come già detto, nel caso specifico, verificare l'assenza di doppioni nella piramide equivale a verificare che la stessa è formata dai numeri che vanno da 1 a 15. Da qui il mio consiglio sulla funzione fun().

    icniVad ha scritto:


    ma non capisco quindi devo aggiungere un'altro array 2d?
    cioè m[5][5]?
    No no, è una funzione che richiami dal main con argomenti la matrice b e un numero da 1 a 15.

    icniVad ha scritto:


    Provo da solo a sviluppare questa function, non so se ci riesco perchè non ho molto ben capito come svilupparla perchè un procedimento tale non l'ho mai visto, però ci provo, grazie sempre del tuo affiancamento in questo progetto sto davvero apprezzando molto il tuo prezioso aiuto ti tengo aggiornato.
    Di niente! Cmq non è difficile, è come verificare se un valore è presente all'interno di un array, solo che qui al posto dell''array abbiamo una porzione specifica di una matrice quadrata.
  • Re: Aiuto: Triangolo di carte(numeri)

    Ah ok ok, allora mi metto subito all'opera che non vedo l'ora di finire questo progetto, spero di prendere dimestichezza con il tempo perchè
    nonostante avendo studiato tutta la teoria per l'esame, la pratica a me risulta ancora un pochetto difficile .
    Ti tengo aggiornato, grazie sempre
Devi accedere o registrarti per scrivere nel forum
99 risposte