鱼C论坛

 找回密码
 立即注册
查看: 810|回复: 10

[已解决]关于两个while的循环导致无限循环的问题

[复制链接]
发表于 2020-3-14 21:21:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如代码所示,想实现输入Y后,程序再次执行五次测试并最终给出测试结果。但是如下代码会无限循环,并不会进入嵌套中的while循环中的各项if代码。
请各位大神看下原因,谢谢!
#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

import random
import time
a = 1
b = 9
amount_count = 5
coorect_answer_count = 0
answer_count = 1
start_time = time.time()
print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
continue_loop = 'Y'
while continue_loop == 'Y':
    while answer_count <= amount_count:
            number1 = random.randint(a, b)
            number2 = random.randint(a, b)
            #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
            if number1 < number2 :
                number1,number2 = number2,number1
            #开始提问
            answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
            if answer == number1 - number2 :
                print ("回答>>>正确<<<,答案为:",number1 - number2)
                #正确回答次数+1
                coorect_answer_count += 1
            elif answer != number1 - number2 :
                print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
            #回答次数+1
            answer_count += 1
        #跳出循环后,记录结束时间
    end_time  = time.time()
        #计算测试时间
    test_time  = int(end_time - start_time)
        #告诉用户测试结果
    print (amount_count,"道题目已完成!")
    print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")

最佳答案
2020-3-14 21:29:12
本帖最后由 qiuyouzhi 于 2020-3-14 21:45 编辑

最后一行缩进错误:
#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

import random
import time
a = 1
b = 9
amount_count = 5
coorect_answer_count = 0
answer_count = 1
start_time = time.time()
print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
continue_loop = 'Y'
while continue_loop == 'Y':
    while answer_count <= amount_count:
            number1 = random.randint(a, b)
            number2 = random.randint(a, b)
            #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
            if number1 < number2 :
                number1,number2 = number2,number1
            #开始提问
            answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
            if answer == number1 - number2 :
                print ("回答>>>正确<<<,答案为:",number1 - number2)
                #正确回答次数+1
                coorect_answer_count += 1
            elif answer != number1 - number2 :
                print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
            #回答次数+1
            answer_count += 1
        #跳出循环后,记录结束时间
    end_time  = time.time()
        #计算测试时间
    test_time  = int(end_time - start_time)
        #告诉用户测试结果
    print (amount_count,"道题目已完成!")
    print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
    a = 1
    b = 9
    amount_count = 5
    coorect_answer_count = 0
    answer_count = 1
    continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-14 21:28:56 | 显示全部楼层
本帖最后由 sunrise085 于 2020-3-14 21:35 编辑

最后一行的缩进不对。最后一行应该是外层while循环内的语句。同时最后没有把answer_count恢复初值。answer_count没有恢复初值,所以想再次执行五次测试的时候,根本无法进入内层while循环
#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

import random
import time
a = 1
b = 9
amount_count = 5
coorect_answer_count = 0
answer_count = 1
start_time = time.time()
print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
continue_loop = 'Y'
while continue_loop == 'Y':
    while answer_count <= amount_count:
            number1 = random.randint(a, b)
            number2 = random.randint(a, b)
            #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
            if number1 < number2 :
                number1,number2 = number2,number1
            #开始提问
            answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
            if answer == number1 - number2 :
                print ("回答>>>正确<<<,答案为:",number1 - number2)
                #正确回答次数+1
                coorect_answer_count += 1
            elif answer != number1 - number2 :
                print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
            #回答次数+1
            answer_count += 1
        #跳出循环后,记录结束时间
    end_time  = time.time()
        #计算测试时间
    test_time  = int(end_time - start_time)
        #告诉用户测试结果
    print (amount_count,"道题目已完成!")
    print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
    answer_count = 1
    continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:29:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qiuyouzhi 于 2020-3-14 21:45 编辑

最后一行缩进错误:
#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

import random
import time
a = 1
b = 9
amount_count = 5
coorect_answer_count = 0
answer_count = 1
start_time = time.time()
print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
continue_loop = 'Y'
while continue_loop == 'Y':
    while answer_count <= amount_count:
            number1 = random.randint(a, b)
            number2 = random.randint(a, b)
            #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
            if number1 < number2 :
                number1,number2 = number2,number1
            #开始提问
            answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
            if answer == number1 - number2 :
                print ("回答>>>正确<<<,答案为:",number1 - number2)
                #正确回答次数+1
                coorect_answer_count += 1
            elif answer != number1 - number2 :
                print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
            #回答次数+1
            answer_count += 1
        #跳出循环后,记录结束时间
    end_time  = time.time()
        #计算测试时间
    test_time  = int(end_time - start_time)
        #告诉用户测试结果
    print (amount_count,"道题目已完成!")
    print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
    a = 1
    b = 9
    amount_count = 5
    coorect_answer_count = 0
    answer_count = 1
    continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 21:39:04 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 21:29
