通过将文本文件读入字符串/向量来计算加权/未加权GPA

时间:2018-06-06 02:01:45

标签: c++ c string vector

我知道存在许多GPA计算问题,但我没有设法找到一个涉及加权和未加权的区别。

我需要读取文本文件,将行输入到字符串或向量中(没有经历过这些),并解析数据(之前没有这样做)来计算GPA以及信用是否加权。如果课程是AP,则成绩加权+1.0,如果是荣誉,则为+0.5。

我很确定到目前为止我所做的是非常错误的,但我正在尝试使用这种操作的语法。

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    using namespace std;

    int main(){

        string data;
        vector<string> lines;
        ifstream myfile("Grades.txt");

        //test file open//
        if (!myfile){

            cout << "Error opening file" << endl;
            system("pause");
            return -1;
        }
        //insert file text into vector//
        while (getline(myfile, data)){

            lines.push_back(data);
        }
        for (int i = 0; i < 8; i++){

            if ((strlen(lines[i]) - 1) == 'A'){
                sum =+ 4;
            }
            else if ((strlen(lines[i]) - 1) == 'B'){
                sum =+ 3;
            }
            else if ((strlen(lines[i]) - 1) == 'C'){
                sum =+ 2;
            }
            else if ((strlen(lines[i]) - 1) == 'D'){
                sum =+ 1;
            }
            else {
                sum =+ 0;
            }
        }

    }

这是文本文件的内容:

    Math A
    AP History C
    Chemistry B
    Honors Physics C
    Ethics A

2 个答案:

答案 0 :(得分:3)

我不太了解C ++,但是因为你用C标记了这个,而你的代码中包含了一些C构造,所以我会假装我有资格回答它。

首先,这些线条值得怀疑:

system("pause");
return -1;

如果你想让程序等待(为什么?),最简单的方法可能就是用getchar()来提示一些输入。另外,不要从main()返回负值。返回值应介于0到127之间。

更重要的是,你做了一些根本不起作用的事情。 strlen()计算NUL终止的C字符串的长度。 C ++ std :: string&#39; s绝对不是NUL终止的字符串,结果将完全未定义。如果你想找到std :: string的长度,你必须调用std::string.length(),这是最好的,因为结果不需要计算。此外,您也不能将getline与std :: string一起使用。

我实际上写了一些我要提交的代码作为问题的可能解决方案,但它是C代码,因为我看到你已经从这个问题中删除了C标签,我不会包括它

编辑:嗯,哎呀,这就是我在C中的表现。

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

#define FILENAME "Grades.txt"

int main(void)
{
    struct stat st;
    char *tok, *obuf, *buf;
    FILE *fp = fopen(FILENAME, "r");

    if (!fp || stat(FILENAME, &st) != 0)
        err(1, "Failed to open/stat file %s\n", FILENAME);

    buf = obuf = malloc(st.st_size + 1lu);
    fread(buf, 1, st.st_size, fp);
    buf[st.st_size] = '\0';
    fclose(fp);

    int num_classes = 0;
    double grade = 0;
    while ((tok = strsep(&buf, "\n")) && *tok) {
        double weight = 1;
        if (strstr(tok, "AP"))
            weight = 2;
        else if (strstr(tok, "Honors"))
            weight = 1.5;

        int grd;
        switch(*(buf - 2lu)) {
            case 'A': grd = 4; break;
            case 'B': grd = 3; break;
            case 'C': grd = 2; break;
            case 'D': grd = 1; break;
            default:  grd = 0; break;
        }

        grade += weight*(double)grd;
        ++num_classes;
    }

    printf("The gpa is around %f\n", grade / (double)num_classes);

    free(obuf);
}

答案 1 :(得分:0)

(1)您的代码无法编译。 &#39;总结&#39;是未宣布的。请提交编译的代码。 (2)strlen调用试图评估向量的长度,而不是字符串。然后,将字符串长度与字母进行比较。在比较之前,您需要使用strlen作为字符串的索引。