controllare se una matrice NxN è magica

« Older   Newer »
  Share  
tonno16
view post Posted on 28/10/2012, 17:36




ciao a tutti.
ripropongo un altro problema magari anche più bello rispetto all'altro.

conoscete tutti il quadrato magico??? ebbene è un quadrato ovvero una matrice di ordine pari o dispari dove la somma delle righe è uguale alla somma delle colonne, ed anche alla somma delle diagonali (nnel caso di matrice con ordine dispari).

IN RETE C' E' UN ALGORITMO APPOSITAMENTE CREATO PER IL QUADRATO MAGICO --> ecco non voglio adottare quella soluzione poichè vietata dalla professoressa.

inizio cosi: chiedi in input il numero di righe ---> ovvero anche numero di colonne. L'utente le inserisce.
il mio ragionamento:

calcolo la somma di riga 1.
se la somma di riga 2 è uguale il cilo incrementa e calcola se la somma della riga 3 è = alla somma della riga 1. questi ciclo va avanti finche ci sono righe che verificano tale condizione. se non c'è la condizione pensavo asd un printf( non è magico ) e un break:

sono arirvato a calcolare solo le somme delle righe, non ho idea di come ragionare in verticale. le chiocciole le ho messe nel punto in cui credo che anche le somme delle colonne debbano essere calcolate.

CITAZIONE
CODICE
#include <stdio.h>
#include <stdlib.h>

int main(){
 
   
   int i,n,rig=0,col,k=1;  //k per le righe
   int somma;
   int sommarig[100];
   
   printf("    PROGRAMMA CHE DATA UNA MATRICE IN INPUT VERIFICHI SE E UN QUADRATO MAGICO \n\n");
   
   while(rig<=0){
       printf(" inserisci il grado dellamatrice quadrata --> ");
       scanf("%d", &rig);
   }
   col=rig;    
   
   int numero[i][n];
   sommarig[0]=0;
   
   
   for(i=1;i<=rig;i++){
       somma=0;
       for(n=1;n<=col;n++){
           printf(" inserisci il numero di posizione-> riga %d colonna %d \n", i,n);
           scanf("%d", &numero[i][n]);
           somma=somma+numero[i][n];
           
           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
       
       } // ho appena inserito i valori di un intera riga  
     
      sommarig[k]=somma;  //abbiamo le somme di tutte le righe
      k++;
      printf("\n");

   
   }
   
   
   for(k=1;k<=rig;k++){      // ***********  ELENCO DELLE SOMME DELLE RIGHE A VIDEO
       printf("somma della riga %d --> %d\n", k,sommarig[k]);
   }    
   
   
 
   
   printf("\n\n stampa della matrice\n\n");   // ********** STAMPA A VIDEO DELLA MATRICE ******+
   for(i=1;i<=rig;i++){
       for(n=1;n<=col;n++){
           printf("%d ", numero[i][n]);
        }
       printf("\n\n");  
   }  
   
   
   
 

system("pause");
return 0;
}

COME FARE???'
 
Top
-Wolfy-
view post Posted on 28/10/2012, 19:41




Se serve posso indicarti qualche bravo stregone :unsure:
 
Top
tonno16
view post Posted on 29/10/2012, 09:33




Ma Wolfy. Se sono scarso in questa materia ok. Qui in questa aula di 200 persone
170 sono ai miei livelli. Per cui se sei gentile puoi aiutarmi...altrimenti non comprendo il tuo messaggio
 
Top
-Wolfy-
view post Posted on 29/10/2012, 13:57




Non è questione di essere gentili o meno, è questione di come ci si pone nei confronti delle persone a cui si chiede aiuto...
 
Top
Arma95
view post Posted on 29/10/2012, 15:54




Apparte che nella battuta simpatica di Wolfy, riferita al quadrato MAGICO (banale gioco di parole, no?), non capisco cosa ci sia di maleducato D:
Su questo forum siamo sempre stati ironici, forse non te lo ricordi più perchè di punto in bianco te ne sei andato e sei scomparso, fino ad oggi in cui evidentemente hai bisogno di aiuto con i compiti, o forse veramente sentivi la mancanza del nostro affetto (ma ti prego, lasciami il beneficio del dubbio (anche se i miei dubbi sono ben pochi a riguardo), sei tornato e pronti via hai messo due richieste di aiuto per dei compiti senza quasi salutare dopo tanto tempo, abbi pazienza).

Per quanto riguarda il quadrato magico, sono i classici esercizi che fanno fare anche a scuola, dovrei averlo da qualche parte quello che feci l'anno scorso in ANSI C, appena ho tempo vedo di darti qualche dritta (se mai avrò tempo :lol:)

Edited by Arma95 - 29/10/2012, 17:08
 
Top
tonno16
view post Posted on 29/10/2012, 20:04




