|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
[c++] Aiuto programmino matrici
ciao a tutti
il prof ci ha assegnato un programmino non troppo complesso che data una matrice qualsiasi quadrata dovrebbe calcolare la somma di tutte le diagonali, anche quelle minori, ovviamente o quelle in questa direzione \ o quelle in questa / io ho fatto in questo modo Codice:
#include <iostream>
using namespace std;
int main() {
int numrighecolonne,
n, // numero totale elementi array diagonale
i, //contatore diagonale
righe, // contatore righe
colonne = 1; //contatore colonne
cout << "Inserire il numero di righe e colonne della matrice";
cin >> numrighecolonne;
n = (numrighecolonne * 2) - 1; // assegna il numero delle diagonali per il tipo di matrice scelta
i = n;
double totdiagonale[n+1]; //dichiara array che contiene la somma degli elementi delle diagonali
double matrice[numrighecolonne] [numrighecolonne]; // array matrice
// Inserisce tutti i valori per la matrice
for(int r = 1, r <= numrighecolonne, r++ ) {
for(int c = 1, c <= numrighecolonne, c++) {
cin >> matrice[r][c];
}
}
// somma gli elementi di matrici e li assegna all'array
for(int r = numrighecolonne, r <= 1, r-- ) {
righe = r;
while(righe <= numrighecolonne) {
totdiagonale[i] += matrice[righe][colonne]
righe++;
colonne++;
i--;
}
}
// stampa l'array
for(i = n, i > (n + 1)/2, i--)
cout << "Somma " << i << "° Diagonale" << endl;
return 0;
}
in pratica ho pensato di fare un cin di tutti gli elementi della matrice e di metterli in un array doppio, e di creare un altro array normale che contenesse le varie somme delle diagonali... poi per quanto riguarda la matrice ho ragionato in questo modo: parto dal primo elemento dell'ultima colonna che non ha una diagonale e salgo con un ciclo for diminuendo gli indicatori di riga, poi con un altro ciclo nidificato sommo in un elemento di un array gli elementi della diagonale, ottenuti aumentando di uno gli indicatori di righe e colonne fin quando l'indicatore di righe non supera il numero prestabilito(cioe quello totale di righe/colonne) il programma non funziona perchè mi da errori di sintassi nei cicli for Codice:
main.cpp:47:2: warning: no newline at end of file main.cpp: In function ‘int main()’: main.cpp:26: error: expected initializer before ‘<=’ token main.cpp:32: error: expected primary-expression before ‘for’ main.cpp:32: error: expected `;' before ‘for’ main.cpp:32: error: expected primary-expression before ‘for’ main.cpp:32: error: expected `)' before ‘for’ main.cpp:32: error: expected initializer before ‘<=’ token main.cpp:42: error: expected primary-expression before ‘for’ main.cpp:42: error: expected `;' before ‘for’ main.cpp:42: error: expected primary-expression before ‘for’ main.cpp:42: error: expected `)' before ‘for’ main.cpp:42: error: expected `;' before ‘)’ token main.cpp:45: error: expected primary-expression before ‘return’ main.cpp:45: error: expected `;' before ‘return’ main.cpp:45: error: expected primary-expression before ‘return’ main.cpp:45: error: expected `)' before ‘return’ ) errori logici, ne ho fatto anche qualcuno stupidissimo di sintassi ![]() mi affido alla vostra enorme saggezza Ultima modifica di -Slash : 28-11-2007 alle 20:02. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Devi usare i ; invece delle virgole dentro alle parentesi dei for, esempio:
Codice:
for(int i=0;i<10;i++) |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
Quote:
ora non da piu nessun errore, solo dopo l'inserimento che funziona bene degli elementi della matrice il programma di chiude... al momento il codice è questo Codice:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int numrighecolonne,
n, // numero totale elementi array diagonale
i, //contatore diagonale
righe, // contatore righe
colonne = 1; //contatore colonne
cout << "Inserire il numero di righe e colonne della matrice" << endl;
cin >> numrighecolonne;
n = (numrighecolonne * 2) - 1;
i = n;
double totdiagonale[n+1];
double matrice[numrighecolonne] [numrighecolonne];
// Inserisce tutti i valori per la matrice
for(int r = 1; r <= numrighecolonne; r++ ) {
for(int c = 1; c <= numrighecolonne; c++) {
cout << "Inserisci elemento " << r << c << endl;
cin >> matrice[r][c];
}
}
for(int r = numrighecolonne; r >= 1; r-- ) {
righe = r;
while(righe <= numrighecolonne) {
totdiagonale[i] += matrice[righe][colonne];
righe++;
colonne++;
i--;
}
}
for(i = n; i > (n + 1)/2; i--)
cout << "Somma " << i << "° Diagonale" << endl;
return 0;
system("PAUSE");
}
Ultima modifica di -Slash : 28-11-2007 alle 20:34. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Prova a mettere un cin a vuoto alla fine oppure un system("pause");
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Ma il System("pause"); l'hai messo dopo il return quindi non verrà mai eseguito...
Ma ti da un errore oppure non dice proprio nulla? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Occhio che le matrici e vettori hanno indici che partono da zero non da uno. Nei for devi partire da 0 e terminare il for un ciclo prima.(fino a numrighecolonne-1 quindi r<numrighecolonne)
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
Quote:
con il system pause mi dice: Somma 5 Diagonale Somma 4 Diagonale con scritto niente ho provato anche a sostituire nel secondo ciclo for(il primo che assegna i valori alle matrici penso sia corretto perchè funziona) il while nidificato con un altro for nidificato, che mi sembra piu elegante, in questo modo Codice:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int numrighecolonne,
n, // numero totale elementi array diagonale
i, //contatore diagonale
colonne = 1; //contatore colonne
cout << "Inserire il numero di righe e colonne della matrice" << endl;
cin >> numrighecolonne;
n = (numrighecolonne * 2) - 1;
i = n;
double totdiagonale[n+1];
double matrice[numrighecolonne] [numrighecolonne];
// Inserisce tutti i valori per la matrice
for(int r = 1; r <= numrighecolonne; r++ ) {
for(int c = 1; c <= numrighecolonne; c++) {
cout << "Inserisci elemento " << r << " - " << c << endl;
cin >> matrice[r][c];
}
}
for(int r = numrighecolonne; r >= 1; r-- ) {
for(int righe = r; righe <= numrighecolonne; righe++) {
totdiagonale[i] += matrice[righe][colonne];
colonne++;
i--;
}
}
/* while(righe <= numrighecolonne) {
totdiagonale[i] += matrice[righe][colonne];
righe++;
colonne++;
i--;
}
*/
for(i = n; i > (n + 1)/2; i--)
cout << "Somma " << i << "° Diagonale" << endl;
system("PAUSE");
return 0;
}
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Ed è normale visto che hai scritto:
Codice:
cout << "Somma " << i << "° Diagonale" << endl; |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Che io sappia non è lecito fare così:
double matrice[numrighecolonne] [numrighecolonne]; dovresti utilizzare l'allocazione dinamica. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2020
|
Vero, numrighecolonne non è una costante.
Ultima modifica di Maverick18 : 29-11-2007 alle 12:50. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
hai il logo Ubuntu ed usi system("PAUSE") ?
qualcosa non mi quadra
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
Quote:
ma perchè faccio questi stupidissimi errori di distrazione Quote:
però nel primo for mi sembra che funzioni, intendo in quello dell'inserimento dei valori... puo darsi in effetti che pero non memorizzi le variabili... comunque nel caso noi sapessimo gia il numero di righe e colonne della matrice e quindi non ci fosse di mezzo l'allocazione dinamica(che penso si faccia in programmazione) l'algoritmo è giusto? infatti me l'hanno chiesto di metterlo, non l'avevo messo proprio per questo motivo: pur stando in quel momento su windows non sono abituato a metterlo perchè sto quasi sempre su linux |
||
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
ragazzi sto provando a riscrivere il programma con il template vector(anche se non l'abbiamo fatto)
Codice:
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
int main() {
int numrighecolonne,
n, // numero totale elementi array diagonale
i, //contatore diagonale
colonne = 1; //contatore colonne
cout << "Inserire il numero di righe e colonne della matrice" << endl;
cin >> numrighecolonne;
n = (numrighecolonne * 2) - 1;
void inputVector(vector< double > &);
void outputVector(vector< double > &);
vector<double> mat(( numrighecolonne ), (numrighecolonne )); //vettore elementi matrice
vector<double> diag( n ); //vettore somma diagonali
cout << "Inserisci gli elementi della Matrice separati da uno spazio" << endl;
inputVector( mat );
i = diag.size();
for(int r = mat.size(); r >= 0; r-- ) {
for(unsigned int righe = r; righe <= mat.size(); righe++) {
diag[i] += mat[righe][colonne];
colonne++;
i--;
}
}
cout << "Le somme delle diagonali sono:" << endl;
outputVector( diag );
system("PAUSE");
return 0;
}
invalid types 'double[int]' for array subscript suggerimenti? |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
Quote:
Codice:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
int numrighecolonne,
n, // numero totale elementi array diagonale
i, //contatore diagonale
colonne = 1; //contatore colonne
cout << "Inserire il numero di righe e colonne della matrice" << endl;
cin >> numrighecolonne;
n = (numrighecolonne * 2) - 1;
void inputVector(vector< double > &);
void outputVector(vector< double > &);
vector<double> mat(( numrighecolonne ), (numrighecolonne )); //vettore elementi matrice
vector<double> diag( n ); //vettore somma diagonali
cout << "Inserisci gli elementi della Matrice separati da uno spazio" << endl;
inputVector( mat );
i = diag.size();
for(int r = mat.size(); r >= 0; r-- ) {
for(unsigned int righe = r; righe <= mat.size(); righe++) {
diag[i] += mat[righe][colonne];
colonne++;
i--;
}
}
cout << "Le somme delle diagonali sono:" << endl;
outputVector( diag );
system("PAUSE");
return 0;
}
void outputVector(vector<double> &array)
{
size_t j;
for( j = 0; j < array.size(); j++) {
cout << setw( 12 ) << array[j];
if(( j + 1 ) % 4 == 0)
cout << endl;
}
}
void inputVector( vector<double> &array )
{
for(unsigned int r = 1; r <= array.size(); r++ ) {
for(unsigned int c = 1; c <= array.size(); c++) {
cout << "Inserisci elemento " << r << " - " << c << endl;
cin >> array[r][c];
}
}
}
sempre lo stesso ossia: invalid types 'double[int]' for array subscript poi non sono molto sicuro di come si dichiari un vector bidimensionale, o in generale multidimensionale, ed ho messo in rosso come l'ho dichiarato io in rosso... ma sul libro non è spiegato e quindi sono andato per intuizione diciamo ed anche sull'array.size finale, perchè essendo l'array bidimensionale come faccio a dirgli si prendere la "seconda" o la "prima" dimensione?ps: inputVector è fatta dal libro e copiata da me, outputVector l'ho fatta io perchè mi serviva per un vector bidimensionale grazie per l'estrema pazienza
Ultima modifica di -Slash : 30-11-2007 alle 15:05. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22462
|
da quel che so io non credo si possano dichiarare vettori multidimensionali, ma un semplice array non funziona?
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
mi hanno detto(e ricordo ci sia scritto anche sul deitel) che un array deve avere sempre come dimensione un valore costante. io il valore lo devo inserire con cin, e poi creare un array con per dimensione l'intero inserito in cin.
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
C'è l'allocazione dinamica per questo...in alternativa i vector vanno bene, ma per gestire una matrice con i vector devi lavorare con un solo indice (o creare un vector di vector) e ridimensionare il vector in ogni caso.
Ad esempio: Codice:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int rows = 6, columns = 6;
vector<double> v;
v.resize(rows * columns, 0.0);
for(int r = 0; r < rows; ++r)
{
for(int c = 0; c < columns; ++c)
cout << v[r * columns + c] << " ";
cout << endl;
}
}
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22462
|
la soluzione si chiama puntatori; come ha già detto cionci
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:19.










) errori logici, ne ho fatto anche qualcuno stupidissimo di sintassi 

ma perchè faccio questi stupidissimi errori di distrazione








