PDA

View Full Version : Quadrato magico (c)


matteo016
03-04-2013, 16:17
Salve, avrei cortesemente bisogno di un aiuto.

mi potreste risolvere questo problema in C? (non C++, solo C)

Data una matrice 3x3, verifica che sia un quadrato magico.

Grazie anticipatamente per l'aiuto e scusate il disturbo.

Hieicker
03-04-2013, 16:21
Hai provato a farlo :)? Hai del codice che hai scritto tu che possiamo vedere? O è proprio una richiesta "fatelo voi per me"?

matteo016
03-04-2013, 16:29
Il problema è che il nostro professore pretende che facciamo gli esercizi senza spiegare, e quindi io non ho la minima idea su come fare, per esempio ho l'algoritmo per caricare la matrice e trovare le diagonali, ma non penso sia utile trovare ogni colonna,ogni riga e tutte le diagonali per verificarlo.

Ci ha detto solamente di costruire un vettore S e un vettore C, ma non riesco a capire come usarli. Grazie ancora e scusa per il disturbo

!fazz
03-04-2013, 16:33
Il problema è che il nostro professore pretende che facciamo gli esercizi senza spiegare, e quindi io non ho la minima idea su come fare, per esempio ho l'algoritmo per caricare la matrice e trovare le diagonali, ma non penso sia utile trovare ogni colonna,ogni riga e tutte le diagonali per verificarlo.

Ci ha detto solamente di costruire un vettore S e un vettore C, ma non riesco a capire come usarli. Grazie ancora e scusa per il disturbo

provaci e dove ti incarti potremmo darti una mano ma non risolviamo i compiti in toto

matteo016
03-04-2013, 16:40
Neanche una mano su come impostarlo? principalmente è questo il problema?

!fazz
03-04-2013, 17:03
Neanche una mano su come impostarlo? principalmente è questo il problema?

tu come lo imposteresti?

e se non riesci a rispondere a quella domanda

cosa vuol dire quadrato magico? --> come posso verificare che sia / non sia un quadrato magico?

matteo016
03-04-2013, 18:35
tu come lo imposteresti?

e se non riesci a rispondere a quella domanda

cosa vuol dire quadrato magico? --> come posso verificare che sia / non sia un quadrato magico?

Allora, un quadrato magico è una matrice speciale, dove la somma dei prodotti nelle colonne, nelle righe e nelle diagonali è uguale.

Posso appunto verificare se lo sia se questa condizione è vera. Giusto?

matteo016
03-04-2013, 20:54
giusto, devi calcolare i prodotti delle righe (3), delle colonne (3) e delle diagonali (2). metti i risultati di ogni calcolo in un vettore. e poi verifichi che il vettore contiene tutti elementi uguali.


Avevo provato a farlo, funziona ma c'è un metodo più veloce?

#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;
}

!fazz
03-04-2013, 23:22
Più veloce praticamente alla prima differenza esci

clockover
04-04-2013, 18:08
Più veloce ancora ogni riga (o colonna o diagonale) deve essere uguale a questo valore (da wikipedia): 1/2 * n * (n^2 + 1)basta che solo una sia diversa allora non è magico