小甲鱼——分支和循环 错题专练

文章详细讲解了游戏开发中如何实现退出机制,使用while循环配合break语句,以及Python中的break和continue语句在控制流程中的应用。同时讨论了输入验证、随机数生成、模拟实验和数学问题,如素数判断、回文数检查等。
摘要由CSDN通过智能技术生成

概念类题目

1.我们知道在游戏运行后,通常是玩家中断游戏或者主角被打败了,才会退出游戏。那么现在让你来开发一个游戏,你觉得应该如何实现这个机制(可以画流程图,也可以简单概述)?

正解:利用while循环实现游戏主体,当触发退出游戏机制的时候(就是玩家中断游戏或者主角被打败了)搭配break语句跳出循环。

2.. 请看下面代码,当 break 语句执行之后,程序是跳转到位置 1 还是位置 2 呢?

>>> day = 1
>>> while day <= 7:
>>>     while hour <= 8:
...         print("今天,我一定要坚持学习8个小时!")
...         hour += 1
...         if hour > 1:
...             break
...     # 位置1
...     day += 1
... # 位置2

 正解:位置1

解析:无论是多少层循环,break语句和continue语句1都只能作用于离它最近的那一层

3.下面代码存在两个问题,细心的你发现了吗?

>>> while True:
...     command = input("请输入命令(exit/pow):")
...     if command == "pow":
...         base = input("请输入底数:")
...         exp = input("请输入指数:")
...         pow(base, exp)
...     elif command == "exit":
...         continue

正解:第 4 和第 5 行代码使用 input 函数获取的是一个字符串结果,如果要作为 pow() 函数的参数使用,应该将它们转换成整数。第 8 行按照题意应该是“用户输入 exit 表示退出程序”,所以应该将 cotinue 修改为 break

那么改正后的代码如下

>>> while True:
...     command = input("请输入命令(exit/pow):")
...     if command == "pow":
...         base = int(input("请输入底数:"))
...         exp = int(input("请输入指数:"))
...         pow(base, exp)
...     elif command == "exit":
...         break

pow函数

pow函数是一个内置函数,用于计算一个数的幂。

语法如下:

1. pow( x , y )  : x 的 y 次幂

eg: pow( 2 , 4 )

运行结果为16

2. pow( x , y , z ) : x 的 y 次幂除以 z 的余数。

eg: pow( 2 , 4 , 5 )

运行结果为1

pow函数的注意事项:

1.z省略时,y 和 x的值可以是整数也可以是浮点数。

2.z存在时,x 和 y 只能是整数

3.参数z不能为0,否则会报错

上机类题目(真的难)

1.写一个代码,实现结果如下图所示:

我写的,没有运行出来 

while 1:
    input("请输入一个口号(输入STOP结束):")
    if answer == STOP:
        break

正解:

while True:
    slogan = input("请输入一个句口号(输入 STOP 结束):")
    if slogan == "STOP":
        break
    print(slogan)

 自己的问题:

a.首先没有给用户输入的变量命名,但是下面又用到”amswer“

b.然后第三行的STOP需要把它写成字符串,而不是变量命名

c.总是忘记最后要把运行结果打印出来

2.更新模拟抛硬币实验

之前的抛硬币实验的代码

counts = int(input("请输入抛硬币的次数:"))
i = 0

print("开始抛硬币实验:")
while i < counts:
    # 生成1到10的一个随机数
    num = random.randint(1, 10)

    # 如果随机数可以被2整除,则代表正面,否则代表反面
    # num是随机的,所以正面和反面的概率也是随机的
    if num % 2:
        print("正面", end=" ")
    else:
        print("反面", end=" ")

    i += 1

更新要求:

  • 如果抛硬币的次数小于 100,则打印每次的结果,否则不打印
  • 统计最终正面和反面的次数

小甲鱼的正解:很奇怪,照这写出来的也是有错误的,水平有限

#更新抛硬币实验#while循环 random语句 if分支结构
import random

counts = int(input("请输入抛硬币的次数:"))

#利用ignore变量判断是否打印每次的结果
if counts > 100:
    ignore = True
else:
    ignore = False
heads = 0#统计正面的次数
tails = 0#统计反面的次数

i = 0
print("开始抛硬币实验......")
while i < counts:
    num = random.randint(1,10)
    if num % 2:
        heads += 1
        if not ignore:
            print("正面",end="")
        else:
            tails += 1
            if not ignore:
                print("反面",end= "")
        i+=1