me ne sono andato per il semplice fatto che non ho più tempo di fare altre cose. Nel frattempo partecipo ad altri forum...di telefonia. E' VERO, NON RICORDO PIù COME SI STA QUI...NEGLI ALTRI FORUM INTERVENTI TIPO WOLFY NON CONSIDERATI UTILI VENGONO SEMPLICEMENTE VISTI MALE O VENGONO SEGNALATI (te lo posso dimostrare).

PER CUI WOLFY TI CHIEDO SCUSA.

riprendendo il problema. sono arrivato a creare un array per le somme delle righe e uno per le colonne.
poi creo due cicli for dove in uno analizzo la somma delle righe e verifico allo stesso tempo se la sommariga[n] equivale alla sommariga[1]
cosi la variabile magico=1

tralascio il problema delle computazioni. In questo problema so che il calcolatore potrebbe eseguire un algoritmo più efficiente, ma serei più interessato a capire come finirlo. Uno migliore potrò visionarlo o sotto vostro consiglio, o dalla prof, anche se solo fra 7 giorni.

la somma si diagonali colonne e righe funziona. Non so come impostare delle condizioni di eguaglianza fra le variabile somme trovate.

codice:
CITAZIONE
CODICE
#include <stdio.h>
#include <stdlib.h>

int main(){
 
   int i,n,rig=0,col,k=1;  //k per le righe
   int somma,magico=1;
   int sommarig[100];
   
   printf("    PROGRAMMA CHE DATA UNA MATRICE IN INPUT VERIFICHI SE E UN QUADRATO MAGICO \n\n");
   
   while(rig<=0){
       printf(" inserisci il grado dellamatrice quadrata --> ");
       scanf("%d", &rig);
   }
   col=rig;    
   
   int numero[i][n];
   sommarig[0]=0;
   
   for(i=1;i<=rig;i++){
       somma=0;
       
       for(n=1;n<=col;n++){
           printf(" inserisci il numero di posizione-> riga %d colonna %d \n", i,n);
           scanf("%d", &numero[i][n]);
       } // ho appena inserito i valori di un intera riga  
   }
   
   printf("\n\n stampa della matrice\n\n");   // ********** STAMPA A VIDEO DELLA MATRICE ******+
   for(i=1;i<=rig;i++){
       for(n=1;n<=col;n++){
           printf("  %d  ", numero[i][n]);
        }
       printf("\n\n");  
   }  
   
   int riga[100];          // ****** CALCOLO SOMME DELLE RIGHE E VERIFICA SE SONO UGUALI
   for(n=1;n<=rig;n++){
       int somma_riga=0;  
       for(i=1;i<=rig;i++){
                   somma_riga=somma_riga+numero[n][i]; // somma tot RIGA     il PRIMO termine decide 1° riga..2°riga
       riga[n]=somma_riga;
       }
     
     if(riga[n]==riga[1]){ magico=1; }
     else{ magico=0; }
   }
       
   int colonna[100];          // ****** CALCOLO SOMME DELLE COLONNE E VERIFICHA SE SONO UGUALI
   for(i=1;i<=col;i++){
       int somma_colonna=0;  
       for(n=1;n<=col;n++){
                   somma_colonna=somma_colonna+numero[n][i]; // somma tot COLONNA     il PRIMO termine decide 1° COLONNA..2°COLONNA
        colonna[i]=somma_colonna;
       }
     
     if(colonna[i]==colonna[1]){ magico=1; }
     else{ magico=0; }
   }
   
   
   int sommadiagonale1=0;    //  CALCOLO SOMMA DIAGONALE PRINCIPALE 1********
   for(i=1;i<=rig;i++){
       for(n=1;n<=col;n++){
           if(i==n){ sommadiagonale1=sommadiagonale1+numero[i][n]; }
        }
   }
   
   int sommadiagonale2=0;   // CALCOLO SOMMA DIAGONALE SECONDARIA 2
   i=1;
   for(n=rig;n>0;n--){
              sommadiagonale2=sommadiagonale2+numero[i][n];
          i++;
         
   }
   
   
   
   
   
   
   
   if(magico==1){ printf("\n\n il quadrato inserito e' magico"); }  // CONTROLLO FINALE
   else { printf("\n\n  il quadrato inserito non e magico \n\n");  }
 

system("pause");
return 0;
}

 
Top
Arma95
view post Posted on 29/10/2012, 21:16




CITAZIONE (tonno16 @ 29/10/2012, 20:04) 
me ne sono andato per il semplice fatto che non ho più tempo di fare altre cose. Nel frattempo partecipo ad altri forum...di telefonia. E' VERO, NON RICORDO PIù COME SI STA QUI...NEGLI ALTRI FORUM INTERVENTI TIPO WOLFY NON CONSIDERATI UTILI VENGONO SEMPLICEMENTE VISTI MALE O VENGONO SEGNALATI (te lo posso dimostrare).

