鱼C论坛

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

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

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

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

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

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

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


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

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

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

  7. import random
  8. import time
  9. a = 1
  10. b = 9
  11. amount_count = 5
  12. coorect_answer_count = 0
  13. answer_count = 1
  14. start_time = time.time()
  15. print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
  16. continue_loop = 'Y'
  17. while continue_loop == 'Y':
  18.     while answer_count <= amount_count:
  19.             number1 = random.randint(a, b)
  20.             number2 = random.randint(a, b)
  21.             #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
  22.             if number1 < number2 :
  23.                 number1,number2 = number2,number1
  24.             #开始提问
  25.             answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
  26.             if answer == number1 - number2 :
  27.                 print ("回答>>>正确<<<,答案为:",number1 - number2)
  28.                 #正确回答次数+1
  29.                 coorect_answer_count += 1
  30.             elif answer != number1 - number2 :
  31.                 print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
  32.             #回答次数+1
  33.             answer_count += 1
  34.         #跳出循环后,记录结束时间
  35.     end_time  = time.time()
  36.         #计算测试时间
  37.     test_time  = int(end_time - start_time)
  38.         #告诉用户测试结果
  39.     print (amount_count,"道题目已完成!")
  40.     print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
  41.     a = 1
  42.     b = 9
  43.     amount_count = 5
  44.     coorect_answer_count = 0
  45.     answer_count = 1
  46.     continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  4. import random
  5. import time
  6. a = 1
  7. b = 9
  8. amount_count = 5
  9. coorect_answer_count = 0
  10. answer_count = 1
  11. start_time = time.time()
  12. print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
  13. continue_loop = 'Y'
  14. while continue_loop == 'Y':
  15.     while answer_count <= amount_count:
  16.             number1 = random.randint(a, b)
  17.             number2 = random.randint(a, b)
  18.             #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
  19.             if number1 < number2 :
  20.                 number1,number2 = number2,number1
  21.             #开始提问
  22.             answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
  23.             if answer == number1 - number2 :
  24.                 print ("回答>>>正确<<<,答案为:",number1 - number2)
  25.                 #正确回答次数+1
  26.                 coorect_answer_count += 1
  27.             elif answer != number1 - number2 :
  28.                 print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
  29.             #回答次数+1
  30.             answer_count += 1
  31.         #跳出循环后,记录结束时间
  32.     end_time  = time.time()
  33.         #计算测试时间
  34.     test_time  = int(end_time - start_time)
  35.         #告诉用户测试结果
  36.     print (amount_count,"道题目已完成!")
  37.     print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
  38.     answer_count = 1
  39.     continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  7. import random
  8. import time
  9. a = 1
  10. b = 9
  11. amount_count = 5
  12. coorect_answer_count = 0
  13. answer_count = 1
  14. start_time = time.time()
  15. print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
  16. continue_loop = 'Y'
  17. while continue_loop == 'Y':
  18.     while answer_count <= amount_count:
  19.             number1 = random.randint(a, b)
  20.             number2 = random.randint(a, b)
  21.             #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
  22.             if number1 < number2 :
  23.                 number1,number2 = number2,number1
  24.             #开始提问
  25.             answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
  26.             if answer == number1 - number2 :
  27.                 print ("回答>>>正确<<<,答案为:",number1 - number2)
  28.                 #正确回答次数+1
  29.                 coorect_answer_count += 1
  30.             elif answer != number1 - number2 :
  31.                 print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
  32.             #回答次数+1
  33.             answer_count += 1
  34.         #跳出循环后,记录结束时间
  35.     end_time  = time.time()
  36.         #计算测试时间
  37.     test_time  = int(end_time - start_time)
  38.         #告诉用户测试结果
  39.     print (amount_count,"道题目已完成!")
  40.     print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
  41.     a = 1
  42.     b = 9
  43.     amount_count = 5
  44.     coorect_answer_count = 0
  45.     answer_count = 1
  46.     continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

缩进后,仍旧无法循环if分支里面的内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


是不是要重置一下answer_count
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

改了一下,现在呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  4. import random
  5. import time

  6. def test():
  7.     a = 1
  8.     b = 9
  9.     coorect_answer_count = 0
  10.     answer_count = 0#一般从0开始
  11.     start_time = time.time()
  12.     while answer_count < amount_count:#不等号更常用
  13.         number1 = random.randint(a, b)
  14.         number2 = random.randint(a, b)
  15.         #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
  16.         if number1 < number2 :
  17.            number1,number2 = number2,number1
  18.                 #开始提问
  19.         answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
  20.         if answer == number1 - number2 :
  21.             print ("回答>>>正确<<<,答案为:",number1 - number2)
  22.                     #正确回答次数+1
  23.             coorect_answer_count += 1
  24.         elif answer != number1 - number2 :
  25.             print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
  26.                 #回答次数+1
  27.         answer_count += 1
  28.             #跳出循环后,记录结束时间
  29.     end_time  = time.time()
  30.             #计算测试时间
  31.     test_time  = int(end_time - start_time)
  32.             #告诉用户测试结果
  33.     print (amount_count,"道题目已完成!")
  34.     print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")


  35. amount_count = 5
  36. print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
  37. test()
  38. while True:
  39.     if input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!") == 'Y':
  40.         test()
  41.     else:
  42.         print('退出测试')
  43.         break
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-14 22:07:08 | 显示全部楼层
错误原因在于原来的参数没有重置,导致下面一层的while直接循环到最后
在最佳答案的基础上,添加了time的参数重置,这样循环就能够持续

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

  4. import random
  5. import time
  6. a = 1
  7. b = 9
  8. amount_count = 5
  9. coorect_answer_count = 0
  10. answer_count = 1
  11. start_time = time.time()
  12. print ("让我们来进行一项10以内的减法小测试,\n共计",amount_count,"道题目!")
  13. continue_loop = 'Y'
  14. while continue_loop == 'Y':
  15.     while answer_count <= amount_count:
  16.             number1 = random.randint(a, b)
  17.             number2 = random.randint(a, b)
  18.             #数字转换,确保前面的数字大于后面数字,避免出现结果为负数
  19.             if number1 < number2 :
  20.                 number1,number2 = number2,number1
  21.             #开始提问
  22.             answer = eval(input(str(number1)+"-"+str(number2)+"= ? "))
  23.             if answer == number1 - number2 :
  24.                 print ("回答>>>正确<<<,答案为:",number1 - number2)
  25.                 #正确回答次数+1
  26.                 coorect_answer_count += 1
  27.             elif answer != number1 - number2 :
  28.                 print("回答>>>错误<<<,",number1,"-",number2,"应该等于",number1-number2)
  29.             #回答次数+1
  30.             answer_count += 1
  31.         #跳出循环后,记录结束时间
  32.     end_time  = time.time()
  33.         #计算测试时间
  34.     test_time  = int(end_time - start_time)
  35.         #告诉用户测试结果
  36.     print (amount_count,"道题目已完成!")
  37.     print ("回答正确",coorect_answer_count,"次;错误",amount_count-coorect_answer_count,"次。\n总共用时",test_time,"秒!")
  38.     #重置所有参数,用来进行下一次循环
  39.     a = 1
  40.     b = 9
  41.     amount_count = 5
  42.     coorect_answer_count = 0
  43.     answer_count = 1
  44.     start_time = time.time()
  45.     continue_loop = input ("小朋友,你是否愿意继续挑战?如果愿意,请输入“Y”,如果不愿意,直接退出即可!")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢大神。
但是自定义函数还没有学会,期待大神下一次的帮助~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

确实是参数重置的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 22:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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