print("")
print("一共模拟了",counts,"次抛硬币实验,结果如下:")
print("正面:",heads,"次",sep="")
print("反面:",tails,"次",sep="")

而且运行结果也是有所出入

2.将九九乘法表倒过来打印

程序实现效果图如下

正解:还是有很多不懂的地方,慢慢来吧,加油

>>> i = 1
>>> while i <= 9:
>>>     j = 9
>>>     while j >= i:
>>>         print(j, "*", i, "=", j * i, end=' ')
>>>         j -= 1
>>>     print()
>>>     i += 1

3.找出 10 以内的所有素数,如果不是素数,请打印出该合数对应的乘积公式。 

程序实现效果图如下:

n = 2
while n < 10:
    x = 2
    while x < n:
        if n % x == 0:
            print(n, "=", x, "*", n // x)
            break
        x += 1
    else:
        print(n, "是一个素数")
    n += 1

4.判断100到999之间的所有水仙花数

我写的:

for i in range(1,10):
    for j in range(0,10):
        for k in range(0,10):
            if i**3+j**3+k**3==i*00+j*0+k:
                x = i*100+j*10+k
                print(x,"是水仙花数")

还写了另一个版本:

#判断水花仙数
for x in range(100,1000):
    i = x % 10
    j = x//10 %10
    K = x //100
    if x == i**3+j**3+k**3:
        print(x,"是水仙花数")

不知道为什么,两个都运行不出来,看看正解:

for i in range(100, 1000):
    sum = 0
    temp = i
    
    while temp:
        sum = sum + (temp % 10) ** 3
        temp //= 10
    
    if sum == i:
        print(i)

大概意思就是:sum = sum + (temp % 10) ** 3 为了避免污染源数据 i,我们创建了新变量 temp。

接着,要将一个整数的每个“位”拆解出来,可以搭配使用求余数运算符(%)和整除运算符(//),比如 123 % 10 就得到最后一位 3

所以,sum = sum + (temp % 10) ** 3 的功能就是每次将最后一位计算三次方的结果累加到 sum 变量里面

temp //= 10 这句就不难理解了,123 拿出 3 之后,下一步就应该是拿倒数第二位来算三次方了,所以我们应该将 123 去掉一位,变成 12,那十进制数去掉末位的方法当然就是除以 10 咯。

5.判断一个数是否为回文数

回文数就是正这读和反这读都是一样的 比如:12321

我没写出来,我连解析都没看懂

正解+解析:

x = int(input("请输入一个正整数:"))

if x < 0 or (x % 10 == 0 and x != 0):
    print("不是回文数。")
else:
    revertedNumber = 0
    while x > revertedNumber:
        revertedNumber = revertedNumber * 10 + x % 10
        x //= 10

    if x == revertedNumber or x == revertedNumber // 10:
        print("是回文数。")
    else:
        print("不是回文数。")

解析:

难点一:为什么一旦满足 x < 0 or (x % 10 == 0 and x != 0) 这两种情况,就说明该数不是回文数?

负数很好理解,因为前面有一个负号(-),你没办法把它放到后面去;第二种情况是当数字的最后一位为 0 时,为了使该数字符合回文数的规则,那么这个数字的第一位也应该为 0,纵观所有自然数,只有 0 满足这一特点……

所以,当一个数最后一位为 0,但这个数不是 0 的话,那么这个数毋庸置疑不是回文数

难点二:循环应该在什么时候结束?

答:常规的想法是搭配使用求余数运算符(%)和整除运算符(//),将 x 每一位都进行对应的前后翻转,即将 12345 依次变为 54321……

但真的有必要吗?来自
Mbc0p)3h?}(.g'!^w_$A
其实并无必要!Powered
eqVc&Sd4utNPHOK (k0C~rDX!2
我们只需要反转一半即可,因为如果该数字是回文数,那么其后半部分翻转后应该与原始数字的前半部分相同。;2].[N
Ow8 }aMXIZp@Q[g;Uz.0A7S2G
例如:输入 1221,我们可以将数字后半部分从 21 翻转为 12,并将其与前半部分 12 进行比较,因为二者相同,我们得知数字 1221 是回文。

难点三:如果该数字的位数是奇数,那么反转后的数字位数会比原来的一半多一位。

所以,if x == revertedNumber or x == revertedNumber // 10 才对两种情况(左侧是当 x 的位数是偶数时;右侧是当 x 的位数是奇数时)进行判断。

专题错题结束,但是我真的不理解最后两个,尤其是最后一个,真的希望有人看到能给我讲一下。

 

a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值