davidmou 发表于 2023-7-7 23:49:36

T-T

# 我改正的答案:
yourinput = input("请输入密码:")
i = 2
answer = "dmDM"
while yourinput != answer:
    if "*" in yourinput:
      yourinput = input("密码错误,您还剩下 %d 次机会, 请重新输入:" % (i + 1))
      continue
    if "*" not in yourinput:
      yourinput = input("密码错误,您还剩下 %d 次机会, 请重新输入:" % (i))
      i -= 1
         
    if i == 0:
      print("密码错误,次数用完了,十五分钟后尝试")
      break
if yourinput == answer:
    print("密码正确,进入程序")

哪位鱼油能帮看一下,这是课后作业第九讲动动手第0道题,当还剩一次机会时输入*是直接结束程序,我也不知道为什么

isdkz 发表于 2023-7-7 23:52:18

看上去你的代码中有一个逻辑错误。当你在密码中输入"*"时,你的代码逻辑会无限地要求用户重新输入密码,但不会减少剩余的尝试次数(因为你在输入"*"的if条件语句中并没有将i减少)。

另外,关于"*"输入后程序直接结束的问题,这可能是由于在while循环的判断条件中,你是根据输入是否等于答案来决定是否退出循环的。如果"*"不等于答案,那么就会一直循环,除非达到次数限制。

修改一下代码,我认为以下的代码能够满足你的要求:

```python
yourinput = input("请输入密码:")
i = 3
answer = "dmDM"
while yourinput != answer and i > 0:
    if "*" in yourinput:
      yourinput = input("密码错误,您还剩下 %d 次机会,请重新输入:" % (i))
    else:
      i -= 1
      if i > 0:
            yourinput = input("密码错误,您还剩下 %d 次机会,请重新输入:" % (i))
      else:
            print("密码错误,次数用完了,十五分钟后尝试")
            break
if yourinput == answer:
    print("密码正确,进入程序")
```

这个版本的代码将只在密码错误且不包含"*"时减少尝试次数。另外,也确保了在达到尝试次数限制后将会退出循环,无论密码是否包含"*"。

歌者文明清理员 发表于 2023-7-7 23:53:24

isdkz 发表于 2023-7-7 23:52
看上去你的代码中有一个逻辑错误。当你在密码中输入"*"时,你的代码逻辑会无限地要求用户重新输入密码,但 ...

分析:isdkz的电脑关机了

isdkz 发表于 2023-7-7 23:55:00

歌者文明清理员 发表于 2023-7-7 23:53
分析:isdkz的电脑关机了

{:10_256:}在电脑上我直接utools快捷键就可以转格式了,手机上懒得调

歌者文明清理员 发表于 2023-7-7 23:59:18

isdkz 发表于 2023-7-7 23:55
在电脑上我直接utools快捷键就可以转格式了,手机上懒得调

/ set ip -v ( ping @isdkz )
/ set UAV.pos -v ip
/ UAV start shot
/ cd desktop
/ play video isdkz.mp4
{:10_256:}

sfqxx 发表于 2023-7-8 07:52:08

isdkz 发表于 2023-7-7 23:55
在电脑上我直接utools快捷键就可以转格式了,手机上懒得调

教我{:10_254:}

isdkz 发表于 2023-7-8 07:53:12

sfqxx 发表于 2023-7-8 07:52
教我

先去了解一下utools这个软件,我现在电脑上都离不开utools和snipaste{:10_256:}

sfqxx 发表于 2023-7-8 07:54:31

isdkz 发表于 2023-7-8 07:53
先去了解一下utools这个软件,我现在电脑上都离不开utools和snipaste

链接{:10_254:}

isdkz 发表于 2023-7-8 07:57:04

sfqxx 发表于 2023-7-8 07:54
链接

https://open.u-tools.cn/468049.html

sfqxx 发表于 2023-7-8 08:25:48

isdkz 发表于 2023-7-8 07:57
https://open.u-tools.cn/468049.html

谢谢{:10_254:}

liuhongrun2022 发表于 2023-7-8 08:31:41

isdkz 发表于 2023-7-8 07:53
先去了解一下utools这个软件,我现在电脑上都离不开utools和snipaste

utools好用,我用过

ww185912 发表于 2023-7-8 09:44:53

我不太明白,你要完成的操作,我看你代码猜测您要完成的操作是:一共3次机会,当输入为*时候可以增加一次机会或保持机会次数不变,我写的是加一次机会,要是你要保证机会不变把我代码中那个i += 1删掉即可
yourinput = input("请输入密码:")
i = 2
answer = "dmDM"
while yourinput != answer:
    yourinput = input("密码错误,您还剩下 %d 次机会, 请重新输入:" % (i))
    if "*" in yourinput:
      i += 1
    elif "*" not in yourinput:
      i -= 1
    if yourinput == answer or i == 0:
      print("密码错误,次数用完,十五分钟后尝试") if i == 0 else print("密码正确,进入程序")
      break

isdkz 发表于 2023-7-8 10:45:23

liuhongrun2022 发表于 2023-7-8 08:31
utools好用,我用过

确实好用,绝对是程序员提效利器{:5_106:}

davidmou 发表于 2023-7-8 15:29:24

isdkz 发表于 2023-7-7 23:52
看上去你的代码中有一个逻辑错误。当你在密码中输入"*"时,你的代码逻辑会无限地要求用户重新输入密码,但 ...

还有一个问题,就是当还剩一次机会时,i以变为了0,为什么不会在屏幕上输出密码错误,次数用完了,十五分钟后尝试。

isdkz 发表于 2023-7-8 15:38:33

davidmou 发表于 2023-7-8 15:29
还有一个问题,就是当还剩一次机会时,i以变为了0,为什么不会在屏幕上输出密码错误,次数用完了,十五分 ...

我看到了你的问题,实际上,在你的代码中当最后一次机会(i=1)用户输入错误时,你的代码会继续执行i -= 1 ,然后变成i = 0 。在这之后,程序会再次进入到循环,但因为yourinput不等于answer ,并且i已经是0了,所以循环条件不满足,程序会跳出循环,而没有机会执行print("密码错误,次数用完了,十五分钟后尝试")这一行代码。

上面我提供的修改后的代码能够处理这个问题,它会在最后一次机会输入错误后输出密码错误,次数用完了,十五分钟后尝试 ,然后退出循环。

再次强调,当你设计一个循环的时候,需要仔细考虑你的循环退出条件和每次循环内部的逻辑,以确保它们可以正确地按照你的预期工作。
页: [1]
查看完整版本: T-T