已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 选择结构程序设计4.1本章导学一、教学目标1.掌握关系运算符和逻辑运算符。2.理解C语言中真与假的概念。3.学会正确书写关系表达式和逻辑表达式。4.能够区分关系等于运算符和赋值运算符。5.掌握根据各种运算符的优先级计算表达式的值。6.熟练掌握三种if语句和switch语句。7.掌握选择结构的嵌套。二、知识要点1.关系运算符及表达式表4.1 关系运算符关系运算符优先级结合性、 =、c+d,(a=9)!=(bc)等。(4)关系表达式的值为逻辑值,即“真”或“假”,在C语言中以1表示为真,以0表示假。如 98,值为1(真);89,值为0(假);设a=2,b=3,c=4,则ab!=c相当于(ab)!=c,值为1(真)。2.逻辑运算符及表达式表4.2 逻辑运算符逻辑运算符含义结合性!逻辑非自左至右&逻辑与自左至右|逻辑或自左至右(1)“!”为单目运算符,要求只能有一个操作数,如!a,运算结果是非0为真,0为假。(2)“&”和“|”为双目运算符,要求有两个操作数。(3)三种逻辑运算符的优先级由高到低依次为:!、&、|;(4)“&”运算,当两个操作数均为非0(真)时,结果为1(真),否则结果为0(假);(5)“|”运算,当两个操作数均为0(假)时,结果为0(假),否则结果为1(真);(6)在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行;例:a&b&c,只有a为真时才需要判断b的值,只有a和b都为真时才需要判断c的值;a|b|c,只要a为真时就不必判断b和c的值,只有a为假时才判断b的值,a和b都为假时才判断c的值。(7)在C语言中,0x10并不能表示x大于0且小于10。假设x=-1,按照优先级及结合性,应先计算0x ,结果为0;再计算010,则结果为1(真),但是-1显然不在010之间,因此,此计算结果是错误的,所以一定要用 (0x)&(x3?2:3;由于23不成立,所以 max的值为3。(2)条件表达式的结合性为自右至左。如:ab?a:bc?b:c等价于ab?a:(bc?b:c)4.各运算符的优先级表4.3 部分运算符优先级运算符!算术运算符关系运算符&|条件运算符赋值运算符逗号运算符优先级高低例:(1)4 & 0 | 2+1,值为1(真);(2)设a=3,b=4,c=5,则a-bc&b!=c 等价于(a-b)b/3&c%2!=1 等价于(!a)(b/3)|(c%2)!=1),值为0(假)。5.在C语言中,用if实现选择结构,if 语句有以下三种最常用的格式:(1)单分支if (表达式) 语句例:if(xy) printf(“%d”,x); (2)双分支if (表达式) 语句1 else 语句2例:if (xy)printf(“max=%d”,x);elseprintf(“max=%d”,y);(3)多分支if(表达式1 ) 语句1else if(表达式2 ) 语句2else if(表达式m) 语句melse语句m+1例:if(n=90 ) g=A;else if(n=80 ) g=B;else if(n=70 ) g=C;else if(n=60 ) g=D;elseg=f;6.选择结构的嵌套在if中又包含一个或多个if语句称为if语句嵌套。if(表达式1 ) if( 表达式2) 语句块1;else 语句块2;elseif(表达式3 ) 语句块3;else 语句块4;(1)在if语句嵌套中,if与else既可以成对出现,也可以不成对出现;(2)else与if的配对原则是:else总是与其上最近且未配对的if配对。例:if (score90)printf(“very good”);elseif(score80)printf(“good”);elseif(score60) printf(“ok”);elseprintf(“bad”); 在书写时,else应与对应的if对齐,形成缩进格式,这样能够更清楚地表示if语句的逻辑关系。7.switch语句用来实现多分支的选择结构switch(表达式) case常量表达式1 :语句序列1case常量表达式2 :语句序列2 case常量表达式n :语句序列n; default : 语句序列n+1 (1)switch后面的表达式和case后面的常量表达式的值必须是整型或字符型,不能为浮点型;(2)同一个switch语句中各个常量表达式的值必须互不相等;(3)case后的常量表达式只起到语句标号的作用,在执行完某个case后的语句序列后,会继续执行下一个case语句后的语句序列,直到遇到break或执行完下面所语句。 因此,通常根据需要,会在case的语句序列最后加一个break语句来达到终止switch语句的目的。例:case的语句后面有break int k=2;switch(k) case 1: printf(%d ,k+);break; case 2: printf(%d ,k+);break; case 3: printf(%d ,k+);break; case 4: printf(%d ,k+);break; default: printf(data error!n);结果为:2case的语句后面没有breakint k=2;switch(k) case 1: printf(%d ,k+); case 2: printf(%d ,k+); case 3: printf(%d ,k+); case 4: printf(%d ,k+); default: printf(data error!n);结果为:2 3 4 data error!多个语句可以共用一个caseswitch(k) case 1: case 2: printf(*);break; case 3: case 4: printf(#);break; default: printf(enter data error!n);当k的值为1或2 时,都会输出“*”;当k的值为3或4时,都会输出“#”。(4)case后的语句序列可以是一条语句也可以是多条语句,可不必用括起来;(5)case与default的位置可以交换;例:switch(k) case 1:case 2: printf(*);break;default: printf(data error!n); case 3:case 4: printf(#);break; 此程序实现的功能依然是当k的值为1或2 时,都会输出“*”;当k的值为3或4时,都会输出“#”。(6)switch语句可以嵌套。例:switch(a) case 1:printf(*);break; case 2: switch(b) case 3: printf(&n);break; case 4: printf(#n);break; default: printf(data error!n);则当a=1时,输出*当a=2且b=3时,输出&当a=2且b=4时,输出#其他情况时,输出data error!4.2基础实验一、程序分析1.有函数定义如下:#include int main( ) int x,y;printf(请输入x的值:);scanf(%d,&x);if(x=0)y=x;printf(x的值是%d,y的值是%d ,x,y);return 0;(1)若输入3,则运行结果是:_ x的值是3,y的值是3 _。(2)若输入-3,则运行结果是:_ x的值是-3,y的值是-3_。(3)若将此题由双分支选择结构实现,则程序为:#include int main( ) int x,y;printf(请输入x的值:);scanf(%d,&x);if(x0) y=-x;else y=x;printf(%d的值是,%d的值是,x,y);return 0;2.以下程序实现的功能是输入x,判断x是否能被2整除。#includeint main( ) int x;scanf(x=%d,&x);if(x%2=0)printf(%d能2整除,x);else printf(%d不能被2整除,x); return 0;(1)若输入x=6,则运行结果:_6能被2整除_。(2)若输入x=7,则运行结果:_7不能被2整除_。3.以下程序实现的功能是输入年份,判断该年是否为闰年。#include int main( ) int year,leap=0;printf(请输入年份:);scanf(%d,&year);if(year%4=0&year%100!=0|year%400=0) printf(%d is a leap year.,year);else printf(%d is not a leap year.,year);return 0;(1)若输入2008,则运行结果:_2008 is a leap year._。(2)若输入2009,则运行结果:_2009 is not a leap year._。4.以下程序#include int main( ) int i=3;switch(i) case 1:printf(%d ,i+);case 2:printf(%d ,i+);case 3:printf(%d ,i+);case 4:printf(%d ,i+);printf( i=%d ,i); return 0;运行结果是:_3 4 i=5_。若在每个case语句的最后都加上break;,运行结果为:_3 i=4_。5.以下程序实现的功能是 根据给定数字,输出对应英文星期 。#includeint main( ) int n;printf(请输入1-7之间的任意数字:);scanf(%d,&n); switch(n) case 1: printf(Monday);break;case 2: printf(Tuesday);break;case 3: printf(Wednesday);break;case 4: printf(Thursday);break;case 5: printf(Friday);break;case 6: printf(Saturday);break;case 7: printf(Sunday);break;default: printf(您输入的数据不在1-7之间); return 0;4.3拓展实验一、程序分析1. 以下程序实现的功能是 比较任意两个整数的大小 ,请将方法二与方法三补充完整。方法一:#include int main( ) int a,b;printf(请输入a,b的值:);scanf(%d,%d,&a,&b);if(ab)printf(%d大于%d,a,b);if(ab)printf(%d小于%d,a,b);if(a=b)printf(%d等于%d,a,b);return 0;方法二:#include int main( ) int a,b;printf(请输入a,b的值:);scanf(%d,%d,&a,&b);if( ab ) printf(%d大于%d,a,b);else if(ab) printf(%d小于%d,a,b);else printf(%d等于%d,a,b);return 0; 方法三:#include int main( ) int a,b;printf(请输入a,b的值:);scanf(%d,%d,&a,&b);if( a!=b )if(ab) printf(%d大于%d,a,b);else printf(%d小于%d,a,b);else printf(%d等于%d,a,b);return 0; 2.以下程序段实现的功能是:_转换大小写_。#include int main( ) char ch ;scanf(%c,&ch);if (ch=A & ch=a & ch=z ) ch=ch-32;printf(%cn ,ch); return 0;(1)若输入h,则运行结果:_H_。(2)若输入H,则运行结果:_h_。(3)若输入 #,则运行结果:_#_。(4)若将此程序中的if语句用条件表达式语句表示,则程序可以改写为:#include int main( ) char ch ;scanf(%c,&ch);(ch=A & ch=a & ch=A & ch=Z?ch=ch+32:ch=ch-32):chprintf(%cn ,ch); return 0;3.以下程序的运行结果是 a=8,b=8,c=10 。#include int main( ) int x=10,y=9,a,b,c;a=(-x=y+)?-x:+y;b=x+;c=y;printf(a=%d,b=%d,c=%d,a,b,c); return 0; 二、程序填空1.以下程序实现的功能是输入两个时间,计算并输出两个时间的和(要求三个时间满足时间的规则,即分和秒的取值范围在0-59)。#include int main( ) int ah,am,as; /ah,am,as表示a时间的时、分、秒int bh,bm,bs; /bh,bm,bs表示s时间的时、分、秒 int h,m,s; /h,m,s表示a时间与b时间和的时、分、秒 printf(请输入a时间 时:分:秒n);scanf(%d:%d:%d,&ah,&am,&as);printf(请输入b时间 时:分:秒n);scanf(%d:%d:%d,&bh,&bm,&bs);h=ah+bh;m=am+bm;s=as+bs;if( s=60 )m+;s=s-60;if(m=60) h+;m=m-60; printf(求和后的时间是t%d:%d:%d,h,m,s);return 0; 2. 以下程序实现的功能是输入一个百分制成绩,要求输出成绩等级,90分以上为A,8189分为B,7079分为C,6069分为D,60分以下为E。方法一、使用多分支if语句进行编程#includeint main( ) float score;char grade;printf(请输入一个百分制成绩:);scanf(%f,&score);if( score100 )printf(您输入的不是一个百分制成绩);else if( score=90 ) grade=A; else if(score=80) grade=B; else if(score=70) grade=C; else if(score=60) grade=D; else grade=E; printf(等级为%c等,grade);return 0;方法二、使用单分支if语句进行编程#includeint main( ) float score;char grade;printf(请输入一个百分制成绩:);scanf(%f,&score);if(score100) grade=x;if(score=90&score=80&score=70&score=60&score=0&score60) grade=E; if( grade!=x ) printf(等级为%c等,grade);else printf(您输入的不是一个百分制成绩);return 0;方法三、使用switch语句进行编程#includeint main( ) float score;char grade;int c;printf(请输入一个百分制成绩:);scanf(%f,&score); switch( (int)score/10 ) case 10:case 9: grade=A;break;case 8: grade=B;break;case 7: grade=C;break;case 6: grade=D;break;case 5:case 4:case 3:case 2:case 1:case 0: grade=E; break;default: grade=x; if(grade=A&grade=E) printf(等级为%c等,grade);else printf(您输入的不是一个百分制成绩);return 0;3. 以下程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型,请在横线上填写正确内容。#include #include int main( )float a, b , c ;float s , area ;scanf(“%f,%f,%f” , &a, &b ,&c);if ( a+bc&a+cb&b+ca ) s=(a+b+c)/2;area= sqrt(s*(s-a)*(s-b)*(s-c);printf(“三角形的面积为:%fn”,area);if ( a=b&a=c ) printf(“等边三角形n”);else if ( a=b|a=c|b=c ) printf(“等腰三角形n”); else if(a*a+b*b=c*c)| (a*a+c*c=b*b)| (c*c+b*b=a*a) printf(“直角三角形n”); else printf(“一般三角形n”);else printf(“不能组成三角形n”);return 0;4. 以下程序实现的功能是,请将程序补充完整。#include int main( ) int x,y;scanf(%d,&x);switch(x0) case 1: y=-1 ;break; case 0:switch(x=0) case 1:y=0;break; case 0:y=1; printf(y=%d,y); return 0;5. 以下程序实现的功能输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天,即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。#include int main( ) int day,month,year,sum,leap;printf(n请输入年-月-日:n);scanf(%d-%d-%d, &year,&month, &day );switch(month)/*先计算某月以前月份的总天数*/ case 1: sum=0 ;break; case 2:sum=31;break; case 3:sum=59;break; case 4:sum=90;break; case 5:sum=120;break; case 6:sum=151;break; case 7:sum=181;break; case 8:sum=212;break; case 9:sum=243;break; case 10:sum=273;break; case 11:sum=304;break; case 12:sum=334;break; default:printf(data error);break;sum=sum+day; /*再加上某天的天数*/if(year%400=0|( year%4=0&year%100!=0 )/*判断是不是闰年*/leap=1;else leap=0;if( leap=1&month2 )/*如果是闰年且月份大于2,总天数应该加一天*/ sum+=1;printf(这一天是这一年的第%d天。,sum);return 0;三、程序改错1.以下程序实现求分段函数。y=行号源程序1234567891011#include int main( ) int x ,y ;scanf(%d,&x); if (x9) y=-1; else if (x=-1) y=x-1; else if (-1x=3) y=2*x; else y=x*(x+2); printf(%dn, y); return 0; 找 错错误在 7行应改为:else if (-1x&x=3) y=2*x;调试正确后的运行结果输入数据: 10 运行结果:-1输入数据: 9 运行结果:99输入数据: 3运行结果:6输入数据: -1运行结果:-22.以下程序实现的功能是输入x的值,计算并输出y的值,x与y的关系如下:行号源程序1234567891011#include int main( ) int x,y; scanf(%d,&x); y=x-3; if (x!=0) if (x0) y=x+3; else y=x; printf(y=%dn , y); return 0;找 错错误在 6行应改为:if (x=0)调试正确后的运行结果输入数据:5运行结果:8输入数据:0运行结果:0输入数据:-5运行结果:-83.以下程序实现的功能根据i的值,输出相应的信息。行号源程序1234567891011#include int main( ) float i=3,n=2; switch(i) case 1:printf(*);break; case n:printf(#);break; case 3:printf($);break; case 4:printf(&);break; return 0; 找 错错误在 4和6行应改为:switch(int)i)和case 2:printf(#);break;调试正确后的运行结果$四、编写程序1.输入一个三位正整数,判断该数是否为水仙花数。(水仙花数的是指一个三位数,其各位数字的立方各等于该数本身。例如:153是一个水仙花数,因为153=13+53+33)2. 输入一个字符,如果它是大写字母,则输出“upper letter”,并同时输出它是从A开始的第几个字符;如果它是小写字母,则输出“lower letter”,并同时输出它是a开始的第几个字母;如果它不字母,则输出该字符的ASCII码值。1. #include int main( ) int n,a,b,c;scanf(“%d”,&n); a=n%10;b=n/10%10;c=n/100;if(n=a*a*a+b*b*b+c*c*c)printf(“%d是水仙花数n”, n); else printf(“%d不是水仙花数n”, n); return 0;2. #include int main( ) char c;scanf(“%c”,&c); if(c=A&c=a&cb)&(n=cd)后,n的值是( )。A. 1 B. 2 C. 3 D. 42. 以下选项中,当x为大于l的奇数时,值为0的表达式是( )。A. x%2=1 B. x/2 C. x%2!=0 D. x%2=03. 下述程序的运行结果是( )。#includeint main ( ) int x=-1,y=4,k; k=x+=0 & !(y-=0); printf(“%d,%d,%d”,k,x,y);A.0,0,3 B.0,1,2 C.1,0,3 D.1,1,24. if语句的基本形式是if(表达式)语句,其中“表达式”( )。A. 必须是逻辑表达式 B. 必须是关系表达式C. 必须是逻辑表达式或关系表达式 D. 可以是任意合法的表达式5. 多重if_else嵌套使用时,寻找else配对的if方法是( )。A. 缩排位置相同的if B. 其上最近的ifC. 下面最近的if D. 其上最近的未配对的if6. 以下程序( )。#includeint main( ) int x=0,y=0,z=0;if (x=y+z) printf(“*”);else printf(“#”);A. 有语法错误,不能通过编译 B. 输出:*C. 可以编译,但不能通过连接,所以不能运行 D. 输出:#7. 以下错误的if语句是( )。A. if(xy) z=x; B. if(x=y) z=0;C. if(x!=y) printf(“%d”,x) else printf(“%d”,y); D. if(xy) x+;y-;8. 以下程序的运行结果是( )。#includeint main( ) int a=0,b=0,c=0;if (+a0 | | +b0) +c;printf(“%d,%d,%d”,a,b,c);A. 0,0,0 B. 1,1,1 C. 1,0,1 D. 0,1,19. 两次运行下面的程序段,如果从键盘上分别输入6和3,则运行结果是( )。int x;scanf(%d,&x);if(x+5) printf(%d,x);else printf(%dn,x - -);A. 7和5 B. 6和3 C. 7和4 D. 6和410. 若变量已正确定义,则以下程序段的运行结果是( )。int a=3,b=5,c=7; if(ab)a=b; c=a; if(c!=a)c=b; printf(%d,%d,%dn,a,b,c); A. 程序段有语法错 B. 3,5,3 C. 3,5,5 D. 3,5,711. 设变量x和y均已正确定义并赋值,以下语句在编译时将产生错误信息的是:( )。A. if(x+); B. if(xy&y!=0);C. if(x0) x- D. if(y0) ;else y+; else x+;12. 当a=1,b=3,c=5,d=4时,执行完下面一段程序后x的值是( )。if (ab)if (cd) x=1;elseif (ac)if (bd) x=2;else x=3;else x=6;else x=7;A. 1 B. 2 C. 3 D. 413. 下列程序的运行结果是( )。#include int main( ) int x=-9,y=5,z=8; if(xy) if(y0)z=0; else z+=1; printf(%dn,z);return 0;A. 6 B. 7 C. 8 D. 914. 在执行下述程序时,若从键盘输入6和8,则结果为( )。#include int main( ) int a,b,s; scanf(%d%d,&a,&b); s=a;if(ab) s=b; s*=s; printf(%d,s); return 0; A. 36 B. 64 C. 48 D. 以上都不对15. 若执行下面的程序时,从键盘输入5和2,则运行结果是( )。#include int main( ) int a,b,k; scanf(%d,%d ,&a,&b); k=a; if(ab) c=a,a=b,b=c; B. if(ab) c=a,a=b,b=c;C. if(ab) c=a;a=b;b=c; D. if(ab) c=a;a=b;b=c;17. 以下程序段中,与语句:k=ab?(bc?1:0):0;功能相同的是( )。A. if(ab)&(bc) k=1; B. if(ab)|(bc) k=1;else k=0; else k=0;C. if(ab) k=1;else if(bc) k=1;else k=0;18. 有以下程序#include int main( ) int x;scanf(“%d”,&x);if(x=3); else if(x!=10) printf(“%dn”,x);return 0;程序运行时,输入的值在哪个范围才会有运行结果( )。A. 不等于10的整数 B. 大于3且不等于10的整数C. 大于3或等于10的整数 D. 小于3的整数有以下程序19. 程序运行后的运行结果是( )。#includeint main( ) int a=1,b=2,c=3,d=0;if(a= =1 &b+= =2)if(b!=2 | c-!=3)printf(“%d,%d,%dn”,a,b,c);else printf(“%d,%d,%dn”,a,b,c);else printf(“%d,%d,%dn”,a,b,c);return 0;A. 1,2,3 B. 1,3,2 C. 1,3,3 D. 3,2,120. 以下程序运行后的运行结果是( )。#include int main( ) int x=1,y=0;if(!x) y+;else if(x= =0)if (x) y+=2;else y+=3;printf(%dn,y);return 0; A. 3 B. 2 C. 1 D. 021. 以下程序的运行结果是( )。#includeint main( )intx1,y2,z3;if(xy)if(yz)printf(%d,z);elseprintf(%d,y);printf(%dn,x);return 0;A. 331 B. 41 C. 2 D. 122. 以下程序的运行结果是( )。#includeint main( ) int c=0,k=3;switch(k)default: c+=k;case 2:c+;break;case 4:c+=2;break;printf(%dn,c);return 0;A. 1 B. 2 C. 3 D. 423. 以下程序的运行结果是( ) #include int main( ) int k=2; switch (k) case 1:printf(“%dn”,k+);break;case 2:printf(“%d ”,k+); case 3:printf(“%dn”,k+);break;case 4:printf(“%dn”,k+); default :printf(“Full!n”); return 0;A. 1 3 B. 2 3 C. 2 2 D. 3 2 24. 以下程序的运行结果是:( )。#include int main( ) int a=15,b=21,m=0;switch(a%3) case 0:m+;break;case 1:m+;switch(b%2) default:m+;case 0:m+;break;printf(%dn,m);return 0;A. 1 B. 2 C. 3 D. 425. 以下程序的运行结果是( )。#include int main( ) int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0:a+; break; case 1:b+; break; case 2:a+; b+; break; case 3:a+; b+; printf(a=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宝鸡三和职业学院单招职业倾向性测试题库附答案
- 民航法规概论题库及答案
- 2025年武汉大学教育发展基金会非事业编制岗位招聘参考题库附答案详解ab卷
- 2026年云南省昭通地区单招职业适应性考试题库必考题
- 2025广东肇庆市封开县事业单位招聘“三支一扶”等基层服务项目人员11人参考题库含答案详解(巩固)
- 2026年陕西交通职业技术学院单招综合素质考试题库附答案
- 2026年浙江越秀外国语学院单招职业倾向性考试题库必考题
- 2026年广西自然资源职业技术学院单招职业适应性考试题库带答案
- 2026年黑龙江幼儿师范高等专科学校单招综合素质考试必刷测试卷完美版
- 2026年浙江农业商贸职业学院单招职业倾向性考试必刷测试卷带答案
- 九三学社 入 社 申 请 表
- 三级安全教育登记卡(新)
- 中小学心理健康教育特色学校标准(试行)
- 蔡司三坐标-高级培训教程
- 韵达快递承包合同韵达快递承包合同
- T-DLSHXH 002-2023 工业干冰标准规范
- 静力压桩中的几个问题及在苏州某工程中的应用
- 钣金检验作业指导书
- 滕王阁序注音全文打印版
- JJG 971-2019液位计
- 高一上学期英语期中考试质量分析会课件
评论
0/150
提交评论