Nippolo ha scritto:
Menefreghista non so, ma un po' svogliato di sicuro... infatti se avessi letto il post che ti ho linkato avresti saputo che la probabilità di generare un quadrato magico è circa 1/45000.
In ogni caso il seme per generare i numeri casuali va inizializzato una sola volta e al fine di rendere l'esecuzione del programma più veloce ti consiglio di limitarti a stampare solo gli eventuali quadrati magici trovati.
P.S.
La funzione operazioni() potrebbe essere migliorata, ma nel complesso mi sembra comunque corretta.
Ciao, ti assicuro che ho letto il tuo post piu volte e dopo aver migliorato il programma mi trovo con te, ora ho implementato alcune cose ma il programma va in loop poi penso sia finito.
Ho un problema nel ciclo while secono me poiche al massimo l'utente puo inserire 3 volte la dimensione del quadrato ma continua all'infinito, non mi dite fallo con i puntatori ecc... perche non sono stato in grado, se potete magari dirmi dove ho sbagliato vi sarei grato, grazie in anticipo.
#include "header.h"
int main()
{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100 //Definisce la massima grandezza del quadrato (es. 3x3/4x4...)
void riempi_arr(int a[][MAX], int); //Riempirlo di 0 per leggere tutta la matrice
int in_arr(int a[][MAX],int num, int ); //per verificare se il numero inserito sia gia presente nella matrice
int operazioni(int a[][MAX],int ,int );
int costante_magica(int );
int contatore;
int conta_volte=3; /*Le vote in cui chiedo di inserire una nuova matrice*/
int trovate_tot=0;
int dim_utente=0;
int a[MAX][MAX];
srand(time(NULL));
while(conta_volte <= 3)
{
conta_volte --;
printf("\n Inserire la dimensione che deve avere il quadrato:");
scanf("%d",&dim_utente);
riempi_arr(a,MAX);
for (contatore = 0;contatore <1000;contatore++)
{
int esecuz_op=0;
riempi_arr(a,dim_utente); //riempimento della matrice
int i, j;
int num;
//Generazione e stampa del quadrato
for (i = 0; i < dim_utente; i++) {
for (j = 0; j < dim_utente; j++) {
while (in_arr(a, num = 1 + rand() % (dim_utente * dim_utente),dim_utente)); //per non far ripetere i numeri
a[i][j] = num;
}
}
int co_mg = costante_magica(dim_utente); //assegnazione costante magica
printf("\n Quadrato numero:%d",contatore);
esecuz_op=operazioni(a, co_mg,dim_utente);
if(esecuz_op == 0) {
printf ("\n ******Trovato****** \n");
trovate_tot++;
printf("\n La percentuale parziale di trovare un quadrato magico e': %f",(trovate_tot*100/(float)contatore));
for (i = 0; i < dim_utente; i++) {
printf("\n"); /*per far si che si visualizzi la forma
*di un quadrato*/
for (j = 0; j < dim_utente; j++) {
printf("|%d|", a[i][j]); /*scrivo la matrice trovata*/
}
}
printf("\n\n Premi invio per continuare a cercare");
getchar(); /*blocca il programma per leggere*/
}
}
printf("\n\n I quadrati che sono stati trovati sono :%d \n ",trovate_tot);
printf("\n La percentuale totale di trovare un quadrato magico e': %f",(trovate_tot*100/(float)contatore));
}
return 0;
}
Se servono anche le function:
int in_arr(int a[][100],int num,int n_ut)
{
for ( int i = 0; i < n_ut; i++) {
for ( int j = 0; j < n_ut; j++){
if(num == a[i][j]){
return 1;
}
}
}
return 0;
}
void riempi_arr(int a[][100],int n_ut)
{
for (int i = 0; i < n_ut; i++) {
for (int j = 0; j < n_ut; j++) {
a[i][j]=0;
}
}
}
int costante_magica(int n_ut)
{
return (n_ut *(n_ut * n_ut + 1)) /2;
}
int operazioni(int a[][100], int magic,int n_ut)
{
int i,j; //(i su righe, j su colonne)
int som_rig,som_col,som_d1,som_d2;
/*controllo delle RIGHE*/
som_rig=0;
for(i=0; i < n_ut;i++) {
for(j=0; j< n_ut; j++)
som_rig+=a[i][j];
if (som_rig!=magic)
return 6; /*6 codice errore sulle righe*/
else
som_rig=0;
}
/*controllo delle COLONNE*/
som_col=0;
for(j=0; j < n_ut; j++){
for(i=0; i < n_ut; i++)
som_col+=a[i][j];
if (som_col!=magic)
return 7; /*7 codice errore sulle righe*/
else
som_col=0;
}
/*controllo della Prima Diagonale Principale (Dx)*/
som_d1=0;
for(i=0; i < n_ut; i++)
som_d1+=a[i][i];
if(som_d1!=magic)
return 8; /*8 codice errore diagonale 1*/
/*controllo della Seconda Diagonale Principale (Sx)*/
som_d2=0;
for(i=0; i < n_ut;i++)
som_d2+=a[i][n_ut-1-i]; /*forse n-i*/
if(som_d2!=magic)
return 9; /*9 codice errore su diagonale 2*/
return 0; /*0 codice che indica che è un quadrato magico*/
}