C - STAMPA DI UNA MATRICE QUADRATA

bibus12


// mettendo +1 in entrambi i casi, faccio partire il contatore 
                                                             // della posizione degli elementi da 1 e non da zero , quindi
                                                             // il contatore parte dalla posizione 11 e non 00!!
                                                             // per fare ciò non modifico


int matrix[2][2]; // cambiando [] cambio numero di righe o colonne


int i,j;


for (i=0 ; i<2; i++) //  IL 2 non si riferisce al numero massimo attribuibile a i o j ma alla posizione massima
                             // attribuibile a i o j poiché i o j sono identificate come posizioni in questo caso dato che       
                            // mi servono come contatore della posizione

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

    printf ("Elemento [%d][%d]: ",i+1 ,j+1 ); // scorre nome posizione da 11 a 22 , se cambiò per esempio
                                                                   // j+2 allora j sarà aumentato nello scorrimento sempre di 1             //rispetto i


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




printf ("la matrice e':\n");
for (i=0; i<2; i++){

for (j=0; j<2; j++)
printf ("%d",matrix[i][j]); 

printf ( "\n"); }




return 0;





Ho scritto questo codice ( funzionante) per immettere da tastiera , e successivamente stampata , una matrice 2x2. Ora vorrei modificare il codice in modo da immettere anche la dimensione da tastiera , e che quindi non fosse più una costante. Potreste aiutarmi dato che dopo diverse prove non ci sono riuscita?

Ho sostituito 2 con N , poi ho aggiunto

printf (" inserisce la dimensione ");
scanf ( "%d" , &N);


Ma non è risultato giusto



Grazie in anticipo

Risposte
giuscri
@ellosma: Mmm ... Cosa vuol dire che non è risultato giusto? Non compila? Stampa schifezza? Copia come vorresti modificare il codice.

Cerca di migliorare anche la leggibilità, però: ti consiglio di togliere tutti quei commenti e di curare di più l'indentazione -anche se lo so che quando si copia del codice sul forum s'incasina da sola. :lol:

