闪电快递练习

明确项目目的

先来看一下项目需求:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析流程,拆解项目

我们的任务就是做一个“快递配送调配程序”,虽然这朋友要的比较着急,但是我们也不着急于编程开发,应该先梳理清楚需求,做出的程序功能达到什么样的效果。

计算器,首先配送站BOSS要输入信息,然后自动计算出结果。为了搞清楚计算过程,我们得到计算公式。

梳理需求,得到下图结果:在这里插入图片描述

# 注:size代表集装箱大小,person代表快递员人数,num代表配送次数

# 配送次数计算
size = 2
person = 2
num = size*100/20
print('2个标准集装箱大的快递项目,使用2快递员配送,则需要配送次数:',int(num))

# 快递员数计算
size = 0.6
num = 1
person = 0.6*100/20
print('0.6个标准集装箱大的快递项目,1次配送完毕,则需要配送员数:',int(person))
# 配送次数计算公式
size = 2
person = 2
num = size * 100 / 20/person

# 配送员数计算公式
size = 0.6
num = 1
person = size *100 /20/ num

我们已经搞定了计算公式,接下来我们拆分一下阶段版本。

因为这BOSS朋友着急,先做出程序,以后再优化吧。所以,我们把程序版本大致规划成3个阶段。在这里插入图片描述
逐步执行,代码实现

先来解决1.0版本。
3.1 先能用
做一个“能用就好”的基本程序,我们把输入的内容当成函数参数,传入到函数中,完成计算功能。

大概是这个样子。

# 配送次数计算
def calculate_num(size,person):
    #配送次数计算过程
    ……

# 配送员数计算
def calculate_person(size,num):
    #配送员数计算过程
    ……

calculate_num(参数1,参数2)
calculate_person(参数1,参数2)

刚才也写好了计算公式,下面我们把计算公式放进函数中,再打印一下结果。

# 配送次数计算
def calculate_num(size,person):
    #配送次数计算过程
    num = size * 100 / 20/person
    print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次:' %(size,person,num))
# 快递员数计算
def calculate_person(size,num):
    #快递员数计算过程
    person = size *100 /20/ num
    print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,num,person))

calculate_num(参数1,参数2)
calculate_person(参数1,参数2)

%f是字符串格式化,格式字符串为浮点数,%.1f的意思是格式话字符串为浮点数,并且保留一位小数。
你看,一个快递配送调配程序就已经完成了,给BOSS朋友送去吧。
3.2 再改进
在这里插入图片描述
那么问题来了,无论小数点之后是点几,都要向上进一取整数。也就是1.5转成2,1.9转成2,1.1转成2,即对人数需要向上取整。
在这里插入图片描述
发现:向上取整是math.ceil(), 括号内放数字。

也就是使用math.ceil()方法,就能把数字向上取整。并且在开始位置,有一句import math, 怎么有些似曾相识. 在上个项目实战中,我们使用随机数,也用过import math代码。

我们使用math.ceil()将我们的小数进行向上取整吧。
现在解决了项目bug,感觉应该可以了。

import math
# 配送次数计算
def calculate_num(size,person):
    #配送次数计算过程
    num = math.ceil(size * 100 / 20/person) 
    print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次:' %(size,person,num))
# 快递员数计算
def calculate_person(size,num):
    #快递员数计算过程
    person = math.ceil(size *100 /20/ num)
    print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,num,person))

calculate_num(1.5,2)
calculate_person(0.5,1)

等等,BOSS朋友需要使用两个函数才能计算配送次数,计算配送员数,有没有办法能够让她使用一个函数就能完成功能。

如何解决这个问题?还是用之前方法流程来处理:
在这里插入图片描述
那么这个功能,第一步就可以这样子:

# 工作量计算函数
def calculate_job(参数……):
    ……

# 调用工作量计算函数
calculate_job(参数……)

要想实现这样效果,我们怎么传递参数,才能让函数区分是【计算配送次数】还是【计算配送员数】。

当然选B啦。区分两种情况,当然用条件判断啊。

