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 循环的条件是连词 (&&),您可以将上述转换组合在一起以创建条件退出析取序列。
我想将我的程序从 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 循环的条件是连词 (&&),您可以将上述转换组合在一起以创建条件退出析取序列。