Funzione non calcola valori minori della media

leon801
Salve, non riesco a capire dove stà l'errore
mi potete aiutare
il quesito:
dopo aver caricato una matrice
che deve mostrare tutti gli elementi, la media e i valori inferiori alla media,
mostra gli elementi , calcola la media ma non i valori inferiori alla media.
vi posto il codice :
void insufficienti(int matriceA[20][N],float media[N]){
	int i, j;
	  cout<<"\nMateria insufficiente - "<<i<<" = ";
	for (j=0; j<M ; j++){
		if (matriceA[j][i]<(float)media[j]){
			matriceA[j][i]=matriceA[j][i];
		}
		else 
		matriceA[j][i]==0;	
		cout<<setw(4)<<"\nStudente   "<<j<<" con insufficienza  ="<<matriceA[j][i]<<endl;	
	}	
}

e nel main :
int main () {
int matriceA[20][N], v[N];
float media[N];

cout<<"\n  Matrice con dimensione massima  20x7 ";
    leggi_Matrice(matriceA);
    stampa_Matrice(matriceA);
    Somma_Colonne(matriceA,v,media);
    insufficente(matriceA,media);
    
   }


Grazie in anticipo
per la collaborazione

Risposte
leon801
Quando compilo mi dà :
undefined reference to "insufficiente(int(*) [3],float*)"
non capisco
ho provato nel main a chiamare la funzione "insufficiente" passando altri parametri
ma non cambia il risultato.

Super Squirrel
Perchè non posti semplicemente il codice per intero?

il quesito:
dopo aver caricato una matrice
che deve mostrare tutti gli elementi, la media e i valori inferiori alla media,
mostra gli elementi , calcola la media ma non i valori inferiori alla media.

Sarà un mio problema, ma non ci ho capito nulla...

leon801
E cco il codice completo :
#include <iostream>
#include <cstdlib>
#include <iomanip>//manipolatore dell'output stream
using namespace std;
const int N=3;
int M;
void leggi_Matrice(int matriceA[20][N]);
void stampa_Matrice (int matriceA[20][N]);
void Somma_Colonne(int matriceA[20][N], int v[N],float media[N]);
void insufficenti(int matriceA[20][N],float media[N]);



void leggi_Matrice (int matriceA[20][N]){
int i, j;  
	cout<<"\n\nScelta numero studenti max 20:";
	cin>>M;
        for (i=0 ; i<N ; i++){
        for(j=0 ; j<N ; j++){
        	cout<<"\nInserisci il voto dello studente "<<i+1<<" nella materia "<<j+1<<" :";
            cin >> matriceA[i][j];
         }
       }
return;
}


void stampa_Matrice (int matriceA[20][N]){
int i, j;
     	for(i=0;i<N;i++){
		cout<<"\n materia - "<<i+1<<" = ";
 		for(j=0;j<M;j++){
	cout<<setw(4)<<matriceA[j][i]<<" ; ";
		}
	}	
return;
}

void Somma_Colonne(int matriceA[20][N], int v[N],float media[N]){
	cout<<"\n\nMEDIA dei VOTI per ogni STUDENTE"<<endl;
	int i, j;
    for (j=0 ; j<M ; j++)
    {
      v[j]=0;//Azzero il vettore delle somme (v[j])dei voti per ogni studente.
      for (i=0; i<N ; i++)
         v[j] += matriceA[j][i];//Carico (v[j]):per ogni studente "j" sommo i voti "i" delle materie N
    }
    for (j=0 ; j<M; j++){
	    media[j]=v[j]/N;//Media = somma dei voti diviso N (materie)
	    cout<<"\nLa MEDIA dei voti dello studente "<<j+1<<" = "<< media[j]<<" ";
	}
}


void insufficienti(int matriceA[20][N],float media[N]){
	int i, j;
	  cout<<"\nMateria insufficiente - "<<i<<" = ";
	for (j=0; j<M ; j++){
		if (matriceA[j][i]<(float)media[j]){
			matriceA[j][i]=matriceA[j][i];
		}
		else 
		matriceA[j][i]==0;	
		cout<<setw(4)<<"\nStudente   "<<j<<" con insufficienza  ="<<matriceA[j][i]<<endl;	
	}	
}


int main () {
int matriceA[20][N], v[N];
float media[N];

cout<<"\n  Matrice con dimensione massima  20x7 ";
    leggi_Matrice(matriceA);
    stampa_Matrice(matriceA);
    Somma_Colonne(matriceA,v,media);
    insufficenti(matriceA,media);
    
   }

