选择与循环结构嵌套

本讲将通过几个经典例子来讲解选择与循环嵌套。

选择与选择嵌套

if 与 if嵌套

判断变量a是否在3~10之间。

int a = 4;

if (a > 3) {

   if (a < 10) {

       printf("满足条件");
   }
}

可以看到,上面程序也可以使用逻辑运算符来简化为:

int a = 4;

if (a > 3 && a < 10) {

   printf("满足条件");
}

第二种写法明显更清晰,也更方便处理。所以在开发过程中,要学会合理运用逻辑运算来合并一些没必要的嵌套。

if 与 switch嵌套

用户输入是否是工作日(y/n)与星期几。如果是工作日,则星期一输出“中午吃牛肉面”,星期二输出“中午吃卤肉面”。

char isWorkingDay = 0;
int dayOfWeek;

printf("请输入是否是工作日(y/n), 与星期几:");
scanf("%c %d", &isWorkingDay, &dayOfWeek);

if (isWorkingDay == 'y') {

   switch (dayOfWeek) {
       case 1:
           printf("中午吃牛肉面");
           break;
       case 2:
           printf("中午吃卤肉面");
           break;

       default:
           break;
   }
}

选择与循环嵌套

对于选择与循环的嵌套结构,主要讲解for循环与if的嵌套。

if 与 for嵌套

输出2000~2100之间的闰年。

// 从2000循环到2100,挨着判断是否是闰年
for (int i = 2000; i <= 2100; i ++) {

   // 判断闰年:能被400整除或能被4且不能被100整除的年份
   if ((i % 400 == 0) || (i % 4 == 0 && i % 100 != 0)) {

       printf("%d ", i);
   }
}

循环与循环嵌套

循环嵌套主要讲解for循环的嵌套。

输出以下形状

****
****
****
// 控制行数
for (int i = 0; i < 3; i ++) {

   // 控制列数
   for (int j = 0; j < 4; j ++) {

       printf("*");
   }
   // 每一行结束后换行
   printf("\n");
}

输出以下形状

*
**
***
****

首先分析*与行号的关系:

行号 *个数
0 1
1 2
2 3
3 4
// 控制有多少行
for (int i = 0; i < 4; i ++) {

   // 控制每一行都多少*
   for (int j = 0; j <= i; j ++) {

       printf("*");
   }
   printf("\n");
}

输出九九乘法表

for (int i = 1; i <= 9; i ++) {

   for (int j = 1; j <= i; j ++) {

       printf("%d * %d = %d\t", j, i, i * j);
   }
   printf("\n");
}

输出以下形状

   *
  **
 ***
****

首先分析*与行号的关系:

行号 *个数 空格数
0 1 3
1 2 2
2 3 1
3 4 0

空格数 = 总行数 - 1 - 行号

*数 = 行号 + 1

// 控制行数
for (int i = 0; i < 4; i ++) {

   // 控制每行的空格数
   for (int j = 0; j < 4 - 1 - i; j ++) {

       printf(" ");
   }

   // 控制每行的*数
   for (int j = 0; j <= i; j ++) {

       printf("*");
   }
   printf("\n");
}

输出以下形状

      1
    2   3
  4   5   6
7   8   9   0

分析:这道题同样需要找到行号、空格、数字之间的关系。同时可以看到,数字是从1开始,到0结束的,可以通过取余运算来达到这个效果。

// 定义变量number,用于输出连续数字
int number = 1;

// 外层循环控制行数
for (int i = 0; i < 4; i ++) {

   // 控制每一行的空格数
   for (int j = 0; j < 4 - 1 - i; j ++) {

       printf(" ");
   }
   // 控制每一行输出的数字
   for (int j = 0; j < i + 1; j ++) {

       // 因为最后一个数是0,而不是10,所以对10取余
       printf("%d ", number % 10);
       // 每输出一个数,就++
       number ++;
   }
   printf("\n");
}