[C] stampa matrice

di il
7 risposte

[C] stampa matrice




#include<stdio.h>
int main() {
int matrix[riga][colonna]; // cambiando [] cambio numero di righe o colonne
int i,j;
int riga ;
int colonna;
printf ( "numero righe :" );
scanf ( "%d", &riga);

printf ("numero colonne:" );
scanf ( "%d" , &colonna);

for (i=0 ; i<riga; i++)  

  for (j=0; j<colonna; j++)  {

    printf ("Elemento [%d][%d]: ",i+1 ,j+1 ); 
    scanf ("%d",&matrix[i][j]);  // attribuisco alla stampa precedente , un valore intero da me dato !
}

printf ("la matrice e':\n");
for(i=0 ; i<riga ; i++){
    for(j=0 ; j<colonna ; j++){
      printf(" %d ",  matrix[i][j]       );
    }
   printf("\n");
}
return 0;}




Ciao a tutti , ho scritto questo programma con l'intenzione di
- introdurre da tastiera il numero delle righe e delle colonne della matrice
- introdurre da tastiera gli elementi della matrice , con relativo posizionamento ( tipo "introduci elemento [1][1] :")
-stampa a griglia degli elementi tipo:
1 1
2 0



Il problema che riscontro riguarda l'ultima parte , infatti se digitò una matrice 2x2 ottengo:
numero righe :2
numero colonne:2
Elemento [1][1]: 1
Elemento [1][2]: 2
Elemento [2][1]: 6
Elemento [2][2]: 1
la matrice e':
6647836 6647820
6647836 6647820


Credo che il problema sia in questa porzione di codice ma sinceramente non saprei proprio come risolverlo

for(i=0 ; i<riga ; i++){
    for(j=0 ; j<colonna ; j++){
      printf(" %d ",  matrix[i][j]       );
    }
Ho provato anche spostare la dichiarazione di matrix dopo gli scanf di riga e colonna ma non ho risolto, la matrice e' sbagliata comunque e non vengono stampati corretti nemmeno i contatori delle posizioni degli elementi della matrice ( [1][1] ecc ) , infatti alcuni non compaiono.

Potreste aiutarmi? Grazie

7 Risposte

  • Re: [C] stampa matrice

    Quando esegui

    int matrix[riga][colonna];

    sia riga che colonna non sono state ancora valorizzate.
  • Re: [C] stampa matrice

    Se ho capito quello che intendi ,ho dichiarato riga e colonna senza specificare un valore perché volevo che il valore fosse digitato da tastiera.
  • Re: [C] stampa matrice

    Le linee di programma sono eseguite una dopo l'altra, dalla prima verso l'ultima.

    Nel tuo codice l'array viene preparato prima che tu inserisca i valori di riga e colonna.
    E questo significa che vengono utilizzati i valori (casuali) che hanno quelle due variabili all'inizio del programma e non quelle che tu inserisci dopo.
  • Re: [C] stampa matrice

    Quindi spostando matrix [j] dopo scanf di riga e colonna e sistemando le parentesi graffe nei cicli for dovrei essere a posto?
  • Re: [C] stampa matrice

    Non ci siamo capiti ...

    L'allocazione dell'array deve essere comunque fatto ma dopo aver eseguito le scanf di riga e colonna.

    Non so quale compilatore usi ma non è sempre consentita una allocazione del tipo

    int matrix[riga][colonna];

    con riga e colonna variabili (solo dallo standard C99 viene previsto).

    Altrimenti devi usare l'allocazione dinamica dell'array.

    Non so da quale libro studi e cosa ti è stato detto al corso.
  • Re: [C] stampa matrice

    
    int main()  {
      int **matrix;
      int i,j;
      int m,n;
      printf ("Numero di righe della matrice: ");
      scanf ("%d",&m);
      printf ("Numero di colonne della matrice: ");
      scanf ("%d",&n);
      matrix = (int**) malloc(m*n*sizeof(int));
      // Inizializzo anche tutti i sotto-vettori,
      // ovvero le righe della matrice
      for (i=0; i<m; i++)
        m[i] = (int*) malloc(n*sizeof(int));
      for (i=0; i<m; i++)
        for (j=0; j<n; j++)  {
        printf ("Elemento [%d][%d]: ",i+1,j+1);
        scanf ("%d",&matrix[i][j]);
    }
      for (i=0; i<m; i++)
        for (j=0; j<n; j++)
          printf ("Elemento [%d][%d]: %d\n",i+1,j+1,matrix[i]);
    free(matrix);
    return 0; }
    
    Ho provato a rifarlo ma mi da diversi errori
  • Re: [C] stampa matrice

    Ovviamente ti dà degli errori ...

    1) nella prima malloc allochi lo spazio di (m*n*sizeof(int)) con un puntatore doppio. Se allochi la matrice come se fosse un vettore (m*n) allora non devi utilizzare un puntatore doppio; al contrario, se allochi un puntatore doppio allora devi allocare "m puntatori semplici" (vedi codice che segue)

    2) se allochi m puntatori, questi staranno nel vettore matrix e non in un vettore m che non esiste (m è una variabile); quindi m in realtà sarà matrix

    3) la free deve essere conseguente, in ordine contrario, alle allocazione fatte

    
    int main()  
    {
    	int **matrix;
    	int i,j;
    	int m,n;
    
    	printf ("Numero di righe della matrice: ");
    	scanf ("%d", &m);
    	printf ("Numero di colonne della matrice: ");
    	scanf ("%d", &n);
    
    	matrix = (int**) malloc(m*sizeof(int *));
    	for (i=0; i<m; i++)
    		matrix[i] = (int*) malloc(n*sizeof(int));
    	
    	for (i=0; i<m; i++)
    		for (j=0; j<n; j++)  
    		{
    			printf ("Elemento [%d][%d]: ",i+1,j+1);
    			scanf ("%d",&matrix[i][j]);
    		}
    
    	for (i=0; i<m; i++)
    		for (j=0; j<n; j++)
    			printf ("Elemento [%d][%d]: %d\n",i+1,j+1,matrix[i][j]);
    
    	for (i=0; i<m; i++)
    		free(matrix[i]);
    	free(matrix);
    
    	return 0; 
    }
    
Devi accedere o registrarti per scrivere nel forum
7 risposte