Quando compia mi dà: undefined reference to "insufficienti (int(*) [3],float*) "

Super Squirrel
Il motivo è che scrivi a volte "insufficenti" e a volte "insufficienti".
In ogni caso ci sono molte altre cose che non vanno...

leon801
A parte la svista di insufficente,
corretto,
ti chiedo se potresti indicarmi qualche errore determinante
magari gli altri ci riesco ...
Grazie per l'attenzione

Super Squirrel
Adesso che il codice compila, hai testato un po' il programma? Funziona correttamente oppure no? In tal caso quali problemi riscontri?

Mostra un po' di buona volontà... :roll:

leon801
Infatti, lavorandoci sopra con un pò di modifiche adesso mi dà le insufficenze,
solo che per i valori superiori alla media li sostituisce con zero,
e quelli inferiori alla media li trasforma in numeri a 7/8/9 cifre
ti posto questa parte
void insufficente(int matriceA[20][N],float media[N],int insuff[][N]){
	int i, j;
	  cout<<endl;
	 for (j=0; j<M ; j++){
	    	
		if (matriceA[j][i]<media[j]){
			insuff[j][i]=matriceA[j][i];
			}
			for (j=0; j<M ; j++){
			cout<<setw(4)<<"\nStudente "<<j+1<<" con insufficenza =";
				for (i=0; i<N ; i++)
				cout<<insuff[j][i]<<";";
            } cout<<endl;

	}
}


Grazie ancora per l'attenzione

Super Squirrel
Di questo passo cmq non ne usciamo... posta il codice completo e spiega precisamente qual è la consegna dell'esercizio.

leon801
Codice completo
il problema che non mostra le insuficenze, li mostra a zero per tutti.
 /*

Simulazione scrutini di una classe di M(da input) studenti con N(costante) materie.

Il programma deve mostrare a video :
i voti di tutta la classe;
la media di ogni studente;
i voti insufficienti di ogni studente;

*/
#include <iostream>
#include <cstdlib>
#include <iomanip>//manipolatore dell'output stream
using namespace std;
const int N=3;//Materie
int M;//studenti
// -- PROTOTIPI -- //
void carica_Matr(int matr_A[20][N]);
void stampa_Matr (int matr_A[20][N]);
void Calc_Med(int matr_A[20][N], int v[N],float med[N]);
void insuff(int matr_A[20][N],float med[N]);
// -- FUNZIONI -- //
void carica_Matr (int matr_A[20][N]){
int i, j;  
	cout<<"\n\nScelta numero studenti max 20:";
	cin>>M;
        for (i=0 ; i<M ; i++){
        for(j=0 ; j<N ; j++){
        	cout<<"Inserisci il voto dello studente "<<i+1<<" nella materia "<<j+1<<" :";
            cin >> matr_A[i][j];
         }
       }
return;
}


void stampa_Matr (int matr_A[20][N]){
int i, j;
     	for(i=0;i<N;i++){
		cout<<"\n materia_"<<i+1<<" =";
 		for(j=0;j<M;j++){
	cout<<setw(4)<<matr_A[j][i]<<";";
		}
	}	
return;
}

void Calc_Med(int matr_A[20][N], int v[N],float med[N]){
	cout<<"\n\nMEDIA dei VOTI per ogni STUDENTE"<<endl;
	int i, j;
    for (j=0 ; j<M ; j++)
    {
      v[j]=0;//Azzero il vettore delle somme (v[j])dei voti per ogni studente.
      for (i=0; i<N ; i++)
         v[j] += matr_A[j][i];//Carico (v[j]):per ogni studente "j" sommo i voti "i" delle materie N
    }
    for (j=0 ; j<M; j++){
	    med[j]=(float)v[j]/N;//Media = somma dei voti diviso N (materie)
	    cout<<setprecision(3)<<"\nLa MEDIA dei voti dello studente "<<j+1<<" = "<< med[j]<<" ";
	}
}

void insuff(int matr_A[20][N],int inf[N]){
	
	int i, j;
	for (i=0; i<M ; i++){
	int inf[N]={0};
	 	if (matr_A[j][i]<6){
			inf[i]==1;
			}
		for (j=0; j<M ; j++){
			    cout<<setw(4)<<"\nStudente "<<j+1<<" con insufficenza =";
				for (i=0; i<N ; i++)
				    cout<<inf[i]<<";";
            }       cout<<endl;
	}
}

int main () {
int matr_A[20][N], v[N],inf[N];
float med[N];
cout<<"\n  Mat con dimensione massima  20x7 ";
    carica_Matr(matr_A);
    stampa_Matr(matr_A);
    Calc_Med(matr_A,v,med);
    insuff(matr_A,inf);
    
   }