既然用条件判断,我们的代码就可以写成:

# 工作量计算函数
def calculate_job(参数……):
    if 条件1......#计算配送员数
    elif 条件2......#计算配送次数

# 调用工作量计算函数
calculate_job(参数……)

OK,现在问题又进了一步。也就是解决条件1与条件2,计算工作量即可。

还有一个问题,就是参数如何设置。

昨天在学习函数时,设置过默认参数,而函数调用时,还能替换掉默认参数,我们就利用函数的特性来解决这个问题。

import math
# 配送调配计算
# 设置默认参数
def calculate_job(size=1,person=None,num=None):
    if(person !=None)and(num==None):
         #配送次数计算过程
        num = math.ceil(size * 100 / 20/person) 
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(size,person,num))
    elif(person==None)and(num!=None):
        #快递员数计算过程
        person = math.ceil(size *100 /20/ num)
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,num,person))
calculate_job(size=1.5,person=2)
calculate_job(size=0.5,num=1)

OK,现在这个程序已经可以运行了。

但是,我们在调用函数的时候,你还要输入参数名与参数值,太麻烦,我们能不能有个简单方法。

import math
# 配送调配计算
# 设置默认参数
def calculate_job(types,size,other):
    if types ==1:
        #配送次数计算过程
        num = math.ceil(size * 100 / 20/other) 
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(size,other,num))
    elif types==2:
        #快递员数计算过程
        person = math.ceil(size *100 /20/ other)
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(size,other,person))
calculate_job(1,1.5,2)
calculate_job(2,0.5,1)

3.3 精细化
在这里插入图片描述
在这里插入图片描述
增加可交互性,让BOSS朋友只输入内容即可, 使用input()函数

import math
types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择:')) 
sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
if types ==1:
    others = int(input('请输入投入的快递员数,请输入整数'))
else:
    others = int(input('请输入快递次数,请输入整数'))

# 配送调配计算
# 设置默认参数
def calculate_job(types,sizes,others):
    print('计算结果如下')
    if types ==1:
         #配送次数计算过程
        num = math.ceil(sizes * 100 / 20/others)
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
    elif types==2:
        #快递员数计算过程
        person = math.ceil(sizes *100 /20/ others)
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))

calculate_job(types,sizes,others)
import math
types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择')) 
sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
if types ==1:
    others = int(input('请输入投入的快递员数,请输入整数'))
else:
    others = int(input('请输入快递次数,请输入整数'))

# 配送调配计算
# 设置默认参数
def calculate_job(types,sizes,others):
    print('计算结果如下')
    if types ==1:
         #配送次数计算过程
        num = math.ceil(sizes * 100 / 20/others)
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
    elif types==2:
        #快递员数计算过程
        person = math.ceil(sizes *100 /20/ others)
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))

calculate_job(types,sizes,others)

在这里插入图片描述
当我们选择计算配送次数, 项目大小为2.2倍,快递员数为1时。 计算工时:需要配送次数 = 2.2*100/20/1 ,得到的结果应该是11次,可是打印出来却是12次。

这是为什么呢? 还是老问题, python江湖中的除法,会将数字都转换二进制再进行计算,得到的结果是一个二进制,造成数字增加。不信,你运行一下下面程序。

import math
print(2.2*100/20)
print(math.ceil(2.2*100/20))
2.2*100/20  ------------->11.000000000000002
math.ceil(2.2*100/20) ------------->12 

明明可以整除的,造成还存在小数部分,然后向上取整后得到12。

那么有没有办法可以改变。

有, 我们使用math中的round函数。

import math
print(round(2.2*100/20,2))

round()函数是python中提供解决小数的保留问题。此函数格式round(x ,n) x表示小数,n表示需要保留的小数位。

我们保留小数2位,将round加入到我们的案例方法中。

import math
types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择')) 
sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
if types ==1:
    others = int(input('请输入投入的快递员数,请输入整数'))
else:
    others = int(input('请输入快递次数,请输入整数'))

