Aiuto: Triangolo di carte(numeri)

di il
99 risposte

Aiuto: Triangolo di carte(numeri)

Ragazzi innanzitutto buonasera, e scusate il disturbo..
Sono davvero in difficoltà e non riesco a completare questo almeno in apparenza semplice programma.
Sono riuscito ad arrivare fino a questo punto, mi aiutate?
Devo inserire credo l'ultima condizione per far si che i numeri non si ripetano.
Avendo studiato tutto il programma teorico non riesco bene ad applicare dei concetti del linguaggio c pur conoscendo la teoria.
Grazie di cuore. Ecco la traccia:

Si vuole sviluppare un programma per verificare se da un array di 5 interi generati a caso
([6, 14, 15, 3, 13] in figura) è possibile costruire un triangolo. Si suppone di avere 15
numeri consecutivi da 1 a 15. Il gioco richiede che ogni carta sia la differenza tra le due
carte che le stanno immediatamente sotto, a sinistra e a destra. Un esempio è il seguente:
5
4 9
7 11 2
8 1 12 10
6 14 15 3 13
Effettuare almeno 5 simulazioni generando dei numeri interi casuali.


Questo è il punto in cui sono arrivato e mi sono bloccato.
Triangolo di carte

#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));
    int t;
    printf("Numeri: ");
    for(t=0; t<15; t++)
    {printf("%3d", numeri[t]);}
    printf("\n\n");

    int a[5], z;
    printf("Array A pseudo-random di partenza in ultima fila: ");
    for(z=0; z<5; z++)
    {a[z]=1+rand()%15;}
    visualizza_array_a(a,5);

    int b[5][5];

    printf("\n\n\n\n");

    int v;
    for(v=0; v<5; v++)
    {b[4][v]=a[v];}


    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]);
}


/*La piramide la visualizzo a forma di triangolo equilatero, nell'anteprima non risulta ma la function visualizza è scritta in modo corretto*/
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");

}
}

99 Risposte

  • Re: Aiuto: Triangolo di carte(numeri)

    Usa i tag code per il codice
  • Re: Aiuto: Triangolo di carte(numeri)

    Ciao oregon e grazie di avermi risposto, in che senso dovrei utilizzare dei tag code?
    Credo di non averli mai utilizzati, mi sapresti indicare come e dove inserirli?
    Grazie mille.
  • Re: Aiuto: Triangolo di carte(numeri)

    Per il codice nel forum, hai notato che non si capisce nulla? leggi il regolamento
  • Re: Aiuto: Triangolo di carte(numeri)

    Fatto, grazie oregon non avevo letto ancora il regolamento.
  • Re: Aiuto: Triangolo di carte(numeri)

    icniVad ha scritto:


    Fatto, grazie oregon non avevo letto ancora il regolamento.
    veramente ancora non l'hai usato il tag CODE
  • Re: Aiuto: Triangolo di carte(numeri)

    Immagine dell'editor completo:

  • Re: Aiuto: Triangolo di carte(numeri)

    Ecco credo stavolta di averlo fatto grazie Nippolo
  • Re: Aiuto: Triangolo di carte(numeri)

    Ragazzi aiutatemi vi prego sono proprio bloccato
  • Re: Aiuto: Triangolo di carte(numeri)

    Se ho ben capito vuoi verificare che la piramide contenga tutti numeri diversi, ossia, nello specifico, tutti i numeri da 1 a 15, giusto?
    In tal caso per prima cosa dovresti controllare che anche i 5 numeri casuali costituenti la base siano diversi fra di loro, altrimenti non ha nemmeno senso costruire il triangolo.
    Detto questo il tuo problema può essere generalizzato come il voler controllare che un array a contenga, anche in ordine sparso, tutti gli elementi (supposti tra loro diversi) di un array b. Ciò può essere fatto in vari modi:
    - controlli che ogni elemento di b sia contenuto in a;
    - ordini a e b e controlli se i due array coincidono;
    - utilizzi come tabella hash un array delle giuste dimensioni per tenere conto dei valori già presi;
    ...

    Ti lancio un paio di sfide:
    - generalizzare il programma per piramidi di base N;
    - utilizzare un array al posto della matrice per contenere la piramide.

    P.S.
    Mettici più impegno nell'indentazione!

    P.P.S
    Ho provato io stesso ad implementare il programma e, supponendo di non aver commesso errori, ti assicuro che 5 simulazioni sono pochine... per ottenere una piramide valida infatti sono necessarie in media 300.000 simulazioni!
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo ti ringrazio davvero tanto per i consigli dati, mi riconcentro allora per una migliore indentazione come mi hai detto tu, e riprovo a costruire la piramide su un solo array, spero di riuscire perchè ho proprio difficoltà.
    Ti tengo aggiornato, a volte un piccolo aiuto è proprio importante..
    Grazie grazie grazie.
  • Re: Aiuto: Triangolo di carte(numeri)

    Di niente, fammi sapere!
  • Re: Aiuto: Triangolo di carte(numeri)

    Nippolo, io penso di aver quasi finito, ma non riesco a porre la giusta condizione per le operazioni di sottrazione nel 3° for che riguarda i numeri "display",
    mi sono ribloccato invio fino a che punto sono arrivato
    #include <stdio.h>
    #include <stdlib.h>
    
    void visualizza_piramide(int a[], int n);
    
    void main()
    
    {
        srand(time(NULL));
        int a[5];
        int i, n=5;
        for(i=0; i<n; i++)
        {a[i]=1+rand()%15;}
        int b[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        /*finchè non saranno uguali i due array prova*/
        /*COMPARAZIONE 2 array.*/
        printf("L'array è:\n\n");
        visualizza_piramide(a,n);
    
    }
    
    void visualizza_piramide(int a[], int n)
    {
        int i, j, k, coef;
        for(i=0; i<n; i++)/*RIGHE*/
        {
            for(j=1; j<=n-i; j++)/*COLONNE*/
                printf("    ");
            {
                for(k=0; k <=i; k++)/*DISPLAY*/
    
                {
                /*la condizione in questo corpo*/
          
     printf("  %4d  ", );
    }
    printf("\n\n");
    }
    }
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Forse sto avanzando..
    #include <stdio.h>
    #include <stdlib.h>
    
    void visualizza_piramide(int a[], int n);
    
    void main()
    
    {
    
        int a[5];
        int i, n=5;
        int b[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        /*finchè non saranno uguali i due array prova*/
        /*COMPARAZIONE 2 array.*/
        printf("L'array è:\n\n");
        visualizza_piramide(a,n);
    
    }
    
    void visualizza_piramide(int a[], int n)
    {
        int i, j, k, coef;
        for(i=0; i<n; i++)/*RIGHE*/
        {
            for(j=1; j<=n-i; j++)/*COLONNE*/
                printf("    ");
            {
                for(k=0; k <=i; k++)/*DISPLAY*/
    
                {
                    {a[k]=1+rand()%15;}
    
                /*la condizione in questo corpo sto provando ad utilizzare un while, adesso ho i numeri pseudocasuali,
                ho bisogno di avere le sottrazioni*/
               
            {printf("  %4d  ", a[k]);}
    
    
    
    }
    printf("\n\n");
    }
    }
    }
    
  • Re: Aiuto: Triangolo di carte(numeri)

    Guarda, il codice iniziale nonostante fosse grezzo, incompleto e con qualche problema da risolvere, aveva cmq un senso... qui invece non capisco ciò che stai cercando di fare!
    Potresti spiegare l'algoritmo a cui hai pensato?
Devi accedere o registrarti per scrivere nel forum
99 risposte