premier programme en aval

J’essaie d’écrire un programme qui récupère les données de ce fichier texte: texte alternatif

Ensuite, sur la base de ces données, le programme est censé calculer l’APG moyen de chaque sexe (f = femme, m = homme) et sortir les résultats dans un nouveau fichier.

Il doit également contenir ces cinq fonctions:

openFiles : cette fonction ouvre les fichiers d’entrée et de sortie et définit la sortie des nombres à virgule flottante sur deux décimales dans un format décimal fixe avec un point décimal et des zéros de fin.

initialize : cette fonction initialise les variables.

sumGrades : cette fonction trouve la sum des GPA des étudiants et des étudiantes.

note moyenne : cette fonction permet de calculer la moyenne cumulative moyenne pour les garçons et les filles.

printResults : cette fonction affiche les résultats pertinents.

Je pense que j’ai assez bien codé les fonctions et tout mais depuis qu’il s’agit de mon premier programme utilisant fstream, je ne sais pas exactement comment je dois les implémenter dans ma fonction principale.

Voici ce que j’ai jusqu’à présent:

en-tête :

#ifndef header_h #define header_h #include  #include  #include  #include  #include  using namespace std; void extern initialize(int&, int&, float&, float&); void extern openFiles(ifstream, ofstream); void extern sumGrades(ifstream, ofstream, char, float, int&, int&, float&, float&); void averageGrade (float&, float&, float, int, float, int); void extern printResults (float, float, ofstream); #endif 

principal :

 #include "header.h" int main() { char gender; float gpa, sumFemaleGPA, sumMaleGPA; ifstream inData; ofstream outData; int countFemale, countMale; inData.open("./Ch7_Ex4Data.txt"); outData.open("./Ch7_Ex4Dataout.txt"); do inData >> gender >> gpa; while(!inData.eof()); inData.close(); outData.close(); system("PAUSE"); return EXIT_SUCCESS; } 

openFiles :

 #include "header.h" void openFiles(ifstream inData, ofstream outData) { inData.open("./Ch7_Ex4Data.txt"); outData.open("./Ch7_Ex4Dataout.txt"); outData << fixed << showpoint << setprecision(2); inData.close(); outData.close(); } 

sumGrades :

 #include "header.h" void sumGrades(ifstream inData, ofstream outData, char gender, float gpa, int& countFemale, int& countMale, float& sumFemaleGPA, float& sumMaleGPA) { char m, f; do { inData >> gender >> gpa; if(gender == m) { sumMaleGPA += gpa; countMale++; } else if (gender == f) { sumFemaleGPA += gpa; countFemale++; } } while(!inData.eof()); } 

moyenneGrade :

 #include "header.h" void averageGrade (float& maleGrade, float& femaleGrade, float sumMaleGPA, int countMale, float sumFemaleGPA, int countFemale) { maleGrade = sumMaleGPA / static_cast(countMale); femaleGrade = sumFemaleGPA / static_cast(countFemale); } 

printResults :

 #include "header.h" void { outData << "average male GPA: " << maleGrade << endl; outData << "average female GPA: " << femaleGrade << endl; } 

Vous faites de bons progrès.

Vous n’avez pas besoin de static_cast s dans averageGrade .

printResults manque la majeure partie de sa signature de fonction.

Dans sumGrades , gpa et gender doivent être des variables locales et non des parameters. Vous souhaitez également comparer les littéraux de caractères 'm' et 'f' , et non les variables nommées m et f avec des contenus aléatoires.

Les stream doivent TOUJOURS être passés par référence, ils ne peuvent pas être copiés.

Lors de la lecture d’un stream, vous devez tester le stream lui-même dans votre boucle while, et non pas eof() .

Avez-vous une question?

Vous devez transmettre les stream de fichiers par des références non constantes:

 void extern openFiles(ifstream&, ofstream&); 

sumGrades et printResults ne printResults pas du fait que ces stream sont des fichiers, vous pouvez donc ne transmettre que des stream, mais il doit s’agir de références:

 void extern sumGrades(istream&, ostream&, char, float, int&, int&, float&, float&); void extern printResults (float, float, ostream&); 

averageGrade est manquant extern .

 void extern averageGrade (float&, float&, float, int, float, int); 

openFiles ne sert à rien. Il ouvre les fichiers et les ferme … Vous ne devriez pas les fermer:

 void openFiles(ifstream& inData, ofstream& outData) { inData.open("./Ch7_Ex4Data.txt"); outData.open("./Ch7_Ex4Dataout.txt"); outData << fixed << showpoint << setprecision(2); // leave them open } 

Le fait est que vous devriez appeler ces fonctions pour ouvrir les fichiers de main :

 // in main(): ifstream inData; ofstream outData; openFiles(inData, outData); // call other functions to do the task. // pass inData and outData as above, where stream arguments are expected. // ... 

Ne faites pas ceci:

 do { inData >> gender >> gpa; STUFF } while(!inData.eof()); 

S’il ne parvient pas à lire le genre ou le gpa, il fait toujours des choses.
Wchich signifie que la dernière ligne de votre fichier a été traitée deux fois.

Une meilleure façon d’écrire ceci est:

 while( inData >> gender >> gpa ) { STUFF } 

Maintenant, STUFF n’est terminé que si le genre et le gpa sont lus correctement dans le fichier.

Cette déclaration si n’est pas requirejse.

  if(gender == m) { sumMaleGPA += gpa; countMale++; } else if (gender == f) { sumFemaleGPA += gpa; countFemale++; } 

Vous pouvez utiliser une carte (ou un autre conteneur pour contenir ces valeurs). De cette façon, votre code est plus lisible (et lorsque nous avons une nouvelle troisième espèce plus facile à développer).

 std::map > data; std::pair& value = data[gender]; value.first += gpa; // First contains the total gpa for a gender value.second++; // Second contains the count of a gender. 

Ressemble à ça:

 void readData(std::istream& in, std::map >& data) { char gender; double gpa; while(inData >> gender >> gpa) { data[gender].first += gpa; data[gender].second ++; } } // // Notice that we pass streams by reference. // Also notice that it is a generic stream not a file stream. // This function does not need to know the output is going to a file // so you can now re-use it to print to another type of stream std::cout void writeData(std::ostream& out, std::map >& data) { for(std::map >::const_iterator loop = data.begin(); loop != data.end(); ++loop ) { char gender = loop->first; std::pair value = loop->second; out << gender << ": " << value.first / value.second << "\n"; } } int main() { std::map > data; std::ifstream inData("./Ch7_Ex4Data.txt"); readData(inData, data); std::ofstream outData("./Ch7_Ex4Dataout.txt"); writeData(outData, data); // Don;t bother to close the files. // This happens automatically when the file goes out of scope. // // Genereally you use close() manually when you want to catch a problem that // is happening when you close the file. Since even if you did find a problem // there is nothing you can do with the problem don;t do it. // // Also note: potentially close() can throw an exception. // If you let the file close automatically with the destructor (it calls close // catches the exception and throws it away). } 

printResults ne doit pas avoir été copié correctement. Je soupçonne qu’il doit avoir la signature

 void printResults(float maleGrade, float femaleGrad); 

Lorsque vous lisez votre fichier, vous devez voir si le genre est m ou f, puis créer une twig et append la prochaine MPC à la MPG.

quelque chose comme

 if(gender == "m"){ maleGPA += gpa; maleCount++; } else{ femaleGPA += gpa; femaleCount++; } // Call the next functions you copy pasted from your homework assignment