【发布时间】:2011-03-18 03:24:30
【问题描述】:
我正在编写一个程序来帮助为 4 年制大学安排课程。出于某种原因,我陷入了 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++;
}
我正在尝试遍历所有数据(并循环),直到所有课程都已正确放置
由于某种原因,当我添加带有星号的 if 语句时,循环将永远继续。然而,没有它和else 的东西(但内部的东西仍在代码中),代码将完成。为什么? c++ 布尔数学与 python 的(对这段代码很重要)有些不同吗?
如果我有任何含糊之处,请告诉我要澄清什么
【问题讨论】:
-
尝试编写正式的循环不变量。然后单步执行代码,看看不变量是否被破坏。或者写几行代码来测试不变量。
-
while 中的第一个 if 是不必要的,因为 while 只在 classes.size() > 0 时取值,所以 while 循环中的 class.size() 将始终不为 0 . 也许你需要休息一下,然后再看一下这段代码,因为你已经在 cmets 中更正了其他一些不一致的地方。问候。
-
另外,如果在出现问题的情况下键入 !(classes[x].spring()) 而不是 (!classes[x].spring()) 会发生什么?跨度>
-
@Emmanuel:将
!移到括号外不会改变任何事情,优先规则会导致它已经按该顺序完成。 -
@Emmanuel: 没有特别的区别,但话又说回来,我不知道哪里出了问题,所以任何事情都可能是正确的,我只关心
标签: c++ sorting loops infinite-loop