qwe2052190 发表于 2021-9-2 18:28:33

被这个代码整吐了

萌新又来求助啦,大佬们帮忙看看这串代码到底哪里出问题了,为什么同时有两个都过1/3了,输出的却只有张三呢?

#建立投票程序,用户输入候选人:
p = ['张三']
m = "请输入候选人: "
m += "请输入'p'结束程序: "
active = True
while active:
    mess = input(m)
    if mess == 'p':
      active = False
    else:
      p.append(mess)
      
#判断是否有两个候选人都超过总数的1/3:
moj_1 = moj_2 = p    #初始化两个候选人变量
count_1 = count_2 = 0    #初始化两个候选人的票数

#对抗阶段:
#遍历候选人列表,每个元素需要分别与当前候选人变量比对,相同则当前候选人票数+1,都不同则弃之,票数-1:
for each in p:
    if moj_1 == each:
      count_1 += 1
      continue
      
    if moj_2 == each:
      count_2 += 1
      continue
      
    if count_1 == 0:
      moj_1 = each
      count_1 = 1
      continue
      
    if count_2 == 0:
      moj_2 == each
      count_2 = 1
      continue
      
    count_1 -= 1
    count_2 -= 1
   
#统计阶段:
#对抗阶段结束后,如果moj_1,moj_2两个变量都有剩余,则统计各自的票数,否则不存在同时过1/3的两个候选人:
if p.count(moj_1) > len(p) / 3:
    print("候选人",moj_1,"的选票超过1/3!")
if p.count(moj_2) > len(p) / 3:
    print("候选人",moj_2,"的选票超过1/3!")

qwe2052190 发表于 2021-9-2 18:29:23

请输入候选人: 请输入'p'结束程序: 张三
请输入候选人: 请输入'p'结束程序: 张三
请输入候选人: 请输入'p'结束程序: 李四
请输入候选人: 请输入'p'结束程序: 李四
请输入候选人: 请输入'p'结束程序: 李四
请输入候选人: 请输入'p'结束程序: p
候选人 张三 的选票超过1/3!
候选人 张三 的选票超过1/3!

这个是 我的测试结果,真的整吐了{:5_96:}

0HB 发表于 2021-9-3 02:16:58

本帖最后由 0HB 于 2021-9-3 02:49 编辑

if count_2 == 0:
      moj_2 = each# 赋值操作,只要一个=
#对抗阶段:
#遍历候选人列表,每个元素需要分别与当前候选人变量比对,相同则当前候选人票数+1,都不同则弃之,票数-1:
for each in p:
    if moj_1 == each:
      count_1 += 1
      continue
      
    if moj_2 == each:
      count_2 += 1
      continue
      
    if count_1 == 0:
      moj_1 = each
      count_1 = 1
      continue
      
    if count_2 == 0:
      moj_2 = each# 赋值操作,只要一个=
      count_2 = 1
      continue
      
    count_1 -= 1
    count_2 -= 1

0HB 发表于 2021-9-3 02:27:20

本帖最后由 0HB 于 2021-9-3 02:28 编辑

if count_2 == 0:
      moj_2 == each
      count_2 = 1
      continue
1.改错。代码运行的逻辑没有问题,问题在于 ‘moj_2 == each’ (判断是否值相等)没有起到把变量moj_2 赋值为 第二位候选人名字的作用。
2.分析。而为什么程序没报错,因为相当于你在这个if中写了个“False”,像是声明了个变量,但却完全没用上(你把 ‘moj_2 == each’直接改成 False写上去,效果一样的)
3.建议。使用IDE(如PyCharm)来写、运行程序,一来效率高,二来容易看出粗心所致的错误

0HB 发表于 2021-9-3 02:43:16

本帖最后由 0HB 于 2021-9-3 02:53 编辑

检察 原先错误程序 运行
# 建立投票程序,用户输入候选人:
p = ['张三']
m = "请输入候选人: "
m += "请输入'p'结束程序: "
active = True
while active:
    mess = input(m)
    if mess == 'p':
      active = False
    else:
      p.append(mess)

# 判断是否有两个候选人都超过总数的1/3:
moj_1 = moj_2 = p# 初始化两个候选人变量
count_1 = count_2 = 0# 初始化两个候选人的票数

# 对抗阶段:
# 遍历候选人列表,每个元素需要分别与当前候选人变量比对,相同则当前候选人票数+1,都不同则弃之,票数-1:
num = 0# 用来记录循环次数
for each in p:
    if moj_1 == each:
      count_1 += 1
      num += 1
      print('第{0}次循环,执行的是: if moj_1 == each:'.format(num))
      print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
      continue

    if moj_2 == each:
      count_2 += 1
      num += 1
      print('第{0}次循环,执行的是:if moj_2 == each:'.format(num))
      print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
      continue

    if count_1 == 0:
      moj_1 = each
      count_1 = 1
      num += 1
      print('第{0}次循环,执行的是:if count_1 == 0:'.format(num))
      print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
      continue

    if count_2 == 0:
      num += 1
      moj_2 == each
      count_2 = 1
      print('第{0}次循环,执行的是:count_2 == 0'.format(num))
      print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))
      continue
    count_1 -= 1
    count_2 -= 1
    num += 1
    print('第{0}次循环,执行的是:减票操作'.format(num))
    print('1:{0}{1}票,2:{2}{3}票'.format(moj_1, count_1, moj_2, count_2))

# 统计阶段:
# 对抗阶段结束后,如果moj_1,moj_2两个变量都有剩余,则统计各自的票数,否则不存在同时过1/3的两个候选人:
if p.count(moj_1) > len(p) / 3:
    print("候选人", moj_1, "的选票超过1/3!")
if p.count(moj_2) > len(p) / 3:
    print("候选人", moj_2, "的选票超过1/3!")
   
"""
注意:第一次循环的对象是p列表中提前写好的张三
"""
结果:(按照「张三、张三、李四、李四、李四、p」依次输入)

qwe2052190 发表于 2021-9-3 08:07:52

0HB 发表于 2021-9-3 02:43
检察 原先错误程序 运行

结果:(按照「张三、张三、李四、李四、李四、p」依次输入)

哈哈,辛苦大佬了,太棒了,{:5_95:}

blahblahfc 发表于 2021-9-3 08:51:34

确实如上所述,把第四个 if 中 moj_2 == each 应该是笔误,改为 = 就好了。
另外提供另一个思路:先用 set(p) 获取候选人集合,再用 p.count(候选人)

qwe2052190 发表于 2021-9-3 08:57:10

blahblahfc 发表于 2021-9-3 08:51
确实如上所述,把第四个 if 中 moj_2 == each 应该是笔误,改为 = 就好了。
另外提供另一个思路:先用 set ...

哈哈,谢谢大佬,不过我现在还么学那么多,才刚刚学了列表这里{:5_91:}
页: [1]
查看完整版本: 被这个代码整吐了