4.3 运用选择结构描述问题求解过程
4.3.1 if语句的应用
在解决问题的过程中,常常需要对事物进行判断和选择。在程序设计中,主要使用条件语句(if语句)来实现判断和选择。if语句在使用中包括单分支if语句和双分支if语句。
1.单分支f语句
(1)单分支语句的格式:
在使用单分支if语句时需要注意:①if (条件表达式)后面加冒号“:”;②当语句A是由多个语句构成的复合语句时,所有语句严格遵循相同的缩进。
(2)单分支if语句的执行过程。
如果条件表达式为真,则执行语句A,然后继续往下执行;如果条件表达式为假,则不执行语句A,然后继续往下执行。其执行过程如图4-7所示。
问题
项目小组成员在某购物网站上了解到某种笔记本搞优惠活动,规定一次购买6本以上(含6本) 10本以下(含10本)打九折,一次购买11本以上(含11本)打八折。怎样根据笔记本的单价和购买数量编写程序计算总费用?
思考
上述问题给出了什么条件,需要解决什么问题,解决问题的方法和步骤是怎样的?
观察
解决上述问题的方法有多种,其中一种步骤如下:
(1)分析问题。
设项目小组购买笔记本的数量为s本,笔记本的单价为p元,折扣系数为j,总费用为t。根据题意,有:
如果s<6,则j=1.0;
如果6≤s≤10,则j=0.9;
如果s≥11,则j=0.8;
又t=s×p×j,求出t的值即为所求的总费用。
(2)设计算法。
根据上面对问题的分析,解决问题的算法描述如下:
①输入s,p的值;
②如果s<6,则j=1.0;
③如果6≤s≤10,则j=0.9;
④如果s≥11,则j=0.8;
⑤t=s×p×j;
⑥输出t的值;
⑦结束。
算法的流程图如图4-8所示。
(3)编写程序。
根据上面设计的算法,编写出解决该问题的程序(见配套学习资源包“第四章\课本素材\程序4-2”)如下:
(4)调试程序。
将程序4-2输入计算机进行调试运行,并输入s的值为100,p的值为3.2,得到结果如下:
2.双分支if语句
( 1)双分支if语句的格式:
在使用双分支if语句时需要注意:①if (条件表达式)后面加冒号“:”;②当语句A和语句B是由多个语句构成的复合语句时,所有语句严格遵循相同的缩进。
(2)双分支if语句的执行过程。
如果条件表达式为真,则执行语句A,然后继续往下执行。如果条件表达式为假,则执行语句B,然后继续往下执行。其执行过程如图4-9所示。
问题
项目小组成员在某购物网站上看到三种笔记本的优惠价各不相同,笔记本1、笔记本2
和笔记本3每本分别优惠价为a元、6元和c元,编程输出其优惠价的最大值。
思考
“求网购笔记本的费用”和“求网购笔记本优惠的最大值”有何区别?在“求网购笔
记本优惠的最大值”中,求最值的方法有哪些,该如何编程实现?
观察
解决上述问题的方法有多种,其中一种的方法步骤如下:
(1)分析问题。
对于输入的三个数a,b,c,设其中的最大数为m,先找出a和b中较大的数赋给m,然后将m与c比较,从而找出三个数中最大的数。
( 2)设计算法。
根据上面的分析,解决问题的算法描述如下:
①输入三个数a,b,c;
②如果a>b,则m=a;否则m=b;
③如果c>m,则m=c;
④输出m的值;
⑤结束。
(3)编写程序。
根据前面设计的算法,编写出解决该问题的程序(见配套学习资源包“第四章\课本素材\程序4-3”)如下:
(4)调试程序。
将程序4-3输入计算机进行调试运行,并输入a,b,c的值分别为32.5,63.4,78,结果如下:
3.if语句的嵌套
if语句允许嵌套,即if语句中的语句A和语句B还可以是if语句。
4.3.2 if...elif...else语句的应用
应用if条件语句可以快速地实现程序的分支选择,但当分支比较多时,用if...eif..else语句来实现比较简便。
( 1 ) if...elif...else语句格式如下:
( 2 ) if...elif...else语句的执行过程。
if...elif...else语句的执行过程如图4-10所示。
问题
项目小组成员经过比较,打算在某购物网站购买三种笔记本作为奖品和纪念品,它们的单价分别为6元、5元和4元。若项目小组共有经费x元,他们希望买尽可能多的笔记本作为奖品和纪念品,并能把经费用完。那么,这三种笔记本各可以买多少本?
思考
根据上述问题给出的条件,思考如何编程找出符合条件的采购方案。
观察
解决上述问题的方法有多种,其中一种方法步骤如下:
(1)分析问题。
因为要买尽量多的笔记本,所以选择4元的笔记本,可以买到的本数最多为一本,但不一定能刚好把经费用完。因此,项目小组可以按如下方案购买笔记本:如果买完一本单价为4元的笔记本,还剩1元, 则单价为4元的笔记本少买1本,换成买- -本单价为5元的笔记本即可;如果买完4本单价为4元的笔记本,还剩2元,则单价为4元的笔记本少买1本,换成买一本单价为6元的笔记本即可;如果买完工本单价为4元的笔记本,还剩3元,则单价为4元的笔记本少买2本,换成买一本单价为5元的和一本单价为6元的笔记本即可。
(2)设计算法。
根据分析,可先设购买笔记本的经费总费用共为x元,购买单价为6元、5元、4元笔记本的数量分别为m, n, k,具体算法描述如下:
①输入x的值;
②k=x//4;
③y=x%4;
④如果y的值为0,则m=0, n=0;
⑤如果y的值为1,则m=0, n=1, k=k-1;
⑥如果y的值为2,则m=1, n=0, k=k-1;
⑦如果y的值为3,则m=1, n=1, k=k-2;
⑧输出m, n, k的值;
⑨结束。
(3)編写程序。
根据设计的算法,编写出解决该问题的程序( 见配套学习资源包“第四章\课本素材\程序4-4" )如下:
(4)调试程序。
将程序4-4输入计算机进行调试运行,如输入x的值为398,结果如下:
讨论
各小组讨论以下问题:
(1) if语向i和.eifclse语句在格式、功能、应用等方面的异同。
(2)选择结构的特点。
实践
某学习小组的三名同学为判断某年是否为闰年的问题,各编写程序如下:
各小组完成以下实践内容:
( 1)上机调试程序,分别验证三个程序的正确性。
(2)在这三个程序中,分别采用了不同的表达式作为判断闰年的条件。分析、讨论哪一种更好。
拓展
Python语言程序调试Python是解释型语言,翻译一行就执行一行,因此在运行程序的过程中,只要任何一行出现错误,程序就会立即显示出错误信息并停止执行。此种方式虽然在调试上比较低效(因为每次只会发现一个错误),但是却很容易知道错误发生的原因以及位置。%debug命令用于调试代码,它有两种用法:一种是在执行代码之前设置断点进行调试;第二种则是在代码抛出异常之后,执行%debug命令查看调用堆栈。如图4-11是代码执行后出现的异常信息。
上面的程序中出现了ZeroDivision Error异常,下面用%debug查看调用堆栈。在调试模式下可以使用ipdb模块提供的调试命令,例如用p x显示变量x的值,如图4-12所示。
调试程序时,我们还可以先设置断点,然后运行程序。但是%‰debug的断点需要指定文件名和行号,使用起来并不方便。用%%func_debug单元命令,可以中断指定运行的函数。在如图4-13所示的例子中,程序是在np.unique()的第一行中断运行,然后通过输入n命令单步运行程序,最后输入c继续运行。