Problema programma in C
Salve, sono un matematico e mi diletto in programmazione... sto costruendomi un programmino e mi serve trasformare i vettori in matrici; ho fatto questo prgramma che trasforma i vettori in matrici quadrate... ma non mi da il risultato sperato potete dire dove sbaglio?
#include
#include
#include
int main()
{
int j,k,t,x,y,z;
printf("\n Inserire lunghezza vettore: ");
scanf("%d", &j); \qui chiedo la lunghezza del vettore\
fflush(stdin);
k=j-1;
float i;
int v[k];
i=sqrt(j);
t=sqrt(j); \qui controllo se la lunghezza è quadrata\
if (i==t)
{
for (x=0;x<=k;x++)
{
printf("dammi il valore numero %d del vettore", x); \ora prendo i singli valori\
scanf("%d", &v[x]);
fflush(stdin);
}
y=t-1;
int M[y][y];
for (x=0;x<=k;x++)
{
int x_1, x_2, q;
x_1= x%t; \ho notato che la posizione su una matrice dipende dalla divisione\
q=x/t; \modulo... facendo un paio di prove si vede che torna\
x_2=q%t;
M[x_2][x_1]=v[x];
}
for (x=0;x<=y;x++) \però una volta alla stampa non torna\
{
for (z=0;z<=y;z++)
{
printf("%d ", M[x][z] );
}
printf("\n");
}
}
else
{
printf ("\n inserire vettore quadrato grazie");
}
}
#include
#include
#include
int main()
{
int j,k,t,x,y,z;
printf("\n Inserire lunghezza vettore: ");
scanf("%d", &j); \qui chiedo la lunghezza del vettore\
fflush(stdin);
k=j-1;
float i;
int v[k];
i=sqrt(j);
t=sqrt(j); \qui controllo se la lunghezza è quadrata\
if (i==t)
{
for (x=0;x<=k;x++)
{
printf("dammi il valore numero %d del vettore", x); \ora prendo i singli valori\
scanf("%d", &v[x]);
fflush(stdin);
}
y=t-1;
int M[y][y];
for (x=0;x<=k;x++)
{
int x_1, x_2, q;
x_1= x%t; \ho notato che la posizione su una matrice dipende dalla divisione\
q=x/t; \modulo... facendo un paio di prove si vede che torna\
x_2=q%t;
M[x_2][x_1]=v[x];
}
for (x=0;x<=y;x++) \però una volta alla stampa non torna\
{
for (z=0;z<=y;z++)
{
printf("%d ", M[x][z] );
}
printf("\n");
}
}
else
{
printf ("\n inserire vettore quadrato grazie");
}
}
Risposte
Ciao! Potrei sapere se ti dà errore in fase di compilazione e qual è il risultato che ti esce fuori?
Perché compilando mi dà errore sulla riga 15, dove assegni a t, che è un int, la radice quadrata di j che è un double, senza fare la conversione. Comunque appena finisco i miei esercizi ci do un'occhiata più approfondita
EDIT: dovrebbe essere così (però ho considerato il fatto che, a quanto ho capito, vuoi una matrice quadrata. In effetti si potrebbe costruire una matrice $r*c$ qualsiasi basta che $r*c=$lunghezza vettore)
Perché compilando mi dà errore sulla riga 15, dove assegni a t, che è un int, la radice quadrata di j che è un double, senza fare la conversione. Comunque appena finisco i miei esercizi ci do un'occhiata più approfondita

EDIT: dovrebbe essere così (però ho considerato il fatto che, a quanto ho capito, vuoi una matrice quadrata. In effetti si potrebbe costruire una matrice $r*c$ qualsiasi basta che $r*c=$lunghezza vettore)
#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 100 int main(){ int lung,i,r,c,sroot,vet[N],val,mat[N][N];; printf("Quanto e' lungo il tuo vettore?\n"); scanf("%d", &lung); sroot=(int)sqrt(lung); if(lung!=sroot*sroot||lung>N){ printf("Non e' possibile trasformare il vettore in una matrice\n"); } else{ for(i=0;i<lung;i++){ printf("Inserire un numero\n"); scanf("%d", &vet[i]); } for(r=0;r<sroot;r++){ for(c=0;c<sroot;c++){ mat[r][c]=vet[(sroot*r)+c]; } } } for(r=0;r<sroot;r++){ printf("\n"); for(c=0;c<sroot;c++){ printf("%d ", mat[r][c]); } } printf("\n"); system("PAUSE"); }
Non so che compilatore usi perchè i commenti non sono quelli standard del C.
In ogni caso, il problema è la dichiarazione
int M[y][y];
La matrice M viene definita e allocata in fase di compilazione, non quando il programma è in esecuzione. E in fase di compilazione la variabile y non è inizializzata, quindi vai ad usare una matrice di cui non si conosce l'effettiva dimensione.
O si usa l'allocazione dinamica di memoria o si definisce la matrice con una dimensione massima prestabilita.
Un'altra cosa che non ho capito è quando calcoli gli indici per riempire M.
Dai un occhio al mio codice e guarda le differenze.
PS Provato su Codeblocks.
In ogni caso, il problema è la dichiarazione
int M[y][y];
La matrice M viene definita e allocata in fase di compilazione, non quando il programma è in esecuzione. E in fase di compilazione la variabile y non è inizializzata, quindi vai ad usare una matrice di cui non si conosce l'effettiva dimensione.
O si usa l'allocazione dinamica di memoria o si definisce la matrice con una dimensione massima prestabilita.
Un'altra cosa che non ho capito è quando calcoli gli indici per riempire M.
Dai un occhio al mio codice e guarda le differenze.
PS Provato su Codeblocks.
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int j,k,t,x,y,z; int M[10][10]={{0}}; printf("\n Inserire lunghezza vettore: "); scanf("%d", &j); //qui chiedo la lunghezza del vettore fflush(stdin); k=j-1; float i; int v[k]; i=sqrt(j); t=sqrt(j); //qui controllo se la lunghezza è quadrata if (i==t) { for (x=0; x<=k; x++) { printf("dammi il valore numero %d del vettore", x); //ora prendo i singli valori scanf("%d", &v[x]); fflush(stdin); } y=t-1; for (x=0; x<=k; x++) { int x_1, x_2; x_1= x%t; //ho notato che la posizione su una matrice dipende dalla divisione //q=x/t; //modulo... facendo un paio di prove si vede che torna //x_2=q%t; x_2=x/t; M[x_2][x_1]=v[x]; } for (x=0; x<=y; x++) //però una volta alla stampa non torna { for (z=0; z<=y; z++) { printf("%d ", M[x][z] ); } printf("\n"); } } else { printf ("\n inserire vettore quadrato grazie"); } return 0; }
Grazie a tutti; ora funziona, era evidentemente il problema di non aver dichiarato la matrice prima... sì mi scuso per i commenti in latere, li ho aggiunti dopo e ho sbagliato la dicitura:)