重复循环直到输入被按下

时间:2015-07-06 07:33:26

标签: c++ loops animation while-loop

对于其他人发现这个问题,可以使用conio.h库中的kbhit()函数来完成。只需插入!kbhit()我将SOMETHING置于正确的循环中,但是我正在寻找一种方法来实现这一点而不需要库。

我是初学者,试图在控制台中创建一个简单的动画。动画将在控制台右侧显示UP字样,右侧显示DOWN字样。到目前为止,我已经让动画完成了一次这样的迭代,但是我试图让它重复,看起来文本回到顶部或底部并再次进行,直到用户按下输入密钥。

我的书(我从教科书中自学)使得它看起来除了iostream和windows.h之外没有任何特定的库可能,但是包括库函数在内的帮助也是受欢迎的,这是一次学习后的经历所有。万分感谢!

对代码的一点解释是我设置UP和DOWN起始位置的坐标,然后移动光标,用空格删除它所在的前一行,然后递增两个并放一个新单词。我猜我可以使用第二个while循环以某种方式检查是否按下了ENTER键。

#include <iostream>
#include <bitset>
#include <unordered_set>

/* Count the number of 1 bits in 32 bit int x in 21 instructions.
 * From /Hackers Delight/ by Henry S. Warren, Jr., 5-2
 */
int count1Bits(int x) {
  x = x - ((x >> 1) & 0x55555555);
  x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
  x = (x + (x >> 4)) & 0x0F0F0F0F;
  x = x + (x >> 8);
  x = x + (x >> 16);
  return x & 0x0000003F;
}

int main () {
  const int n = 19;
  const int h = 10;
  std::unordered_set<long> dotProductSet;

  // look at all 2^(n+h-1) possibilities for longVec
  // upper n bits cannot be all 0 so we can start with 1 in pos h
  for (int longVec = (1 << (h-1)); longVec < (1 << (n+h-1)); ++longVec) {

    dotProductSet.clear();
    bool good = true;

    // now look at all n digit non-zero shortVecs
    for (int shortVec = 1; shortVec < (1 << n); ++shortVec) {

      // longVec dot products with shifted shortVecs generates h results
      // each between 0 and n inclusive, can encode as h digit number in
      // base n+1, up to (n+1)^h = 20^10 approx 13 digits, need long
      long dotProduct = 0;

      // encode h dot products of shifted shortVec with longVec
      // as base n+1 integer
      for(int startShort = 0; startShort < h; ++startShort) {
        int shortVecShifted = shortVec << startShort;
        dotProduct *= n+1;
        dotProduct += count1Bits(longVec & shortVecShifted);
      }

      auto ret = dotProductSet.insert(dotProduct);
      if (!ret.second) {
        good = false;
        break;
      }
    }

    if (good) {
      std::cout << std::bitset<(n+h-1)>(longVec) << std::endl;
      break;
    }
  }

  return 0;
}

1 个答案:

答案 0 :(得分:0)

最好的办法是创建一个自定义的“GetAsyncKeyState”函数,该函数将使用#IFDEF for windows和linux来选择合适的GetAsyncKeyState()或等效函数。对于前

if (GetAsyncKeyState(VK_RETURN))
    {
       exit = true;
    }