1

我已经以三种不同的方式尝试了这个程序,我知道我已经接近了好几次,但是在失败了这么多次之后,我放弃了,需要一双额外的眼睛。我知道这个程序很“简单”,但我知道我想多了。

程序应将正确答案存储在列表中。使用该列表对 20 个问题的测试进行评分。然后阅读该 student.txt 文件以确定学生的回答方式。阅读 .txt 文件后,它应该评分然后显示通过或失败(通过 = 15 或更高)它最终显示总数或正确、不正确的答案以及学生错过的问题列表。

以下是所有三种尝试。任何帮助是极大的赞赏。


answerKey = [ B, D, A, A, C, A, B, A, C, D, B, C, D, A, D, C, C, B, D, A,]

studentExam = [ B, D, A, D, C, A, B, A, C, A, B, C, D, A, D, C, C, B, D, A,]

index = 0 

numCorrect = 0

for answerLine, studentLine in zip (answerKey, studentExam):
    answer = answerLine.split()
    studentAnswer = studentLine.split()

    if studentAnswer != answer:
        print( 'You got that question number', index + 1, 'wrong\n the correct,\
        answer was' ,answer, 'but you answered' , studentAnswer)
        index += 1
    else:
        numCorrect += 1
        index += 1

    grade = int((numCorrect / 20) * 100)

    print (' The number of correctly answered questions: ', numCorrect)

    print (' The number of incorrectly answered questions: ', 20 - numCorrect)

    print (' Your grade is', grade, '%')

    if grade <= 75:
        print (' You have not passed ')
    else:
        print (' Congrats you have passed ')

answerKey.close()
studentExam.close()

# This program stores the correct answer for a test
# then reads students answers from .txt file
# after reading determines and dislpays pass or fail (15 correct to pass)
# Displays number of correct and incorrect answers for student
# then displays the number for the missed question/s

#Creat the answer list
def main ( ): 
    # Create the answer key list
    key = [ B, D, A, A, C, A, B, A, C, D, B, C, D, A, D, C, C, B, D, A,]

    print (key)

# Read the contents of the student_answers.txt and insert them into a list
def read_student( ):
    # Open file for reading
    infile = open ( 'student_answers.txt', 'r' )

    # Read the contents of the file into a list
    student = infile.readlines ( )

    # Close file
    infile.close ( )

    # Strip the \n from each element
    index = 0
    while index < len(student):
        student[index] = student[index].rstrip ( '\n' )

    # Print the contents of the list
    print (student)

# Determine pass or fail and display all results 
def pass_fail(answers, student):

    # Lists to be used to compile amount correct, 
    # amount wrong, and questions number missed
    correct_list = []
    wrong_list = []
    missed_list = []

    # For statement to compile lists
    for ai,bi in zip (key,student):
        if ai == bi:
            correct_list.append(ai)
        else:
            wrong_list.append(ai)
            missed_list.append(ai)

    # Printing results for user
    print(correct_list,' were answered correctly')

    print(wrong_list,' questions were missed')

    # If statement to determine pass or fail
    if len(correct_list) >=15:
        print('Congrats you have passed')
    else: 
        print('Sorry you have faild please study and try, \
         again in 90 days')
        print('Any attempt to retake test before 90 days, \
        will result in suspension of any licenses')

    # Displaying the question number for the incorrect answer
    print ( 'You missed questions number ', missed_list)


main()

a = (1, 'A'),(2,'C'),(3,'B')
b = (1,'A'), (2,'A'),(3,'C')

correct_list = []

wrong_list = []

missed_list = []

for ai, bi in zip (a, b):
    if ai == bi:
        correct_list.append(ai)
    else:
        wrong_list.append(ai)
        missed_list.append(ai)
index(ai)+1


print(correct_list,'answered correct')

print(wrong_list, 'answered wrong')

if len(correct_list) >=2:
    print ('Congrats you have passed')
else:
    print ('Sorry you have faild please study and try again in 90 days')
    print('Any attempt to retake test before 90 days will result in suspension of any     lisences')


print ('Question number missed', missed_list)
4

3 回答 3

2

所以,我决定研究你的第二个例子,因为它对我来说是最容易理解的。

这是一个修改后的文件,带有解释,我认为你想要的。我假设学生的答案在一个名为的文本文件中student_answers.txt,并且每行有一个答案。

#!/usr/bin/env python

def read_student(path):
    with open(path, 'r') as infile:
        contents = infile.read()

    # Automatically gets rid of the newlines.
    return contents.split('\n') 

def pass_fail(answers, student):
    correct_list = []
    wrong_list = []

    # Use the 'enumerate' function to return the index.
    for index, (ai, bi) in enumerate(zip(answers, student)):
        # since problems start with 1, not 0
        problem_number = index + 1 

        if ai == bi:
            correct_list.append(problem_number)
        else:
            wrong_list.append(problem_number)

    # Print the length of the list, not the list itself.
    print(len(correct_list), 'were answered correctly')
    print(len(wrong_list), 'questions were missed')

    if len(correct_list) >= 15:
        print('Congrats, you have passed')
    else: 
        print('Sorry, you have failed. Please study and try again in 90 days')
        print('Any attempt to retake test before 90 days will result in suspension of any licenses')

    # Display each missed number on a separate line
    print ('You missed questions numbers:')
    for num in wrong_list:
        print('    ' + str(num))



