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

时间:2020-03-09 01:07:53

标签: python python-3.x

问题:编写程序以连续询问用户以0到100范围内的整数百分比形式给出的考试成绩。如果输入的值不是-1,则不在此范围内,请打印出错误并提示用户再试一次。计算所有输入的有效成绩的平均值以及每个字母等级类别中的总成绩数,如下所示:90到100是A,80到89是B,70到79是C,60到69是a 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

注意:这是我的第一门计算机科学课程,所以我确定有一个明显的解决方法,我很想念我,但是我很感谢我能得到的任何帮助

4 个答案:

答案 0 :(得分:0)

这是我的演练说明:

因此,该程序应该询问用户他们得到的分数是 ,他们说他们得到的分数是-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.

希望我的评论可以帮助您了解我的代码中正在发生的事情!

答案 1 :(得分:0)

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

  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()

答案 2 :(得分: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后面,并且将值放在零以下。 next()函数将为您执行搜索,当不存在有效条目时返回无。

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

要累积分数,字典(scores)比列表更适合,因为字典允许您使用键(分数字母)访问实例。这使您可以在单个变量中跟踪多个分数。计算每个分数输入多少也一样。

要获得最后的平均值,您只需要对scores词典的值得分求和,然后除以您添加到counts词典中的得分计数即可。

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

答案 3 :(得分:-1)

这可能对您有用:

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