lab4 2021.10.14

使用参考书为学校配套使用上机指导书

一、ABC全排列

本解法利用了枚举法的思想,用三重循环罗列出所有ABC组合,再利用if语句进行条件判断,筛选出需要的排列。

上机时遇到的问题主要有两个:

  1. cout输出字符’A’、’B’、’C’。这涉及int型和char型变量的转换,在计算机中存储char变量时也是使用0、1比特位来存储的,那如何让计算机由存储的二进制数字输出一个所需的字符呢。这就用到了ASCII码表的转换。在程序遇到char型变量时,计算机会利用ASCII码表将存储在变量存储单元中的二进制数字转化为ASCII表中的字符。因此,在使用cout时,我们可以直接用类似cout << char(65)的语句输出需要的字符。上面这句语句输出的字符就是ASCII表中65对应的字符A

  2. 在使用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;
    }
}