# Average GPA

Write a program that takes a course number, units and grade delimited by spaces, and computes the average GPA when the user doesnt provide input.

```python
import re
from re import findall


GPAG = {"A+":4.3,
        "A":4,
        "A-":3.7,
        "B+":3.3,
        "B":3,
        "B-":2.7,
        "C+":2.3,
        "C":2,
        "C-":1.7,
        "D+":1.3,
        "D":1,
        "D-":0.7,
        "F":0}


all_units = [] 
all_letter_grades = []


def getGrade(user_input):
    all_data = user_input.split()
    all_units.append(int(all_data[1]))
    all_letter_grades.append(all_data[2])


def calcGPA():
    total_qp = 0
    total_hours = 0

    for i in range(len(all_units)):
        letter = all_letter_grades[i]
        hrs = all_units[i]
        total_hours += hrs
        total_qp += GPAG[letter] * hrs

    return round(total_qp/total_hours, 2)


while True:
    user_input= input('Enter course number, units, and grade, separated by spaces\n')
    if not user_input:
        print("The GPA is:", calcGPA())
        break
    else:
        getGrade(user_input)
```

Now improve your program to take in a file of student summary course, and output to a file that summaries the average GPA per student.

File in:

```
eric, davidson
ecs10 4 B-
ecs30 3 C+

dan, mak
ecs50 4 A
ecs60 4 A
sas30 4 A
```

```
eric, davidson            2.52
dan, mak                  4.00
```

```python
#12.8 GPA reports using files

GPAG = {'A':4.0,
       'A-':3.67,
       'B+':3.33,
       'B':3.0,
       'B-':2.67,
       'C+':2.33,
       'C':2.0,
       'C-':1.67,
       'D+':1.33,
       'D':1.0,
       'D-':0.67,
       'B+':0.33,
       'B':0.0
       }


all_units = []
all_letter_grades = []
current_name = "";

def calcGPA():
    total_qp = 0
    total_hours = 0
    for i in range(len(all_units)):
        letter = all_letter_grades[i].rstrip()
        hrs = all_units[i]
        total_hours += hrs
        total_qp += GPAG[letter] * hrs

    return round(total_qp/total_hours, 2)

def contains_comma(line):
    for char in line:
        if (char == ','):
           return True

def contains_number(line):
    for char in line:
        if (char.isdigit()):
           return True


file_out = open("GPA_output.txt", "w")
file_in=input('Enter the file name: ')
with open(file_in, 'r') as file:
    lines = file.readlines()
    for line in lines:

        if (contains_comma(line)):
            current_name = line.rstrip();
            continue

        elif(contains_number(line)):
            course_unit_grade = line.split(' ');
            all_units.append(int(course_unit_grade[1]))
            all_letter_grades.append(course_unit_grade[2]);
            continue;

        elif(line == "\n"):
            file_out.write('%-26s%.2f\n' % (current_name, calcGPA()));
            all_units = []
            all_letter_grades = []
            current_name = ""

    file_out.write('%-26s%.2f' % (current_name, calcGPA()));


file_out.close();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://maksimdan.gitbook.io/interview-practice-problems/leetcode_sessions/array-and-strings/average-gpa.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
