Моя программа округляется до ближайшего целого - PullRequest
1 голос
/ 01 октября 2019

Сегодня в моей лаборатории C ++ возникла досадная проблема, которую я не мог понять. Мой класс изучает операторы switch и циклы while и работает над проектом для ввода оценок и вычисления средних баллов. Моя программа, кажется, идет хорошо, но я не могу понять, почему она округляется до целого числа вместо отображения десятичных точек. Например, вместо того, чтобы выводить что-то вроде 2,76, он будет выводить 3,00 как средний балл при вводе случайных оценок. Мой код все еще находится в стадии разработки, но он должен быть в состоянии вычислить десятичные числа, когда я включу его, как пример программы моего профессора: http://classes.aligra.com/Riverside%20City%20College/2019%20Fall/CSC5/Projects/Project%2002.pdf

Любая обратная связь будет принята с благодарностью.

#include <iostream>
#include <iomanip>
using namespace std;

/*******************************************************
 *
 * COMPUTE GRADE POINT AVERAGE
 * _____________________________________________________
 * This program accepts as user input from an instructor
 * to calculate his/her class's grade point average.
 * This will be done through the use of the Do-While
 * loop and if-else statments.
 * _____________________________________________________
 *  INPUT
 *      score       : A grade of one of the instructor's students.
 *
 *  OUTPUT
 *      score       : A grade of one of the instructor's students.
 *
 ********************************************************/

int main()
{
    /******************************************************
     * CONSTANTS
     * ____________________________________________________
     * A_score          : Variable for a grade of A.
     * B_score          : Variable for a grade of B.
     * C_score          : Variable for a grade of C.
     * D_score          : Variable for a grade of D.
     *****************************************************/

    const int A_score = 4;
    const int B_score = 3;
    const int C_score = 2;
    const int D_score = 1;

    char score;
    int count = 1;
    int num_of_grades = 0;
    int total_gp = 0;
    double gpa;

    cout << "TEST #" << count << ":\n\n";
do {
        cout << setw(45) << "Enter Letter Grade (enter 'X' to exit): ";
        //cin.ignore();
        cin >> score;
        //cin.get(score);

    switch (score)
    {
        case 'A': num_of_grades += 1;
        total_gp += A_score;
        break;

        case 'a': num_of_grades += 1;
        total_gp += A_score;
        break;

        case 'B': num_of_grades += 1;
        total_gp += B_score;
        break;

        case 'b': num_of_grades += 1;
        total_gp += B_score;
        break;

        case 'C': num_of_grades += 1;
        total_gp += C_score;
        break;

        case 'c': num_of_grades += 1;
        total_gp += C_score;
        break;

        case 'D': num_of_grades += 1;
        total_gp += D_score;
        break;

        case 'd': num_of_grades += 1;
        total_gp += D_score;
        break;

        case 'F': num_of_grades += 1;
        total_gp += 0;
        break;

        case 'f': num_of_grades += 1;
        total_gp += 0;
        break;

        case 'X': gpa = total_gp/num_of_grades;
        cout << "\n\nTotal Grade Points: " << total_gp;
        cout << "\nGPA: " << gpa << "\n\n";
        count += 1;
        cout << "\nTEST #" << count << ":\n\n";
        break;

        case 'x': gpa = total_gp/num_of_grades;
        cout << "\n\nTotal Grade Points: " << total_gp;
        cout << "\nGPA: " << setprecision(2) << fixed << gpa << "\n\n";
        count += 1;
        cout << "\nTEST #" << count << ":\n\n";
        break;

        default: cout << "\n" << setw(45) << "Invalid letter grade, please try again\n\n";
    }


    } while (count < 4);

    return 0;
    }

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Измените ваш регистр 'x' следующим образом

gpa = (float) total_gp/num_of_grades

Поскольку два целочисленных деления всегда будут возвращать целое число.

1 голос
/ 01 октября 2019

Ваши total_gp и num_of_grades оба int. Деление двух целых чисел является интегральной операцией, результатом которой является int (где происходит округление). Это целое число затем присваивается переменной double gpa, но повреждение уже сделано - нет способа восстановить потерянную информацию.

Вам нужно указать компилятору, что вы хотите, чтобы плавающееделение на две точки, убедившись, что хотя бы один из операндов имеет тип с плавающей точкой. Любой из них будет работать:

gpa = (double) total_gp/num_of_grades;
gpa = total_gp/(double) num_of_grades;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...