160 likes | 262 Views
3.1 分支流程控制语句 3.1.1 if 语句的三种形式 if 语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。 if 语句的一般形式为: if ( 表达式) 语句 1 else 语句 2 根据具体形式又可分为以下 3 种形式:. ( 1 ) if ( 表达式)语句 例如: if (x>y) printf("%d",x); ( 2 ) if ( 表达式)语句 1 else 语句 2 例如:
E N D
3.1 分支流程控制语句 3.1.1 if语句的三种形式 if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。 if语句的一般形式为: if(表达式) 语句1 else 语句2 根据具体形式又可分为以下3种形式: (1)if(表达式)语句 例如: if (x>y) printf("%d",x); (2)if(表达式)语句1 else 语句2 例如: if (x>y) printf("%d",x); else printf("%d",y);
(3)if (表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 …… else 语句n [例3-1] 输入两个数,按由小到大次序将这两个数重新排序。 main( ) { float a,b,t; scanf("%f,%f ",&a,&b); if (a>b){t=a;a=b;b=t} /*先将a原来的值保存在t中,然后将b原来的值赋给a,再将t中保存的值赋给b,从而实现a与b的值互相交换*/ printf("%5.2f,%5.2f",a,b); }
3.1.2 if语句与条件运算符 条件表达式运算符的一般格式为: 条件 ? 表达式1:表达式2 这是一个三目运算符,它控制三个操作数,第一个操作数是条件,条件通常是一个逻辑关系表达式,判断该条件是否成立,即是否为真。若为真,表达式1的值就是本条件表达式的运算结果;否则,表达式2的值就是本条件表达式的运算结果。 [例3-2]求两个数中的最大值。 可以改写成: main( ) { int a,b,c; scanf("%d%d",&a,&b); c=(a>b)?a:b; printf("The maxum is %d",c); } main( ) { int a,b,c; scanf("%d%d",&a,&b); if (a>b) c=a; else c=b; printf("The maxum is %d",c); }
3.1.3 if语句的嵌套 在 if 语句中又包含一个或多个 if 语句,称为 if 语句的嵌套。 [例3-4]求3个数中的最大者。 main( ) { int a,b,c,d; scanf("%d%d%d",&a,&b,&c); if (a>b) if (a>c)d=a; else d=c; else if (b>c) d=b; else d=c; printf("The maxum is %d",d); }
3.1.4 switch语句 switch语句是多分支选择语句。switch语句的一般形式如下: switch (表达式) { case 常量表达式1:语句1 break; case 常量表达式2:语句2 break; … case 常量表达式n:语句n break; default :语句n+1 } 说明: (1)每个case的常量表达式的值必须互不相同,但多个case可以共用一组语句。 (2)当表达式的值与某一个 case 后面的常量表达式相等时,就执行此 case 后面语句,若所有的case 中的常量表达式的值都没有与表达式的值匹配时,就执行 default 后面的语句。 (3)break 语句的作用是在执行一个 case 分支后,使流程跳出 switch 结构,即终止 switch 语句的执行。请注意:若忘记给某一 case 子句加上 break 语句,则在这条case子句之后的case子句也将被执行,直到遇到 break 语句或 switch 语句结束。
[例3-5]用switch case和break语句编写一个程序,输入字符A或a时,显示America;输入字符B或b时,显示Britain;输入字符C或c时,显示China;输入字符D或d时,显示Denmark;输入其他字符时,显示Canada。 main( ) { char ch; printf("Please input a character:");scanf("%c",&ch); switch(ch){ case 'a': case 'A':printf("America \n");break; case 'b': case 'B':printf("Britain \n");break; case 'c': case 'C':printf("China \n");break; case 'd': case 'D':printf("Denmark \n");break; default:printf("Canada \n"); } }
3.2 循环流程控制语句 循环结构是结构化程序三种基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。 在C语言中可以用以下语句来实现循环: (1)用goto语句和if语句构成循环; (2)用while语句,也称“当”型循环; (3)用do-while语句,也称“直到”型循环; (4)用for语句。 3.2.1 goto语句 goto语句为无条件转向语句,它的一般形式为: goto 语句标号; 注意:goto语句不符合结构化程序设计原则,尽量少用,以防降低程序的可读性。
3.2.2 while语句 其一般形式如下: while (表达式)语句 当表达式为真(非0值)时,执行while语句中的内嵌语句。 [例3-7]用while语句求1+2+…+100。 main( ) { int i=1,sum=0; while(i<=100) { sum=sum+i; i++; } printf("%d",sum); }
3.2.3 do-while语句 其一般形式为: do 语句 while (表达式); 其特点是:先执行语句,后判断表达式。它是这样执行的:先执行一次指定的内嵌的语句,然后判别表达式。当表达式的值为真(“非0值”)时,返回重新执行该语句,如此反复,直到表达式的值等于0为止循环结束。 [例3-8]用do-while语句求100!。 main( ) { int i=2,product=1; do { product = product*i;i++;} while(i<=100); printf("%d",product); }
3.2.4 for语句 for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句和do-while语句。 一般形式为:for(表达式1;表达式2;表达式3)语句 [例3-9]编一个程序显示Fibonacci数列 1,1,2,3,5,8,…的前36项。该数列的第1项和第2项为1,从第3项开始,每项为前两项之和。 main( ) { long a=1,b=1,fib; int i; printf(“%15ld%15ld”,a,b);/*输出第1、2项,数据宽度为15,长整型,右对齐*/ for (i=3;i<=36;i++) { fib=a+b;printf(“%15ld”,fib);/*在循环过程中逐个输出第3至第36项*/ a=b;b=fib; if(i%4==0) printf("\n"); /*每行显示4个数据,然后换行显示*/ } }
3.2.5 循环的嵌套 一个循环体内又包含另一完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环(while循环,do-while循环和for循环)可互相嵌套。 [例3-11]利用循环的嵌套,显示九九乘法口决。 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*6=36 6*7=42 6*8=48 6*9=54 7*7=49 7*8=56 7*9=63 8*8=64 8*9=72 9*9=81
编这个程序应注意:使显示的数据按要求对齐,可采用转义字符“\t”跳格,也可以适当取空格来实现。编这个程序应注意:使显示的数据按要求对齐,可采用转义字符“\t”跳格,也可以适当取空格来实现。 程序如下: main( ) { int i=1,j; while(i<10) { for(j=1;j<i;j++) printf("\t"); for(j=i;j<10;j++) printf("\t%2d*%2d=%2d",i,j,i*j); printf("\n"); i++; } }
3.2.6 break语句和continue语句 1.break语句前面已经介绍过用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。如计算r=1到r=10时的圆面积,直到面积area大于100为止: for(r=1;r<10;r++) { area=pi*r*r; if(area>100) break; printf("%f",area); } 2.continue语句 其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 continue语句和break语句的区别是:continue语句只结束本次循环,而break是终止整个循环的执行。
[例3-12]把100~200之间不能被3整除的数输出。 程序如下: main( ) { int n; for(n=100;n<=200;n++) { if(n%3= =0) continue; printf("%d",n); } } 当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数),只有n不能被3整除时才执行printf函数。 当然 , 循环体也可以改用一个语句处理: if (n%3!=0) printf("%d",n); 我们在程序中用continue语句是为了说明continue语句的作用。
3.2.7 几种循环的比较 (1)4种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。 (2)while和do-while循环,只在while后面指定循环条件,在循环体中包含应反复执行的操作语句,包括使循环趋于结束的语句(如i++,或i=i+1等)。 for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while和do-while循环循环能完成的,用for循环都能实现。 (3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。 (4)while和for循环是先判断表达式,后执行语句;而do-while循环是先执行语句,后判断表达式。 (5)对while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。而对用goto语句和if 语句构成的循环,不能用break语句和continue语句进行控制。
本章小结 1.if语句是选择结构采用的主要语句。if后面的表达式,一般为逻辑表达式或关系表达式,也可以是任意的数值类型,包括整形、字符型、指针型数据。else子句不能作为语句单独使用,它必须与if 配对使用。if和else 语句的内嵌语句是多个语句时,必须用花括号“{ }”将几个语句括起来成为一个复合语句,但在{ }的后边不需再加分号。 2.switch语句主要用于多分支选择语句。每个case的常量表达式的值必须互不相同,但多个case可以共用一组语句。若忘了给某一case子句加上break语句,则在这条case子句之后的case子句也将被执行,直到遇到break语句或switch语句结束。 3.goto语句是无条件转向语句,它可以和if语句联合构成“当型”循环,但滥用goto语句将使程序流程无规律,可读性差。所以结构化程序设计方法主张限制使用goto语句。 4.while语句实现“当型”循环结构,do-while语句用来实现“直到型”循环结构。在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但在while后面的表达式一开始就为假(0值)时,两种循环的结果就不同了。 5.for语句是个功能强大的语句。for语句的三个表达式使用时相当灵活。可根据需要省略某一表达式,甚至三个表达式均可省略。表达式2无论是什么类型,只要它有确切的数值(非零或零)即可运行。 6.break语句和continue语句的区别是:continue语句只结束本次循环,而break是终止整个循环的执行。