我正在编写一个程序,帮助为 4 年制大学安排类(class)。由于某种原因,我陷入了 while 循环。
/*
some info:
"course" is a class i created
some of the member function are:
bool fall() // does the class run in the fall?
bool spring() // does the class run in the spring?
string name() // name of this course
... // plenty of irrelevant stuff
"classes" is a vector of courses
"vector <vector <course> > out" has n (generally 8) elements
"vector <string> taken" records the names of the courses that have been taken
bool prereq_taken(course C, vector <string> & taken) checks if all the
prerequisites of the course are taken
even semesters are fall and odd are spring
*/
int x = 0, semester = 0;
while ((classes.size() > 0)){
x %= classes.size();
if (prereq_taken(classes[x], taken)){ // checks if all of the prerequisites in the course have already been taken
// my test condition
//if ((semester % 2 == 0) && classes[x].fall() && (!classes[x].spring())){
// Ben's condtion
if ((semester & 1)? classes[x].spring(): classes[x].fall()){
// my retardedly long all-in-one condition
/*if (
(((!(semester % 2)) && classes[x].fall() && (!classes[x].spring())) // if fall and is only fall class or
|| ((semester % 2) && (!classes[x].fall()) && classes[x].spring()) // if spring and is only spring class
|| (classes[x].fall() && classes[x].spring()) // if any semester class
) // and there is class space and enough credit space
&& (((out[semester].size() + 1) < classes_per_semester) && ((credits[semester] + classes[x].credits()) < credits_per_semester))) {
*/
taken.push_back(classes[x].name()); // put class name into vector of takens
out[semester].push_back(classes[x]); // put class into final output
classes.erase(classes.begin() + x); // remove from class list
}
else
x++;
}
else
x++; // else go to next class
if ((out[semester].size() + 1) > classes_per_semester)
semester++;
}
我正在尝试遍历所有数据(并循环)直到所有类(class)都已正确放置
出于某种原因,当我添加带有星号的 if 语句时,循环将永远持续下去。然而,如果没有它和 else
的东西(但内部的东西仍然在代码中),代码将完成。为什么? C++ bool 数学与 Python 的有点不同(这对这段代码很重要)?
如果我有任何模糊之处,请告诉我需要澄清的地方
最佳答案
你认为这有什么作用?
if ((x == classes.size()))
x %= classes.size();
赋值与:
x = x % classes.size();
但是你刚发现x == classes.size()
所以
x = classes.size() % classes.size();
对于任何N
,N%N
为零,这意味着
if ((x == classes.size()))
x = 0;
这是你想要的吗?
有问题的 if
只能处理仅在秋季提供的类(class)。也许你想要:
if ((semester & 1)? classes[x].spring(): classes[x].fall()) { ... }
也许这行得通?
int x = 0, semester = 0, scheduled = 0;
vector<string> completed;
while ((classes.size() > 0)) {
if (classes.size() == x) {
x = 0;
cout << "Checked all classes and scheduled " << scheduled << endl;
if (0 == scheduled) {
++semester;
completed = taken;
}
scheduled = 0;
}
if (prereq_taken(classes[x], completed)) {
if ((semester & 1)? classes[x].spring(): classes[x].fall()) {
if (credits[semester] + classes[x].credits() <= credits_per_semester) {
taken.push_back(classes[x].name());
out[semester].push_back(classes[x]);
credits[semester] += classes[x].credits();
cout << classes[x].name() << " will be taken in semester " << semester << " for " << classes[x].credits() << " credits" << endl;
classes.erase(classes.begin() + x);
scheduled++;
}
else {
cout << classes[x].name() << " can't be taken in semester " << semester << " : overload on credits" << endl;
x++;
}
}
else {
cout << classes[x].name() << " can't be taken in semester " << semester << " : not offered" << endl;
x++;
}
}
else {
cout << classes[x].name() << " can't be taken in semester " << semester << " : not offered" << endl;
x++; //
}
if (out[semester].size() >= classes_per_semester || credits[semester] >= credits_per_semester) {
cout << "Full load reached for semester " << semester << endl;
semester++;
completed = taken;
}
}
关于c++ - 似乎无法找到无限循环的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347725/