bibus12
Allora , spiegare che accada quando cercò di compilare il codice e' un po' un casino poiché non uso dev CPP ma c\c++ compiler , una app per ipad ( ho un pc ma è rotto :( ). Comunque , quando lo compilo mi chiede la dimensione della matrice , poi mi chiede il numero da inserire nel posto [1][1] della matrice MA DOPO QUESTA POSIZIONE GLI ALTRI POSIZIONAMENTI SONO SBALLATI. se per esempio digito dimensione 2 , gli unici posizionamenti che escono sono [1][1] e [1][2], ma mancano 21 e 22. dopo avere inserito i numeri ( solo due ) in questi due posizionamenti ( se la dimensione e' due ) il programma li stampa ma arrivato al momento di stampare la matrice incolonnata mi stampa una matrice che non ha nulla a che fare !

Quello che vorrei come output e':
Inserisci dimensione : 2 ( per ex )
Elemento [1][1] : 1
... È così via per gli altri
La matrice e : 1 0
0 1 ( per esempio )

Ora, il programma funziona perfettamente nel primo caso poiché la dimensione e' una costante. Per fare in modo che invece la dimensione non fosse costante e che il programma mi stampasse una qualsiasi matrice quadrata , ho scritto IN AGGIUNTA

#include
int main () {
int n;
printf("Inserisci la dimesione della matrice quadrata: ");
scanf("%d", &n);

int i,j;
int matrix[n][n];
for (i=0 ; i
for (j=0; j
printf ("Elemento [%d][%d]: ",i+1 ,j+1 );
scanf ("%d",&matrix[j]);
}

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

return 0;
}

giuscri
"ellosma":
Allora , spiegare che accada quando cercò di compilare il codice e' un po' un casino poiché non uso dev CPP ma c\c++ compiler , una app per ipad ( ho un pc ma è rotto :( ). Comunque , quando lo compilo mi chiede la dimensione della matrice , poi mi chiede il numero da inserire nel posto [1][1] della matrice MA DOPO QUESTA POSIZIONE GLI ALTRI POSIZIONAMENTI SONO SBALLATI. se per esempio digito dimensione 2 , gli unici posizionamenti che escono sono [1][1] e [1][2], ma mancano 21 e 22. dopo avere inserito i numeri ( solo due ) in questi due posizionamenti ( se la dimensione e' due ) il programma li stampa ma arrivato al momento di stampare la matrice incolonnata mi stampa una matrice che non ha nulla a che fare !

Quello che vorrei come output e':
Inserisci dimensione : 2 ( per ex )
Elemento [1][1] : 1
... È così via per gli altri
La matrice e : 1 0
0 1 ( per esempio )

Ora, il programma funziona perfettamente nel primo caso poiché la dimensione e' una costante. Per fare in modo che invece la dimensione non fosse costante e che il programma mi stampasse una qualsiasi matrice quadrata , ho scritto IN AGGIUNTA

#include<stdio.h>
int main () {
int n;
printf("Inserisci la dimesione della matrice quadrata: ");
scanf("%d", &n);

int i,j;
int matrix[n][n];
for (i=0 ; i<n; i++)

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

printf ("Elemento [%d][%d]: ",i+1 ,j+1 );
scanf ("%d",&matrix[i][j]);
}

printf ("la matrice e':\n");
for (i=0; i<n; i++){

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

return 0;
}



Guardandolo così non mi salta nulla all'occhio. Ad ogni modo, commentino noioso: la compilazione rende il codice sorgente un eseguibile. Eseguire il codice non ha niente a che vedere con la compilazione. Domani provo a riguardare il codice, comunque. Ad ogni modo non ho capito: la compilazione ha successo, vero? Altrimenti che cosa staresti eseguendo? ...

bibus12
Ok, scusa , ho ancora molto da imparare! La compilazione ha successo e questo e' l'output se inserisco come dimensione della matrice il numero 2:

Inserisci la dimesione della matrice quadrata: 2
Elemento [1][1]: 1
Elemento [2][1]: 2
la matrice e':
00
01

bibus12

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



Sono riuscita a sistemare ( spero ) il contatore del posizionamento degli elementi ( [1][1] ) , e la stampa degli elementi digitati da tastiera e' corretta. Però non riesco a capire il motivo percui la stampa della matrice in griglia non è effettuata. Non essend molto pratica ho lasciato la porzione di codice che avevo scritto per il programma in dimensione predefinita2 , ma non effettua alcuna stampa in griglia. Anzi continua a chiederai di digitare da tastiera la matrice ( un numero )

giuscri
"ellosma":

#include<stdio.h>
int main() {
int matrix[riga][colonna];
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+
    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;}



Sono riuscita a sistemare ( spero ) il contatore del posizionamento degli elementi ( [1][1] ) , e la stampa degli elementi digitati da tastiera e' corretta. Però non riesco a capire il motivo percui la stampa della matrice in griglia non è effettuata. Non essend molto pratica ho lasciato la porzione di codice che avevo scritto per il programma in dimensione predefinita2 , ma non effettua alcuna stampa in griglia. Anzi continua a chiederai di digitare da tastiera la matrice ( un numero )


A parte che usi le variabili riga e colonna prima di dichiararle ... Ma prima di questo frammento non lo facevi, quindi non dire che l'errore più grosso stia lì.
Anche riguardando il codice con più concentrazione non mi viene in mente nulla. Ma non mandarmi ...! :lol: Un sospetto ce l'ho: prendila come opinione più che altro. Definire la dimensione di un array a run-time (cioè durante l'esecuzione del programma) è consentito in C secondo lo standard del 1995, non secondo quello del 1990. Sebbene non ti sappia dire perchè, ti dico che mi è stato spesso sconsigliato farlo.

Ora: ti consiglio di cercare di capire bene perchè il tuo programma non funziona, però se intanto hai bisogno di codice funzionante puoi definire, come costante, una dimensione massima -e creare una matrice di quelle dimensioni- e in base alle richieste dell'utente riempire più o meno la matrice, stampando solo fino a dove è stata riempita.

// ...
const int N = 50;
int matrix[N][N];
int num_righe;
int num_colonne;

printf ( "numero righe :" );
scanf ( "%d", &num_righe);

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

int i, j;
for (i = 0; i < num_righe; i++)
  for (j = 0; j < num_colonne; j++)
  {
   printf ("Elemento [%d][%d]: ",i+1 ,j+1 );
   scanf ("%d",&matrix[i][j]);
  }

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

// ...


Sarebbe meglio arrivasse qualcuno a chiarire il mistero ... :roll:

claudio862
Anche io non vedo problemi nel programma del terzo post (però consiglio di racchiudere sempre il contenuto di for, if e while tra parentesi graffe, anche se si tratta di un'unica istruzione).
Forse il problema potrebbe essere proprio nel compilatore, che non supporta gli array a dimensione variabile (@giuscri gli anni degli standard dovrebbero essere 89 e 99, per il resto è corretto). Dovresti cercare di capire che compilatore (o interprete? Da una rapida ricerca non sembra possibile eseguire programmi su iPad, quindi staresti usando un interprete) tu stia usando, e quale versione del linguaggio supporti.

Gli array a dimensione variabile dovrebbero essere usati con moderazione perché:
- Sono supportati solo in C99 e successivi. Non in versioni del C più vecchie, né in alcuna versione del C++ (alcuni compilatori li supportano come estensione dello standard, ma altri no).
- Sono allocati sullo stack, che è abbastanza piccolo. Se la dimensione viene chiesta all'utente (come in questo caso), quest'ultimo potrebbe inserire un valore troppo grande.

P.S.
Una volta aggiustato il PC, sbarazzati di Dev-CPP e installa un IDE di questo decennio. Code::Blocks, Visual studio, QtCreator, Eclipse, Netbeans…

giuscri
[ot]
"claudio86":

- Sono allocati sullo stack, che è abbastanza piccolo. Se la dimensione viene chiesta all'utente (come in questo caso), quest'ultimo potrebbe inserire un valore troppo grande.


Ma i vettori di dimensione definita durante la compilazione non sono ugualmente allocati sullo stack?[/ot]

claudio862
[ot]
"giuscri":
Ma i vettori di dimensione definita durante la compilazione non sono ugualmente allocati sullo stack?


Sì, ma di quelli la dimensione la decidi tu, non l'utente. Se crei un array a dimensione fissa troppo grande te ne accorgi durante la compilazione (se il compilatore è abbastanza intelligente), o durante i test. Se invece crei un array dinamico del quale chiedi le dimensioni all'utente, non hai alcun controllo sul valore inserito da quest'ultimo. Magari gli scappa uno zero di troppo e vai in stack overflow.

Di contro, essendo lo stack molto più veloce dello heap, in certi particolari contesti potrebbero essere la scelta migliore.[/ot]

giuscri
[ot]
"claudio86":
[quote="giuscri"]Ma i vettori di dimensione definita durante la compilazione non sono ugualmente allocati sullo stack?


Sì, ma di quelli la dimensione la decidi tu, non l'utente. Se crei un array a dimensione fissa troppo grande te ne accorgi durante la compilazione (se il compilatore è abbastanza intelligente), o durante i test. Se invece crei un array dinamico del quale chiedi le dimensioni all'utente, non hai alcun controllo sul valore inserito da quest'ultimo. Magari gli scappa uno zero di troppo e vai in stack overflow.

Di contro, essendo lo stack molto più veloce dello heap, in certi particolari contesti potrebbero essere la scelta migliore.[/quote]

Ok, ora capisco di più! :wink:[/ot]

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