lab4 2021.10.14
使用参考书为学校配套使用上机指导书
一、ABC全排列
本解法利用了枚举法的思想,用三重循环罗列出所有ABC组合,再利用if语句进行条件判断,筛选出需要的排列。
上机时遇到的问题主要有两个:
用
cout
输出字符’A’、’B’、’C’。这涉及int型和char型变量的转换,在计算机中存储char变量时也是使用0、1比特位来存储的,那如何让计算机由存储的二进制数字输出一个所需的字符呢。这就用到了ASCII码表的转换。在程序遇到char型变量时,计算机会利用ASCII码表将存储在变量存储单元中的二进制数字转化为ASCII表中的字符。因此,在使用cout
时,我们可以直接用类似cout << char(65)
的语句输出需要的字符。上面这句语句输出的字符就是ASCII表中65
对应的字符A
。在使用if、for语句时,一定要注意其后所跟的代码块范围。在验收时,发现很多同学在写if和for语句时,不加
{}
,对于分支或循环体重只有一行语句的代码这是可行的,但对于其中有多行代码的情况,这一般会导致逻辑BUG出现。因此,我们建议在使用if、for之类的语句时,尽量习惯性在后面加上{}
表明其代码块范围,即使其中只有一行代码。看没有大括号的语言的书的时候,是真的需要尺子的,换页就是灾难。 ——不知名网友
//示例代码
#include <iostream>
using namespace std;
int main()
{
char c1, c2, c3;
for (c1 = 'A'; c1 <= 'C'; ++c1){
for (c2 = 'A'; c2 <= 'C'; ++c2){
if (c1 == c2) {continue;}
else{
for (c3 = 'A'; c3 <= 'C'; ++c3){
if ((c3 == c1 || c3 == c2)) {continue;}
else {cout << c1 << c2 << c3 << endl;}
}
}
}
}
}
二、罗列素数
本解法逻辑也较简单,也是使用枚举法遍历范围内的全部数字,根据条件检查其是否为素数。
验收时基本没有发现什么问题,有一个可能要注意的就是如何判断代码是走完了整个循环再跳出for循环还是在其中触发了break跳出来。在示例代码中,我们使用flag来解决这个问题,是大部分同学使用的方法,也是我们比较推荐的方法。
#include <iostream>
using namespace std;
int main()
{
for (int i=1;i<=100;i++) { //枚举1到100的数
bool flag=true; //是否素数的标志
for (int j=2;j<i;j++) { //枚举2到i-1的数
//如果j整除i,则i不是素数,将标志修改为false,退出内层的循环
if (i%j==0) {
flag=false;
break;
}
}
if (!flag) continue; //如果标志为false,不输出
cout << i << endl;
}
}