循环测试分数的文件输入输出

0 投票
2 回答
2073 浏览
提问于 2025-04-18 12:35

在我的编程作业中,我需要做以下事情:

创建两个程序,使用文件的输入和输出。第一个程序要提示用户输入5个测试分数,然后把这些分数写入一个名为tests.txt的文件中,每个分数占一行。第二个程序则读取tests.txt,显示所有分数以及这些分数的平均值。

于是我提交了以下代码,得到了一个还不错的分数,并收到了以下反馈:

我扣了分,因为设计不够好。当你发现代码中有几行几乎相同的内容时,应该使用循环。两个程序都需要用到循环。

所以,我现在卡在了如何改进设计和在代码中加入循环这一步(虽然我以为我的For Loop已经在做这个了)。如果能得到帮助和解释,我会非常感激 =D

这是第一个程序:

def main():
    score1=int(input("Please input your first score: "))
    score2=int(input("Please input your second score: "))
    score3=int(input("Please input your third score: "))
    score4=int(input("Please input your fourth score: "))
    score5=int(input("Please input your fifth score: "))

    score_file=open("tests.txt","w")

    for count in range(1, 5):
        score_file.write(str(score1) + "\n")
        score_file.write(str(score2) + "\n")
        score_file.write(str(score3) + "\n")
        score_file.write(str(score4) + "\n")
        score_file.write(str(score5) + "\n")

    score_file.close()

main()

这是第二个程序:

def main():

    display_score=open("tests.txt", "r")
    for count in range(1,5):  
        score1=int(display_score.readline())
        score2=int(display_score.readline())
        score3=int(display_score.readline())
        score4=int(display_score.readline())
        score5=int(display_score.readline())

    display_score.close()

    average=(score1+score2+score3+score4+score5)/5

    print("Here are your scores you inputted: ", \
      score1, ", ",score2,", ",score3,", ",score4,", ",score5,\
      sep="")
    print("Your average is: ", average, "%",\
      sep="")

main()

2 个回答

1

评论:

  • 你们的程序其实都有问题 - 你们的 for 循环读取了5个值,重复了5次(总共读取了25个分数条目)

  • 每当你发现自己在用编号的变量(比如 score1, score2 等)时,通常说明你应该使用一个列表来处理这些数据

  • with 是处理文件的更好方法;它总是能确保文件被正确关闭

  • str.format()(新式字符串格式化)通常比字符串拼接更快,也更容易阅读

这是第一个程序的简化版本

def main():
    with open("tests.txt", "w") as score_file:
        for tag in ["first", "second", "third", "fourth", "fifth"]:
            prompt = "Please input your {} score: ".format(tag)
            score  = int(input(prompt))
            output = "{}\n".format(score)
            score_file.write(output)

if __name__=="__main__":
    main()

运行结果是

Please input your first score: 1
Please input your second score: 2
Please input your third score: 3
Please input your fourth score: 4
Please input your fifth score: 5

第二个程序的简化版本:

def average(lst):
    return float(sum(lst)) / len(lst)    

def main():
    with open("tests.txt") as score_file:
        scores = [int(line) for line in score_file]

    print("Here are your scores you inputted:")
    print(", ".join(str(score) for score in scores))

    print("Your average is: {}".format(average(scores)))

if __name__=="__main__":
    main()

运行结果是

Here are your scores you inputted:
1, 2, 3, 4, 5
Your average is: 3.0
1

读取分数:

all_scores = []

for x in range(5):
   all_score.append( int(input("score: ")) )

print all_scores

你可以用同样的方法写入文件

for one_score in all_scores:
    score_file.write( str(one_score) + "\n")

但你可以在一个循环中完成这件事:

for x in range(5):
    score = input("score: ")
    score_file.write( score + "\n")

顺便说一下,在第一个程序中,你不需要把分数转换成 int() 然后再转换成 str()

你可以用 for 循环来添加分数(或者使用特别的函数 sum(all_scores) 来实现)

sum_score = 0

for one_score in all_scores:
    sum_score = sum_score + one_score

print( sum_score / len(all_scores) )

len(all_scores) 可以告诉你列表中有多少个分数

当然,你也可以用 for 循环从文件中读取数字

all_scores = []

for count in range(5):  
    all_scores.append( int(display_score.readline()) )

print( all_scores )

有一个特别的函数可以打印列表中的元素

print( ", ".join(all_scores) )

所有的值会用 ", " 连接起来

撰写回答