实验3分支结构程序设计 3.1二分支程序设计 【实验目的】 1.学会正确表达关系表达式和逻辑表达式 2.熟练使用f语句实现二分支程序设计: 3. 学习如何调试程序。 【相关知识点】 1.关系运算符和关系表达式 用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达 式及字符表达式)连接起来的式子,称为关系表达式。关系表达式的值为逻辑值“真”或“假”。 所谓“关系运算”实际上就是“比较运算”。将两个值进行比较,判断比较的结果是否符 合给定的条件。 示例1:a>3 该表达式是一个关系表达式,大于号(>)是关系运算符,如果的值为5,则满足给定 的“a>3”的条件,因此关系表达式的值为“逻辑真”:如果a的值为2,不满足“a>3”的条 件,则关系表达式的值为“逻辑假”。 C语言提供6种关系运算符:(大于)、>=(大于或等于) 一(等于)、=(不等于)。前四种关系运算符的级别相同,后两种运算符的级别相同,前四 种运算符的级别高于后两种。 示例2:若a=3,b=2,c=1 则关系表达式(a>b)=c的值为“逻辑真”。 2.逻辑表达式和逻辑运算符 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。 C语言提供三种逻辑运算符:&&(逻辑与)、‖(逻辑或)、」(逻辑非),逻辑运算符为 -41-
实验 3 分支结构程序设计 3.1 二分支程序设计 【实验目的】 1. 学会正确表达关系表达式和逻辑表达式 2. 熟练使用 if 语句实现二分支程序设计; 3. 学习如何调试程序。 【相关知识点】 1. 关系运算符和关系表达式 用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达 式及字符表达式)连接起来的式子,称为关系表达式。关系表达式的值为逻辑值“真”或“假”。 所谓“关系运算”实际上就是“比较运算”。将两个值进行比较,判断比较的结果是否符 合给定的条件。 示例 1:a>3 该表达式是一个关系表达式,大于号(>)是关系运算符,如果 a 的值为 5,则满足给定 的“a>3”的条件,因此关系表达式的值为 “逻辑真”;如果 a 的值为 2,不满足“a>3”的条 件,则关系表达式的值为 “逻辑假”。 C 语言提供 6 种关系运算符:(大于)、>=(大于或等于)、 ==(等于)、!=(不等于)。前四种关系运算符的级别相同,后两种运算符的级别相同,前四 种运算符的级别高于后两种。 示例 2:若 a=3,b=2,c=1 则关系表达式 (a>b)==c 的值为“逻辑真”。 2. 逻辑表达式和逻辑运算符 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。 C 语言提供三种逻辑运算符:&&(逻辑与)、||(逻辑或)、! (逻辑非),逻辑运算符为 - 41 -
双目运算符。 示例1: a&&b若a、b为真,则逻辑表达式a&&b的值为真。 allb 若a、b之一为真,则逻辑表达式ab的值为真。 为 若a为真,则逻辑表达式la的值为假。 逻辑表达式的值为逻辑值“真”或“假”,通常以数值1代表“真”,以0代表“假”。但 在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。 示例2:若a=3,b=2,c=l 则逻辑表达式(a>b)=c&&0的值为“逻辑假”,逻辑表达式(a>b)=c&&35的值为“逻辑 真”。 3.if语句 if语句的一般格式有两种,即if-else语句和省略clse的if语句。 a)if-else语句的一般格式为: f(表达式) 语句1 else 语句2 执行的流程:先求解表达式,如果表达式的值为真,就执行语句1:否则(即表达式的值 为假)就执行语句2。 b)省略else的if语句的一般格式为: if(表达式) 语句1 执行的流程:先求解表达式,如果表达式的值为真,就执行语句1:否则(即表达式的值 为假)就什么也不做。 示例: int a-3,b-4, ifa>b)】 a=a-b: else -42-
双目运算符。 示例 1: a&&b 若 a、b 为真,则逻辑表达式 a&&b 的值为真。 a||b 若 a、b 之一为真,则逻辑表达式 a||b 的值为真。 !a 若 a 为真,则逻辑表达式!a 的值为假。 逻辑表达式的值为逻辑值“真”或“假”,通常以数值 1 代表“真”,以 0 代表“假”。但 在判断一个量是否为“真”时,以 0 代表“假”,以非 0 代表“真”。 示例 2:若 a=3,b=2,c=1 则逻辑表达式 (a>b)==c&&0 的值为“逻辑假”,逻辑表达式(a>b)==c&&35 的值为“逻辑 真”。 3. if 语句 if 语句的一般格式有两种,即 if-else 语句和省略 else 的 if 语句。 a) if-else 语句的一般格式为: if(表达式) 语句 1 else 语句 2 执行的流程:先求解表达式,如果表达式的值为真,就执行语句 1;否则(即表达式的值 为假)就执行语句 2。 b) 省略 else 的 if 语句的一般格式为: if(表达式) 语句 1 执行的流程:先求解表达式,如果表达式的值为真,就执行语句 1;否则(即表达式的值 为假)就什么也不做。 示例: int a=3,b=4; if(a>b) a=a-b; else - 42 -
a=a+b; printf("a=%d,b=%d",a,b); 该示例判断条件“a>b”是否成立,若成立则执行语句“a=a-b;”,否则执行语句“a=a+b,”。 【实验任务】 一、程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误,针对二分支程序设计这部分内容,主要有 如下问题: 1)不能正确表示f语句用到的关系表达式: 2)不能正确表示if语句用到的逻辑表达式。 针对上面出现的问题,查找下面程序中存在的问题,并改正调试。 1.打开c.lc-programming\3pg3101.cpp,该程序是输入一个数x,当x能被5整除时,输 出“x能被5整除”的信息,否则输出“x不能被5整除”。检查程序哪里有问题,请修改使 之运行能得到正确结果。修改后的程序以pg3101_ok.cpp保存。该源程序内容如下: #include void main(void) { int x,k; printf"请输入x的值:n")方 scanf("%d",&x), k=x%5; if(k=0) printf("x能被S整除ln")方 else printf("x不能被5整除n"): 了提示:如何发现问题? -43-
a=a+b; printf("a=%d,b=%d",a,b); 该示例判断条件“a>b”是否成立,若成立则执行语句“a=a-b;”,否则执行语句“a=a+b;”。 【实验任务】 一、程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误,针对二分支程序设计这部分内容,主要有 如下问题: 1) 不能正确表示 if 语句用到的关系表达式; 2) 不能正确表示 if 语句用到的逻辑表达式。 针对上面出现的问题,查找下面程序中存在的问题,并改正调试。 1.打开 c:\c-programming\3\pg3101.cpp,该程序是输入一个数 x,当 x 能被 5 整除时,输 出“x 能被 5 整除”的信息,否则输出“x 不能被 5 整除”。检查程序哪里有问题,请修改使 之运行能得到正确结果。修改后的程序以 pg3101_ok.cpp 保存。该源程序内容如下: #include void main(void) { int x,k; printf("请输入 x 的值:\n"); scanf("%d",&x); k=x%5; if (k=0) printf("x 能被 5 整除\n"); else printf("x 不能被 5 整除\n"); } 提示:如何发现问题? - 43 -
编译、链接该程序后,运行该程序,发现程序可以正常运行,只是运行结果错误。在程 序中,如果输入x的值是25,应该输出“x能被5整除”的信息,但是程序输出结果却是“x 不能被5整除”,因此,不难发现问题的所在就是f语句的条件表达式有错误。 改正程序后的运行结果示例如图3.1.1所示。 e"C:\e-programming\3\Debug\pg3101_ok.exe"X 请输入×的值: 25 x能被5整除 Press any key to continue 图3.1.1pg3101_ok.cpp的运行结果 2.打开c.lc-programming3pg3102.cpp,该程序是求一分段函数的值,分段函数如下: 10 -2 void main(void) int x.y; printf("请输入x的值:")方 scanf"%d",&x)方 if-2<=x<=0) y=10 else y=0: printf"y的值为%dn",y)方 } 了提示:如何发现问题? 编译、链接、运行该程序,发现程序可以正常运行,只是运行结果错误。当输入X的值 -44-
编译、链接该程序后,运行该程序,发现程序可以正常运行,只是运行结果错误。在程 序中,如果输入 x 的值是 25,应该输出“x 能被 5 整除”的信息,但是程序输出结果却是“x 不能被 5 整除”,因此,不难发现问题的所在就是 if 语句的条件表达式有错误。 改正程序后的运行结果示例如图 3.1.1 所示。 图 3.1.1 pg3101_ok.cpp 的运行结果 2.打开 c:\c-programming\3\pg3102.cpp,该程序是求一分段函数的值,分段函数如下: 10 -2 void main(void) { int x,y; printf("请输入 x 的值:"); scanf("%d",&x); if(-2<=x<=0) y=10; else y=0; printf("y 的值为%d\n",y); } 提示:如何发现问题? 编译、链接、运行该程序,发现程序可以正常运行,只是运行结果错误。当输入 x 的值 - 44 -
为一1时,输出的结果是“y的值为0”,但是按照给出的函数定义,输出的结果应该是10, 而该程序是f语句实现的简单的二分支程序,因此可以发现问题所在。 改正程序后的运行结果示例如图3.1.2所示。: "C\c-programming\3\Debug\pg3102_ok.exe" ▣x 情输入x的值:-1 y的值为10 ress any key to continue 图3.1.2pg3102_ok.cpp的运行结果 二、程序扩展 1.打开c:lc-programming\3pg3201.cpp,该程序是输入一个整数,判断该数是奇数还是偶 数,源程序内容如下: #include void main(void) { int number; printf"请输入一个整数:")方 scanf("%d"&number): if(number%2=0) printf"该数是偶数。n"); else printf("该数是奇数。n")方 要求:改写程序,判断输入的整数是否能被5整除。修改后源程序以pg3201a.cpp保存。 训练要点:了解基本的二分支程序结构,掌握如何通过基本的f语句实现二分支程序。 在此基础上,对原有的程序按要求进行修改,熟练掌握如何实现二分支程序设计。 修改后程序的运行结果如图3.1.3所示。 "C:\c-programming\3\Debug\pg3201a.exe" 回x 青输入一个整数:24 该数不能被5整除。 ress any key to continue -45-
为-1 时,输出的结果是“y 的值为 0”,但是按照给出的函数定义,输出的结果应该是 10, 而该程序是 if 语句实现的简单的二分支程序,因此可以发现问题所在。 改正程序后的运行结果示例如图 3.1.2 所示。: 图 3.1.2 pg3102_ok.cpp 的运行结果 二、程序扩展 1.打开 c:\c-programming\3\pg3201.cpp,该程序是输入一个整数,判断该数是奇数还是偶 数,源程序内容如下: #include void main(void) { int number; printf("请输入一个整数:"); scanf("%d",&number); if(number%2==0) printf("该数是偶数。\n"); else printf("该数是奇数。\n"); } 要求:改写程序,判断输入的整数是否能被 5 整除。修改后源程序以 pg3201a.cpp 保存。 训练要点:了解基本的二分支程序结构,掌握如何通过基本的 if 语句实现二分支程序。 在此基础上,对原有的程序按要求进行修改,熟练掌握如何实现二分支程序设计。 修改后程序的运行结果如图 3.1.3 所示。 - 45 -
图3.1.3pg3201a.cpp的运行结果 2.打开c:lc-programming\3pg3202.cpp,该程序是判断一个5位数是否是回文数。例如12321 是回文数,个位与万位相同,十位与千位相同,该源程序内容如下: #include void main(void) int ge,shi,qian,wan,x; printf("请输入一个整数:n")方 scanf("%d",&x); wan=x/10000; qian=x%10000/1000: shi=x%100/10: ge-x%10; if (ge=wan&&shi=qian) 体个位等于万位并且十位等于千位*/ printf("这个数是回文n")方 else printf("这个数不是回文n")方 } 要求:根据题目中每一位数字分解的方法,改写程序,对于一个不多于5位的正整数① 分别打印出每一位数字②按逆序打印该数,例如原数为321,应输出123。修改后源程序以 pg3202a.cpp保存。 训练要点:了解较复杂的二分支程序结构,掌握为正确表达f语句中用到的条件判断, 如何获得相关的变量值。在此基础上,对原有的程序按要求做进一步扩展,能够实现更复杂 的二分之程序。 修改后程序的运行结果如图3.1.4所示。 "C:lc-programming\3\Debug\pg3202a.exe ✉▣x 请输入一个整数: 1234 该数每一位所对应的数字是:1,2,3,4 按逆序打印该数为:4321 ress any key to continue -46-
图 3.1.3 pg3201a.cpp 的运行结果 2.打开c:\c-programming\3\pg3202.cpp,该程序是判断一个5位数是否是回文数。例如12321 是回文数,个位与万位相同,十位与千位相同,该源程序内容如下: #include void main(void) { int ge,shi,qian,wan,x; printf("请输入一个整数:\n"); scanf("%d",&x); wan=x/10000; qian=x%10000/1000; shi=x%100/10; ge=x%10; if (ge==wan&&shi==qian) /*个位等于万位并且十位等于千位*/ printf("这个数是回文\n"); else printf("这个数不是回文\n"); } 要求:根据题目中每一位数字分解的方法,改写程序,对于一个不多于 5 位的正整数① 分别打印出每一位数字②按逆序打印该数,例如原数为 321,应输出 123。修改后源程序以 pg3202a.cpp 保存。 训练要点:了解较复杂的二分支程序结构,掌握为正确表达 if 语句中用到的条件判断, 如何获得相关的变量值。在此基础上,对原有的程序按要求做进一步扩展,能够实现更复杂 的二分之程序。 修改后程序的运行结果如图 3.1.4 所示。 - 46 -
图3.1.4pg3202a.cpp的运行结果 三.程序编写 1.有一分段函数如下: .5<x<=0 y- x-1 0<x<=5 要求用简单的if语句进行编程实现,编写的源程序以pg3301.cpp保存。 训练要点:用简单的f语句解决数学分段函数问题。 程序运行结果参考示例如图3.1.5及3.1.6所示。 "CIc-programming\3\Debug\pg3301.exe ✉回x 请输入x的值: ×■-3.ym-3 Press any key to continue 图3.1.5x=-3时,pg3301.cpp的运行结果 "C:\c-programming\3\Debug\pg3301.exe 回☒ 请输入x的值: x6.y=7 Press any key to continue 图3.1.6x=6时,Pg3301.cpp的运行结果 3.2多分支程序设计 【实验目的】 l.学会使用else-if语句、switch语句实现多分支程序设计。 2.熟练使用嵌套f语句实现多分支程序设计: 3.结合程序掌握一些简单的算法 4. 学习如何调试程序。 -47-
图 3.1.4 pg3202a.cpp 的运行结果 三.程序编写 1.有一分段函数如下: x -5<x<=0 x-1 0<x<=5 y= 1 10 要求用简单的 if 语句进行编程实现,编写的源程序以 pg3301.cpp 保存。 训练要点:用简单的 if 语句解决数学分段函数问题。 程序运行结果参考示例如图 3.1.5 及 3.1.6 所示。 图 3.1.5 x=-3 时,pg3301.cpp 的运行结果 图 3.1.6 x=6 时,pg3301.cpp 的运行结果 3.2 多分支程序设计 【实验目的】 1. 学会使用 else-if 语句、switch 语句实现多分支程序设计。 2. 熟练使用嵌套 if 语句实现多分支程序设计; 3. 结合程序掌握一些简单的算法; 4. 学习如何调试程序。 - 47 -
【相关知识点】 1.else-if语句 else-if语句的一般格式为: if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式m) 语句m else 语句n 语句执行流程:先求解表达式1,如果表达式1的值为“真”,执行语句1,并结束整个 if语句:否则,求解表达式2的值,……;最后的lse处理给出的条件都不满足的情况,即 表达式1至表达式m的值都为“假”时,执行语句n。 示例: #include void main(void) int salary; float tax rate; scanf(("%d ",&salary); if(salary>=8000)tax rate=0.3: else if(salary>=5000)tax rate=0.25; else if(salary>=3500)tax rate=0.15; else if(salary>=2000)tax rate=0.1; else tax rate=0. printf("工资是:%d,税率为:%f",salary,tax rate方 -48-
【相关知识点】 1.else-if 语句 else-if 语句的一般格式为: if(表达式 1) 语句 1 else if(表达式 2) 语句 2 ┇ else if(表达式 m) 语句 m else 语句 n 语句执行流程:先求解表达式 1,如果表达式 1 的值为“真”,执行语句 1,并结束整个 if 语句;否则,求解表达式 2 的值,… …;最后的 else 处理给出的条件都不满足的情况,即 表达式 1 至表达式 m 的值都为“假”时,执行语句 n。 示例: #include void main(void) { int salary; float tax_rate; scanf(("%d ",&salary); if(salary>=8000) tax_rate=0.3; else if(salary>=5000) tax_rate=0.25; else if(salary>=3500) tax_rate=0.15; else if(salary>=2000) tax_rate=0.1; else tax_rate=0; printf("工资是:%d,税率为:% f ",salary, tax_rate); - 48 -
} 该示例是根据工资的多少来求得税率。工资大于或等于8000元时,税率为0.3:工资大 于或等于5000元并小于8000元时,税率为0.25:工资大于或等于3500元并小于5000元时, 税率为0.15:工资大于或等于3500元并小于2000元时,税率为0.1:工资小于2000元时, 税率为0。 2.嵌套的if语句 如果if-else语句的内嵌语句是另一条基本的if语句,就形成了嵌套的if-else语句。它的 一般形式如下: if(表达式1) if(表达式2)语句1 else语句2 else if(表达式3)语句3 else语句4 该语句实现了4路分支,必要时其中的语句1~语句4还可以是基本的f语句,从而实现 更多路分支结构。 注意:在嵌套的if-else语句中,如果内嵌的if省略了else部分,导致if与else不能一对 一配对时,则else与离它最近的未配对的if相匹配。 示例: int x,y; if(x>=0) ifx>0)y=5, else y=0; else y=-5; 上述示例程序段实现如下分段函数: -49-
} 该示例是根据工资的多少来求得税率。工资大于或等于 8000 元时,税率为 0.3;工资大 于或等于 5000 元并小于 8000 元时,税率为 0.25;工资大于或等于 3500 元并小于 5000 元时, 税率为 0.15;工资大于或等于 3500 元并小于 2000 元时,税率为 0.1;工资小于 2000 元时, 税率为 0。 2.嵌套的 if 语句 如果 if-else 语句的内嵌语句是另一条基本的 if 语句,就形成了嵌套的 if-else 语句。它的 一般形式如下: if(表达式 1) if(表达式 2)语句 1 else 语句 2 else if(表达式 3)语句 3 else 语句 4 该语句实现了 4 路分支,必要时其中的语句 1~语句 4 还可以是基本的 if 语句,从而实现 更多路分支结构。 注意:在嵌套的 if-else 语句中,如果内嵌的 if 省略了 else 部分,导致 if 与 else 不能一对 一配对时,则 else 与离它最近的未配对的 if 相匹配。 示例: int x,y; if(x>=0) if(x>0) y=5; else y=0; else y=-5; 上述示例程序段实现如下分段函数: - 49 -
x>0 X=0 3.switch语句 switch语句是多分支选择语句,用来实现多分支选择结构。它的一般格式如下: switch(表达式) case常量表达式l:语句l;break: case常量表达式2:语句2,break: case常量表达式n:语句n;break: default:语句ntl;break, } 语句执行流程:首先求解表达式,如果表达的值与某个常量表达式的值相等,则执行该 常量表达式后的相应语句段,如果表达式的值与任何一个常量表达式的值都不相等,则执行 default后的语句段,最后执行break语句,跳出switch语句。 示例: int grade; scanf("%d"&grade): switch(grade) case'A':printf"成绩为90~l00分"),break, case 'B':printf("成绩为80-89分")break case'C':printf("成绩为0-79分");break: case 'D':printf("成绩为60-69分")break case'E':printf"成绩为60分以下"),break, default:printf"数据错误")方 -50-
5 x>0 0 x=0 y= 0 3.switch 语句 switch 语句是多分支选择语句,用来实现多分支选择结构。它的一般格式如下: switch(表达式) { case 常量表达式 1:语句 1;break; case 常量表达式 2:语句 2;break; ┇ case 常量表达式 n:语句 n;break; default:语句 n+1;break; } 语句执行流程:首先求解表达式,如果表达的值与某个常量表达式的值相等,则执行该 常量表达式后的相应语句段,如果表达式的值与任何一个常量表达式的值都不相等,则执行 default 后的语句段,最后执行 break 语句,跳出 switch 语句。 示例: int grade; scanf("%d",&grade); switch(grade) { case 'A':printf("成绩为 90~100 分");break; case 'B':printf("成绩为 80~89 分");break; case 'C':printf("成绩为 70~79 分");break; case 'D':printf("成绩为 60~69 分");break; case 'E':printf("成绩为 60 分以下");break; default: printf("数据错误"); } - 50 -