if (usersGrade == 'A')
gradePoints = 4.0;
if (usersGrade == 'B')
gradePoints = 3.0;
if (usersGrade == 'C')
gradePoints = 2.0;
if (usersGrade == 'D')
gradePoints = 1.0;
if (usersGrade == 'F')
gradePoints = 0.0;
Using using namespace std; is asking for trouble if that's what you did.
Generally avoid because it include all the names in the scope, where names can repeat and collide creating compile errors.
RUN_NUMS should best be an constexpr rather than const, though compiler will optimize it anyway... this is semantically a little bit better because you just label a value that can exist only at compile time and the program is just fine no matter the case.
It's kinda weird that it exists in the first place, but if that's in the specification then that's fine.
Nice that you cared about letter case, as you always should.
If there's only one possibility then it should be if...else
You can create an array for those so you don't have to use if at all, for once that would reduce it only to bounds checking which you don't seem to even have in your solution.
I would say that for the future of the program you could even consider creating a function for translating grades expressed with letters to grades expressed with float (but that's a side note, maybe the program is not expected to change).
In case of
if (gradeNum > 0)
Overall may be necessary, or may not be and in such case you can consider non-nesting version of it.
Since we are in a loop we can just check for inversed condition and skip execution of code below (assuming nothing else needs to happen below it).
if (gradeNum <= 0) continue;
gpa = totalPoints / gradeNum;
cout << endl << endl;
Very often this trick saves you from nesting too many things like:
if (x) {
if (y) {
for (...) {
if(d) {
}
}
}
}