[C++] help matrice quadrata
raga non riesco a fare una cosa semplicissima...una matrice quadrata da caricare e stampare.
Mi escono solo gli ultimi numeri che inserisco ripetuti e non ho capito perchè...vi posto il codice che deve essere semplice:
#include
#include>
using namespace std;
int main(){
int n,i,j;
int mat[n][n];
cout<<"inserire numero righe e colonne:";
cin>>n;
for(i=0;i
for (j=0;j
cin>>mat[j];
}
};
cout<<"la matrice inserita:"<
for (i=0;i
for (j=0;j
cout<[j];
}
cout<
};
};
Mi escono solo gli ultimi numeri che inserisco ripetuti e non ho capito perchè...vi posto il codice che deve essere semplice:
#include
#include
using namespace std;
int main(){
int n,i,j;
int mat[n][n];
cout<<"inserire numero righe e colonne:";
cin>>n;
for(i=0;i
}
};
cout<<"la matrice inserita:"<
cout<
}
cout<
};
Risposte
il motivo principale per cui non funziona è che quando dichiari l'array le sue dimensioni non sono note, infatti già se metti la riga (cin>>n;) prima di (int mat[n][n];) dovrebbe funzionare.
in ogni caso ciò è concettualmente sbagliato in quanto nel c++ le dimensioni di un array statico devono essere prefissate al momento della sua dichiarazione e non possono essere modificate durante l'esecuzione del programma.
se vuoi fissare o modificare le dimensioni di un array durante l'esecuzione del programma dovresti sfruttare gli array dinamici e i puntatori, ma credo che per il momento non ti interessi...
quindi nel tuo caso dichiari per esempio un array 20x20, ma andrai a considerare solo gli elementi in comune alle prime n righe e colonne (ovviamente n dovrà essere <=20 ).
inoltre la libreria stdio.h non serve e dopo le parentesi graffe non va messo il punto e virgola.
ti suggerisco inoltre di indentare il codice.
ecco come andrebbe fatto il programmino
in ogni caso ciò è concettualmente sbagliato in quanto nel c++ le dimensioni di un array statico devono essere prefissate al momento della sua dichiarazione e non possono essere modificate durante l'esecuzione del programma.
se vuoi fissare o modificare le dimensioni di un array durante l'esecuzione del programma dovresti sfruttare gli array dinamici e i puntatori, ma credo che per il momento non ti interessi...
quindi nel tuo caso dichiari per esempio un array 20x20, ma andrai a considerare solo gli elementi in comune alle prime n righe e colonne (ovviamente n dovrà essere <=20 ).
inoltre la libreria stdio.h non serve e dopo le parentesi graffe non va messo il punto e virgola.
ti suggerisco inoltre di indentare il codice.
ecco come andrebbe fatto il programmino
#include <iostream> using namespace std; int main() { int n, v[20][20]; cout << "Dimensione matrice quadrata (MAX 20): "; cin >> n; for(int i = 0; i < n; i++) { cout << endl; for(int j = 0; j < n; j++) { cout << "v[" << i << "][" << j << "] = "; cin >> v[i][j]; } } cout << endl << "MATRICE:"; for(int i = 0; i < n; i++) { cout << endl; for(int j = 0; j < n; j++) { cout << v[i][j] << "\t"; } } }
okkey tnx ho risolto...il problema ora si è evoluto. Devo indicare se la matrice è diagonale, triangolare superiore o nessuna delle due. Ho svolto il codice che mi sembra corretto, ma il programma non mi riporta le risposte giuste...posto:
using namespace std;
int main(){
int n;
int v=0;
int k=0;
int l=0;
cout<<"inserire numero righe e colonne della matrice quadrata:"<
cin>>n;
int mat[n][n];
cout<<"inserire elementi:"<
for (int i=0;i
for (int j=0;j
cin>>mat[j];
}
}
cout<<"la matrice visualizzata e':"<
for(int i=0;i
for (int j=0;j
cout<[j];
}
cout<
}
for(int i=0;i
for (int j=0;j
if (i==j){ //verifica gli elementi sulla diagonale principale e se uno è uguale a 0 assegna v=1 matrice non diagonale
if (mat[j]==0);
v=1;
}
if (i!=j){ //verifica gli elementi fuori della diagonale e se uno solo non è uguale a 0 inserisce l=1 matrice non diagonale
if (mat[j]!=0)
l=1;
}
if (j
if (mat[j]!=0)
k=1;
}
}
}
if (v==0&&l==0&&k==0){ //k=0 e v=0 indicano una matrice diagonale e triangolare superiore quindi triangolare
cout<
cout<<"triangolare superiore";
}
if (v==0 && l==0 &&k==1){ //v=0 indica una matrice diagonale
cout<
cout<<"diagonale";
}
if (v==1&&l==1&&k==1){ //entrambi pari a 1 indicano nessuna delle precedenti
cout<
cout<<"nessuna delle precedenti";
}
}
using namespace std;
int main(){
int n;
int v=0;
int k=0;
int l=0;
cout<<"inserire numero righe e colonne della matrice quadrata:"<
int mat[n][n];
cout<<"inserire elementi:"<
}
}
cout<<"la matrice visualizzata e':"<
}
cout<
for(int i=0;i
if (mat[j]==0);
v=1;
}
if (i!=j){ //verifica gli elementi fuori della diagonale e se uno solo non è uguale a 0 inserisce l=1 matrice non diagonale
if (mat[j]!=0)
l=1;
}
if (j
if (mat[j]!=0)
k=1;
}
}
}
if (v==0&&l==0&&k==0){ //k=0 e v=0 indicano una matrice diagonale e triangolare superiore quindi triangolare
cout<
}
if (v==0 && l==0 &&k==1){ //v=0 indica una matrice diagonale
cout<
}
if (v==1&&l==1&&k==1){ //entrambi pari a 1 indicano nessuna delle precedenti
cout<
}
}
L'uso di mat[n][n] è vietato dallo standard C++ anche se permesso dalle estensioni di GCC e dallo standard C99 e C11 (nota però che tu non stai programmando in C ma in C++). Visual Studio non ti compilerebbe quel codice. Come ti ha detto Super Squirrel dovresti usare la programmazione dinamica o una matrice di dimensione fissata sufficientemente grande.
Adesso guardo il resto del codice, ma se non formatti e usi il tag code diventa difficile leggere il tuo codice.
Adesso guardo il resto del codice, ma se non formatti e usi il tag code diventa difficile leggere il tuo codice.
non ho avuto problemi col c++ nell'utilizzare questa matrice...ripeto che deve essere semplice il codice.
Praticamente diciamo che mi va' un po' tutto ma ho problemi nella risposta,ovvero gli if non mi funzionano come dovrebbero...non riportano i valori esatti.
Praticamente diciamo che mi va' un po' tutto ma ho problemi nella risposta,ovvero gli if non mi funzionano come dovrebbero...non riportano i valori esatti.
voi come risolvereste?
Non hai avuto problemi perché hai compilato con un solo compilatore e senza modificare le condizioni standard del compilatore. Il tuo codice compila perché stai usando minGW con le estensioni di GCC, ma non è portabile.
Nota che una matrice è diagonale se è sia triangolare superiore che triangolare inferiore. Quindi una matrice non è nessuna delle due se non è triangolare superiore. Inoltre ti potrebbe convenire testare la condizione di essere triangolare inferiore piuttosto che la diagonabilità.
Il tutto lo si può fare in un singolo ciclo, considero la sola condizione di essere triangolare superiore. Supponi di trovarti nella posizione \(\displaystyle (i,j) \) e di voler aggiornare il bool is_trup.
Abbiamo quindi la seguente tabella della verità con A = is_trup, B = (i < j), C = (mat[j] == 0) e R è il valore aggiornato di is_trup
La variabile bool is_trlw (se è lower triangular) si comporta in modo simile ma ha B = (i > j).
Quindi l'aggiornamento di is_trup si può fare per esempio con l'assegnazione
Alternativamente puoi anche usare altre condizioni simili, un if+assegnazione appropriato, oppure puoi sommare i valori assoluti degli elementi sotto la diagonale (ma ti richiederebbe di gestire l'overflow).
Nota che una matrice è diagonale se è sia triangolare superiore che triangolare inferiore. Quindi una matrice non è nessuna delle due se non è triangolare superiore. Inoltre ti potrebbe convenire testare la condizione di essere triangolare inferiore piuttosto che la diagonabilità.
Il tutto lo si può fare in un singolo ciclo, considero la sola condizione di essere triangolare superiore. Supponi di trovarti nella posizione \(\displaystyle (i,j) \) e di voler aggiornare il bool is_trup.
Abbiamo quindi la seguente tabella della verità con A = is_trup, B = (i < j), C = (mat[j] == 0) e R è il valore aggiornato di is_trup
\(\displaystyle A\) | \(\displaystyle B \) | \(\displaystyle C \) | \(\displaystyle R \) |
---|---|---|---|
T | T | T | T |
F | F | T | F |
T | T | F | F |
F | T | T | F |
T | F | F | F |
T | F | F | F |
La variabile bool is_trlw (se è lower triangular) si comporta in modo simile ma ha B = (i > j).
Quindi l'aggiornamento di is_trup si può fare per esempio con l'assegnazione
is_trup = is_trup && ((i >= j) || (mat[i][j] == 0));equivalente a \(\displaystyle R = A\wedge (\overline{B}\vee C) \). Ovviamente modificando il for in maniera appropriata diventa inutile testare B, ma ti richiede di fare un ciclo per ogni test invece di raggrupparli.
Alternativamente puoi anche usare altre condizioni simili, un if+assegnazione appropriato, oppure puoi sommare i valori assoluti degli elementi sotto la diagonale (ma ti richiederebbe di gestire l'overflow).
ti dico la verità non mi è molto chiaro quanto hai scritto
una matrice formata da tutti 0 è triangolare superiore?
diciamo che ho risolto grazie ai bool che mi hanno reso le cose più chiare...
#include
using namespace std;
int main(){
int n; //numero di elementi della matrice
bool diagsup=true; //se true gli elementi della diagonale inferiore sono tutti 0, altrimenti false
bool diag=true; //se true gli elementi della diagonale sono diversi da 0 e la matrice è diagonale
bool diaginf=true; //se true gli elementi della diagonale superiore sono tutti 0
cout<<"inserire numero righe e colonne della matrice quadrata:"<
cin>>n;
int mat[n][n];
cout<<"inserire elementi:"<
for (int i=0;i
for (int j=0;j
cin>>mat[j];
}
}
cout<<"la matrice visualizzata e':"<
for(int i=0;i
for (int j=0;j
cout<[j];
}
cout<
}
for(int i=0;i
for (int j=0;j
if (i==j){ //verifica gli elementi sulla diagonale principale e se uno è uguale a 0 assegna a diag=1 matrice non diagonale
if (mat[j]==0)
diag=false;
}
}
}
for(int i=0;i
for (int j=0;j
if (i>j){ //verifica gli elementi sotto la diagonale e se uno solo non è uguale a 0 la matrice non è diagonale superiore
if (mat[j]!=0)
diagsup=false;
}
}
}
for(int i=0;i
for (int j=0;j
if (i
if (mat[j]!=0){
diaginf=false;
}
}
}
}
if (diagsup==true){
cout<
cout<<"triangolare superiore";
}
if (diagsup==true&&diaginf==true&&diag==true){
cout<
cout<<"diagonale";
}
if (diagsup==false){
cout<
cout<<"nessuna delle precedenti";
}
}
#include
using namespace std;
int main(){
int n; //numero di elementi della matrice
bool diagsup=true; //se true gli elementi della diagonale inferiore sono tutti 0, altrimenti false
bool diag=true; //se true gli elementi della diagonale sono diversi da 0 e la matrice è diagonale
bool diaginf=true; //se true gli elementi della diagonale superiore sono tutti 0
cout<<"inserire numero righe e colonne della matrice quadrata:"<
int mat[n][n];
cout<<"inserire elementi:"<
}
}
cout<<"la matrice visualizzata e':"<
}
cout<
for(int i=0;i
if (mat[j]==0)
diag=false;
}
}
}
for(int i=0;i
if (mat[j]!=0)
diagsup=false;
}
}
}
for(int i=0;i
if (mat[j]!=0){
diaginf=false;
}
}
}
}
if (diagsup==true){
cout<
}
if (diagsup==true&&diaginf==true&&diag==true){
cout<
}
if (diagsup==false){
cout<
}
}
Una matrice nulla è sia diagonale che triangolare superiore. Il codice mi sembra corretto anche se migliorabile.