博学谷——让IT教学更简单,让IT学习更有效
开始i <= 9假假j <= i真真printf(“i*j=i*j”);
图3-25 九九乘法表流程图
由于嵌套循环程序比较复杂,下面分步骤进行详细地讲解,具体如下: 第一步,在第4行代码中定义了两个循环变量i和j,其中i为外层循环变量,j为内层循环变量。 第二步,在第5行代码中将i初始化为1,条件i <= 9为真,即一共打印9行。程序将首次进入
外层循环的循环体。
第三步,在第7行代码中将j初始化为1,由于此时i的值为1,条件j <= i为真,程序将首次
进入内层循环的循环体,打印第一行的数值相乘结果:1*1 = 1。
第四步,执行第7行代码中内层循环的操作表达式j++,将j的值自增为2。
第五步,执行第7行代码中的判断条件j<=i,判断结果为假,内层循环结束。执行后面的代码,
打印换行符。
第六步,执行第5行代码中外层循环的操作表达式i++,将i的值自增为2。
第七步,执行第5行代码中的判断条件i<=9,判断结果为真,程序将进入外层循环的循环体,
继续执行内层循环。
第八步,由于i的值为2,内层循环会执行两次,即在第2行打印两列相乘结果:2*1=2 2*2 =4。
在内层循环结束时会打印换行符。
第九步,以此类推,在第3行会打印3列相乘结果,逐行递增,直到i的值为10时,外层循环
的判断条件i <= 9结果为假,外层循环结束,整个程序也就结束了。
除了用for循环来实现乘法表,读者也可以尝试用while和do…while()循环来实现。这里就不再 赘述。
结束3.5.5 跳转语句(break、continue、goto)
跳转语句用于实现循环执行过程中程序流程的跳转,在C语言中,跳转语句有break语句、goto语句和continue语句。接下来分别进行详细地讲解。
1、break语句
在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出当前循环语句,执行后面的代码。接下来通过一个具体的案例来演示break语句如何跳出当前循环,如例3-12所示。
例3-12
1 #include
int x = 1; //定义变量x,初始值为1
21
博学谷——让IT教学更简单,让IT学习更有效
5 6 7 8 9 10 11 12 13 14 }
while (x <= 4) //循环条件 { }
printf(\条件成立,打印x的值 if (x == 3) { }
x++; //x进行自增
break;
运行结果如图3-26所示。
图3-26 运行结果
例3-12中,通过while循环打印x的值,当x的值为3时使用break语句跳出循环。因此打印结果中并没有出现“x=4”。需要注意的是,break语句不能用于循环语句和switch语句之外的任何其他语句。
2、continue语句
在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。求1~100之内的奇数之和就可以使用continue语句来实现,如例3-13所示。
例3-13
1 #include
int sum = 0; //定义变量sum,用于记住和 for (int i = 1; i <= 100; i++) { }
printf(\
if (i % 2 == 0) //如果i是一个偶数,执行if语句中的代码 { }
sum += i; //实现sum和i的累加
continue; //结束本次循环
运行结果如图3-27所示。
图3-27 运行结果
22
博学谷——让IT教学更简单,让IT学习更有效
例3-13使用for循环让变量i的值在1~100之间循环,在循环过程中,当i的值为偶数时,将执行continue语句结束本次循环,进入下一次循环。当i的值为奇数时,sum和i进行累加,最终得到1~100之间所有奇数的和,打印“sum = 2500”。 注意:break与continue的区别
? break终止当前循环,执行循环体外的第一条语句;而continue是终止本次循环,继续执行
下一次循环。
? break语句可以用于switch语句,而continue不可以。 3、goto语句
当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想要跳出外层循环则需要对外层循环添加标记,然后使用goto语句。通过一个案例来演示如何使用goto语句,如例3-14所示。
例3-14
1 #include
int i, j; //定义两个循环变量 for (i = 1; i <= 9; i++) //外层循环 { }
for (j = 1; j <= i; j++) //内层循环 { }
printf(\换行
if (i > 4) //判断i的值是否大于4 { }
printf(\输出*
goto end; //跳至标识为end的语句
18 end: system(\让运行结果界面暂停,system()包含在stdlib.h头文件中 19 return 0; 20 }
运行结果如图3-28所示。
图3-28 运行结果
例3-14中,在system()语句前面增加了标记“end”。当i>4时,使用“goto end;”语句跳出外层循环。因此程序只打印了4行“*”。
需要注意的是,结构化程序设计方法主张限制使用goto语句,goto语句可以跳转到指定的任意语句,滥用该语句将使程序流程无规律、可读性差。
23
博学谷——让IT教学更简单,让IT学习更有效
3.6 进阶案例(一)——打印水仙花数
学完了C语言程序设计的流程,接下来通过一个打印水仙花数的案例来加深对C语言流程控制程序的理解。所谓的水仙花数是指一个n位数(n ≥ 3),它的每个位上的数字n次幂之和等于本身。例如,3位数153是水仙花,各位数字的立方和13+53+33=153。
例3-15
1 #include
4 int num; 5 6 7 8 9 10 11 12 13 14 15 }
int a, b, c;
for (num = 100; num < 1000; num++) { }
a = num % 10; //num的个位数字 b = num / 10 % 10; //num的十位数字 c = num / 100; //num的百位数字
if (num == (a*a*a + b*b*b + c*c*c))
printf(\
运行结果如图3-29所示。
图3-29 运行结果
例3-15中,水仙花数是一个三位数,所以要遍历100-1000之间的数,要求这个三位数的每个数字的立方和,则先要求出其每个位上的数字,第7、8、9行代码分别求出了其个、十、百位上的数字,第11行代码判断三个数字的立方和是否与原来的数相等,相等则打印,不相等则进行下一次循环。
3.7 进阶案例(二)——查找100以内的素数
打印完水仙花后,接下来紧追一步打印出1-100之间的所有素数。所谓素数,是只能被1和它本身整除的数。代码示例如例3-16所示。
例3-16
1 void main() 2 { 3 4
int num = 2; //num从2开始 int i, j = 1;
24
博学谷——让IT教学更简单,让IT学习更有效
5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 24
}
}
if (count % 5 == 0) //每5个换一行
printf(\
if (num == i) //如果跳出内层循环后,num == i成立,即2-num之间的数都不能整除num {
printf(\则num就是一个素数,就打印出来
while (num < 100) //遍历1-100之间的数 {
for (i = 2; i < num; i++) //用2-num之间的所有数去除num { }
if (num % i == 0) //如果模等于0,也就是能被整除 { }
break; //就跳出这层循环,执行num++
18 count++; //记录素数的个数
23 num++; //num++不要忘记
25 printf(\之间的素数一共有%d个\\n\ 26 27 }
system(\让运行结果界面暂停
运行结果如图3-30所示。
图3-30 运行结果
如图3-41所示,1-100之间一共有25个素数。素数只能被1和它本身整除,则在求素数时,要用num与2-num之间的所有数相除,如果没有能整除num的数,则num就是一个素数。
例3-15与例3-16中结合了循环、选择语句之间的嵌套。关于这几种结构语句的使用,读者要多加练习,熟练掌握。
3.8 本章小结
本章首先讲解了程序的运行流程图,然后讲解了C语言中最基本的三种流程控制语句,包括顺序结构语句、选择结构语句和循环语句。通过本章的学习,读者应该能够熟练的运用if判断语句、switch判断语句、while循环语句、do-while循环语句以及for循环语句。掌握本章的内容就能够编写逻辑比较复杂的C语言程序并且有助于后面章节的学习。
25