计算机二级C语言程序设计第4讲.ppt
第4讲 选择结构程序设计,要设计选择结构程序,要考虑两个方面的问题:一是在C语言中如何来表示条件,二是在C语言中实现选择结构用什么语句。在C语言中表示条件,一般用关系表达式或逻辑表达式,实现选择结构用if语句或switch语句。4.1 if语句4.2 switch语句4.3 选择结构程序举例,4.1 if 语句,if 语句是用来判断所给定的条件是否满足,根据判定的结果(真或假)决定执行给定的某种操作之一。,一、if 语句的形式1单边选择结构,格式:if(表达式)语句,执行过程:,判断条件,表达式取值非0,即条件成立,执行语句后继续向下执行,表达式取值为0,即条件不成立,跳过语句向下执行,P,语句,(入口),(出口),Y,N,一、if 语句的形式1单边选择结构,main()int x,y=0;scanf(%d,程序运行后,当从键盘上输入3时,程序运行的结果是多少?,程序运行后,当从键盘上输入-5时,程序运行的结果是多少?,x=3,y=7,x=-5,y=0,例如,求:y=,2x+1 x=00 x0,二、if 语句的形式2双边选择结构,格式:if(表达式)语句1 else 语句2,执行过程:,判断条件,表达式取值非0,即条件成立,执行语句1后继续向下执行,表达式取值为0,即条件不成立,跳过语句1执行语句2后向下执行,P,(入口),(出口),Y,N,二、if 语句的形式2双边选择结构,main()int x,y;scanf(%d,程序运行后,当从键盘上输入3时,程序运行的结果是多少?,程序运行后,当从键盘上输入-5时,程序运行的结果是多少?,x=3,y=7,x=-5,y=26,例如,求:y=,2x+1 x=0 x2+1 x0,这是一个双边结构,三、多层选择结构,格式:if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3:else if(表达式n)语句n else 语句n+1,执行过程:依次计算各表达式的值,若表达式之值为非0,即条件成立执行其后的语句后,跳过其它语句,向下执行;若表达式之值为0,即条件不成立,则继续判断其它条件;当所有的条件都不成立时,执行语句n+1后继续向下执行。,三、多层选择结构,这是一个单边结构,单边选择结构举例按升序输出两个实数,main()float a,b,t;scanf(%f,%f,程序运行后,如果从键盘上输入6,2.8,则程序运行的顺序为:,程序运行后,如果从键盘上输入2.8,6,则程序运行的顺序为:,2.80,6.00End,2.80,6.00End,两个变量交换数据的实现方法,变量a,3,变量b,5,注意:变量a,b交换内容不能简单地用a=b;b=a;来实现,正确的方法是借助一个中间变量(如t)来实现,先执行t=a;将a的值保存在中间变量t中,再执行a=b;将b的值赋给变量a,最后执行b=t;将t中保存的变量a的原来值赋给变量b,main()float a,b,t;scanf(%f,%f,复合语句及其花括号的使用,main()float a,b,t;scanf(%f,%f,有花括号时程序的运行顺序(假设从键盘上输入2.8,6),2.80,6.00End,复合语句及其花括号的使用,main()float a,b,t;scanf(%f,%f,去掉花括号时程序的运行顺序(假设从键盘上输入2.8,6),6.00,随机值End,复合语句及其花括号的使用,将前2个分号改为逗号时程序的运行情况(假设从键盘上输入2.8,6),main()float a,b,t;scanf(%f,%f,2.80,6.00End,复合语句及其花括号的使用,将前2个分号改为逗号时程序的运行情况(假设从键盘上输入2.8,6),main()float a,b,t;scanf(%d,%d,2.80,6.00End,结论:将条件成立时要进行的所有操作变成一个语句,if 语句的嵌套,一般形式:if(条件1)if(条件2)语句1 else 语句2 else if(条件3)语句3 else 语句4,在if 语句中又包含一个或多个if 语句,称为if 语句的嵌套,if 与 else 的配对关系:从最内层开始,else 总是与它上面最近的且尚未配对的if 配对。,求分段函数的值,1(x0)0(x=0)-1(x0),程序分析:要对x 的值判断之后计算y 的值,要用到选择结构。考虑到要进行两次判断,因而使用单边或双边选择结构都不能很好地解决这一问题,应使用多层选择结构或选择结构的嵌套。,y=,根据所输入的x之值,求:,这是一个嵌套结构,用if 嵌套结构求分段函数的值,main()int x,y;scanf(%d,/*x=0不成立,即x0*/,/*x=0成立且x0不成立,即x=0*/,从键盘上输入2时程序的运行顺序,x=2,y=1,用多层选择结构求分段函数的值,main()int x,y;scanf(%d,/*x0和x=0都不成立,即x0*/,/*x0不成立再判断x=0是否成立*/,从键盘上输入2时程序的运行顺序,x=2,y=1,条件运算符,条件运算符(三目):?:(表达式1)?(表达式2):表达式3)条件运算符的结合性:自右向左条件运算符的执行:先计算表达式1之值,若条件表达式的值非0(即条件成立),计算表达式2之值并将该值作为条件表达式之值;若表达式1的值为0(即条件不成立),计算表达式3之值并将表达式3之值作为整个条件表达式的值。,条件运算符的优先等级:高于赋值和逗号运算符,比其它运算符都低,条件运算符使用举例,有如下程序:main()int a=3,b=4,c;c=ab?a:b;printf(max=%dn,c);,语句:c=ab?a:b;执行以后,变量c中存放的是变量a,b中的最大值,输入一个字母并将其转换为小写(小写不变),main()char ch;scanf(%c,printf(%cn,ch),要求掌握的两点内容:掌握条件运算符的使用。掌握判断大写字母或小写字母的方法。,1、在嵌套使用if语句时,C语言规定else总是A)和之前与其具有相同缩进位置的if配对B)和之前与其最近的if配对C)和之前与其最近的且不带else的if配对D)和之前的第一个if配对2、设变量x和y均已正确定义并赋值。以下if语句中,编译产生错误的是A)if(x+);B)if(xy,2006-9,2007-4,3、有以下计算公式 sqrt(x)(x=0)y=sqrt(-x)(x=0)y=sqrt(x);B)y=sqrt(x)elsey=sqrt(-x);if(x=0)y=sqrt(x);D)y=sqrt(x=0?x:-x);if(xmain()inta,b,c,t1,t2;scanf(%d%d%d,2007-9,2007-9,a:b c:t1,5、若变量已经正确定义,有以下程序段inta=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,3C)3,5,5D)3,5,76、有以下程序段inta,b,c;a=10;b=50;c=30;if(ab)a=b,b=c;c=a;printf(a=%db=%dc=%dn,a,b,c);程序的输出结果是A)a=10b=50c=10B)a=10b=50c=30C)a=10b=30c=10D)a=50b=30c=50,2008-4,2008-9,7、有以下程序#includemain()intx=1,y=2,z=3;if(xy)if(yz)printf(%d,+z);elseprintf(%d,+y);printf(%dn,x+);程序的运行结果是A)331B)41C)2D)1,2008-9,8、以下是if语句的基本形式:if(表达式)语句 其中表达式A)必须是逻辑表达式 B)必须是关系表达式C)必须是逻辑表达式或关系表达式 D)可以是任意合法的表达式,2009-3,9、有以下程序#includemain()intx;scanf(%d,程序运行时,输入的值在哪个范围才会有输出结果A)不等于10的整数 B)大于3且不等于10的整数C)大于3或等于10的整数 D)小于3的整数,2009-3,10、有以下程序#includemain()inta=1,b=2,c=3,d=0;if(a=1程序运行后输出结果是A)1,2,3 B)1,3,2 C)1,3,3 D)3,2,1,2009-3,11、设有定义:inta=1,b=2,c=3;,以下语句中执行效果与其它三个不同的是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;12、以下程序段中,与语句:k=ab?(bc?1:0):0;功能相同的是A)if(ab),2009-9,2009-9,填空题请补充main函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的绝对值,并显示出来。例如,输入:-3847652,结果为:3847652。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。试题程序:#include#include#includevoid main()long int n;system(CLS);printf(Enter the data:n);scanf(【1】);printf(*the absolute value*n);if(n0)【2】printf(nn);printf(【3】);,填空题请补充main函数,其功能是:从键盘输入3个整数,然后找出最大的数并输出。例如,输入:12,45,43,最大值为45。试题程序:#include#include#includevoid main()int a,b,c,max;system(CLS);scanf(%d,%d,%d,4.2 switch 语句(开关语句、多分支选择语句),switch 语句的格式:switch(表达式)case 常量1:语句1;break;case 常量2:语句2;break;case 常量3:语句3;break;case 常量n:语句n;break;default:语句n+1;,执行过程:先计算表达式之值,如果与某个case语句中的常量的值匹配(即相同),则执行其后的语句;若所有的case语句中的常量的值都 不能与之匹配,则执行default后的语句n+1。,根据表达式的值找入口,注意:则执行完入口语句后,则自动转到下一个case后面的语句执行;如果语句中有break;,则执行完一个入口语句后跳出switch选择结构。,switch 语句流程图(有break;语句),表达式,语句1,语句2,语句3,语句n,语句n+1,switch 语句流程图(无break;语句),表达式,语句1,语句2,语句3,语句n,=常量1,=常量2,=常量3,=常量n,语句n+1,switch语句的使用举例1:求分段函数的值,1+x x=1 2*x x=2 x*x x=3 x 其它,y=,求分段函数的值:,main()int x,y;scanf(%d,用switch语句求分段函数的值程序,注意:关键字case后面一定要留空格,且case后面应为常量。,程序运行后,如果从键盘上输入3,则程序运行的顺序和结果如下:,x=3,y=9,这是一个switch语句,switch 语句使用说明,各个语句后如果没有break;语句,则执行了相应的操作后,会自动转到下一个case后面的语句执行。可以使多个case共用同一组执行语句。case后面的表达式不能相同。各个case和default语句的顺序可以改变。,案例4.1 从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80scoremain()int score,grade;printf(“Input a score(0100):”);scanf(“%d”,switch语句应用例2:,case 8:printf(grade=Bn);break;case 7:printf(grade=Cn);break;case 6:printf(grade=Dn);break;case 5:case 4:case 3:case 2:case 1:case 0:printf(“grade=En”);break;default:printf(“The score is out of range!n”);程序演示程序运行情况如下:Input a score(0100):85grade=B,4.3 选择结构程序举例,求一元二次方程的根小学生做算术题数字拆分判断字母、数字,求一元二次方程的根程序,#include main()float a,b,c,disc,x1,x2,real,imag;scanf(%f,%f,%f,小学生解100以内加法问题,#include#include main()int a,b,c;a=rand()%100;b=rand()%100;scanf(%d,/*产生一个099之间的随机数*/,/*再产生一个099之间的随机数*/,/*为学生显示题目*/,/*学生输入答案*/,printf(%d+%d=?,a,b);,将一个三位数进行拆分,#include main()int m,a,b,c;printf(Please enter an integer(100):);scanf(%d,/*将个位数拆分出来*/,/*将十位数拆分出来*/,/*将百位数拆分出来*/,从键盘上输入一个字符判断是数字、字母或其它,#include main()char c;c=getchar();if(c=A,#include main()int a=2,b=7,c=5;switch(a0)case 1:switch(b0)case 1:printf();break;case 2:printf(!);break;case 0:switch(c=5)case 0:printf(*);break;case 1:printf(#);break;case 2:printf($);break;default:printf(,2007-4输出#&如果将b0,结果为?输出#&,有以下程序#includemain()intx=1,y=0,a=0,b=0;switch(x)case1:switch(y)case 0:a+;break;case 1:b+;break;case2:a+;b+;break;case3:a+;b+;printf(a=%d,b=%dn,a,b);程序运行的结果是A)a=1,b=0 B)a=2,b=2 C)a=1,b=1 D)a=2,b=1,2008-4,题库练习,(1)单个if66-1(大小写字母转换,修改书中代码第10行)、75-2(字母转换)(2)if嵌套74-2,