c++ - 似乎无法找到无限循环的原因

标签 c++ sorting loops infinite-loop

我正在编写一个程序,帮助为 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();

对于任何NN%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/

相关文章:

javascript - 在 javascript 中实现 quickSort 时遇到问题

r - 使用 for 循环的累积和方程

arrays - 遍历数组,将字符串转换为数组,推送到 Ruby 中的新数组

c++ 使用子类 'type cast' 错误

c++ - reinterpret_cast a pointer as long 是什么意思?

sorting - 如何在 jasper 中对交叉表的列标题值进行排序?

选择多行进行排序时发生 JavaFX TreeTableView 异常

c++ - C++类模板继承和运算符=

c++ - 在 C++ 中将 HWND 转换为十六进制字符串

Javascript:While 循环解决幂等于 0 时出现错误的指数问题