def main( ): 
    key = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 
        'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
    student_answers = read_student('student_answers.txt')
    pass_fail(key, student_answers)

if __name__ == '__main__':
    main()

一些一般性评论:

  • 在您的main函数中,您创建了一个键,将其打印出来,并尝试在pass_fail函数内部访问它。那是行不通的——当你在函数内部创建一个变量时,它不能在函数外部自动访问。您可以采取多种解决方案:
    • key了一个全局变量。这是一个不受欢迎的解决方案
    • key将变量传递给pass_fail函数。这就是我所做的。
  • 您读取学生文件的代码有点太复杂了。您可以使用该with语句,它会自动为您打开和关闭文件对象 ( infile)。同样,Python 提供了内置方法来帮助拆分文本文件中的字符串并删除换行符。此外,对于将来,您还可以像下面这样遍历文件中的每一行,而不是手动循环遍历它:

    with open('file.txt') as my_file:
         for line in my_file:
             print(line) 
             # The newline is still a part of the string!
    
  • 我不知道为什么你在里面有wrong_listmissed_list变量pass_fail。我删除了missed_list

  • for您的循环的问题在于您存储的是正确答案,而不是问题编号。enumerate为了解决这个问题,我使用了对这类事情非常有用的内置函数。或者,您可以使用一个变量并在每个循环中将其递增一次。
  • 你的print陈述有点畸形,所以我清理了
  • 为用户打印结果时,您不想打印列表。相反,您想打印列表的长度
  • 我不知道这是不是故意的,但是您的密钥中没有字符串,而只有字母名称。
于 2013-04-16T02:32:18.993 回答
0

您的第一个答案相当接近,只是 Python 将 A、B、C 和 D 解释为变量而不是字符。您将评分逻辑留在了 for 循环中。将数组更改为字符而不是变量后,我得到以下结果:

 The number of correctly answered questions:  1
 The number of incorrectly answered questions:  19
 Your grade is 5 %
 You have not passed 
 The number of correctly answered questions:  2
 The number of incorrectly answered questions:  18
 Your grade is 10 %
 You have not passed 
 The number of correctly answered questions:  3
 The number of incorrectly answered questions:  17
 Your grade is 15 %
 You have not passed 
You got that question number 4 wrong
 the correct,        answer was ['A'] but you answered ['D']
 The number of correctly answered questions:  3
 The number of incorrectly answered questions:  17
 Your grade is 15 %
 You have not passed 
 The number of correctly answered questions:  4
 The number of incorrectly answered questions:  16
 Your grade is 20 %
 You have not passed 
 The number of correctly answered questions:  5
 The number of incorrectly answered questions:  15
 Your grade is 25 %
 You have not passed 
 The number of correctly answered questions:  6
 The number of incorrectly answered questions:  14
 Your grade is 30 %
 You have not passed 
 The number of correctly answered questions:  7
 The number of incorrectly answered questions:  13
 Your grade is 35 %
 You have not passed 
 The number of correctly answered questions:  8
 The number of incorrectly answered questions:  12
 Your grade is 40 %
 You have not passed 
You got that question number 10 wrong
 the correct,        answer was ['D'] but you answered ['A']
 The number of correctly answered questions:  8
 The number of incorrectly answered questions:  12
 Your grade is 40 %
 You have not passed 
 The number of correctly answered questions:  9
 The number of incorrectly answered questions:  11
 Your grade is 45 %
 You have not passed 
 The number of correctly answered questions:  10
 The number of incorrectly answered questions:  10
 Your grade is 50 %
 You have not passed 
 The number of correctly answered questions:  11
 The number of incorrectly answered questions:  9
 Your grade is 55 %
 You have not passed 
 The number of correctly answered questions:  12
 The number of incorrectly answered questions:  8
 Your grade is 60 %
 You have not passed 
 The number of correctly answered questions:  13
 The number of incorrectly answered questions:  7
 Your grade is 65 %
 You have not passed 
 The number of correctly answered questions:  14
 The number of incorrectly answered questions:  6
 Your grade is 70 %
 You have not passed 
 The number of correctly answered questions:  15
 The number of incorrectly answered questions:  5
 Your grade is 75 %
 You have not passed 
 The number of correctly answered questions:  16
 The number of incorrectly answered questions:  4
 Your grade is 80 %
 Congrats you have passed 
 The number of correctly answered questions:  17
 The number of incorrectly answered questions:  3
 Your grade is 85 %
 Congrats you have passed 
 The number of correctly answered questions:  18
 The number of incorrectly answered questions:  2
 Your grade is 90 %
 Congrats you have passed 
Traceback (most recent call last):
  File "a1.py", line 39, in <module>
    answerKey.close()
AttributeError: 'list' object has no attribute 'close'

最后一个错误是因为您关闭了可能是文件对象的数组,但您已经非常接近了。只是一个小的语法错误。

于 2013-04-16T02:43:16.887 回答
0

简短的版本,但可以完成工作。

correct = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
file_handler = open('student_answers.txt','r')
answers = file_handler.readlines()
valid = 0
for element in enumerate(correct):
    if answers[element[0]].rstrip("\n") == element[1]:
        valid += 1
if valid >= 15:
    print("Congrats, you passed with " + str((valid/20)*100) + "%")
else:
    print("Sorry, you failed with " + str((valid/20)*100) + "%")
于 2013-04-16T02:47:34.387 回答