C语言 第四章重点汇总
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4)各case及default子句的先后次序,不影响程序执 行结果。 (5)多个case子句,可共用同一语句(组)。 例如,在[案例4.5]中的“case 10: ”和“case 9: ”共用 语句“printf("grade=A\n"); break;”,“case 5: ”~“case 0: ” 共用语句“printf("grade=E\n"); break;”。 (6)用switch语句实现的多分支结构程序,完全可 以用if语句或if语句的嵌套来实现。 [Return]
[Return]
4.2 switch语句
C语言提供了switch语句直接处理多分支选择。 [案例4.4] 从键盘上输入一个百分制成绩score,按下列原则输出其 等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80, 等级为C;60≤score<70,等级为D;score<60,等级为E。 /*案例代码文件名:AL4_5.C。*/ main() {int score, grade; printf(“Input a score(0~100): ”); scanf(“%d”, &score); grade = score/10; /*将成绩整除10,转化成switch语句中的case标号*/ switch (grade) {case 10: case 9: printf(“grade=A\n”); break;
2.if语句的执行过程 (1)缺省else子句时 当“表达式”的值不等于0(即判定为“逻辑真”) 时,则执行语句组1,否则直接转向执行下一条。如图41(a)所示。
(2)指定else子句时 当“表达式”的值不等于0(即判定为“逻辑真”) 时,则执行语句组1,然后转向下一条语句;否则,执行 语句组2。如图4-1(b)所示。 3.if语句的嵌套与嵌套匹配原则 if语句允许嵌套。所谓if语句的嵌套是指,在“语句 组1”或(和)“语句组2”中,又包含有if语句的情况。 if语句嵌套时,else子句与if的匹配原则:与在它上 面、距它最近、且尚未匹配的if配对。 为明确匹配关系,避免匹配错误,强烈建议:将内 嵌的if语句,一律用花括号括起来。 [案例4.3] 写一程序,从键盘上输入1年份year(4位十 进制数),判断其是否闰年。闰年的条件是:能被4整除、 但不能被100整除,或者能被400整除。
[例4.3] 从键盘上输入一个字符,如果它是大写字母, 则把它转换成小写字母输出;否则,直接输出。 /*案例文件名:AL4_4.C*/ main() { char ch; printf("Input a character: "); scanf("%c",&ch); ch=(ch>='A' && ch<='Z') ? (ch+32) : ch; printf("ch=%c\n",ch); } [程序演示]
程序运行情况如下: Please input three numbers:11,22,18↙ The three numbers are:11,22,18 max=22 本案例中的第1个if语句,可优化为如下不带else子句 的形式: max=num1; if(num2>max) max=num2; 这种优化形式的基本思想是:首先Fra Baidu bibliotek一个数预置为 max(最大值),然后再用max依次与其余的数逐个比较, 如果发现有比max大的,就用它给max重新赋值,比较完 所有的数后,max中的数就是最大值。这种方法,对从3 个或3个以上的数中找最大值的处理,非常有效。请读者 仔细体会。
}
}
程序运行情况如下: Input a score(0~100): 85↙ grade=B
[程序演示]
1.switch语句的一般形式 switch(表达式) { case 常量表达式1:语句组;break; case 常量表达式2:语句组;break; ...... case 常量表达式n:语句组;break; [default:语句组;[break; ]] } 2.执行过程 (1)当switch后面“表达式”的值,与某个case后面 的“常量表达式”的值相同时,就执行该case后面的语句 (组);当执行到break语句时,跳出switch语句,转向执 行switch语句的下一条。
4.说明 (1)if后面的“表达式”,除常见的关系表达式或逻辑表达式外, 也允许是其它类型的数据,如整型、实型、字符型等。 (2)if语句允许嵌套,但嵌套的层数不宜太多。在实际编程时, 应适当控制嵌套层数(2~3层)。 (3)“语句组1”和“语句组2”,可以只包含一个简单语句,也可 以是复合语句。 务必牢记 :不管是简单语句,还是复合语句中的各个语句,每个 语句后面的分号必不可少! 例如,[案例4.1]中的: if (num1>num2) max=num1; else max=num2;语句: if行后面的赋值语句“max=num1;”分号不能省略。但不要误认为if 和else是2个独立的语句,它们都属于if语句中的一部分,else是if语句 的子句。
if (year % 4==0) {if (year % 100 != 0) leap=1;} else {if (year%400==0) leap=1; } if (leap) printf("%d is a leap year.\n",year); else printf("%d is not a leap year.\n",year);
4.3 选择结构程序设计举例
[案例4.5] 求一元二次方程ax2+bx+c=0的解(a≠0)。 /*案例代码文件名:AL4_6.C。*/ /*功能:求一元二次方程的解。*/ #include "math.h" main() {float a,b,c,disc,x1,x2,p,q; scanf(“%f,%f,%f”, &a, &b, &c); disc=b*b-4*a*c; if (fabs(disc)<=1e-6) /*fabs():求绝对值库函数*/ printf(“x1=x2=%7.2f\n”, -b/(2*a)); /*输出两个相等的实根*/ else { if (disc>1e-6) {x1=(-b+sqrt(disc))/(2*a); /*求出两个不相等的实根*/ x2=(-b-sqrt(disc))/(2*a); printf("x1=%7.2f,x2=%7.2f\n", x1, x2); }
case 8: printf("grade=B\n"); break; case 7: printf("grade=C\n"); break; case 6: printf("grade=D\n"); break; case 5: case 4: case 3: case 2: case 1: case 0: printf(“grade=E\n”); break; default: printf(“The score is out of range!\n”);
4.1 if语句
4.1.1 if语句 [案例4.1] 输入任意三个整数num1、num2、num3,求三个数中的最 大值。 /*案例代码文件名:AL4_1.C。*/ /*功能:说明if 语句的格式。*/ main() {int num1,num2,num3,max; printf("Please input three numbers:"); scanf("%d,%d,%d",&num1,&num2,&num3); if (num1>num2) max=num1; else max=num2; if (num3>max) max=num3; printf("The three numbers are:%d,%d,%d\n",num1,num2,num3); printf("max=%d\n",max); } [程序演示]
程序运行情况如下: Please input three numbers:11,22,18↙ Three numbers after sorted: 11,18,22
1.if语句的一般格式
if(表达式) {语句组1;} [else {语句组2;} ] (1)if语句中的“表达式”必须用“(”和“)”括起来。 (2)else子句(可选)是if语句的一部分,必须与if配对使用,不 能单独使用。 (3)当if和else下面的语句组,仅由一条语句构成时,也可不使 用复合语句形式(即去掉花括号)。
else {p=-b/(2*a); q=sqrt(fabs(disc))/(2*a); printf(“x1=%7.2f + %7.2f i\n“, p, q); printf(”x2=%7.2f - %7.2f i\n“, p, q); } } }
[案例4.2]输入任意三个数num1、num2、num3,按从小到大的顺序 排序输出。 /*案例代码文件名:AL4_2.C。*/ main() {int num1,num2,num3,temp; printf("Please input three numbers:"); scanf("%d,%d,%d",&num1,&num2,&num3); if (num1>num2) {temp=num1;num1=num2;num2=temp;} if (num2>num3) {temp=num2;num2=num3;num3=temp;} if (num1>num2) {temp=num1;num1=num2;num2=temp;} printf("Three numbers after sorted: %d,%d,%d\n",num1,num2,num3); } [程序演示]
算法设计要点: (1)如果X能被Y整除,则余数为0,即如果X%Y的值等于 0,则表示X能被Y整除! (2)首先将是否闰年的标志leap预置为0(非闰年),这样仅 当year为闰年时将leap置为1即可。这种处理两种状态值的方法,对 优化算法和提高程序可读性非常有效,请读者仔细体会。参考程序 如下: /*案例代码文件名:AL4_3.C。*/ /*功能:说明if语句的嵌套格式和用法。*/ main() {int year,leap=0; /* leap=0:预置为非闰年*/ printf("Please input the year:"); scanf("%d",&year);
}
[程序演示]
利用逻辑运算能描述复杂条件的特点,可将上述程序优化如下: main() {int year; printf("Please input the year:"); scanf("%d",&year); if ((year%4==0 && year%100!=0)||(year%400==0)) printf("%d is a leap year.\n",year); else printf("%d is not a leap year.\n",year); }
(2)如果没有任何一个case后面的“常量表达式” 的值,与“表达式”的值匹配,则执行default 后面的语 句(组)。然后,再执行switch语句的下一条。 3.说明 (1)switch后面的“表达式”,可以是int、char和枚 举型中的一种。 (2)每个case后面“常量表达式”的值,必须各不 相同,否则会出现相互矛盾的现象(即对表达式的同一 值,有两种或两种以上的执行方案)。 (3)case后面的常量表达式仅起语句标号作用,并 不进行条件判断 。系统一旦找到入口标号,就从此标号 开始执行,不再进行标号判断,所以必须加上break语句, 以便结束switch语句。 思考题:如果去掉[案例4.5]程序中的所有break语句, 且输入的成绩为75,输出会如何?
第4章
选择结构程序设计
要设计选择结构程序,要考虑两个方面的问题:一是 在C语言中如何来表示条件,二是在C语言中实现选择结 构用什么语句。 在C语言中表示条件,一般用关系表达式或逻辑表达 式,实现选择结构用if语句或switch语句。 4.1 if语句 4.2 switch语句 4.3 选择结构程序举例 良好的源程序书写风格──注释