Problema programma in C

Boxyes
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");
}
}

Risposte
porcellins1212
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)

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

Quinzio
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.


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

Boxyes
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:)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.