Re: QUADRATO MAGICO

di il
29 risposte

Re: QUADRATO MAGICO

#include <stdio.h>
/*Gioco del Quadrato magico  */
    int somma_righe(int [][100],int ,int );
    int somma_colonne(int [][100],int ,int );
    int somma_prim_diagonale(int [][100],int ,int );
    int somma_secd_diagonale(int [][100],int ,int );
    //int confronto(int [][100],int , int );
int main()
{
    int n,m;
    int i,j;
    int somm_righ, somm_coln,som_p_dg,som_s_dg;
    int a[10][10];

                    //Dimensionamento Matrice
    printf("Inserire le dimensioni del quadrato:\n");
    scanf("%d %d",&n,&m);
                    //Inserimento numeri nell' array

    printf("Inserire i numeri:\n");
    for (i=0;i<n;i++)
    {
        for (j=0;j<m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
                 //Stampa dell'array
    for (i=0;i<n;i++)
    {
        printf("\n");
        for (j=0;j<m;j++)
        {
            printf("|%d|",a[i][j]);
        }
    }

                    //Chiamata delle function
    somm_righ=somma_righe(a[i][j],n,m);
    somm_coln=somma_colonne(a[i][j],n,m);
    som_p_dg=somma_prim_diagonale(a[i][j],n,m);
    som_s_dg=somma_secd_diagonale(a[i][j],n,m);

    if((somm_righ==som_p_dg)&&(somm_coln==somm_righ)&&(somm_coln==som_p_dg)
                            &&(somm_righ==som_s_dg)&&(somm_coln==som_s_dg))
    {
        return 1;
        printf("Il quadrato e'magico",somm_righ);
    }
    else
    {
        return 0;
        printf("Il quadrato non e'magico",somm_coln);
    }

}
int somma_righe(int p_array[][100],int n, int m)
{
    int i,j;
    int som_r=0;

    for (int i = 0; i < n;i++)
    {   som_r=0;
        for (int j = 0; j < m;j++)
        {
            som_r=som_r+p_array[i][j];
        }
    }
return som_r;
}
int somma_colonne(int s_array[][100],int n,int m)
{
    int i,j;
    int som_c=0;

    for (int i = 0; i < m;i++)
    {   som_c=0;
        for (int j = 0; j < n;j++)
        {
            som_c=som_c+s_array[i][j];
        }
    }
    return som_c;

}
int somma_prim_diagonale(int t_array[][100],int n ,int m )
{
    int somm_p_diag=0;
    int i,j;

    for (int i = 0; i < n;i++)
    {   somm_p_diag=0;
        for (int j = 0; j < m;j++)
        {
            if (i==j)
            {
                somm_p_diag=somm_p_diag+t_array[i][j];
            }
        }
    }
    return somm_p_diag;
}
int somma_secd_diagonale(int t_array[][100],int n,int m)
{
    int i,j;
    int som_s_diag=0;
    for(i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (i + j == n - 1)
                som_s_diag = som_s_diag + t_array[i][j];
        }
    }
    return som_s_diag;
}

29 Risposte

  • Re: Re: QUADRATO MAGICO

    Tanto per cominciare usa i tag CODE per il codice perché così non si capisce nulla.

    Poi spiega nel thread e non nel titolo qual è il problema con maggiori dettagli.

    Leggi il regolamento del forum.

    Comunque, da quello che leggo, se prima esegui la return e poi la printf
    
    return 1;
    printf("Il quadrato e'magico",somm_righ);
    
    ovviamente la printf non verrà mai eseguita.
  • Re: Re: QUADRATO MAGICO

    Okay scusami sono nuovo nel forum adesso apporto queste modifiche e poi minimamente non so cosa siano i tag CODE seno li avrei utilizzati. Comunque continua ad uscirmi solamnete il quadrato ma non mi dice se è magico o meno.
  • Re: Re: QUADRATO MAGICO

    Dovevi leggere il regolamento del forum prima di postare altrimenti avresti saputo cosa sono i tag CODE.

    Hai letto la mia risposta precedente sul return?
  • Re: Re: QUADRATO MAGICO

    Ho scritto questo codice per un esercizio di un progetto solo che a me non parte proprio mi sono servito di vecchi post sul forum
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define n 3
    int generazione_num(int [n][n]);         //Serve a non generare numeri uguali insieme al comfronto
    int confronto_num(int [n][n],int );
    int operazioni(int [n][n]);
    int inizializzazione(int [n][n]);
    int stampare(int [n][n]);
    
    int main()
    {
        srand(time(NULL));
        int mat[n][n];
        int f=0;
        int cont=0;
    
        while (f==0)
        {
          generazione_num(mat[n][n]);
          if (operazioni(mat[n][n]))
          {   stampare(mat[n][n]);
              printf("\n\n");
              printf("contatore di probabilità = %d\n", cont);
              f = 1;
          }
          cont++;
        }
        }
    int generazione_num(int mat[][n])
    {
        int i,j;
        int num;
        inizializzazione(mat[n][n]);
        for (i=0;i<n;i++)
        {
            for (int j=0;j<n;j++)
            {
                num=rand()%(n*n)+1;
                while (confronto_num(mat[n][n],num)!=1)
                    num=rand()%(n*n)+1;
                mat[i][j]=num;
            }
        }
    }
    int confronto_num(int mat[][n],int val)
    {
        int i,j;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n;j++)
            {
                if (val == mat[i][j])
                {
                    return 1;
                }
            }
        }
        return 0;
    }
    int operazioni(int mat[][n])
    {
        int i,j;
        int som1=0,som2=0;
    
        //SOMMA RIGHE
        for (int i = 0; i < n;i++)
        {
            for (int j = 0; j < n; j++)
            {
                som1=som1+mat[i][j];
            }
            if (som1!=som2)
                return 0;
        }
        //SOMMA COLONNE
        for (int i = 0; i < n;i++)
        {
            for (int j = 0; j < n; j++)
            {
                som1=som1+mat[j][i];
            }
            if (som1!=som2)
                return 0;
        }
        //SOMMA DIAGONALE 1
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if(i==j)
                    som2=som2+mat[i][j];
            }
        }
        //SOMMA DIAGONALE 2
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if(i+j == n-1)
                    som2=som2+mat[i][j];
            }
        }
    
        //DUE DIAGONALI
        /*for (int i=0,som2=0; i<n,j<n-1; i++,j++)
        {
            som2=som2+mat[i][j];
            if (som2!=som1)
            {
                return 0;
            }
                return 1;
        }*/
    }
    int inizializzazione(int mat[][n]){
        int i,j;
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                mat[i][j]=0;
    }
    int stampare(int mat[][n])
    {
        int i,j;
        for(i=0; i<n; i++){
            for(j=0; j<n; j++)
                printf("%d ",mat[i][j]);
            printf("\n\n");
        }
    
  • Re: Re: QUADRATO MAGICO

    Beh non va bene fare copia incolla senza capire il codice e senza avere una minima preparazione di base. Devi esaminare tutti gli errori che hai in compilazione e correggerli nel codice. Ad esempio, questa riga

    generazione_num(mat[n][n]);

    è sbagliata perché quando chiami la funzione devi fornire solo il nome della matrice

    generazione_num(mat);

    Se vai avanti, controllando tutti gli errori, riesci a compilare. Se poi il codice fa quello che vuoi, questo lo sai tu.
  • Re: Re: QUADRATO MAGICO

    Il codice anche con queste modifiche non fa assolutamente niente io o cercato di apportarlo mano mano capendo ogni parte leggendomi i ragionamenti ma se lo prendo copiato bello e fatto parte in questo caso avendolo modificato e scritto a modo mio non esegue niente anche se non ci sono errori segnalati
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define n 3
    int generazione_num(int [n][n]);         //Serve a non generare numeri uguali insieme al comfronto
    int confronto_num(int [n][n],int );
    int operazioni(int [n][n]);
    int inizializzazione(int [n][n]);
    int stampare(int [n][n]);
    
    int main()
    {
        srand(time(NULL));
        int mat[n][n];
        int f=0;
        int cont=0;
    
        while (f==0)
        {
          generazione_num(mat);
          if (operazioni(mat))
          {   stampare(mat);
              printf("\n\n");
              printf("contatore di probabilità = %d\n", cont);
              f = 1;
          }
          cont++;
        }
        }
    int generazione_num(int mat[][n])
    {
        int i,j;
        int num;
        inizializzazione(mat);
        for (i=0;i<n;i++)
        {
            for (int j=0;j<n;j++)
            {
                num=rand()%(n*n)+1;
                while (confronto_num(mat,num)!=1)
                    num=rand()%(n*n)+1;
                mat[i][j]=num;
            }
        }
    }
    int confronto_num(int mat[][n],int val)
    {
        int i,j;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n;j++)
            {
                if (val == mat[i][j])
                {
                    return 1;
                }
            }
        }
        return 0;
    }
    int operazioni(int mat[][n])
    {
        int i,j;
        int som1=0,som2=0;
    
        //SOMMA RIGHE
        for (int i = 0; i < n;i++)
        {
            for (int j = 0; j < n; j++)
            {
                som1=som1+mat[i][j];
            }
            if (som1!=som2)
                return 0;
        }
        //SOMMA COLONNE
        for (int i = 0; i < n;i++)
        {
            for (int j = 0; j < n; j++)
            {
                som1=som1+mat[j][i];
            }
            if (som1!=som2)
                return 0;
        }
        //SOMMA DIAGONALE 1
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if(i==j)
                    som2=som2+mat[i][j];
            }
        }
        //SOMMA DIAGONALE 2
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if(i+j == n-1)
                    som2=som2+mat[i][j];
            }
        }
    
        //DUE DIAGONALI
        /*for (int i=0,som2=0; i<n,j<n-1; i++,j++)
        {
            som2=som2+mat[i][j];
            if (som2!=som1)
            {
                return 0;
            }
                return 1;
        }*/
    }
    int inizializzazione(int mat[][n]){
        int i,j;
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                mat[i][j]=0;
    }
    int stampare(int mat[][n])
    {
        int i,j;
        for(i=0; i<n; i++){
            for(j=0; j<n; j++)
                printf("%d ",mat[i][j]);
            printf("\n\n");
        }
    }
  • Re: Re: QUADRATO MAGICO

    Comincia a togliere tutta la trafila di funzioni che chiamano funzioni (tra l'altro alcune inutili, perché inizializzare un array può essere fatto in una riga), scrivi tutto nel main e vedi se cominci a capirci qualcosa.

    p.s.: #define n no dai. Digitalo qualche carattere in più
  • Re: Re: QUADRATO MAGICO

    Lo sto rifacend da capo cosi lo capisco meglio, sono arrivato a questo punto dove mi genera il quadrato con numeri uguali (mi serve che lo faccia da 1 a n^2) e gli ho messo la condizione per farli generare diversi ma non stampa niente.

    Per quanto riguarda il define non so come fare senza se hai qualche idea la accetto volentieri ahahhahaha
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define dim 3
    
    int generazione_num_cas(int [][dim]);
    int numeri_diversi(int ,int [][dim]);
    int main()
    {
        int a[10][10];
        int i,j;
    
        //Stampa quadrato
        for (i=0;i<dim;i++)
        {
            printf("\n");
            for (j=0;j<dim;j++)
            {
                printf("|%d|",generazione_num_cas(a[i][j]));
    
            }
        }
    }
    int generazione_num_cas(int a[][dim])
    {
        srand(time(NULL));
    
        int i, j,num;
    
        for (i=0;i<dim;i++)
        {
            for (int j=0;j<dim; j++)
            {
                num=rand()%(dim*dim)+1;
                
                while(num == a[i][j])
                {
                    return 1;
                }
                return 0;
            }
        }
    }
    
    }
  • Re: Re: QUADRATO MAGICO

    Ho provato anche a scriverla cosi per non far generare numeri uguali ma ancora non stampa niente
    int generazione_num_cas(int a[][dim])
    {
        srand(time(NULL));
    
        int i, j,num;
    
        for (i=0;i<dim;i++){
            for (int j=0;j<dim; j++)
            {
                num=rand()%(dim*dim)+1;
                if (num == a[i][j])
                {
                    return 1;
                }
                return 0;
            }
        }
     }
  • Re: Re: QUADRATO MAGICO

    Ammine7 ha scritto:


    Ho provato anche a scriverla cosi per non far generare numeri uguali ma ancora non stampa niente
    int generazione_num_cas(int a[][dim])
    {
        srand(time(NULL));
    
        int i, j,num;
    
        for (i=0;i<dim;i++){
            for (int j=0;j<dim; j++)
            {
                num=rand()%(dim*dim)+1;
                if (num == a[i][j])
                {
                    return 1;
                }
                return 0;
            }
        }
     }
    Ma esattamente cosa ti aspetti? Con questa funzione il return value che poi stampi è zero oppure uno, quasi sicuramente zero perché la matrice non l'hai toccata proprio ed ha valori a caso.
    Scrivi direttamente un esempio di matrice 3x3 o 4x4 che vuoi, che almeno si capisce cosa vuoi fare
  • Re: Re: QUADRATO MAGICO

    Tutti i problemi che hai derivano da una quasi nulla conoscenza del linguaggio e di quello che stai facendo.
    Copi codice senza comprenderlo, fai modifiche senza senso, ti aspetti che tutto funzioni per magia.
    Per completare l'esercizio dovrai studiare tanto tempo oppure dovrai copiarlo pronto per l'uso.°
    Un consiglio del forum non basta.
  • Re: Re: QUADRATO MAGICO

    oregon ha scritto:


    Tutti i problemi che hai derivano da una quasi nulla conoscenza del linguaggio e di quello che stai facendo.
    Copi codice senza comprenderlo, fai modifiche senza senso, ti aspetti che tutto funzioni per magia.
    Per completare l'esercizio dovrai studiare tanto tempo oppure dovrai copiarlo pronto per l'uso.°
    Un consiglio del forum non basta.
    Ciao oregon apprezzo la critica pero vedo che non fai altro, gentilmente se vuoi aiutarmi cercando di farmi capire gli errori saresti di grande aiuto, altrimenti non rispondere che non mi serve sapere che devo studiare. Spero tu capisca cosa intendo non prenderla sul personale.
  • Re: Re: QUADRATO MAGICO

    Weierstrass ha scritto:


    Ammine7 ha scritto:


    Ho provato anche a scriverla cosi per non far generare numeri uguali ma ancora non stampa niente
    int generazione_num_cas(int a[][dim])
    {
        srand(time(NULL));
    
        int i, j,num;
    
        for (i=0;i<dim;i++){
            for (int j=0;j<dim; j++)
            {
                num=rand()%(dim*dim)+1;
                if (num == a[i][j])
                {
                    return 1;
                }
                return 0;
            }
        }
     }
    Ma esattamente cosa ti aspetti? Con questa funzione il return value che poi stampi è zero oppure uno, quasi sicuramente zero perché la matrice non l'hai toccata proprio ed ha valori a caso.
    Scrivi direttamente un esempio di matrice 3x3 o 4x4 che vuoi, che almeno si capisce cosa vuoi fare
    Ho visto anche da un vecchio esercizio sul forum ed è fatto cosi, se lo lancio infatti gia bello e fatto funziona perfettamente, io ho apportato delle modifiche e non funziona se sai aiutarmi saresti di aiuto
  • Re: Re: QUADRATO MAGICO

    Posta il codice originale oppure posta la matrice fatta a manina
    Non siamo telepati
Devi accedere o registrarti per scrivere nel forum
29 risposte