实验三选择结构程序设计3.1实验要求与目的1.掌握关系表达式和逻辑表达式的正确应用2.条件表达式的正确应用3. 掌握if语句,if-else语句,if语句的嵌套的编程方法4. 掌握switch的编程方法及执行特点5.掌握相关的算法(大小写字母的转换,判断数的奇偶,整数的整除,分段函数的求解,成绩的转换等)6. 培养解决实际问题的能力3.2实验指导结构化程序设计的三大结构:顺序结构、选择结构和循环结构。
计算机在执行过程时,根据条件选择所要执行的语句,称为选择结构,也称为分支结构。
在解决实际问题时,可能会因为其种条件的约束产生分支,可能是单分支结构、双分支结构和多分支结构等。
因此可选择相应的语句进行程序设计。
C语言程序设计实现单分支结构常采用,if语句;实现双分支结构常采用:if-else语句;实现多分支结构常采用:if-else嵌套语句或switch语句。
选择结构的程序设计除了选择适当的语句外,另一关键问题是条件的正确表示。
条件可以用表达式来描述,如关系表达式、逻辑表达式等。
【3.1】录入下列程序,输入给定的测试数据,观察其程序执行结果。
程序文件名为:ex3_1.c。
输入测试数据:23 56程序运行结果:max=56#include<stdio.h>void main(){int a,b,max;scanf("%d%d",&a,&b); /*从键盘输入两整数*/max=a;if(max<b)max=b;printf("max=%d\n",max); /*输出最大数*/}该程序的执行过程,从键盘输入两个整数赋予a,b,把a的值先赋予变量max,采用if 语句判别max和b的大小,若max小于b,则把b的值赋予max,然后执行printf语句输出max的值;若max大于b,不执行if后的语句,而执行printf语句输出max的值;max中的值总是大数。
因此该程序的功能是输入两个整数,输出其中的大数。
单分支结构if语句的一般形式:if(表达式) 语句;其语义,如果表达式的值为非零值(为真),则执行其后的语句,否则不执行该语句。
小结:1.表达式也称为条件表达式,可以包括常量、变量和表达式的任意表达式。
常用的是单一变量,关系表达式和逻辑表达式。
2.若语句由两条以上的语句组成时,必须用花括号{}括起来,组合成一条复合语句。
【3.2】编程实现,从键盘输入一个字符型数据,若输入小写字符,则将其转换成大写字符,输出相应的整数;若输入其它字符,则显示出错信息。
程序文件名为:ex3_2.c。
分析:根据题意,本程序要解决三个问题,1)输入字符数据;2)判断输入的字符是否是小写字符;3)输出(输出大写字符相应的整数或输出错误信息)。
因此根据判断条件输出两种结果的其中一个。
#include <stdio.h>void main(){char c;scanf("%c",&c);if('a'<=c&&c<='z'){c=c-32;printf("%d\n",c);}elseprintf("data error\n");}第一次运行程序,输入测试数据:a程序运行结果:65第二次运行程序,输入测试数据:A程序运行结果:data error双分支结构if语句的一般形式:if(表达式)语句1;else语句2;其语义,如果表达式的值为非零值(为真),则执行if后的语句1,否则执行else后的语句2。
同理,使用该语句时,表达式(条件表达式)是可以包括常量、变量和表达式的任意表达式。
若语句1或语句2是由两条以上的语句组成,则必须用必须用花括号{}括起来,组合成一条复合语句。
小结:1.任意字符在内存中都以ASCII码存储,一个字符数据既可以以字符形式输出(输出格式控制符%c),也可以以整数形式输出(输出格式控制符%d)。
2.字符数据可以进行算术运算,即相当于对其字符数据的ASCII码进行运算。
根据这一特点,可实现大小写字符的相互转换。
小写字母转换为大写字母:c=c-32 或者c=c-' a'+'A'大写字母转换为小写字母:c=c+32 或者c=c+' a'-'A'3. 字符数据可以进行比较运算,因此判断一个字符属于哪个范围可采用下列方式实现。
属于小写字母的表达式:'a'<=c&&c<='z' 或者 97<=c&&c<=122属于大写字母的表达式:'A'<=c&&c<='Z' 或者 65<=c&&c<=90属于数值字符的表达式:'0'<=c&&c<='9' 或者48<=c&&c<=57【3.3】从键盘输入两个整数m,n (假设输入的数m>0,n>0),判断m 能否被n 整除,若能输出m 和n ,否则输出m 与n 的余数。
程序文件名:ex3_3.c 。
分析:分析问题,理出算法,是程序设计的核心,如何实现m 能否被n 整除是解决该问题的关键。
m 能被n 整除的表达式:m%n==0。
实现程序编写的要点是学会对题意的“翻译”。
即,从键盘输入数一定采用scanf 格式输入函数。
判断m 能否被n 整除,其判断结果只有两个,能整除输出原数,否则输出两数的余数,因此可采用选择结构的if-else 语句。
#include <stdio.h>void main(){int m,n;printf("Input 2 number m & n:");scanf("%d%d",&m,&n);if(m%n==0) /*判断m 能否被n 整除*/printf("m=%d,n=%d",m,n);elseprintf("%d",m%n);}第一次运行程序,输入测试数据:21 7程序运行结果:m=21,n=7第二次运行程序,输入测试数据:23 6程序运行结果:5小结:1.由此题可扩展为,判断一个数是偶数还是奇数。
若m 是偶数则只需考虑m 能否被2整除,若能整除,则m 是偶数,不能整除则m 是奇数。
2.注意一个等号“=”与双等号“==”的区别。
一个等号称为赋值号,若a=5,其含义是将5赋给a 。
双等号为算术运算符“等号”,若a==5,其含义是变量a 的值与整数5是否相等。
3.求余运算符“%”,求余运算只能求任意两整数的余数。
【3.4】输入x 的值求分段函数y 的值。
程序文件名:ex3_4.c 。
10 113101 121 ⎪⎩⎪⎨⎧>-≤≤-<=x x x x x x y分析:本程序是求分段函数的值,根据x 的取值不同,出现了三个分支的情形。
因此采用多分支的控制结构,嵌套的if 语句实现。
编程思路,当有多分支结构时,可先转换为二分支结构,如选择表达式条件为(x<1),条件为真计算y=x,条件为假继续采用if-else语句判断,在else分支中继续采用if-else二分支结构。
#include <stdio.h>void main(){float x,y;scanf("%f",&x);if(x<1)y=x;else{if(x<10) /*该if-else语句嵌套在上一个if-else的else中*/ y=2*x-1;elsey=3*x-11;}printf("x=%.2f,y=%.2f",x,y);}第一次运行程序,输入测试数据:-3程序运行结果:x=-3.00,y=-3.00第二次运行程序,输入测试数据:7程序运行结果:x=7.00,y=13.00第三次运行程序,输入测试数据:13程序运行结果:x=13.00,y=28.00if-else嵌套实现多分支结构,嵌套的形式多种多样,无论如何嵌套else子句与if的匹配原则总是从最内层开始,即else与在它上面离它最近的,且尚未曾配对的if配对,else无二义性。
常见的几种嵌套形式。
形式1:if(表达式1)if (表达式2)语句1;else语句2;形式2:if(表达式1)if(表达式2)语句1;else语句2;else语句3;形式3:if(表达式1)语句1;elseif (表达式2)语句2;else语句3;形式4:if(表达式1)if (表达式2)语句1;else语句2;elseif (表达式3)语句3;else语句4;if 语句的嵌套不影响if 语句的独立性。
if 语句的嵌套使用起来比较灵活,嵌套层次对应时内层的语句要被完整地包含在外层的语句之内。
小结:1. 编程的方法并非唯一,对于多分支结构也可以用多条简单的if 语句实现。
如下修改后的程序。
#include <stdio.h>void main(){float x,y;scanf("%f",&x);if(x<1)y=x;if(x>=1&&x<=10)y=2*x-1;if(x>10)y=3*x-11;printf("x=%.2f,y=%.2f",x,y);}2. 正确使用逻辑运算符,逻辑与(&&)和逻辑或(||)。
如,101≤≤x 的合法的C 语言表达式,1<=x && x<=10 。
【3.5】 编写实现:利用switch 语句模拟两个整数的加、减、乘、除运算。
如,输入5+2,输出5+2=7 ;如,输入5/2,输出5/2=2.50。
程序文件名:ex3_5.c 。
分析:本程序的关键是由输入的运算符来决定运算的结果。
因此引入一个字符变量存放算术运算符,由该变量的字符值来选择做何种运算。
#include<stdio.h>void main(){ int a,b;char ch;scanf("%d%c%d",&a,&ch,&b);switch(ch){ case '+':printf("%d+%d=%d\n",a,b,a+b);break;case '-':printf("%d-%d=%d\n",a,b,a-b);break;case '*':printf("%d*%d=%d\n",a,b,a*b);break;case '/':printf("%d/%d=%.2f\n",a,b,(float)a/b);break;}}第一次运行程序,输入测试数据:5+2程序运行结果:5+2=7第二次运行程序,输入测试数据:5-2程序运行结果:5-2=3第三次运行程序,输入测试数据:5*2程序运行结果:5*2=10第四次运行程序,输入测试数据:5/2程序运行结果:5/2=2.50该源程序中switch语句的表达式的值为字符,当字符变量ch的值为“+”时,则选取case 后常量为'+'后的语句执行。