Help quadrato magico

di il
38 risposte

Help quadrato magico

Buongiorno e buona domenica a tutti.
Avrei bisogno di un aiuto sul seguente esercizio in C.
Il testo chiede inserite le dimensioni di una matrice, si devono generare i numeri casuali da 1 a n^2.
Fatto ciò bisogna verificare che la matrice generata sia un quadrato magico.
Tutto ciò il codice deve essere eseguito 1000 volte, e alla fine mi deve calcolare la probabilità che la matrice sia un quadrato magico.

Io ho due dubbi principali:
1) come inserire che i numeri vadano da 1 a n^2;
2) come eseguire il codice 1000 volte, e ogni volta memorizzare se è un quadrato magico, per poi poter calcolare la probabilità:

Ovviamente se ci sono altri errori nel codice segnalatemeli pure.


#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

int main ()
{
    int array[10][10];
     int i, j, m, n, y, l, sum,sumcol, sumdiag,smd=0;
    int prob;

     printf("inserisci le dimensioni della matrice\n");
     scanf("%d %d", &m, &n);
     for(y=0;y<10;y++){
    srand((unsigned)time(NULL));
 for (i=0; i<n; i++)
 for (j=0; j<m; j++)
 array[i][j] = rand()%10;
    
     for (i = 0; i < m; ++i)
     {
         sum=0;
         for (j = 0; j < n; ++j)
         {
             sum = sum + array[i][j] ;
         }

     }


     for (j = 0; j < n; ++j)
     {
         sumcol=0;
         for (i = 0; i < m; ++i)
         {
             sumcol = sumcol + array[i][j];
         }

     }

     sumdiag = 0;
         for (i = 0; i < n; i++)
         {
             for (j = 0; j < m; j++)
             {
                 if(i==j){
                    sumdiag=sumdiag+array[i][j];

                 }


             }

         }


         for(i = 0; i < n; i++)
             {
                 for(j = 0; j < n; j++)
                 {
                     if(i + j == n-1)
                      smd=smd + array[i][j];
                 }
             }
                   if(sum==sumcol==sumdiag==smd){
                        l=1;

                    }else{
                        l=0;

                   }
              prob=l/10*100;
              printf("%d ", prob);
     }

system("pause");
return 0;
}

Scusate il post domenicale ed eventuali errori, ma sono un neofita.

Grazie

