流程控制
1掌握循环结构语句
前面的章节一直在介绍C语言的基本语法知识,然而仅仅依靠这些语法知识还不能编写出完整的程序。在程序中,通常需要加入业务逻辑,并对程序的流程进行控制。本章将重点讲解C语言中最基本的三种流程控制语句。程序都有一个共同的特点,即程序中的所有语句都是从上到下逐条执行,这样的程序结构叫做顺序结构。顺序结构是程序开发中最常见的一种结构,它可以包含多种语句,如变量的定义语句、输入输出语句、赋值语句等。
#include<stdio.h>
int main(){
pirntf("我\n");
pirntf("爱\n");
pirntf("c\n");
pirntf("语\n");
pirntf("言\n");
return 0;
}
使用了5个printf()语句,从上往下依次输出“我、爱、C、语、言”。从运行结果可以看出,程序是按照语句的先后顺序执行的。因此,可以说明该程序是一个顺序结构的程序。
2 if条件语句
f语句是指如果满足某种条件,就进行相应的处理。例如,小明妈妈跟小明说“如果你考试得了100分,星期天就带你去游乐场玩”。这句话可以通过下面的一段伪代码来描述。
如果小明考试得了100分
妈妈星期天带小明去游乐场
在上面的伪代码中,“如果”相当于C语言中的关键字if,“小明考试得了100分”是判断条件,需要用()括起来,“妈妈星期天带小明去游乐场”是执行语句,需要放在{}中。修改后的伪代码如下:
#include<stdio.h>
int main(){
if(小明考试得了100分){//条件语句
妈妈就带小明去游乐场}//代码块
}
上述语法格式中,判断条件是一个布尔值(T/F),当判断条件为true时,{}中的执行语句才会被执行。
#include<stdio.h>
int main(){
int x=5;//声明变量x
if(x<=10){
x++;
}
printf("x=%d\n,x");
return 0;
}
定义了一个变量x,其初始值为5。在if语句的判断条件中判断x的值是否小于10,很明显条件成立,因此{}中的语句会被执行,变量x的值将进行自增。从运行结果可以看出,x的值已由原来的5变成了6。else语句***else语句**
3 if else语句
if…else语句是指如果满足某种条件,就进行相应的处理,否则就进行另一种处理。语法格式中,判断条件是一个布尔值。当判断条件为true时,if后面{}中的执行语句1会被执行。当判断条件为false时,else后面{}中的执行语句2会被执行。
#include<stdio.h>
int main(){
int num=19;
if(num%2==0){//判断条件成立,num被2整除
printf("num是一偶数\n");
}
eles{
printf("是一个奇数\n");
}
return 0;
}
变量num的值为19,模以2的结果为1,不等于0,判断条件不成立。因此会执行else后面{}中的语句,打印“num是一个奇数”
4 if else.. if else语句
if…else if…else语句用于对多个条件进行判断,从而进行多种不同的处理。
#include<stdio.h>
int main(){
int grade=75;//定义学生的成绩
if(grade>=80){//满足条件grade>=80
printf("该成绩优秀\n");
}
else if (grade>=70){//不满足80但满足70
printf("该成绩良好\n");
}
else if (grade>=60){//同上
printf("该成绩为中\n");
}
else{
printf("该成绩为差\n");
}
return 0;
}
定义了学生成绩grade为75。它不满足第一个判断条件grade>=80,会执行第二个判断条件grade>=70,条件成立,因此会打印“该成绩的等级为良”。
5 switch条件语句
witch 条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。
用于表示星期的数字
如果等于1,则输出星期一
如果等于2,则输出星期二
如果等于3,则输出星期三
如果等于4,则输出星期四
如果等于5,则输出星期五
如果等于6,则输出星期六
如果等于7,则输出星期天
如果不是1~7,则输出此数字为非法数字
在switch语句中switch关键字后面有一个表达式,case关键字后面有目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句。witch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,就会执行相应case后的语句,否则执行default后的语句。关于switch语句中的break关键字将在后面的小节中做具体介绍,此处,初学者只需要知道break的作用是跳出switch语句即可。
#include<stdio.h>
int main(){
int week=5;
switch(week){
case 1:printf("星期一");
break;
case 2:printf("星期二");
break;
case 3:printf("星期三");
break;
case 4:printf("星期四");
break;
case 5:printf("星期五");
break;
case 6:printf("星期六");
break;
case 7:printf("星期天");
break;
default:
printf("输入的数字不正确");
break;
}
return 0;
}
由于变量week的值为5,整个switch语句判断的结果满足第19行的条件,因此打印“星期五”。程序中的default语句用于处理和前面的case都不匹配的情况,将第5行代码替换为int week = 8,再次运行程序,则会显示"输入的数字不正确"
循环结构语句
1 while循环语句
hile循环语句和上面小节讲到的条件判断语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会一直执行,直到条件不成立,while循环结束。
#include<stdio.h>
int main(){
int x=1;//定义变量x,初始值为1
while(x<=4){//循环条件
printf("x=%d\n",x);//成立条件,打印x的值
x++;//x进行自增
}
return 0;
}
输出结果 x=1 x=2 x=3 x=4
x的初始值为1,在满足循环条件x <= 4的情况下,循环体会重复执行,打印x的值并让x进行自增。因此打印结果中x的值分别为1、2、3、4。值得注意的是,中的第6行代码用于在每次循环时改变变量x的值,直到循环条件不成立,如果没有这行代码,整个循环会进入无限循环的状态,永远不会结束。
2 do…while循环语句
do…while循环语句和while循环语句功能类似,二者的不同之处在于,while语句需要先判断循环条件,然后根据判断结果来决定是否执行大括号中的代码,而do…while循环语句先要执行一次大括号内的代码再判断循环条件,
#include<stdio.h>
int main(){
int x=1;//定义变量x,初始值为1
do{
printf("x=%d\n",x);//成立条件,打印x的值
x++;//x进行自增
}
while(x<=4)//循环条件
return 0;
}
运行结果一致,这说明do …while循环和while循环能实现同样的功能。然而在程序运行过程中,这两种语句还是有差别的。如果循环条件在循环语句开始时就不成立,那么while循环的循环体一次都不会执行,而do…while循环的循环体还是会执行一次。若将例中的循环条件x<=4改为x < 1,第二个会打印x=1,而第一个什么也不会打印。
3.for循环语
在上面的语法格式中,for关键字后面()中包括了初始化表达式、循环条件和操作表达式三部分内容,它们之间用“;”分隔,{}中的执行语句为循环体。
for(初始化表达式;循环条件;操作表达式)
{执行语句
}
#include<stdio.h>
int main(){
int i,sum=0; //定义变量sum,用于记住累加的和
for(int i=1;i<=4;i++){ //i的值会在1-4之间变化
sum +=i; //实现sum与1的累加
}
printf("sum=%d\n",sum);// 打印累加的值
return 0;
}
输出结果为 10
变量i的初始值为1,在判断条件i<=4为true的情况下,会执行循环体sum+=i,执行完毕后,会执行操作表达式i++,i的值变为2,然后继续进行条件判断,开始下一次循环,直到i=5时,条件i<=4为false,结束循环,执行for循环后面的代码,打印“sum=10”
4.循环嵌套
有时为了解决一个较为复杂的问题,需要在一个循环中再定义一个循环,这样的方式被称作循环嵌套。在C语言中,while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,这当中最常见的就是在for循环中嵌套for循环
#include<stdio.h>
int main(){
int i, j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{printf("*");
}
printf("\n");
}
return 0;
}
定义了两层for循环,分别为外层循环和内层循环,外层循环用于控制打印的行数,内层循环用于打印“”,每一行的“”个数逐行增加,最后输出一个直角三角形。由于嵌套循环程序比较复杂,下面分步骤进行详细地讲解,具体如下:
第一步,在第4行代码中定义了两个循环变量i和j,其中i为外层循环变量,j为内层循环变量。
第二步,在第5行代码中将i初始化为1,条件i <= 9为true,程序将首次进入外层循环的循环体。
第三步,在第7行代码中将j初始化为1,由于此时i的值为1,条件j <= i为true,程序将首次进入内层循环的循环体,打印一个“*”。
第四步,执行第7行代码中内层循环的操作表达式j++,将j的值自增为2。
第五步,执行第7行代码中的判断条件j<=i,判断结果为false,内层循环结束。执行后面的代码,打印换行符。
第六步,执行第5行代码中外层循环的操作表达式i++,将i的值自增为2。
第七步,执行第5行代码中的判断条件i<=9,判断结果为true,程序将进入外层循环的循环体,继续执行内层循环。
第八步,由于i的值为2,内层循环会执行两次,即在第2行打印两个“*”。在内层循环结束时会打印换行符。
第九步,以此类推,在第3行会打印3个“*”,逐行递增,直到i的值为10时,外层循环的判断条件i <= 9结果为false,外层循环结束,整个程序也就结束了。
5 跳转语句(break、goto、continue)
1 berak语句
在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出当前循环语句,执行后面的代码。
#include<stdio.h>
int main (){
int x=1; //定义变量x,初始值为1
while(x<=4){ //循环条件
printf("x=%d\n",x); //条件成立,打印x的值
if(x==3){
break;
}
x++; //x自增
}
return 0;
}
输出结果 x=1 x=2 x=3
通过while循环打印x的值,当x的值为3时使用break语句跳出循环。因此打印结果中并没有出现“x=4”。
2 goto 语句
当break语句出现在嵌套循环中的内层循环时,它只能跳出内层循环,如果想要跳出外层循环则需要对外层循环添加标记,然后使用goto语句。
#include<stdio.h>
int main(){
int i, j; //定义变量 i j
for(i=1;i<=9;i++){ //外层循环
for(j=1;j<=9;j++){ //内层循环
if(i>4){ //判断i的值是否大于1
goto end; //跳至标识为end的语句
}
printf("*"); //输出*
}
printf("\n"); //换行
}
end; return 0;
}
在return语句前面增加了标记“end”。当i>4时,使用“goto end;”语句跳出外层循环。因此程序只打印了4行“*”。
3、continue语句
在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。
#include<stdio.h>
int main(){
int sum =0;
for(int i=1;i<=100;i++){
if(i%2==0){ //如果i是个偶数,执行if的代码
continue; //结束本次循环
}
sum +=i; //实现sum和i的累加
}
printf("sum=%d\n",sum);
return 0;
}
输出结果 :2500
使用for循环让变量i的值在1100之间循环,在循环过程中,当i的值为偶数时,将执行continue语句结束本次循环,进入下一次循环。当i的值为奇数时,sum和i进行累加,最终得到1100之间所有奇数的和,打印“sum = 2500”。
浙公网安备 33010602011771号