PDA

Visualizza la versione completa : [C] Caricamento di una matrice a spirale


MaLaKiAn.SP
17-02-2011, 11:48
Salve,
stavo progettando questo programma che carica una matrice da un file seguendo un andamento degli indici "a spirale".

Il programma, però, anche se mi sembra logicamente corretto, non funziona...

Create un file e riempitelo così:

4
1 8 7 2 3 4 9 1 5 7 3 2 5 4 7 8

Questo, invece, è il codice:

#include <stdio.h>
#include <stdlib.h>
#define M 20

int caricaSpirale(int mat[][M]);
void stampaMatrice(int mat[][M], int dim);

int main()
{
int dim;
int mat[M][M];

dim=caricaSpirale(mat);
if (dim==-1)
{
printf("Errore\n");
system("PAUSE");
exit(1);
}
else
{
stampaMatrice(mat,dim);

printf("\n");
system("PAUSE");
}
}

int caricaSpirale(int mat[][M])
{
FILE* f;
int dim,est,dimOLD,j,i,temp;
char nomeFile[M];
printf("\nInserisci nome file:\t");
scanf("%s", nomeFile);
f=fopen(nomeFile,"r");

if (f==NULL)
{
fclose(f);
return -1;
}
else
{
fscanf(f,"%d",&dimOLD);
dim=dimOLD-1;

for (i=0; i<dim; i++)
for (j=0; j<dim; j++)
mat[i][j]=0;
printf("OK");


for (est=0; est<=dim/2; est++)
{
for (j=est; j<=dim-est; j++)
{
fscanf(f, "%d", temp);
mat[est][j]=temp;
// printf("%d %d\n", est, j);
}
for (i=est+1; i<=dim-est; i++)
{
fscanf(f, "%d", temp);
mat[i][dim-est]=temp;
// printf("%d %d\n", i, dim-est);
}
for (j=dim-est-1; j>=est; j--)
{
fscanf(f, "%d", temp);
mat[dim-est][j]=temp;
// printf("%d %d\n", dim-est, j);
}
for (i=dim-est-1; i>=est+1; i--)
{
fscanf(f, "%d", temp);
mat[i][est]=temp;
// printf("%d %d\n", i, est);
}
}
fclose(f);
return dim;
}
}

void stampaMatrice(int mat[][M], int dim)
{
int i,j;

printf("\n");
for (i=0; i<dim; i++)
{
for (j=0; j<dim; j++)
printf("%d\t", mat[i][j]);
printf("\n");
}
}

Grazie degli eventuali aiuti. :ciauz:

Alex'87
17-02-2011, 11:50
Originariamente inviato da MaLaKiAn.SP
Salve,
stavo progettando questo programma che carica una matrice da un file seguendo un andamento degli indici "a spirale".Definisci "andamento degli indici 'a spirale'".


Originariamente inviato da MaLaKiAn.SP
Questo, invece, è il codice:

#include <stdio.h>
#include <stdlib.h>
#define M 20

int caricaSpirale(int mat[][M]);
void stampaMatrice(int mat[][M], int dim);

int main()
{
int dim;
int mat[M][M];

Grazie degli eventuali aiuti. :ciauz: Il codice è tutto qui?

MaLaKiAn.SP
17-02-2011, 12:00
Scusate, mi sono sbagliato a inserire il codice..
Ecco il codice completo:

#include <stdio.h>
#include <stdlib.h>
#define M 20

int caricaSpirale(int mat[][M]);
void stampaMatrice(int mat[][M], int dim);

int main()
{
int dim;
int mat[M][M];

dim=caricaSpirale(mat);
if (dim==-1)
{
printf("Errore\n");
system("PAUSE");
exit(1);
}
else
{
stampaMatrice(mat,dim);

printf("\n");
system("PAUSE");
}
}

int caricaSpirale(int mat[][M])
{
FILE* f;
int dim,est,dimOLD,j,i,temp;
char nomeFile[M];
printf("\nInserisci nome file:\t");
scanf("%s", nomeFile);
f=fopen(nomeFile,"r");

if (f==NULL)
{
fclose(f);
return -1;
}
else
{
fscanf(f,"%d",&dimOLD);
dim=dimOLD-1;

for (i=0; i<dim; i++)
for (j=0; j<dim; j++)
mat[i][j]=0;
printf("OK");


for (est=0; est<=dim/2; est++)
{
for (j=est; j<=dim-est; j++)
{
fscanf(f, "%d", temp);
mat[est][j]=temp;
// printf("%d %d\n", est, j);
}
for (i=est+1; i<=dim-est; i++)
{
fscanf(f, "%d", temp);
mat[i][dim-est]=temp;
// printf("%d %d\n", i, dim-est);
}
for (j=dim-est-1; j>=est; j--)
{
fscanf(f, "%d", temp);
mat[dim-est][j]=temp;
// printf("%d %d\n", dim-est, j);
}
for (i=dim-est-1; i>=est+1; i--)
{
fscanf(f, "%d", temp);
mat[i][est]=temp;
// printf("%d %d\n", i, est);
}
}
fclose(f);
return dim;
}
}

void stampaMatrice(int mat[][M], int dim)
{
int i,j;

printf("\n");
for (i=0; i<dim; i++)
{
for (j=0; j<dim; j++)
printf("%d\t", mat[i][j]);
printf("\n");
}
}

Grazie degli aiuti..

Alex'87
17-02-2011, 12:21
Ancora non hai spiegato cosa intendi con "andamento degli indici 'a spirale'"...

MaLaKiAn.SP
17-02-2011, 15:19
Originariamente inviato da Alex'87
Ancora non hai spiegato cosa intendi con "andamento degli indici 'a spirale'"...

Intendo che la matrice viene riempita facendo un percorso simil "spirale"... Cioè, vengono riempiti prima i lati esterni e poi si passa a quelli più interni. L'immagine chiarirà meglio cosa intendo:
http://img692.imageshack.us/img692/7113/imm3agine.png

Loading