Как отладить мою C ++ программу, которая обрабатывает дроби? - PullRequest
0 голосов
/ 17 марта 2019

У меня есть эта ошибка при отладке моего кода, проблема состоит в том, чтобы распечатать наибольшее число дроби:

Например:

1/2 5/8 12/9  

Ожидается:

12/9  

Реальность: мой код распечатывает все введенные мною дробные числа

1/2 5/8 12/9  

Я просто не могу понять, что пошло не так.Как я могу отладить это?

Концепция struct просто так сбивает с толку.

Вот мой код:

#include <iostream>
#include <cmath>
using namespace std;
struct FractionNumber
{
    int Numerator;
    int Denominator;
    float FractionNumber;
};
void TypeIn(FractionNumber a[] ,int n)
{
    for (int i=0; i<n; i++)
    {
        cout << "Enter Numerator " << i+1 << ": ";
        cin >> a[i].Numerator;
        cout << "Enter Denominator " << i+1 << ": ";
        cin >> a[i].Denominator;
        a[i].FractionNumber=a[i].Numerator/a[i].Denominator;
    }
}
int FindBiggest(FractionNumber a[], int n)
{
    FractionNumber Biggest=a[0];
    for (int i=0; i<n; i++)
    {
        if(a[i].FractionNumber > Biggest.FractionNumber)
        {
            Biggest.FractionNumber = a[i].FractionNumber;
        }
    }
    return Biggest.FractionNumber;
}
void PrintBiggest(FractionNumber a[], int n)
{
    for (int i=0; i<n; i++)
    {
        if(a[i].FractionNumber = FindBiggest(a,n))
        {
            cout << "biggest FractionNumber: " << a[i].Numerator << "/" << a[i].Denominator << endl;
        }
    }
}
int main()
{
    int n;
    FractionNumber a[100];
    cin >> n;
    TypeIn(a,n);
    PrintBiggest(a,n);


return 0;
}

1 Ответ

0 голосов
/ 18 марта 2019

Этот ответ прямо указывает на достижение цели, т.е. получают наибольшее число. Я не уверен, пробовали ли вы это или нет. Или вы просто играете со структурами, чтобы понять это больше.

В любом случае, давайте углубимся в это и внесем несколько изменений ...

Вы можете проверить разницу между struct и typedef struct здесь

typedef struct 
{
    int Numerator;
    int Denominator;
    float FractionNumber;
}FractionNumber;

Убедитесь, что знаменатель не равен 0 (нулю) (Такие потоки могут обрабатываться с помощью блоков try-catch, но вы можете прочитать их сами, поскольку это может привести к прекращению выполнения)

cout << "Enter Denominator " << i+1 << ": ";
bool check = false;
do {
   cin >> a[i].Denominator;
   if (0 == a[i]) {
      check = true;
   }else{
      check = false;
   }
} while (check);

Оператор деления должен выдать float

a[i].FractionNumber=static_cast<float>(a[i].Numerator)/static_cast<float>(a[i].Denominator);

Функция FindBiggest не нужна для простого сравнения, которое, как я предполагаю, вы пытаетесь сделать.

PrintBiggest может просто проверить числа Franction для сравнения наибольшего значения и вернуть его индекс

int PrintBiggest(FractionNumber *a, int n) {
    int index_of_biggest = 0;
    for (int i=0; i<n; i++) {
        if(a[i].FractionNumber > a[index_of_biggest].FractionNumber) {
            index_of_biggest = i;
        }
    }
    return(index_of_biggest);
}

И, наконец, получите этот индекс, чтобы напечатать ваш самый большой номер

int x = PrintBiggest(a,n);
cout << "Biggest is: " << a[x].Numerator << "/" << a[x].Denominator;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...