-1

嗨所以我开始创建一个程序来计算一个人的 GPA 并保存该信息以供将来参考。我的问题是我不知道如何读取保存在 .txt 文件中的数字,然后将它们存储起来用于 GPA 计算。这是未完成程序的代码,任何帮助都会很棒

编辑: .txt 文件的布局如下: 5.0 3.7 5.0 3.7 5.0 4.0 ... 以下是我在程序中的进度,但是当我运行它时,我收到的 GPA 为 0(不正确)。不确定词汇转换是我的问题,getline() 方法还是其他问题。有什么帮助(calculateGPA() 方法是问题所在)?

#include <iostream>
#include <fstream>
#include <string>
#include <boost/lexical_cast.hpp>
using namespace std;

string newCC, newCG;
double curGPA;
char command;
bool running = 1;

void calculateGPA();
void writeGrades();
void mainMenu();
void addClass();

int main()
{
    while(running) {
        mainMenu();
    }

    return 0;
}

void calculateGPA()
{
    double credit_sum = 0.0, grade_sum = 0.0;
    double credit, grade;

    ifstream gReader("grades.txt");

    for( int i = 0; ! gReader.eof() ; i++ )
    {
        string number;

        getline( gReader , number ) ;

        double dblNumber;
        try
        {
         dblNumber = boost::lexical_cast<double>(number);
        }
        catch (boost::bad_lexical_cast const&)
        {
              dblNumber = 0;
        }

        credit_sum = credit_sum + dblNumber;
    }

    ifstream cReader("credits.txt");

    for( int i = 0; ! cReader.eof() ; i++ )
        {
            string number;

            getline( cReader , number ) ;

            double dblNumber;
            try
            {
             dblNumber = boost::lexical_cast<double>(number);
            }
            catch (boost::bad_lexical_cast const&)
            {
                  dblNumber = 0;
            }
            credit_sum = credit_sum + dblNumber;
        }

    if(credit_sum == 0.0) {

        curGPA = 0.0;
    }

    curGPA = (grade_sum / credit_sum);

  cReader.close() ;
  gReader.close() ;

}//End calculateGPA

void writeGrades()
{
    string cToWrite = newCC + "\n"; 
    string gToWrite = newCG + "\n";

    ofstream cWriter("credits.txt", ios::app);
    cWriter << cToWrite;
    ofstream gWriter("grades.txt", ios::app);
    gWriter << gToWrite;

    cWriter.close();
    gWriter.close();
}//End writeGrades

void addClass()
{
    cout << "New class' credits?"; cin >> newCC;
    cout << endl << "New class' grade? (GP)"; cin >> newCG;
    writeGrades();
    cout << "Add another class? (y/n)" << endl; cin >> command;
    if(command == 'y')
        addClass();
    else mainMenu();
}//End addClass

void mainMenu()
{
    string command;

    cout << "What would you like to do?" << endl;
    cout << "(V)iew GPA" << endl;
    cout << "(A)dd grades" << endl;
    cout << "(E)xit" << endl;

    cin >> command;

    if(command == "v")
    {
        calculateGPA();
        cout << "Your current GPA is " << curGPA << endl;
    }
    else if(command == "a")
    {
        addClass(); 
    } 

    else running = 0;

}//End mainMenu
4

3 回答 3

0

看看这个函数:http ://www.cplusplus.com/reference/cstdlib/atof/

您可以使用它将正在读入的字符串(或字符)转换为双精度。我假设您想要双倍,因为等级是 4.0、3.7、3.3、3.0 等。

于 2013-04-29T01:42:47.927 回答
0

使用流:

double calculateGPA() {
    double credit_sum = 0.0, grade_sum = 0.0;
    double credit, grade;
    ifstream reader("grades.txt");

    while (!reader.eof()) { /* while the file still has numbers to be read */
        reader >> credit >> grade;

        if (reader.fail()) {
            /* something unexpected happened (read error/formatting error) */
            break;
        }

        credit_sum += credit;
        grade_sum += grade;
    }

    if(credit_sum == 0.0) {
        /* avoid divide by zero */
        return 0.0;
    }

    /* divide the total grade by the total credits */
    return grade_sum / credit_sum;
}

笔记:

  • 假设 .txt 文件只有由空格(空格或换行符)分隔的数字(学分、等级、学分、等级……):对于更复杂的格式,您需要 scanf 或正则表达式。
  • 返回 double 而不是 float,您通常希望 double 的精度超过 float 相对较小的速度和内存优势。
  • 当阅读器超出范围时,文件将在函数结束时关闭。reader.close() 不是必需的,但放入并不是一件坏事(我只是懒惰。)
于 2013-04-29T02:04:59.397 回答
0

或者,您可以直接读入双精度。

calculateGPA()
{
   double credit;
   ...
   reader >> credit;
   ...
}

此外,在您的 WriteGrades 函数中,为什么要在行前而不是行尾写出新行(使用 endl 而不是 '\n')?

于 2013-04-29T02:05:13.667 回答