我正在尝试编写程序,并且我的编译器在第一个for循环之后出错。我已经试图修复它很长一段时间但它不起作用。我的编译器说有一个std :: out_of_range错误。顺便说一句,我是编码的中间人。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
/* A = 4
B = 3
C = 2
D = 1
F = 0*/
double gpa = 0;
char grade;
int gradeamount;
cout << "Welcome to GPA calculator. This tells you your GPA by inputting your grades. How many grades do you have." << endl;
cin >> gradeamount;
cin.ignore();
vector<char> grades;
for(int i = 1; i <= gradeamount; i++)
{
cout << "What is your " << i << " grade? In Caps Please." << endl;
cin >> grade;
cin.ignore();
grades.push_back(grade);
}
for(int i = 0; i <= (int) grades.size(); i++)
{
if(grades.at(i) = 'A')
gpa += 4;
else if(grades.at(i) = 'B')
gpa += 3;
else if(grades.at(i) = 'C')
gpa += 2;
else if(grades.at(i) = 'D')
gpa += 1;
else if(grades.at(i) = 'F')
gpa +=0;
else
{
cout << "That is not a grade, if it is try capitalizing it." << endl;
int main();
}
}
gpa /= (double) grades.size();
cout << "Your GPA is: " << gpa << endl;
}
答案 0 :(得分:0)
您有索引问题。在C ++中,数组是零索引的。在第一个循环中,很明显你想要从1开始向用户提供一个grates计数。相反,这个万无一失的方法是将每个循环表示为。 。
for(int i = 0; i < elements; i++) {}
然后在初始循环中使用以下内容来获得所需的行为。
cout << "What is your " << i+1 << " grade? ...
发生越界错误是因为grades.at(grades.size())
超过了第二个循环中数组的末尾,因为循环遍历grades.size()+1
个元素,所以会被命中。
答案 1 :(得分:0)
不要在主上做递归!你在做什么,你首先接受了错误的输入,然后你创建了你的数据的完整副本,从头开始做这一切。退出main后,您将返回相同的for()循环。
ifs中有错误,使用=而不是==。
实际上你的成绩计算器可能会更短..如果你使用for(),你可以使用迭代器或者必须使用&lt; grades.size()。否则你可以使用lambda函数放弃for和long ifs:
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
//... skipped code ...
const std::string rates = "FDCBA";
std::for_each(grades.begin(), grades.end(), [&gpa,&rates](const char &c)
{
gpa += rates.find(c); // determine index
});
//... skipped code ...
或使用iterator:
for(auto it = grades.begin(); it != grades.end(); it++)
gpa += rates.find(*it);
或使用范围for():
for (char c : grades)
gpa += rates.find(c);
使用
移动检查输入到您输入的循环中的正确输入if((c>='A')&&(c<='F'))
或类似的东西。那将是程序的理智行为