'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 |