E tornatene sugli altri forum, non so che dirti! Si parla tranquillamente e tu attacchi!
Ti abbiamo fatto notare che ci ha dato fastidio, saremo anche in torto marcio, ma non mi sembra comunque il caso di fare una discussione chilometrica partendo da una battuta! Qua il forum è sempre funzionato così, se ti va bene è così, se non ti va bene, così rimane!
Non ti sta bene? Faccelo notare in modo più pacato, discutiamone magari anche in privato! Non mi pare si sia detto nulla di così tremendo! <_<
 
Top
view post Posted on 29/10/2012, 22:40
Avatar

Insopportabile

Group:
Hobbisti
Posts:
1,077
Location:
Hill Valley-California

Status:


Arma tornatene a lucidare valvole u.u
 
Top
tonno16
view post Posted on 4/11/2012, 16:07




bhe sono arrivato ad una conclusione dell' esercizio lavorando sulla condizione finale. MI auguro di aver fatto bene, inoltre la professoressa ha convalidato l'esercizio.

posto qui nel caso qualcuno gli servisse:

CITAZIONE
CODICE
#include <stdio.h>
#include <stdlib.h>

int main(){
 
   int i,n,rig=0;  //k per le righe
   int numero[10][10];
   int sommadiagonale1=0, sommadiagonale2=0;
   int primasomma,somma_riga=0,somma_colonna=0;
   
   printf("    PROGRAMMA CHE DATA UNA MATRICE IN INPUT VERIFICHI SE E UN QUADRATO MAGICO \n\n");
   while(rig<=0){
       printf(" inserisci il grado dellamatrice quadrata (MAX 10)--> ");
       scanf("%d", &rig);
   }  
// ********** INSERIMENTO TERMINI ****************
   for(i=1;i<=rig;i++){
       for(n=1;n<=rig;n++){
           printf(" inserisci il numero di posizione-> riga %d colonna %d \n", i,n);
           scanf("%d", &numero[i][n]);
       }
   }
   
// ********** STAMPA A VIDEO DELLA MATRICE ********
   printf("\n\n stampa della matrice\n\n");    
   for(i=1;i<=rig;i++){
       for(n=1;n<=rig;n++){
           printf("  %d  ", numero[i][n]);
        }
       printf("\n\n");  
   }  
   
//  CALCOLO SOMMA DIAGONALE PRINCIPALE 1********
   for(i=1;i<=rig;i++){
       for(n=1;n<=rig;n++){
           if(i==n){ sommadiagonale1=sommadiagonale1+numero[i][n]; }
        }
   }
// ***** CALCOLO SOMMA DIAGONALE SECONDARIA 2
   i=1;
   for(n=rig;n>0;n--){
              sommadiagonale2=sommadiagonale2+numero[i][n];
              i++;
   }
   
// ***** definisco la variabile PRIMA SOMMA che è la somma della prima riga.
   for (n=1;n<=rig;n++){
       somma_riga=somma_riga+numero[1][n]; // sommo gli elementi della prima riga
   }
   primasomma=somma_riga;
   printf("prima somma = %d \n\n",primasomma);
 
// ****** CALCOLO SOMME DELLE RIGHE E VERIFICA SE RIGA SCANSIONATA è UGUALE ALLA RIGA[1]        
  for(n=1;n<=rig;n++){
       somma_riga=0;  
       for(i=1;i<=rig;i++){
                   somma_riga=somma_riga+numero[n][i]; // somma tot RIGA     il PRIMO termine decide 1° riga..2°riga
       }
     if(somma_riga!=primasomma) {break;}
   }
   
// ****** CALCOLO SOMME DELLE COLONNE E VERIFICHA SE SONO UGUALI
   for(i=1;i<=rig;i++){
       somma_colonna=0;  
       for(n=1;n<=rig;n++){
                   somma_colonna=somma_colonna+numero[n][i]; // somma tot COLONNA     il PRIMO termine decide 1° COLONNA..2°COLONNA
       }
     if(somma_colonna!=primasomma){ break; }
   }
   
  printf("prima somma = %d\n", primasomma);
  printf("somma_riga = %d\n", somma_riga);
  printf("somma_colonna = %d\n", somma_colonna);
  printf("sommadiagonale1 = %d\n", sommadiagonale1);    
   
   if(primasomma==somma_riga && primasomma==somma_colonna && primasomma==sommadiagonale1 && primasomma==sommadiagonale2){
       printf("\n\n il quadrato inserito e' magico \n\n"); }  
   else { printf("\n\n  il quadrato inserito non e magico \n\n");  }
 

system("pause");
return 0;
}

 
Top
Roy Silver
view post Posted on 27/7/2016, 21:15




L'esercizio sembra facile perché devi verificare se un quadrato è magico e non generarlo...
Basta fare le somme di tutte le colonne, righe, diagonali e vertici ergo vedere che faccia sempre M(n) = n*(n^2 + 1 ) * 0.5
 
Top
9 replies since 28/10/2012, 17:36   1436 views
  Share