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

798qvoo8  于 2023-01-10  发布在  Python
关注(0)|答案(4)|浏览(110)

问题:编写一个程序,连续询问用户以整数百分比形式给出的考试分数,范围为0到100。如果输入的值不在该范围内(-1除外),则打印错误并提示用户重试。计算所有有效分数输入的平均值沿着每个字母等级类别中的总分数,如下所示:90到100为A,80到89为B,70到79为C,60到69为D,0到59为F。使用负分数作为标记值来指示输入的结束。(负值仅用于结束循环,因此不要在计算中使用它。)例如,如果输入为。

#Enter in the 4 exam scores
g1=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):
    continue
else:
    print("Sorry",g1,"is not in the range of 0 and 100 or -1. Try again!")

while g2 is range(0,100):
    continue
else:
    print("Sorry",g2,"is not in the range of 0 and 100 or -1. Try again!")

while g3 is range(0,100):
    continue
else:
    print("Sorry",g3,"is not in the range of 0 and 100 or -1. Try again!")

while g4 is range(0,100):
    continue
else:
    print("Sorry",g4,"is not in the range of 0 and 100 or -1. Try again!")

#calculating Average
def calc_average(total):
    return total/4

def 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 + TotalF

grade=total
average=calc_average

#printing the average of the 4 scores
print("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)

给我的输出示例:

Enter an exam score between 0 and 100 or -1 to end: 88.64 
Enter an exam score between 0 and 100 or -1 to end: 103
Sorry, 103 is not in the range of 0 and 100 or -1. Try Again! 
Enter an exam score between 0 and 100 or -1 to end: 99.10 
Enter an exam score between 0 and 100 or -1 to end: 71.52
Enter an exam score between 0 and 100 or -1 to end: 73
Enter an exam score between 0 and 100 or -1 to end: -1
You entered 4 valid exam scores with an average of 83.07.

Grade Distribution
Number of A’s = 1
Number of B’s = 1
Number of C’s = 2
Number of D’s = 0
Number of F’s = 0

注:这是我的第一堂计算机科学课,所以我肯定有一个明显的工作,我错过了,但我感谢任何帮助,我可以得到

rwqw0loc

rwqw0loc1#

以下是我的详细说明:
因此,程序应该询问用户他们得到了什么分数,直到他们说他们得到了-1,在这个过程中,在你给予他们的结果之后,要循环直到他们给出-1,我们可以使用while循环:

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.

希望我的注解能帮助您弄清楚我的代码中发生了什么!

blpfk2vs

blpfk2vs2#

这里你问题可以被分成几个部分,
1.从用户处获取检查编号
1.从用户处获取这些检查的有效输入
1.计算所有检查的平均值
1.计算品位分布
1.如果用户输入为-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()
luaexgnf

luaexgnf3#

每当你有多个类似的示例需要处理时(评分范围、总计数),你必须尝试使用多值结构而不是单个变量,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列表包含得分字母和最小值对(元组)。这种结构允许您通过查找值小于或等于输入值的第一个条目并使用相应的字母,将中的成绩值转换为得分字母。
通过策略性地在100之后放置None值并且不放置小于零的值,相同的列表用于验证输入值。next()函数将为您执行搜索,并在不存在有效条目时返回None。
你的主程序循环需要继续,直到输入值为-1,但它需要至少遍历输入一次(典型的repeat-until结构,但Python中只有while),所以while语句将永远循环(即while True),并且需要在满足退出条件时被任意中断。
要累计分数,字典(scores)比列表更适合,因为字典允许使用键(分数字母)访问示例,这允许跟踪单个变量中的多个分数,同样的方法也适用于计算每个分数的输入数量。
要在最后得到平均值,只需将scores字典中的values scores相加,然后除以添加到counts字典中的scores的计数。
最后,要打印得分计数的摘要,您可以再次利用字典结构,并且只为所有得分字母和总计编写一个通用打印行。

vxbzzdmp

vxbzzdmp4#

这可能对您有用:

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'])

相关问题