鱼C论坛

 找回密码
 立即注册
查看: 1814|回复: 11

python 第44课 动动手0 求助

[复制链接]
发表于 2018-7-11 22:46:35 | 显示全部楼层 |阅读模式
9鱼币
本帖最后由 屁哥 于 2018-7-13 11:21 编辑

题目: 如果开始计时的时间是(2022年2月22日16:30:30),停止时间是(2025年1月23日15:30:30),那按照我们用停止时间减开始时间的计算方式就会出现负数,你应该对此做一些转换。
答案代码:
import time as t

class MyTimer:
    def __init__(self):
        self.unit = ['年', '月', '天', '小时', '分钟', '秒']
        self.borrow = [0, 12, 31, 24, 60, 60]
        self.prompt = '未开始计时!'
        self.lasted = []
        self.begin = 0
        self.end = 0

    def __str__(self):
        return self.prompt

    __repr__ = __str__

    def __add__(self, other):
        prompt = '总共运行了'
        result = []
        for index in range(6):
            result.append(self.lasted[index] + other.lasted[index])
            if result[index]:
                prompt += (str(result[index]) + self.unit[index])
            return prompt
    # 开始计时
    def start(self):
        self.begin = t.localtime()
        self.prompt = '提示: 请先调用 stop() 停止计时'
        return '计时开始'

    # 停止计时
    def stop(self):
        if not self.begin:
            print('提示: 请先调用 start() 进行计时!')
        else:
            self.end = t.localtime()
            self._calc()
            print('计时结束!')

    # 内部方法 计算运行时间
    def _calc(self):
        self.lasted = []
        self.prompt = '总共运行了'
        for index in range(6):
            temp = self.end[index] - self.begin[index]

            # 位低不够减 需向高位借位
            if temp < 0:
                # 测试高位是否有得'借',没得借的话向再高位借.....
                i = 1
                while self.lasted[index - i] < 1:
                    self.lasted[index - i] += self.borrow[index - i] - 1
                    self.lasted[index - i - 1] -= 1
                    i += 1

                self.lasted.append(self.borrow[index] + temp)
                self.lasted[index-1] -= 1
            else:
                self.lasted.append(temp)

        # 由于高位随时会被借位,所以打印要放在最后
        for index in range(6):
            if self.lasted[index]:
                self.prompt += str(self.lasted[index]) + self.unit[index]

        # 为下一轮计时初始化变量
        self.begin = 0
        self.end = 0

这里 循环部分 不太理解 求指教
    def _calc(self):
        self.lasted = []
        self.prompt = '总共运行了'
        for index in range(6):
            temp = self.end[index] - self.begin[index] # 结束时间减去开始时间 赋值给 temp

            # 位低不够减 需向高位借位
            if temp < 0:        # 如果结果小于0 就是出现了负数的时间,数学减法中的向前借位
                # 测试高位是否有得'借',没得借的话向再高位借.....
                i = 1   # 赋值1给变量 i
                while self.lasted[index - i] < 1:   # 用循环 判断lasted 列表中的结果是否小于1 如果小于1 执行下面借位代码
                    # 上面这句有点不懂 self.lasted 这个列表中有值么? 什么时候添加进列表的? 现在这个列表时空的吧..
                    self.lasted[index - i] += self.borrow[index - i] - 1
                    # 这句[index- i] 向上借位,比如天向月借位,月就加12-1(也不对啊,10月19日,减去9月20日,是前面的10月+(12-1)=21月)?
                    self.lasted[index - i - 1] -= 1 # 这里如果继续上面的逻辑下来,(21-2)月=19-10=9个月 ?
                    i += 1  # 这里循环一圈 i + 1 是怎么回事?

                self.lasted.append(self.borrow[index] + temp)   # 这就往列表里添加数值了,括号里有点懂又不懂...
                self.lasted[index-1] -= 1   # 对应索引值 减一 再减一 ? 没读下来 彻底懵了
            else:
                self.lasted.append(temp)    # 这个好理解了,如果结果不小于1 直接添加列表里面了.
                ## 等等 小于1 ? 如果结果是 0 呢? 0也正常啊,10月-10月 正好是0 (31日 -31日 = 0日)  上面循环为什么是小于1而不是小于0 ?