# 配送调配计算
# 设置默认参数
def calculate_job(types,sizes,others):
    print('计算结果如下')
    if types ==1:
         #配送次数计算过程
        num = math.ceil(round((sizes * 100 / 20/others),2))
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
    elif types==2:
        #快递员数计算过程
        person = math.ceil(round((sizes *100 /20/ others),2))
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))

calculate_job(types,sizes,others)

BOSS朋友是不是可以输入了。

但是,按照函数封装代码的思想,我们现在代码写的很杂。

那我们把它优化一下?

怎么优化呢?创建一个主函数,用来调用其他子函数。
在这里插入图片描述

import math

def BOSS_input():
    # 输入内容
    types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择')) 
    sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
    if types ==1:
        others = int(input('请输入投入的快递员数,请输入整数'))
    else:
        others = int(input('请输入快递次数,请输入整数'))
    
    return types,sizes,others  #这里返回一个数组

#计算工作量
def calculate_job(data_input):
    #获取参数数值
    types = data_input[0]
    sizes = data_input[1]
    others = data_input[2]

    print('计算结果如下')
    if types ==1:
         #配送次数计算过程
        num = math.ceil(round((sizes * 100 / 20/others),2))
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
    elif types==2:
        #快递员数计算过程
        person = math.ceil(round((sizes *100 /20/ others),2))
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))


#主函数
def res():
    data_input = BOSS_input()
    calculate_job(data_input)
    
#调用主函数
res()

在这里函数BOSS_input()负责收集BOSS朋友输入的数据;函数calculate_job()负责计算工作量.函数res()负责调用两个函数,传入参数.只要调用res()函数,就能让整个程序跑起来。

import math

def BOSS_input():
    # 输入内容
    types = int(input('请选择需要计算的工作:1-配送次数计算,2-快递员数计算,请选择')) 
    sizes = float(input('请输入项目大小:1代表标准,还可以输入其他倍数或小数'))
    if types ==1:
        others = int(input('请输入投入的快递员数,请输入整数'))
    else:
        others = int(input('请输入快递次数,请输入整数'))
    
    return types,sizes,others  #这里返回一个数组

#计算工作量
def calculate_job(data_input):
    #获取参数数值
    types = data_input[0]
    sizes = data_input[1]
    others = data_input[2]

    print('计算结果如下')
    if types ==1:
         #配送次数计算过程
        num = math.ceil(round((sizes * 100 / 20/others),2))
        print('%.1f个标准集装箱大的快递项目,使用%d位快递员配送,则需要配送次数%d次' %(sizes,others,num))
    elif types==2:
        #快递员数计算过程
        person = math.ceil(round((sizes *100 /20/ others),2))
        print('%.1f个标准集装箱大的快递项目,%d次配送完毕,则需要快递员数:%d位' %(sizes,others,person))


#主函数
def res():
    data_input = BOSS_input()
    calculate_job(data_input)
    
#调用主函数
res()

通过自己方法,完成向上取整.
用户输入1.1,变成2
用户输入1.5,变成2
用户输入1.9,变成2
不使用math.ceil()函数,自己制作一个向上取整的函数。

def rounding(num):
    if num%1==0:
        return int(num)
    else:
    	data = int(num)+1
    	return data
num=float(input('请输入数字:'))
num1 = rounding(num)
print(num1)

出租车车费计算方式如下:1、打车距离在3公里以内,只收起步价15元。2、距离在3公里~15公里,每1公里加3元。3、距离超过15公里后,每1公里加5元。请完成计价函数。
今天需要和BOSS朋友去吃饭,我们一起打车去市中心,我们想写一个程序,输入坐车公里数,就能自动计算车费。 出租车车费计算方式如下:

import math
distance = math.ceil(float(input("请输入坐车公里数:")))
def texi(distance):
    if distance<=3:
        price=15
    elif 3<distance<=15:
        price=15+(distance-3)*3
    elif distance>15:
        price=15+12*3+(distance-15)*5
    print('本次打车费用为:%d元'%price)
texi(distance)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值