实验三-选择结构程序设计

更新时间:2023-09-22 05:58:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验三 选择结构程序设计

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 void main() {

int a,b,max;

scanf(\ /*从键盘输入两整数*/ max=a;

if(max

printf(\ /*输出最大数*/ }

该程序的执行过程,从键盘输入两个整数赋予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 void main() {

char c;

scanf(\ if('a'<=c&&c<='z') {

c=c-32;

printf(\ } else

printf(\}

第一次运行程序,

输入测试数据: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 void main() {

int m,n;

printf(\ m & n:\ scanf(\

if(m%n==0) /*判断m能否被n整除*/ printf(\ else

printf(\}

第一次运行程序,

输入测试数据: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。

x?1?x ?y??2x?1 1?x?10

?3x?11 x?10?分析:本程序是求分段函数的值,根据x的取值不同,出现了三个分支的情形。因此采用多

分支的控制结构,嵌套的if语句实现。编程思路,当有多分支结构时,可先转换为二分支

结构,如选择表达式条件为(x<1),条件为真计算y=x,条件为假继续采用if-else语句判断,在else分支中继续采用if-else二分支结构。

#include void main() {

float x,y;

scanf(\ if(x<1) y=x; else {

if(x<10) /*该if-else语句嵌套在上一个if-else的else中*/ y=2*x-1; else

y=3*x-11; }

printf(\}

第一次运行程序,

输入测试数据:-3

程序运行结果:x=-3.00,y=-3.00 第二次运行程序,

输入测试数据:7

程序运行结果:x=7.00,y=13.00 第三次运行程序,

输入测试数据:13

程序运行结果:x=13.00,y=28.00

if-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;

else

if(表达式2)

语句2; else

语句3;

形式4:

if(表达式1)

if(表达式2)

语句1; else

语句2;

else

if(表达式3)

语句3; else

语句4;

if语句的嵌套不影响if语句的独立性。if语句的嵌套使用起来比较灵活,嵌套层次对应时内层的语句要被完整地包含在外层的语句之内。 小结:

1. 编程的方法并非唯一,对于多分支结构也可以用多条简单的if语句实现。如下修

改后的程序。 #include void main() {

float x,y;

scanf(\ if(x<1) y=x;

if(x>=1&&x<=10) y=2*x-1;

if(x>10) y=3*x-11;

printf(\}

2. 正确使用逻辑运算符,逻辑与(&&)和逻辑或(||)。

如,1?x?10的合法的C语言表达式,1<=x && x<=10 。

【3.5】 编写实现:利用switch语句模拟两个整数的加、减、乘、除运算。如,输入5+2,输出5+2=7 ;如,输入5/2,输出5/2=2.50。程序文件名:ex3_5.c。

分析:本程序的关键是由输入的运算符来决定运算的结果。因此引入一个字符变量存放算术运算符,由该变量的字符值来选择做何种运算。

#include void main() { int a,b; char ch;

scanf(\ switch(ch)

{ case '+':printf(\ case '-':printf(\ case '*':printf(\

case '/':printf(\ } }

第一次运行程序,

输入测试数据:5+2 程序运行结果:5+2=7 第二次运行程序,

输入测试数据:5-2 程序运行结果:5-2=3 第三次运行程序,

输入测试数据:5*2 程序运行结果:5*2=10 第四次运行程序,

输入测试数据:5/2

程序运行结果:5/2=2.50

该源程序中switch语句的表达式的值为字符,当字符变量ch的值为“+”时,则选取case后常量为 '+'后的语句执行。若没有break语句,会依次执行其后所有case后的语句组。若有break语句,中断该switch语句。

因此,switch语句实现多分支结构的关键是只需对条件判断一次,然后从其多种结果中取一种情形执行。

通常情况下,采用switch语句实现多分支结构时,需使用break语句。但该语句的一般格式中是不包含break语句的。 switch的一般格式: switch(表达式) {

case常量表达式1: 语句1 case常量表达式2: 语句2 …

case常量表达式n: 语句n default : 语句n+1 }

switch语句中的表达式的值,通常情况下,为整型值或字符型值。若为实型值时自动取整。而case后的各常量表达式数据类型的值必须互不相同,否则会出现错误。default子句也可以省略。 小结:

1.scanf函数中格式控制符为\,要求从键盘输入数据时,数、字符与数之间不能用空格分隔,否则结果会出错。

2.用switch语句实现多分支结构时,要正确合理地使用break语句。

3.3实验内容

3.3.1 夯实基础

【3.6】从键盘输入任意两个正整数m,n,判断m能否被n整除,若能输出m与n的值,否则继续判断两个数的奇偶性,若为奇数输出“Odd”,若为偶数输出“Even”。程序文件名:ex3_6.c。

第一次运行程序

输入测试数据:49 4 程序运行结果:49:Odd

4:Even

第二次运行程序

输入测试数据:24 8 程序运行结果:24 8

【3.7】编程实现,为鼓励居民节约用水,A市对居民用水按水量阶梯式计价。计价标准:按每年用水量统计,不超过180立方米的部分按每立方米5元收费;超过180立方米不超过260立方米的部分按每立方米7元收费;超过260立方米的部分按每立方米9元收费。编程对水费进行计算,要求保留两位小数。程序文件名:ex3_7.c

输入测试数据:200

程序运行结果:x:200.0 y:1040.00

【3.8】编程实现,判断某一年是否是闰年。程序文件名:ex3_8.c。

【提示】:判断某一年是否是闰年的条件是这一年的年份能被4整除但不能被100整除或者能被400整除。 第一次运行程序

输入测试数据:2015

程序运行结果:2015 is not a leap year 第二次运行程序

输入测试数据:2016

程序运行结果:2016 is a leap year

【3.9】编程实现,将一个百分制成绩转换为五分制成绩。转换原则,当成绩大于或等于90分为A,小于90分且大于等于80分为B,小于80分且大于等于70分为C,小于70分且大于等于60分为D;小于60分为E。程序文件名ex3_9.c。

3.3.2 应用提高

【3.10】编程实现:输入任意四个整数n1、n2、n3、n4,求四个数中的最大值。程序文件名:ex3_10.c。

输入测试数据:56 34 87 23

程序运行结果:max=87

【3.11】编程实现:中国有句俗语“三天打鱼两天晒网”。某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第n天中是“打鱼”还是“晒网”。程序文件名:ex3_10.c。 第一次运行程序

输入测试数据:100 程序运行结果:晒网 第二次运行程序

输入测试数据:73 程序运行结果:打鱼

3.4实验思考

【思考1】若将【3.2】程序中的条件表达式'a'<=c&&c<='z'写成'a'<=c<='z',程序会不会出错?输入测试数据A,写出程序运行结果。

【思考2】阅读下列程序,写出其运行结果。 #include void main() {

char a=66; if(a%2==0) putchar(a); else

putchar(a+32); }

程序运行结果:

修改条件表达式为:a%2=0,程序还会运行吗?

本文来源:https://www.bwwdw.com/article/87uh.html

Top