While 循环,其中两个条件由 HLA 中的 AND 运算符连接。将 C++ 转换为 HLA

While loop with two conditions joined by an AND operator in HLA. Converting C++ to HLA

我想将我的程序从 C++ 翻译(或手动编译)为 HLA。该程序读取输入的数字。然后减去三和十或仅减去十,确定该值是否以零或三结尾。连续三个这样的数字赢得比赛!不以这些数字结尾的一个值将输掉游戏。

我不知道如何使用 HLA 中的 AND 运算符连接两个条件来执行 while 循环。

while ((iend != 1) && (iscore < 3))

这是我用 C++ 编写的完整代码,我想将其翻译成 HLA:

#include <iostream>
using namespace std;

int main() {
  int inum;
  int iend = 0;
  int iscore = 0;
  int icheckthree; //To check if it ends in 3
  int icheckzero; //To check if it ends in zero

  while ((iend != 1) && (iscore < 3)) {
    cout << "Gimme a number: ";
    cin >> inum;

    //Case 1: ends in three
    icheckthree = inum - 3;
    while (icheckthree > 0) {
      icheckthree = icheckthree - 10;
      if (icheckthree == 0) {
        cout << "It ends in three!" << endl;
        iscore++;
      }
    }

    icheckzero = inum;
    while (icheckzero > 0) {
      icheckzero = icheckzero - 10;
    }
    //Case 2: ends in zero
    if (icheckzero == 0) {
      cout << "It ends in zero!" << endl;
      iscore++;
    }
    //Case 3: Loose the game
    else {
      if (icheckzero != 0) {
        if(icheckthree != 0) {
          iend = 1;
        }
      }
    }
    
    if (iend == 1) {
      cout << "\n";
      cout << "Sorry Charlie!  You lose the game!" << endl;
    }
    else if (iscore == 3) {
      cout << "\n";
      cout << "You Win The Game!" << endl;
    } else {
      cout << "Keep going..." << endl;
      cout << "\n";
    }
  }
}

使用逻辑转换。

例如语句:

if ( <c1> && <c2> ) { <do-this-when-both-true> }

可以翻译成:

if ( <c1> ) {
    if ( <c2> ) {
        <do-this-when-both-true>
    }
}

这两个结构是等价的,但后者不使用连词。


一个while循环可以被带到if-goto-label如下:

while ( <condition> ) {
    <loop-body>
}

Loop1:
    if ( <condition> is false ) goto EndLoop1;
    <loop-body>
    goto Loop1;
EndLoop1:

接下来,分别是一个涉及反转连词&&的if语句,如下:

if ( <c1> && <c2> is false ) goto label;

又名

if ( ! ( <c1> && <c2> ) ) goto label;


简化为:

if ( ! <c1> || ! <c2> ) goto label;

这是德摩根的逻辑定律,将否定与合取和析取联系起来。


最后,上面的析取可以很容易地简化(类似于上面的连词简化)如下:

   if ( ! <c1> ) goto label;
   if ( ! <c2> ) goto label;

如果 while 循环的条件是连词 (&&),您可以将上述转换组合在一起以创建条件退出析取序列。