38 Risposte

  • Re: Help quadrato magico

    Un quadrato ha dimensioni nxn e quindi m non c'entra nulla.

    La srand va usata una sola volta all'inizio del programma

    Nella documentazione della rand trovi come generare un valore random tra un min e un max

    Tutto il codice che genera la matrice e la controlla deve stare in un ciclo for e accumulerai i risultati in un contatore

    P.S. non mettere help nel titolo ...
  • Re: Help quadrato magico

    Scusa per l'Help nel titolo.

    Potresti essere un po più specifico su questa parte "tutto il codice che genera la matrice e la controlla deve stare in un ciclo for e accumulerai i risultati in un contatore", per piacere.

    Grazie
  • Re: Help quadrato magico

    Come posso esserlo? Non è chiaro? In pratica

    azzera cont
    ciclo for da 1 a 1000
    ___genera_valori_in matrice
    ___controlla_quadrato_magico
    ___se_quadrato_magico aumenta_cont
    fine ciclo for
  • Re: Help quadrato magico

    Grazie Oregon, ci sto lavorando un po.
    Qualora ci dovessero essere problemi spero sempre nella tua disponibilità qui sul forum
  • Re: Help quadrato magico

    Mi sorge un dubbio... sei sicuro di aver capito bene cosa sono i quadrati magici?

    Lo sai che l'istruzione
    array[i][j] = rand()%10;
    può anche generare lo stesso numero più volte?

    Inoltre dalla traccia
    Il testo chiede inserite le dimensioni di una matrice, si devono generare i numeri casuali da 1 a n^2.
    mi sembra di intuire che il quadrato generato debba (potenzialmente) essere non un semplice quadrato magico, ma un quadrato magico perfetto!
    Conosci la differenza?
  • Re: Help quadrato magico

    Ho provato per curiosità a lanciare la funzione random con questo codice (che stampa valori tra 1 e 25)
    srand(time(NULL));
    for(i=0; i<100; i++){
    num = rand() % DIM*DIM + 1;
    printf("%d ",num);
    e mi stampa 100 volte solo le cifre 1, 21, 11, 6, non è pochino per essere "random"?
    edit: anche con 1000 aggiunge solo il 16 alle cifre di sopra
  • Re: Help quadrato magico

    Nippolo ha scritto:


    Mi sorge un dubbio... sei sicuro di aver capito bene cosa sono i quadrati magici?

    Lo sai che l'istruzione
    array[i][j] = rand()%10;
    può anche generare lo stesso numero più volte?

    Inoltre dalla traccia
    Il testo chiede inserite le dimensioni di una matrice, si devono generare i numeri casuali da 1 a n^2.
    mi sembra di intuire che il quadrato generato debba (potenzialmente) essere non un semplice quadrato magico, ma un quadrato magico perfetto!
    Conosci la differenza?
    Certo che conosco la differenza trai due!
    Non ci avevo pensato però potesse essere un quadrato magico perfetto, grazie per avermelo fatto notare
  • Re: Help quadrato magico

    enricoscarsissimo ha scritto:


    Ho provato ...
    Occhio alla precedenza degli operatori

    num = rand() % (DIM*DIM) + 1;
  • Re: Help quadrato magico

    Ops
  • Re: Help quadrato magico

    Secondo voi è corretto?
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #define TRUE 1
    #define FALSE 0
    
    int main ()
    {
        int array[10][10];
        int i, j, n, y, l, sum,sumcol, sumdiag,smd=0;
        int prob;
        int cont;
    
         printf("inserisci le dimensioni della matrice\n");
         scanf("%d", &n);
    
    cont = 0;
    l= n*n;
    for (y=0;y<1000;y++) {
    
    
     for (i=0; i<n; i++){
    
     for (j=0; j<n; j++){
    array[i][j] = rand()%l+1;
    
     }
     }
    
    for (i = 0; i < n; ++i)
            {
           printf("\n");
                for (j = 0; j < n; ++j)
                {
                   printf("|%d|",array[i][j]);
                }
    }
    
         for (i = 0; i < n; ++i)
         {
             sum=0;
             for (j = 0; j < n; ++j)
             {
                 sum = sum + array[i][j] ;
             }
    
         }
    
    
         for (j = 0; j < n; ++j)
         {
             sumcol=0;
             for (i = 0; i < n; ++i)
             {
                 sumcol = sumcol + array[i][j];
             }
    
         }
    
         sumdiag = 0;
             for (i = 0; i < n; i++)
             {
                 for (j = 0; j < n; j++)
                 {
                     if(i==j){
                        sumdiag=sumdiag+array[i][j];
    
                     }
    
    
                 }
    
             }
    
    
             for(i = 0; i < n; i++)
                 {
                     for(j = 0; j < n; j++)
                     {
                         if(i + j == n-1)
                          smd=smd + array[i][j];
                     }
    
                 }
    
    
                 if(sum==sumcol==sumdiag==smd){
                                     cont++;
                                     printf("\nla matrice restituisce %d\n",TRUE);
    
                                  }
                                  else{
                                     printf("\nla matrice restituisce %d\n",FALSE);
                                  }
    
                 }
                 prob = (cont/1000)*100;
                 printf("\nla probabilita' e' %d\n",prob);
                 system("pause");
                 return 0;
    }
    
    
    Mi potete dare un consiglio su come generare numeri casuali non uguali?

    Grazie
  • Re: Help quadrato magico

    L'unica idea che viene in mente a me è generare il valore random all'interno di un ciclo che fa il confronto con gli altri elementi della matrice, se già è presente lo riprova finchè non ne trova uno diverso (puoi utilizzare una flag per uscire dal ciclo)
  • Re: Help quadrato magico

    Lol ho appena scoperto che attraverso questo sistema posso risolvere il sudoku in un modo moolto più semplice
  • Re: Help quadrato magico

    enricoscarsissimo ha scritto:


    Lol ho appena scoperto che attraverso questo sistema posso risolvere il sudoku in un modo moolto più semplice
    Ottimo mi fa piacere che un mio dubbio, abbia scaturito in te l'intuizione per risolvere un problema.
    P.s. grazie per il consiglio precedente
  • Re: Help quadrato magico

    Comunque mi piaceva l'esercizio e lo sto facendo anchio, ti posto il codice di quello che dicevo (anche se l'ho inserita in una funzione ausiliaria)
    qui c'è il pezzo di codice che genera il numero
    num = rand() % (DIM*DIM) + 1;
    	while(confronto(num,mat)==1)
    			num = rand() % (DIM*DIM) + 1;
    qui quella che verifica che la matrice sia composta da valori diversi:
    int confronto(int num,int mat[][DIM]){
    	int i,j;
    	for(i=0; i<DIM; i++){
    		for(j=0; j<DIM; j++)
    			if(num == mat[i][j])
    				return 1;
    	}
    	return 0;
    
    }
    
Devi accedere o registrarti per scrivere nel forum
38 risposte