<problem>
Create a method `calculateGrade(hw:float, exams: float, projects: float, att:float) -> Tuple[str, int]` that takes in four float parameters between 0 and 100 representing a student's grades in four different categories: Homework (`hw`) which is worth 20% of the final grade, Exams (`exams`) worth 40% of the final grade, Projects (`projects`) worth 30%, and Attendance (`att`), worth 10%. The function should calculate the final grade a student is getting and return a tuple containing the final letter grade and the final numeric grade rounded up to the nearest whole number.

The letter grade should be determined based on the following scale:

* A for a final rounded grade between 90 and 100 (inclusive)
* B for a final rounded grade between 80 and 89 (inclusive)
* C for a final rounded grade between 70 and 79 (inclusive)
* D for a final rounded  grade between 60 and 69 (inclusive)
* F for a final rounded grade below 60.

For example, if you enter `calculateGrade(75, 60, 73, 87)`, the function should return `('C', 70)` because the final raw score is `69.6` which rounds up to `70` and corresponds to a letter grade of `C`.

## Example Cases:
```
calculateGrade(100, 100, 100, 100) => ('A', 100)
calculateGrade(100, 89, 85, 90) => ('A', 90)
calculateGrade(72, 96, 74, 98) => ('B', 85)
calculateGrade(100, 82, 68, 94) => ('B', 83)
calculateGrade(75, 60, 73, 100) => ('C', 71)
calculateGrade(75, 60, 73, 87) => ('C', 70)
calculateGrade(70, 60, 65, 70) => ('D', 64)
calculateGrade(12, 14, 23, 10) => ('F', 16)
calculateGrade(0, 0, 0, 0) => ('F', 0)
```
</problem>
<bug_desc>
The return statement on line 15 is never executed. Consequently, the function only returns a string `letterGrade` instead of returning a tuple with a string and an integer containing the letter grade and the rounded final score respectively.
</bug_desc>
<bug_fixes>
Remove line 15 and replace `letterGrade` with `(letterGrade, roundedScore)` on line 15.
</bug_fixes>
<unit_tests>
assert calculateGrade(100, 100, 100, 100) == ('A', 100)
assert calculateGrade(100, 89, 85, 90) == ('A', 90)
assert calculateGrade(72, 96, 74, 98) == ('B', 85)
assert calculateGrade(100, 82, 68, 94) == ('B', 83)
assert calculateGrade(75, 60, 73, 100) == ('C', 71)
assert calculateGrade(75, 60, 73, 87) == ('C', 70)
assert calculateGrade(70, 60, 65, 70) == ('D', 64)
assert calculateGrade(12, 14, 23, 10) == ('F', 16)
assert calculateGrade(0, 0, 0, 0) == ('F', 0)
</unit_tests>
<stu_desc>

</stu_desc>
<dialogue>
User: Hi, please help I'm not sure what's going wrong
Assistant: Hello. Let's take a look at your code together. What problem are you facing?
	<alt>Hi. Are you encountering an error?
	<alt>Hello. Can you describe your code line by line?
	<alt>Hi. Let's recall what you know about return statements in Python. What happens when a compiler encounters a return statement?
User: The function only seems to return the `letterGrade` but otherwise it runs alright.
	<alt>It does not throw an error, but it does not show everything I want it to either.
	<alt>No errors but it is not working as expected.
Assistant: Python code runs line-by-line. Let's look at yours again - can you pinpoint where the problem might be?
User: Yes, it seems like line 15 never runs. Does that mean my function stops at line 14?
	<alt>It seems like the last line never executes.
Assistant: Good! Given this observation, when does your function terminate?
	<alt>Good! Can you describe what are you trying to do on line 15?
	<alt>What makes you think line 15 is not being executed?
	<alt>Can you describe what are you trying to do on lines 14 and 15?
User: It seems like once the return statement has executed, the function does not go further.
Assistant: Is it possible for a function to have two consecutive return statements? 
	<alt>Let's recall what you know about return statements in Python. What happens when a compiler encounters a return statement?
	<alt>How about we look up this behavior in the documentation to get more clarity?
User: It seems like I can only use one return statement here. What should I do to return both `letterGrade` and `roundedScore`?
	<alt>But then how do I make sure to return both the `letterGrade` and `roundedScore`?
	<alt>Looking at the documentation, it seems I can only use one return statement per function. However, I would still have a problem with returning both the `letterGrade` and `roundedScore`!
Assistant: Good question! Let's turn to the documentation - how can we return multiple variables?
	<alt>Let's look at the instructions. When looking at the function signature, can you determine the data type that is specified as the return value?
	<alt>Let's look at the examples in the instructions. What do you notice is being returned?
User: Ah I see. Looks like I need only one statement, but I can include more variables in the same statement. Updating my code now.
<code>
1. def calculateGrade(hw, exams, projects, att):
2.    finalScore = hw * 0.2 + exams * 0.4 + projects * 0.3 + att * 0.1
3.    roundedScore = round(finalScore)
4.    if roundedScore >= 90:
5.        letterGrade = "A"
6.    elif roundedScore >= 80:
7.        letterGrade = "B"
8.    elif roundedScore >= 70:
9.        letterGrade = "C"
10.   elif roundedScore >= 60:
11.       letterGrade = "D"
12.   else:
13.       letterGrade = "F"
14.   return letterGrade, roundedScore


</code>
Assistant: Great job! Is your code working now?
	<alt>Did that fix your problem?
User: Yes it did, thanks!
	<alt>I'm all done!
</dialogue>