2015-09-09 3 views
0

Я просто изучаю C++ и имею назначение, где вещи должны выводиться как фракции. Я никогда не работал на C++, поэтому я не совсем уверен, правильно ли я это делаю. Моя программа позволяет мне вводить первые 2 фракции, затем она падает (что я предполагаю, имеет какое-то отношение к моим функциям и как я их реализовал в int main). Я обычно бывал у репетитора, но, к сожалению, в школу я иду не предлагает преподавателей по этой теме, и я перешел из школы, которая преподавала C, поэтому я действительно борется! Любая помощь очень ценится (:Новичок в C++ (вычисление и вывод данных)

#include<iostream> 
using namespace std; 
class gcd 
{ 
public: 
    void finder(); 
    void rename(); 
    void add(); 
    void subtract(); 
    void multiply(); 
    void divide(); 
    void print(); 
private: 
    int n, d, n1, d1, temp1, temp2; 

} g1; 
void gcd::finder() 

{ 
    temp1 = n; 
    temp2 = d; 

    while (n != d) 

    { 
     if (n > d) 
      n = n - d; 
     else 
      d = d - n; 
    } 

    n1 = temp1/n; 
    d1 = temp2/d; 
} 

void gcd::rename() 
{ 
    n1 = n; 
    d1 = d; 
} 

void gcd::add() 
{ 
    n1 = (n1 * d) + (n * d1); 
    d1 = (d1 * d); 
    g1.finder(); 
} 

void gcd::subtract() 
{ 
    n1 = (n1 * d) - (n * d1); 
    d1 = (d1 * d); 
    g1.finder(); 
} 

void gcd::multiply() 
{ 
    n1 = n * n1; 
    d1 = d * d1; 
    g1.finder(); 
} 

void gcd::divide() 
{ 
    n1 = n1 * d; 
    d1 = d1 * n; 
    g1.finder(); 
} 

void gcd::print() 
{ 
    cout << n1 << "/" << d1 << endl; 
} 

int main() 
{ 
    int n, d; 

    cout << "Please enter 5 fractions with a space between the numerator and denominator" << endl; 
    cout << "For example, input 2/3 as 2 3" << endl; 

    cout << "Enter 1st fraction: "; 
    cin >> n >> d; 
    g1.rename(); 
    cout << "Enter 2nd fraction: "; 
    cin >> n >> d; 
    g1.divide(); 

    cout << "Enter 3rd fraction: "; 
    cin >> n >> d; 
    g1.multiply(); 

    cout << "Enter 4th fraction: "; 
    cin >> n >> d; 
    g1.add(); 

    cout << "Enter 5th fraction: " << endl << endl; 
    cin >> n >> d; 
    g1.subtract(); 

    g1.print(); 

    return 0; 
} 
+0

Вы должны вывести «вещи» в виде фракций или написать класс, представляющий фракции? – molbdnilo

+0

'int n, d', перечисленные в' main', не будут теми же переменными, что и члены данных 'n' и' d' в 'g1', поэтому' cin >> n >> d' не влияет на ' g1' и 'g1.rename()' работает с неинициализированными данными членов (это неопределенное поведение). Вероятно, вы должны создать 'g1' внутри' main' - после того, как вы прочитали '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'и передали их как аргументы в * конструктор * для' класса gcd', соответствующие элементы данных. –

+0

@TonyD Bear со мной, (поскольку я только начал C++ на этой неделе, так что я не уверен, что это правильно), но я бы просто добавил «void fraction (int n, int d)»; к классу gcd, затем поставьте «g1.fraction()»; в основном для этого? – Celeste

ответ

0

Пробовал бегать и понимания вашей программы, смотрит на меня, понятие класса не следует должным образом Вы не можете получить доступ к переменной класса непосредственно внутри основной Так что я могу понять, от вашего кода.. . вы вызываете переименовывать устанавливать различные значения, но ваша функция переименования переназначения значения из местных неинициализированных только переменных Вот что вы должны сделать:

Создать конструктор для класса

class gcd 
{ 
public: 
    void finder(); 
    void rename(int x, int y); 
    void add(); 
    void subtract(); 
    void multiply(); 
    void divide(); 
    void print(); 
    gcd(int x, int y, int w, int z, int m, int p) 
{ 
n = y; 
d=x; 
n1=w; 
d1=z; 
temp1=m; temp2=p;} 

private: 
    int n, d, n1, d1, temp1, temp2; 

}; 

Crea. te объекта gcd с использованием выше конструктора. Также перед делением проверки на деление на ноль.

0
  1. Вам нужно узнать, что такое программирование ОО, классы и конструкторы. В идеале ваш класс должен быть классом Fraction с числителем и знаменателем и с перегрузками оператора для выполнения основных арифметических операций и ввода-вывода.
  2. Если вы не знаете о перегрузке оператора, просто используйте статические функции-члены класса для выполнения арифметической операции.
  3. Если вы не знаете о статических функциях-членов, то вы можете создать функцию-члена форм:

Fraction add(const Fraction& another) const -> Это добавит фракцию, передаваемую в функцию члена, как another переменных с самими собой и вернуть новый без мутирующий/меняющий себя.

void add(const Fraction& another) -> Это добавит another Фракция к себе (тем самым меняя себя).

Вот пример:

class Fraction 
{ 
    int num, den ; 
public: 
    Fraction(int n, int d) : num(n), den(d) {} 

    Fraction add(const Fraction&) const ; 
    Fraction sub(const Fraction&) const ; 
    Fraction mul(const Fraction&) const ; 
    Fraction div(const Fraction&) const ; 
    void show() const; 
}; 

Fraction Fraction::add(const Fraction& another) const 
{ 
    return Fraction(num*another.den + den*another.num, den*another.den); 
} 

void Fraction::show() const 
{ 
    std::cout << num << "/" << den ; 
} 

... // define other methods likewise 

Основная функция:

int main() 
{ 
    int n, d ; 
    std::cout << "Enter first fraction : "; 
    std::cin >> n >> d ; 
    Fraction a(n, d); 

    std::cout << "Enter second fraction : "; 
    std::cin >> n >> d ; 
    Fraction b(n, d); 

    Fraction sum = a.add(b); 
    std::cout << "Sum is : " ; 
    sum.show(); 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^