[C++] errore codice
Praticamente dopo aver letto una matrice da file quadrata di interi ho creato una funzione che cerca il minimo in un vettore di interi e restituisce l'indice del valore minimo e con l'aiuto di un'altra funzione devo sommare agli elementi della matrice con indice dato dall'altra funzione una costante.
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
typedef int matrice [50][50];
typedef int vettore [50];
void leggi_mat( matrice , int&);
void leggi_mat( matrice mat, int&riemp) {
ifstream input;
int i,j;
input.open( "mat.txt");
if(input.fail())
exit(1);
input>>riemp;
for(i=0;i<riemp;i++)
for(j=0;j<riemp;j++)
input>>mat[i][j];
input.close ();
}
int calc_ind_min( vettore v,int riemp) {
int i;
int pos_min;
int min=v[0];
for(i=0;i<riemp;i++)
if( v[i]<min){
min=v[i];
pos_min=i;
}
return pos_min;
}
void somma( matrice mat, int riemp, int t){
t=4;
int i,j;
for(i=0;i<riemp;i++)
for(j=0;j<riemp;j++)
if( j==calc_ind_min( mat[i],riemp)){
mat[i][j]= mat[i][j]+t;}
}
int main(int argc, char *argv[])
{
matrice m;
int r,k,t;
leggi_mat( m , r) ;
somma(m, r, t);
system("PAUSE");
return EXIT_SUCCESS;
}
Risposte
Ho sistemato l'indentazione del codice, cosi è più leggibile.
Il codice compila con due warning, tutti e due per variabile non inizializzata (r e t)
Ho due domande:
1) come mai nella funzione leggi_mat metti l'input in int &riemp?
2) come mai hai t=4 nella funzione somma e non viene passato come argomento? Se non viene mai inizializzato viene dato warning.
puoi mettere un esempio di file mat.txt cosi vedo come si comporta a runtime?
(A te che errore da?)
Il codice compila con due warning, tutti e due per variabile non inizializzata (r e t)
Ho due domande:
1) come mai nella funzione leggi_mat metti l'input in int &riemp?
2) come mai hai t=4 nella funzione somma e non viene passato come argomento? Se non viene mai inizializzato viene dato warning.
puoi mettere un esempio di file mat.txt cosi vedo come si comporta a runtime?
(A te che errore da?)
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
typedef int matrice [50][50];
typedef int vettore [50];
void leggi_mat( matrice , int&);
void leggi_mat( matrice mat, int &riemp) {
ifstream input;
input.open( "mat.txt");
if (input.fail()) {
exit(1);
}
input >> riemp;
for (int i = 0; i < riemp; i++) {
for (int j = 0; j < riemp; j++) {
input >> mat[i][j];
input.close ();
}
}
}
int calc_ind_min ( vettore v, int riemp) {
int pos_min;
int min = v[0];
for (int i = 0; i < riemp; i++) {
if ( v[i] < min ){
min = v[i];
pos_min = i;
}
}
return pos_min;
}
void somma ( matrice mat, int riemp, int t) {
t = 4;
for (int i = 0; i < riemp; i++) {
for (int j = 0; j < riemp; j++) {
if ( j == (calc_ind_min( mat[i], riemp)) ) {
mat[i][j] = mat[i][j] + t;
}
}
}
}
int main (int argc, char *argv[]) {
matrice m;
int r,k,t;
leggi_mat( m , r) ;
somma(m, r, t);
system("PAUSE");
return EXIT_SUCCESS;
}
A me va bene, compila tutto . Solo che se provo a stampare la nuova matrice mi da uno 0 a video.. Cmq il mio file di testo è
2
1 2
3 4
Per le tue domande, sono miei errori scusa...
2
1 2
3 4
Per le tue domande, sono miei errori scusa...
Riguardo a riemp lo scopo è che il valore di riemp sia visto nel main. Puoi o far così o far ritornare il valore. Dovresti comunque controllare che riemp non si troppo grande.
Per quanto riguarda t=4 direi che non ha alcun senso, dovrebbe essere inializzata nel main.
Comunque
Per quanto riguarda t=4 direi che non ha alcun senso, dovrebbe essere inializzata nel main.
Comunque
(calc_ind_min( mat[i], riemp))è indipendente da \(\displaystyle j \), quindi dovresti spostarlo al di fuori del secondo for. Insomma lo stai trasformando da un algoritmo \(\displaystyle 2n^2 \) in uno \(\displaystyle n^3 \).