为了账号安全,请及时绑定邮箱和手机立即绑定

在这个Python家庭作业问题上遇到麻烦

在这个Python家庭作业问题上遇到麻烦

BIG阳 2022-08-25 14:03:39
问题:编写一个程序,以连续询问用户以整数百分比形式给出的考试分数,范围为 0 到 100。如果输入的值不在 -1 之外的范围中,请打印出错误并提示用户重试。计算输入的所有有效等级的平均值以及每个字母等级类别中的等级总数,如下所示:90 至 100 表示 A,80 到 89 表示 B,70 到 79 表示 C,60 到 69 是 D,0 到 59 表示 F。(负值仅用于结束循环,因此不要在计算中使用它。例如,如果输入是。#Enter in the 4 exam scoresg1=int(input("Enter an exam score between 0 and 100 or -1 to end: "))g2=int(input("Enter an exam score between 0 and 100 or -1 to end: "))g3=int(input("Enter an exam score between 0 and 100 or -1 to end: "))g4=int(input("Enter an exam score between 0 and 100 or -1 to end: "))total =(g1 + g2 + g3 + g4)while g1 is range(0,100):    continueelse:    print("Sorry",g1,"is not in the range of 0 and 100 or -1. Try again!")while g2 is range(0,100):    continueelse:    print("Sorry",g2,"is not in the range of 0 and 100 or -1. Try again!")while g3 is range(0,100):    continueelse:    print("Sorry",g3,"is not in the range of 0 and 100 or -1. Try again!")while g4 is range(0,100):    continueelse:    print("Sorry",g4,"is not in the range of 0 and 100 or -1. Try again!")#calculating Averagedef calc_average(total):    return total/4def determine_letter_grade(grade):    if 90 <= grade <= 100:        1 + TotalA    elif 80 <= grade <= 89:        1 + TotalB    elif 70 <= grade <= 79:        1 + TotalC    elif 60 <= grade <= 69:        1 + TotalD    else:        1 + TotalFgrade=totalaverage=calc_average#printing the average of the 4 scoresprint("You entered four valid exam scores with an average of: " + str(average))print("------------------------------------------------------------------------")print("Grade Distribution:")print("Number of A's: ",TotalA)print("Number of B's: ",TotalB)print("Number of C's: ",TotalC)print("Number of D's: ",TotalD)print("Number of F's: ",TotalF)
查看完整描述

4 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

在这里,您的问题可以分为几个部分,

  1. 从用户处获取考试次数

  2. 从用户获取这些考试的有效输入

  3. 计算所有考试的平均值

  4. 计算等级分布

  5. 如果用户输入为 -1,则退出

下面的代码遵循所有这些步骤

 #calculating Average

    def calc_average(scores):

            return sum(scores)/len(scores)




    grade_dist = {

    (90, 101):'A',

    (80,90):'B',

    (70, 80):'C',

    (59, 70):'D',

    (0,59):'F'

    }


    def get_grade_freq(scores):

        grades = {'A':0, 'B':0, 'C':0, 'D':0, 'F':0}


        for score in scores:

          for k, v in grade_dist.items():

            if score in range(k[0], k[1]):

              grades[v]+=1


        print("Grade distributions")


        for grade, number in grades.items():

            print("Number of {}’s = {}".format(grade, number))




    def get_scores(n):

        scores = []

        cond = True

        while cond and n>0:

          score = int(input("Enter an exam score between 0 and 100 or -1 to end : "))

          if score==-1:

            cond=False

            return -1

          if score not in range(0,101):

              print("Sorry, {} is not in the range of 0 and 100 or -1. Try Again!".format(score))

          if score in range(0,101):

            scores.append(score)

            n-=1

        return scores


    def main():

        n = int(input('total number of exams ' ))


        scores = get_scores(n)

        if scores == -1:

            exit(-1)


        average = calc_average(scores)


        print("You entered {} valid exam scores with an average of {}.".format(n, average))


        get_grade_freq(scores)



    if __name__=='__main__':

        main()


查看完整回答
反对 回复 2022-08-25
?
catspeake

TA贡献1111条经验 获得超0个赞

每当有多个类似事物的实例需要操作(评分范围、总数)时,都必须尝试使用多值结构,而不是单个变量。Python的列表和字典旨在收集多个条目作为位置列表或键控索引(字典)。


这将使您的代码更加通用。当您操作概念而不是实例时,您将知道自己走在正确的轨道上。


例如:


grading = [(None,101),("A",90),("B",80),("C",70),("D",60),("F",0)]

scores  = {"A":0, "B":0, "C":0, "D":0, "F":0}

counts  = {"A":0, "B":0, "C":0, "D":0, "F":0}

while True:

    input_value = input("Enter an exam score between 0 and 100 or -1 to end: ")

    value       = int(input_value)

    if value == -1: break

    score = next((s for s,g  in grading if value >= g),None)

    if score is None:

        print("sorry ",input_value," is not -1 or in range of 0...100")

        continue

    scores[score] += value

    counts[score] += 1


inputCount = sum(counts.values())

average    = sum(scores.values())//max(1,inputCount)  

print("")

print("You entered", inputCount, "valid exam scores with an average of: ", average)

print("------------------------------------------------------------------------")

print("Grade Distribution:")

for grade,total in counts.items():

    print(f"Number of {grade}'s: ",total)

该列表包含分数字母和最小值(以元组为单位)对。这样的结构将允许您通过查找值低于或等于输入值的第一个条目并使用相应的字母,将中的成绩值转换为评分字母。grading


同一列表用于验证输入值,方法是有策略地将 None 值放在 100 之后,并且不低于零的值。该函数将为您执行搜索,并在不存在有效条目时返回 None。next()


您的主程序循环需要继续,直到输入值为 -1,但它需要至少通过输入一次(典型的重复-直到结构,但在 Python 中只有一个)。因此,该语句将永远循环(即在 True 时),并且在满足退出条件时需要任意中断。whilewhile


为了累积分数,字典 () 比列表更适合,因为字典将允许您使用键(分数字母)访问实例。这允许您跟踪单个变量中的多个分数。计算每个分数的输入数量也是如此。scores


要获得最后的平均值,您只需将字典的值分数相加,然后除以添加到字典中的分数计数即可。scorescounts


最后,要打印分数计数的摘要,您可以再次利用字典结构,并且只为所有分数字母和总计编写一个广义的打印行。


查看完整回答
反对 回复 2022-08-25
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

以下是我的演练解释:


因此,该程序应该询问用户他们得到了什么分数,直到他们说他们得到了一个分数,在你给他们结果之后。要循环直到它们给出,我们可以使用一个循环:-1-1while


inp = float(input("Enter an exam score between 0 and 100 or -1 to end: ")) # Get input

grades = []

while inp > -1: # Loop until user gives a score of -1

    if inp >= 0 and inp <= 100: # Check if valid grade

        grades.append(inp) # Add grade to grades list

        inp = float(input("Enter an exam score between 0 and 100 or -1 to end: ")) # Ask again

    else:

        print("Sorry", inp, "is not in the range of 0 and 100 or -1. Try again!") # Invalid grade


# ANALYSIS OF GRADES


# Format first line of output - the first str(len(grades)) give the amount of grades they entered,

# and the str(sum(grades) / len(grades)) gives the average of the grades list.

print("You entered", str(len(grades)), "valid exam scores with an average of", str(sum(grades) / len(grades)))


print("Grade Distribution:")

print("Number of A's =", str(sum(90 <= g <= 100 for g in grades)) # I am using a very short notation

print("Number of B's =", str(sum(80 <= g <= 89 for g in grades)) # here - this is basically counting

print("Number of C's =", str(sum(70 <= g <= 79 for g in grades)) # the number of grades that are

print("Number of D's =", str(sum(60 <= g <= 69 for g in grades)) # a valid value based on the checks

print("Number of F's =", str(sum(0 <= g <= 59 for g in grades)) # I am making.

希望我的评论能帮助你弄清楚我的代码中发生了什么!


查看完整回答
反对 回复 2022-08-25
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

这可能适用于您:


scores = {

    "A": 0,

    "B": 0,

    "C": 0,

    "D": 0,

    "F": 0,

}

total = 0

count = 0


input_value = 0


while (input_value != -1) and (count < 4):

    input_value = int(input("Enter an exam score between 0 and 100 or -1 to end: "))

    if 0 <= input_value <= 100:

        total += input_value

        count += 1

        if input_value >= 90:

            scores["A"] += 1

        elif input_value >= 80:

            scores["B"] += 1

        elif input_value >= 70:

            scores["C"] += 1

        elif input_value >= 60:

            scores["D"] += 1

        else:

            scores["F"] += 1

    else:

        print("Sorry", input_value, "is not in the range of 0 and 100 or -1. Try again!")


print("You entered {} valid exam scores with an average of: {}".format(count, total / count))

print("------------------------------------------------------------------------")

print("Grade Distribution:")

print("Number of A's: ", scores['A'])

print("Number of B's: ", scores['B'])

print("Number of C's: ", scores['C'])

print("Number of D's: ", scores['D'])

print("Number of F's: ", scores['F'])


查看完整回答
反对 回复 2022-08-25
  • 4 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信