do while.. switch case (Taylor Series)

I'll be having problem when answering like "znciwi" or any number when 'Is the angle in degree or radian?' is asked. It will work fine if I key in just one letter, but keying in many letters or numbers as mentioned before will result in messy flow. Need your help please!!... Any suggestion on how to correct it?..

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
#include <iostream>
#include <cstdlib>
#define PI 3.1415926

using namespace std;

void displayMenu( float& angle )
{
system("cls");
cout << "*******Trigonometry Program**********" << endl;
cout << "\nPlease enter an angle value => ";
cin >> angle;
}

void DegOrRad ( char& select )
{
cout << "Is the angle in Degree or Radian?" << endl;
cout << "    Type D if it is in Degree" << endl;
cout << "    Type R if it is in Radian" << endl;
cout << "Your response => ";
cin >> select;
select = toupper ( select );
}

void ConvR( float& angle, float& Rad, float& Deg, float& term, float& sinX, float& cosX, float& x, float& tanX, int& i )
{

cout.precision(7);
cout.setf(ios::fixed);
cout << "     " << angle << " Degree =";
cout.width(17);
Rad = angle * PI / 180;
term = Rad;
sinX = term;

for (i=3; i<=21; i+=2)
{
    term = -term*Rad*Rad / (i*(i-1));
    sinX = sinX + term;
}

    term = 1, cosX = 1;
    x = Rad;
for (i=1; i<=21; i++)
{
    term = ((-term)*(x*x)) / ((2*i)*(2*i-1));
    cosX = cosX + term;
}

    tanX = sinX / cosX;

cout << Rad << " Radian";
cout << endl;

cout << "\n\n           Results";
cout << "\n====================================";
cout << "\n      x  =       " << Rad << " Radian";
cout << "\n  sin(x) =       " << sinX;
cout << "\n  cos(x) =       " << cosX;
cout << "\n  tan(x) =       " << tanX;
cout << "\n====================================";
cout << endl;
}

void AngleRadian( float& angle, float& Rad, float& Deg, float& term, float& sinX, float& cosX, float& x, float& tanX, int& i )

{
cout.precision(7);
cout.setf(ios::fixed);

term = angle;
sinX = term;

for (i=3; i<=21; i+=2)
{
    term = -term*angle*angle / (i*(i-1));
    sinX = sinX + term;
}

    term = 1, cosX = 1;
    x = angle;
for (i=1; i<=21; i++)
{
    term = ((-term)*(x*x)) / ((2*i)*(2*i-1));
    cosX = cosX + term;
}

    tanX = sinX / cosX;



cout << "\n\n           Results";
cout << "\n====================================";
cout << "\n      x  =       " << angle << " Radian";
cout << "\n  sin(x) =       " << sinX;
cout << "\n  cos(x) =       " << cosX;
cout << "\n  tan(x) =       " << tanX;
cout << "\n====================================";
cout << endl;

}

void YesNo ( char& select2 )

{
cout<<"Do you want to continue?"<<endl;
cout<<"    Type Y to continue"<<endl;
cout<<"    Type any other key to stop"<<endl;
cout<<"Your response => ";
cin >> select2;
select2 = toupper ( select2 );

}
int main()
{

float angle = 35;
float Rad;
float Deg;
float term;
float sinX;
float cosX;
float tanX;
float x;
int i;
char select;
char select2;
char retry = 0;
bool done = false;
bool select_valid = false;

do
{

displayMenu ( angle );

do
{
DegOrRad ( select );

switch (select)
{
case 'D' : ConvR ( angle, Rad, Deg, term, sinX, cosX, tanX, x, i );
select_valid = true;
break;
case 'R' : AngleRadian ( angle, Rad, Deg, term, sinX, cosX, tanX, x, i );
select_valid = true;
break;
default : cout << "Invalid selection, try again!" << endl;

break;
}
}while ( !select_valid );

YesNo ( select2 );

} while ( select2 == 'Y' || select2 == 'y' );

cout << "Thank You, Goodbye";
return 0;


}

The problem is that char expects you to enter one character. So it'll put your letter into select, but then any other letters you may type remain in the cin buffer.

Here are two options:

1. Use std::string instead of char
Use #include <string> . Then change DegOrRad to void DegOrRad ( std::string& select ). Also change, char select; in main() to std::string select;.

2. Use getline() instead of >>, this will read everything up until the user hits [enter]

Thanks for replying..

Use std::string instead of char
Use #include <string> . Then change DegOrRad to void DegOrRad ( std::string& select ). Also change, char select; in main() to std::string select;.


I've change my coding as you suggested, but it turned out that there are two errors :

a) In function 'void DegOrRad(std::string&)':|
No matching function for call to 'toupper(std::string&)'
in line select = toupper ( select ); in void DegOrRad ( std::string& select )

b) In function 'int main()':
switch quantity not an integer

Then, I deleted select = toupper ( select ); and it turned out ok but the second error still remains unsolved.

Any idea @Stewbond
Last edited on
Sure try this:
I've put my changes in bold

1
2
3
4
5
6
7
8
9
10
char DegOrRad ()
{
    std::string select;
    cout << "Is the angle in Degree or Radian?" << endl;
    cout << "    Type D if it is in Degree" << endl;
    cout << "    Type R if it is in Radian" << endl;
    cout << "Your response => ";
    cin >> select;
    return toupper ( select );
}


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
int main()
{
    float angle = 35;
    float Rad;
    float Deg;
    float term;
    float sinX;
    float cosX;
    float tanX;
    float x;
    int i;
    char select;
    char select2;
    char retry = 0;
    bool done = false;
    bool select_valid = false;

    do
    {

        displayMenu ( angle );

        do
        {
            select = DegOrRad();

            switch (select)
            {
            case 'D' : 
                ConvR ( angle, Rad, Deg, term, sinX, cosX, tanX, x, i );
                select_valid = true;
            break;
            case 'R' : 
                AngleRadian ( angle, Rad, Deg, term, sinX, cosX, tanX, x, i );
                select_valid = true;
            break;
            default : 
                cout << "Invalid selection, try again!" << endl;
            break;
            }
        }while ( !select_valid );

        YesNo ( select2 );

    } while ( select2 == 'Y' || select2 == 'y' );

    cout << "Thank You, Goodbye";
    return 0;
}



You can do something very similar with YesNo(select2) as well.

If you wanted to get really fancy, you can
switch ( DegOrRad() ) and get rid of the select variable all together.
Thanks for ur help again..

Have u ever tried the change you made?. What kind of compiler that you use?

Two errors shown when I ran it.

1) error: declaration of 'std::string select' shadows a parameter :
1
2
3
char DegOrRad ( char& select )
{
std::string select;



2) error: no matching function for call to 'toupper(std::string&)'
return toupper ( select );

I'm using code block..
Topic archived. No new replies allowed.