'C++ Issue with functions?

So I'm trying to write this program that functions as a fraction calculator, and I'm running into issues with my functions not running. This is what I have right now:

#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h> 

using namespace std;

  int frac1num; // first fraction's numerator.
  int frac1den; // first fraction's denominator.
  int frac2num; // second fraction's numerator.
  int frac2den; // second fraction's denominator.
  string op; //operation.
  string str; 
  int num; //calculated numerator.
  int den;

void menu()
{
  cout << "This program allows you to perform arithmetic operations on fractions that contain a single digit numerator and denominator. \n" << "****************************\n" << "INSTRUCTIONS: \n" << "------------------\n" << "1. First select the operation you'd like to perform (+, -, *, or /).\n" << "2. Then, enter your first fraction. \n" << "3. Finally, enter your second fraction.\n" << "\n ***Note: Fractions should be entered as four digits. \n For example: 1/2 and 1/4 would be written as 1214.\n" << endl;
}

void addFractions()
{
  num = (frac2den * frac1num) + (frac1den * frac2num);
  den = (frac1den * frac2den);
}

void subtractFractions()
{
  int num1;
  int num2;
  
  num1 = (frac2den * frac1num);
  num2 = (frac1den * frac2num);

  if (num1 > num2)
    num = num1 - num2;
  else 
    num = num2 - num1;;
  den = (frac1den * frac2den);
}

void multiplyFractions()
{
  num = (frac1num * frac2num);
  den = (frac1den * frac2den);
}

void divideFractions()
{
  if (frac1den <= 0 || frac2den <= 0)
  {
    cout << "Error: Can not divide by zero.";
    exit (EXIT_FAILURE);
  }
  else
  {
    num = (frac1num * frac2den);
    den = (frac2num * frac1den);
  }
}

int main() {
menu();
  int frac; // fractions entered by user as a 4 digit number.
  int frac1num; // first fraction's numerator.
  int frac1den; // first fraction's denominator.
  int frac2num; // second fraction's numerator.
  int frac2den; // second fraction's denominator.
  string op; //operation.
  string str; 
  int num = 0; //calculated numerator.
  int den = 0; //calculated denominator.
  

  cout << "Enter the operation you'd like to perform: \n";
  cin >> op;
  cout << endl;
  cout << "Enter your fractions: \n";
  cin >> frac;
  cout << endl;

  str = to_string(frac);
  string str1 = str.substr (0, 1); 
  string str2 = str.substr (1, 1);
  string str3 = str.substr (2, 1);
  string str4 = str.substr (3, 1);
  frac1num = stoi(str1);
  frac1den = stoi(str2);
  frac2num = stoi(str3);
  frac2den = stoi(str4);


  if (op == "+")
    addFractions();
  else if (op == "-")
    subtractFractions();
  else if (op == "/")
    divideFractions();
  else if (op == "*")
    multiplyFractions();
  else
    cout << "Operation not supported." << endl;
    exit (EXIT_FAILURE);

  cout << frac1num << "/" << frac1den << " " << op << " " << frac2num << "/" << frac2den << " = " << num << "/" << den;


  return 0;
}

So everything is outputting correctly ACCEPT the actual calulation that it's supposed to perform. I keep getting "0/0" as the solution for anything I enter when running the program. At first I was getting crazy numbers as the answer output, so I thought if I initialized num and den (the numerator and denominator of the answer) that it would help, but now I know it just isn't running my functions at all because now, as I said, I'm just getting 0/0 for everything. Am I not calling them correctly?

Thanks.



Solution 1:[1]

Fixed several things

  • first the global variables masking the local variables, you should really not use globals but I left them as is
  • your error exit was happening unconditionally
  • I also simplified the parsing of the four digits string (you should really check the length too)
  • op was not needed as a global

Code

#include <iostream>
#include <string>


using namespace std; <<<<== dont do this in future

int frac1num; // first fraction's numerator.
int frac1den; // first fraction's denominator.
int frac2num; // second fraction's numerator.
int frac2den; // second fraction's denominator.

int num; //calculated numerator.
int den;

void menu()
{
    cout << "This program allows you to perform arithmetic operations on fractions that contain a single digit numerator and denominator. \n" << "****************************\n" << "INSTRUCTIONS: \n" << "------------------\n" << "1. First select the operation you'd like to perform (+, -, *, or /).\n" << "2. Then, enter your first fraction. \n" << "3. Finally, enter your second fraction.\n" << "\n ***Note: Fractions should be entered as four digits. \n For example: 1/2 and 1/4 would be written as 1214.\n" << endl;
}

void addFractions()
{
    num = (frac2den * frac1num) + (frac1den * frac2num);
    den = (frac1den * frac2den);
}

void subtractFractions()
{
    int num1;
    int num2;

    num1 = (frac2den * frac1num);
    num2 = (frac1den * frac2num);

    if (num1 > num2)
        num = num1 - num2;
    else
        num = num2 - num1;;
    den = (frac1den * frac2den);
}

void multiplyFractions()
{
    num = (frac1num * frac2num);
    den = (frac1den * frac2den);
}

void divideFractions()
{
    if (frac1den <= 0 || frac2den <= 0)
    {
        cout << "Error: Can not divide by zero.";
        exit(EXIT_FAILURE);
    }
    else
    {
        num = (frac1num * frac2den);
        den = (frac2num * frac1den);
    }
}

int main() {
    menu();
    string op;
    string frac;
    cout << "Enter the operation you'd like to perform: \n";
    cin >> op;
    cout << endl;
    cout << "Enter your fractions: \n";
    cin >> frac;
    cout << endl;


    frac1num = frac[0] - '0';
    frac1den = frac[1] - '0';
    frac2num = frac[2] - '0';
    frac2den = frac[3] - '0';

    if (op == "+")
        addFractions();
    else if (op == "-")
        subtractFractions();
    else if (op == "/")
        divideFractions();
    else if (op == "*")
        multiplyFractions();
    else
    {
        cout << "Operation not supported." << endl;
        exit(EXIT_FAILURE);
    }

    cout << frac1num << "/" << frac1den << " " << op << " " << frac2num << "/" << frac2den << " = " << num << "/" << den;


    return 0;
}

Removing the globals is complicated by the fact that you effectively want to 'return' 2 values from each function.

What you should really do is a have a class called Fraction and pass 2 of them into each function and return one. But that's too much for me to do here. Instead here is how to use std::tuple to return 2 values.

see https://en.cppreference.com/w/cpp/utility/tuple

Taking add as the example

std::tuple<int,int> addFractions(int lfrac1num, int lfrac1den, int lfrac2num,int lfrac2den ) {
    int lnum = (lfrac2den * lfrac1num) + (lfrac1num * lfrac2num);
    int lden = (lfrac1den * lfrac2den);
    return std::make_tuple(lnum, lden);
}

and calling it

if (op == "+") {
    auto [n,d] = addFractions(frac1num, frac1den, frac2num, frac2den);
    num = n;
    den = d;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 pm100