最后一行缩进错误:

缩进后,仍旧无法循环if分支里面的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:42:12 | 显示全部楼层
while continue_loop == 'Y':
    answer_count = 1

是不是要重置一下answer_count
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:43:35 | 显示全部楼层
laikuihao 发表于 2020-3-14 21:39
缩进后,仍旧无法循环if分支里面的内容

改了一下,现在呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 21:49:56 | 显示全部楼层
你好,根据你的题目要求 重写了你的函数 我觉得 你的循环 还是没有理解 面向流程编程是编程的第一步
你还得咱看看,你的基础稍微差点 循环的顺序 再看看吧  Y还是N那个 你死循环 是因为 一直是 'Y'你没有再循环内
给那个loop什么的赋值 所以一直循环 我这个 程序 完全满足要求 望采纳
#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

import random
import time

def test():
    a = 1
    b = 9
    coorect_answer_count = 0
    answer_count = 0#一般从0开始
    start_time = time.time()
    while answer_count < amount_count:#不等号更常用
        number1 = random.randint(a, b)
        number2 = random.randint(a, b)
        #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
        if number1 < number2 :
           number1,number2 = number2,number1
                #开始提问
        answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
        if answer == number1 - number2 :
            print ("回答>>>正确<<<,答案为:",number1 - number2)
                    #正确回答次数+1
            coorect_answer_count += 1
        elif answer != number1 - number2 :
            print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
                #回答次数+1
        answer_count += 1
            #跳出循环后,记录结束时间
    end_time  = time.time()
            #计算测试时间
    test_time  = int(end_time - start_time)
            #告诉用户测试结果
    print (amount_count,"道题目已完成!")
    print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")


amount_count = 5
print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
test()
while True:
    if input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!") == 'Y':
        test()
    else:
        print('退出测试')
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-14 22:07:08 | 显示全部楼层
错误原因在于原来的参数没有重置,导致下面一层的while直接循环到最后
在最佳答案的基础上,添加了time的参数重置,这样循环就能够持续
#10以内减法小测试
# 1、随机生成1-9的整数,将两个整数相减,且结果不能为负数 2、提示用户输入正确答案 3、验证并告知用户回答结果,如果错误,则告诉用户正确答案
# 4、记录正确和错误答案次数 5、测试5次,结束后告知用户得分情况

import random
import time
a = 1
b = 9
amount_count = 5
coorect_answer_count = 0
answer_count = 1
start_time = time.time()
print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
continue_loop = 'Y'
while continue_loop == 'Y':
    while answer_count <= amount_count:
            number1 = random.randint(a, b)
            number2 = random.randint(a, b)
            #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
            if number1 < number2 :
                number1,number2 = number2,number1
            #开始提问
            answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
            if answer == number1 - number2 :
                print ("回答>>>正确<<<,答案为:",number1 - number2)
                #正确回答次数+1
                coorect_answer_count += 1
            elif answer != number1 - number2 :
                print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
            #回答次数+1
            answer_count += 1
        #跳出循环后,记录结束时间
    end_time  = time.time()
        #计算测试时间
    test_time  = int(end_time - start_time)
        #告诉用户测试结果
    print (amount_count,"道题目已完成!")
    print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
    #重置所有参数,用来进行下一次循环
    a = 1
    b = 9
    amount_count = 5
    coorect_answer_count = 0
    answer_count = 1
    start_time = time.time()
    continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 22:08:02 | 显示全部楼层
TJBEST 发表于 2020-3-14 21:49
你好,根据你的题目要求 重写了你的函数 我觉得 你的循环 还是没有理解 面向流程编程是编程的第一步
你还 ...

感谢大神。
但是自定义函数还没有学会,期待大神下一次的帮助~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 22:10:46 | 显示全部楼层
lilu7688x 发表于 2020-3-14 21:42
是不是要重置一下answer_count

确实是参数重置的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 22:30:05 | 显示全部楼层
微信图片_20200314222810.png

两个while循环下的内容可以暂时用两句话概括出来,这样你应该容易理清前后的关系,发现问题

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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