Need help with switch function based calculator

Hello! I'm trying to write a program that will simulate a calculator by using switches that call functions to perform the desired task. When I try compiling I get error messages "error: no match for 'operator>>' in 'infile.std::basic_ifstream<char>::<enonymous.std..."

Any help would be appreciated!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

int add (ofstream &);
int subtract (ofstream &);
int multiply (ofstream &);
double divide (ofstream &);
int remainder (ofstream &);
double average (ofstream &);
int maximum (ofstream &);
int minimum (ofstream &);
int square (ofstream &);

//ifstream infile ("C:\\Users\\DavidC\\Desktop\\HW_5_INPUT.txt");
ifstream infile ("con");
//ofstream outfile ("C:\\Users\\DavidC\\Desktop\\HW_5_OUTPUT.txt");
ofstream outfile ("con");


int main ()
{

    char choice;
    bool not_done = true;

    do {

        cout << "Please select a function to perform." << endl << endl;
        cout << "Enter\t\t\tFor" << endl;
        cout << "+\t\t\tAddition\n-\t\t\tSubtraction\n*\t\t\tMultiplication\n/\t\t\tDivision\n%\t\t\tRemainder\nA\t\t\tAverage of two numbers\nX\t\t\tMaximum of two numbers\nM\t\t\tMinimum of two numbers\nS\t\t\tSquare of a number\nQ\t\t\tQuit program";
        infile >> choice;

        switch (choice) {
            case '+':
                add (outfile);
                break;
            case '-':
                subtract (outfile);
                break;
            case '*':
                multiply (outfile);
                break;
            case '/':
                divide (outfile);
                break;
            case '%':
                remainder (outfile);
                break;
            case 'A':
                average (outfile);
                break;
            case 'X':
                maximum (outfile);
                break;
            case 'M':
                minimum (outfile);
                break;
            case 'S':
                square (outfile);
                break;
            case 'Q':
                not_done = false;
            default:
                outfile << "Error: Please enter a valid selection." << endl;
                break;
            }
        }
        while (not_done);

    return 0;
}


int add (ofstream &out)
{
    int x, y, sum;

    out << "Please enter the addend: ";
    infile >> x >> endl;
    out << "Please enter the augend: ";
    infile >> y >> endl;

    sum = x + y;

    return sum;
}


int subtract (ofstream &out)
{
    int x, y, difference;

    out << "Please enter the minuend: ";
    infile >> x >> endl;
    out << "Please enter the subtrahend: ";
    infile >> y >> endl;

    difference = x - y;

    return difference;
}


int multiply (ofstream &out)
{
    int x, y, product;

    out << "Please enter the multiplier: ";
    infile >> x >> endl;
    out << "Please enter the multiplicand: ";
    infile >> y >> endl;

    product = x * y;

    return product;
}


double divide (ofstream &out)
{
    double x, y, quotient;

    out << "Please enter the dividend: ";
    infile >> x >> endl;
    out << "Please enter the divisor: ";
    infile >> y >> endl;

    quotient = (double)(x / y);

    return quotient;
}


int remainder (ofstream &out)
{
    int x, y, remain;

    out << "Please enter the dividend: ";
    infile >> x >> endl;
    out << "Please enter the divisor: ";
    infile >> y >> endl;

    remain = x % y;

    return remain;
}


int average (ofstream &out)
{
    int x, y, avg;

    out << "Please enter the first number: ";
    infile >> x >> endl;
    out << "Please enter the second number: ";
    infile >> y >> endl;

    avg = (x + y)/2;

    return avg;
}


int maximum (ofstream &out)
{
    int x, y, max;

    out << "Please enter the first number: ";
    infile >> x >> endl;
    out << "Please enter the second number: ";
    infile >> y >> endl;

    if (x > y)
        max = x;
        else
        max = y;

    return max;
}


int minimum (ofstream &out)
{
    int x, y, min;

    out << "Please enter the first number: ";
    infile >> x >> endl;
    out << "Please enter the second number: ";
    infile >> y >> endl;

    if (x < y)
        min = x;
        else
        min = y;

    return min;
}


int square (ofstream &out)
{
    int x, squared;

    out << " Please enter the number that you would like to square: ";
    infile >> x >> endl;

    squared = x * x;

    return squared;
}
I don't think you need endl on all your input statements.
I would try to simplify you solution significantly.

@Chervil is right as well, the endl is not necessary. You should look at using std::getline() as it's not prone to errors like the >> operator.

Some points of interest for you.
1. You don't need to pass in the ofstream to every method because it's declared out of the main() method scope.
2. Why are you reading and writing everything from a file and not the console? (cin/cout)
3. You don't need to create a variable to hold the results of all of your methods.
e.g return x * x;
is better than create a temp variable to hold the result only to return it on the following line (it's only helpful when using a debugger.. but even then marginally)

Some points of interest for you.
1. You don't need to pass in the ofstream to every method because it's declared out of the main() method scope.


I agree with Zaita.
I think if you delete these lines:

1
2
3
4
//ifstream infile ("C:\\Users\\DavidC\\Desktop\\HW_5_INPUT.txt");
ifstream infile ("con");
//ofstream outfile ("C:\\Users\\DavidC\\Desktop\\HW_5_OUTPUT.txt");
ofstream outfile ("con");


and add these lines on the begining of main() :

1
2
ifstream infile.open("con.txt");
ofstream outfile.open("con.txt");


you will not get this error. Because you missed opening file and did not call open functions anywhere, so your ifstream types are empty now.
Another tip. Make the calculator a resusable static class.
There isn't much gained by having it as a static class. Putting the methods in a class and holding an instance of it in the main method would more than suffice.
It makes it easier to use. A simple calculator doesn't need an instance since you are merely using single commands to output and answer. It is basically a utility class.

If it was a graphing calculator then an instance would make more sense but even then, when are you ever going to create multiple instances of the calculator?
Last edited on
But the same argument would be applied to putting them into a class. Why? There is nothing gained from having them as static methods on a class.

If you want to isolate the code for a better implementation then put the functions into a namespace, but there is no reason to go OO for the sake of going OO.
Topic archived. No new replies allowed.