Super Squirrel
Il corretto prototipo della funzione Calc_Med dovrebbe essere:
void Calc_Med(int matr_A[20][N], int v[20],float med[20]);

in quanto, stando all'implementazione della funzione, v e med devono avere un numero di elementi pari agli studenti e non alle materie.
Passare il vettore v alla funzione è completamente inutile in quanto basta una semplice variabile intera dichiarata all'interno della funzione. Inoltre se lo scopo del programma è solo quello di mostrare a video la media di ogni studente, allora anche il vettore med è superfluo.

Per quanto riguarda le insufficienze se ho capito bene ad ogni studente vuoi associare un vettore di N elementi in cui 0 indica la sufficienza e 1 l'insufficienza, giusto?
In questo caso:
- se vuoi salvare questi dati non basta un array di N elementi, ma ci vuole una matrice int inf[20][N];
- se lo scopo è solo quello di mostrare a video, allora il vettore/matrice inf è inutile.
Per quanto riguarda l'implementazione della funzione:
- hai scritto inf==1 invece di inf=1;
- controlla bene i cicli for, ci sono molti errori.

leon801
Ciao Super Squirrel
ho fatto modifiche che ni hai indicato
ma credo che è rimasto un ciclo for che mi fa sbagliare la videata,
nel senso che calcola i valori insufficenti dello studente 1
considerando i valori insufficenti della materia 1 di tutti gli studenti
ti posto il codice cosi capisci meglio
 /*

Simulazione scrutini di una classe di M(a input) studenti con N(costante) materie.

Il programma deve mostrare a vieo :
i voti di tutta la classe;
la media di ogni studente;
i voti insufficienti di ogni studente;

*/
#include <iostream>
#include <cstdlib>
#include <iomanip>//manipolatore dell'output stream
using namespace std;
const int N=3;//Materie
int M;//studenti
// -- PROTOTIPI -- //
void carica_Matr(int matr_A[20][N]);
void stampa_Matr (int matr_A[20][N]);
void Calc_Med(int matr_A[20][N], int v[N],float med[N]);
void insuff(int matr_A[20][N],float med[N]);
// -- FUNZIONI -- //
void carica_Matr (int matr_A[20][N]){
int i, j;  
	cout<<"\n\nScelta numero studenti max 20:";
	cin>>M;
        for (i=0 ; i<M ; i++){
        for(j=0 ; j<N ; j++){
        	cout<<"Inserisci il voto dello studente "<<i+1<<" nella materia "<<j+1<<" :";
            cin >> matr_A[i][j];
         }
       }
return;
}


void stampa_Matr (int matr_A[20][N]){
int i, j;
     	for(i=0;i<N;i++){
		cout<<"\n materia_"<<i+1<<" =";
 		for(j=0;j<M;j++){
	cout<<setw(4)<<matr_A[j][i]<<";";
		}
	}	
return;
}

void Calc_Med(int matr_A[20][N]){
	int v[N];float med[N];
	cout<<"\n\nMEDIA dei VOTI per ogni STUDENTE"<<endl;
	int i, j;
    for (j=0 ; j<M ; j++)
    {
      v[j]=0;//Azzero il vettore delle somme (v[j])dei voti per ogni studente.
      for (i=0; i<N ; i++)
         v[j] += matr_A[j][i];//Carico (v[j]):per ogni studente "j" sommo i voti "i" delle materie N
    }
    for (j=0 ; j<M; j++){
	    med[j]=(float)v[j]/N;//Media = somma dei voti diviso N (materie)
	    cout<<setprecision(3)<<"\nLa MEDIA dei voti dello studente "<<j+1<<" = "<< med[j]<<" ";
	}
}

void insuff(int matr_A[20][N], int inf[20][N]){
	int i, j; 
	int insuf=6;
	for (i=0; i<M ; i++){
	cout<<setw(4)<<"\nStudente "<<i+1<<" con insufficenza =";	
	int inf[20][N]={0};
	   for (j=0; j<N ; j++)
	       	if (matr_A[j][i]<insuf){
			inf[j][i]=matr_A[j][i];
		   cout<<inf[j][i]<<";"; 
            } 
    }     
}

int main () {
int matr_A[20][N];
int inf[20][N];
float med[N];
cout<<"\n  Mat con dimensione massima  20x7 ";
    carica_Matr(matr_A);
    stampa_Matr(matr_A);
    Calc_Med(matr_A);
    insuff(matr_A,inf);
    
   }



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