我知道存在许多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
答案 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作为字符串的索引。