Prompt the user by “Enter name of input file: ” for the name of an input file and open that file for reading. The two input files for the tests are already at the zyBooks site.They each have a list of student names with the course they have taken, of the form
Jacobs, Anthony ECS10 4 B- ECS20 4 C+ ANS17 3 A ANS49H 2 D Wilson, Elaine ECS10 4 B+ ECS20 4 C+ ANS17 3 A ANS49H 2 D ANS100 5 B-
with the student name on one line, and a list of that student’s course names, units, and grades on a sequence of following lines, terminated by a blank line before the next student name line. The input will be terminated either by a second blank line where the next name would be, which will appear as just “n”, or by the file ending, which will result in just the empty string “” when reading in any more lines. (The input for the hidden second test just ends without an blank lines after the last course.)
The program should open and write an output file named “GPA_output.txt” of the form:
Jacobs, Anthony 2.62 Wilson, Elaine 2.77
with each line containing a student name and the GPA, which must be computed by the program. The format of each line must have the name left adjusted, in a field with a total of 26 spaces, followed immediately by the GPA, with two decimal places. You can do this with a formatted output of the form:
f.write("%-26s%.2fn" % (student_name, GPA))
Note that the “n” is needed at the end of the quoted format specification, because unlike print(), f.write() does not automatically put a new line character at the end of the line.
The input given above is for the first test, and the file “GPA_input.txt” from which it was taken is in the canvas File Folder for “Week 9” of “Programs shown in class”, so that you can use it for testing your program before submitting it. You will probably need to do such testing because unlike the other assignments, if your program has problems that prevent it from getting to the stage of writing the output file, the error reported will just be “Could not find file: GPA_output.txt” which is not very useful. The output file for this input, “GPA_output.txt” is also in the Week 9 folder for you to compare, since white space is important here.
Expert Answer
Program code:
def getPoints(gd):
original_grades = [ (‘A’,4.0), (‘A-‘,3.7), (‘B+’,3.33), (‘B’,3), (‘B-‘,2.7), (‘C+’,2.3), (‘C’,2), (‘C-‘,1.7), (‘D+’,1.3), (‘D’,1), (‘D-‘,0.7)]
original_grades = dict(original_grades)
return original_grades[gd]
first_file = raw_input(“Enter file name: “)
second_file = raw_input(“Enter file name: “)
f = open(‘GPA_output.txt’, ‘w’)
f1 = open(first_file, ‘r’)
f2 = open(second_file, ‘r’)
while True:
student_name = f1.readline().rstrip(‘n’)
if (student_name == ” or student_name == ‘ ‘):
break;
grade_score = 0
Total_grade_points = 0
gradeline = f1.readline().rstrip(‘n’)
while gradeline != ”:
arry = gradeline.split()
Total_grade_points += int(arry[1])
grade_score += float(arry[1]) * getPoints(arry[2])
gradeline = f1.readline().rstrip(‘n’)
# calculate GPA
GPA=grade_score/Total_grade_points
#wite it in output file
f.write(“%-26s%.2fn” % (student_name,GPA))
f1.close()
#read second file student grade points
while True:
student_name = f2.readline().rstrip(‘n’)
if (student_name == ” or student_name == ‘ ‘):
break;
grade_score = 0
Total_grade_points = 0
gradeline = f2.readline().rstrip(‘n’)
while gradeline != ”:
arry = gradeline.split()
Total_grade_points += int(arry[1])
grade_score += float(arry[1]) * getPoints(arry[2])
gradeline = f2.readline().rstrip(‘n’)
# calculate GPA
GPA=grade_score/Total_grade_points
#wite it in output file
f.write(“%-26s%.2fn” % (student_name, GPA))
f2.close()
f.close()