太笨了,注释代码 自己把自己整蒙了,求指点指点,我知道我不是这块料,但是我就是想学. 先谢谢了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-12 13:09:57 | 显示全部楼层
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码  (for语句部分)
for index in range(6):# 注意看这里,是从年开始的哦,为什么? 请看下个注释
    temp = self.end[index] - self.begin[index] # 当 index = 0 ,对应的是年哦
    if temp < 0:
        i = 1
        while self.lasted[index - i] < 1: # 测一下是不是能借给需要的低位
            self.lasted[index - i] += self.borrow[index - i] - 1#他 -1
            self.lasted[index - i - 1] -= 1 # 他的上一位 -1
            i += 1 # 虽然他的上一位 -1了,但还是要测一下,他的上一位是不是真有数,如果有,那就跳过while了,进入下一环节咯
        self.lasted.append(self.borrow[index] + temp)
        self.lasted[index-1] -= 1
    else:
        self.lasted.append(temp) 

r
QQ图片20180712130713.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-12 13:10:54 | 显示全部楼层
如果解决了,给个最佳答案把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-12 13:44:23 | 显示全部楼层
cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把

妥妥的  我看看  
我这人比较笨 哎....  谢谢哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-12 13:46:42 | 显示全部楼层
本帖最后由 屁哥 于 2018-7-12 13:59 编辑
cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码  (for语句部分)


是年减去年 不小于0  temp >  0  直接执行 else  self.lasted.append 加进去了年
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-12 14:04:40 | 显示全部楼层
屁哥 发表于 2018-7-12 13:46
是年减去年 不小于0  temp >  0  直接执行 else  self.lasted.append 加进去了年


temp < 0,那么不光是>0, =0时,也会直接执行self.lasted.append的,当然还其他的地方,你再想想?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-9 15:47:37 | 显示全部楼层
回答的答案看不懂耶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-16 11:13:49 | 显示全部楼层
cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码  (for语句部分)

cupbbboom 的答案非常好啊,写的很详细了,支持下,谢谢你,我看懂了,9个币到现在都没有拿到,哈哈有点坑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-25 17:43:13 | 显示全部楼层
shokunin 发表于 2019-6-9 15:47
回答的答案看不懂耶

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-19 17:08:31 | 显示全部楼层
cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把

您写出来的解释我理解,并同意。但是有一个问题:如果需要借位时,i-1这一位是0,那就需要再向i-2先借位。假如i - 2这一位借位前是1,借位后变成了0。那么根据while循环,就需要再次进入(因为条件是<1),但事实上这一位由1变成0的话是不需要再次进入while循环的。也就是说这个代码存在错误。我表达的问题清楚吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 21:30:16 | 显示全部楼层
答案代码确实有误,修改如下:


   if temp < 0:
        i = 1
        while self.lasted[index - i] < 1: # 测一下是不是能借给需要的低位
            self.lasted[index - i] += self.borrow[index - i] - 1#他 -1
####           self.lasted[index - i - 1] -= 1 #这句不需要,因为上位的借位留给下一次循环解决
            i += 1 # 虽然他的上一位 -1了,但还是要测一下,他的上一位是不是真有数,如果有,那就跳过while了,进入下一环节咯
        self.lasted.append(self.borrow[index] + temp)
        self.lasted[index-i] -= 1        #这句不对,应该是index-i,表示直到找到能借到的那一位,也就是循环跳出来的时候
    else:
        self.lasted.append(temp)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-25 11:13:47 | 显示全部楼层
本帖最后由 Tigeroad 于 2020-5-25 11:46 编辑
boy007 发表于 2020-3-9 21:30
答案代码确实有误,修改如下:


是的!
不过你注释的“因为上位的借位留给下一次循环解决”,改成“下一步的lasted[index - i] -= 1 解决”更好,因为跳出while循环之前,i += 1, 所以下一步lasted[index - i] -= 1 是减去的更高一位的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表