PDA

Visualizza la versione completa : [c++] Matrice di numeri reali negativi/positivi (media)


Wimmo
13-02-2015, 00:30
Salve ragazzi il problema è semplice ma mi sta bloccando:confused:
il punto e' questo, siprogettino queste due funzioni:
- leggi_mat, che riceve in ingresso il nome di un file, e legge da quel file i riempimenti di riga e colonna ed i valori di una matrice di numeri reali;
- med_pos_mat, che riceve in ingresso una matrice M di numeri reali e restituisce come parametro di di uscita la media dei soli elementi positivi di M. La funzione dovrà anche restituire come valore di ritorno un valore booleano, che deve essere pari a false qualora non vi siano in M elementi strettamente maggiori di 0 (zero), e pari a true altrimenti;
Ecco la matrice:
3 4
2.5 -17.1 19.3 22.5
-3.2 20.0 7.4 -9.4
-2.8 -23.2 32.7 40.1

Fin qua tutto bene.. poi mi viene chiesto di fare la media sei soli elementi positivi.
Io l'ho scritto il codice e penso sia fatto anche bene...
Però poichè non mi trovo col risultato ho pensato di far fare al mio programma la stampa di tale matrice e mi dà un output diverso ovvero:



Inserire il nome del file di testo: mat.txt
Matrice letta dal file "mat.txt":
2.8026e-045 3.58164e-039 3.76531e-039 3.94899e-039
8.90818e-039 9.09185e-039 9.27553e-039 9.4592e-039
1.44186e-038 4.55515e-038 1.47857e-038 1.49694e-038

La media e' questa: 1.14797e-038

Premere un tasto per continuare . . .

Il codice che ho fatto tramite le funzioni,librerie ecc... è questo :


// main.cpp
#include <cstdlib>
#include <iostream>
#include "lib.h"

using namespace std;

int main()
{
int rig, col;
matrice mat;
stringa nomefile;
float media;


cout<<"\nInserire il nome del file di testo: ";
cin>>nomefile;
leggi_mat(mat, rig, col, nomefile);
cout<<"\n Matrice letta dal file "<<nomefile<<": \n";
stampa_mat(mat,rig,col);

med_pos_mat(mat, rig, col, media);
cout<<"La media e' questa: ";
cout<<media<<'\n'<<'\n';
system("PAUSE");
return EXIT_SUCCESS;
}






//lib. h

const int maxdim=30;
typedef float vettore [maxdim];
typedef float matrice [maxdim][maxdim];
typedef char stringa [maxdim+1];


void leggi_mat( matrice, int& , int&, stringa);
bool med_pos_mat(matrice, int, int, float& );
void stampa_mat(const matrice, int, int);




//lib.cpp
#include <cstdlib>
#include <iostream>
#include "lib.h"
using namespace std;

void leggi_mat(matrice mat, int&rig, int&col, stringa nomefile){
int i,j;
FILE*fp=fopen(nomefile, "r");

if(fp==0){
cout<<" Il file non e' stato trovato...\n Controllare la directory del file.txt";
system("PAUSE");
exit(1);
}

fscanf(fp,"%d %d", &rig, &col);
for(i=0;i<rig;i++)
for(j=0;j<col;j++){
fscanf(fp, "%d", &mat[i][j]);
}
fclose(fp);
}

void stampa_mat(const matrice mat, int rig, int col){
int i,j;

for(i=0;i<rig;i++){
for(j=0;j<col;j++)
cout<<mat[i][j]<<' ';
cout<<'\n';
}
}


bool med_pos_mat(matrice mat, int rig, int col, float&media){
int i,j,contatore;
float somma;
float val=0.0;
somma=0.0;
contatore=0;
for(i=0;i<rig;i++){
for(j=0;j<col;j++)
if(mat[i][j]>val){
somma=somma+mat[i][j];
contatore++;
}
}

if(contatore>0){
media=somma/contatore;
return true;
}
return false;


}


Perchè mi esce quel mammone in output? :(

Samuele_70
13-02-2015, 00:58
Per leggere in modo corretto i valori float usa la fscanf() in questo modo


fscanf( fp, "%G", &mat[i][j] );

Wimmo
13-02-2015, 01:06
Diame hai ragione!
Ecco cosa mi era sfuggito!
Vabbè grazie mille!! :fiore:

Loading