While loop (Converting Letters to Number in A Telephone Number)

I'm trying to do a program where it converts letters into numbers in a telephone number. For example, For example, using letters, the telephone number 438-5626 can be shown as GET LOAN. This is what came up with:

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
#include <iostream>
using namespace std;
int main ()
{
	char input;
char letters;
int number;
int i;


    //Program
cout << "Enter Y/y to convert a telephone number form letters to digits." << endl;
cout << "Enter any other letter to terminate the program." << endl;
cin >> input;
while (input == 'Y' || input == 'y')
{
    cout << "Enter telephone number using letters: ";
    cin >> letters;
    cout << endl;

    cout << "The corresponding phone number is: ";

    for(int i = 0; i < 7; i++)
    {
        if ((letters >= 'A' && letters <= 'Z') || (letters >= 'a' && letters <= 'z'))
        switch (letters)
    {
    case 'A':
    case 'a':
    case 'B':
    case 'b':
    case 'C':
    case 'c':
    cout << "2";
    break;

    case 'D':
    case 'd':
    case 'E':
    case 'e':
    case 'F':
    case 'f':
    cout << "3";
    break;

    case 'G':
    case 'g':
    case 'H':
    case 'h':
    case 'I':
    case 'i':
    cout << "4";
    break;

    case 'J':
    case 'j':
    case 'K':
    case 'k':
    case 'L':
    case 'l':
    cout << "5";
    break;

    case 'M':
    case 'm':
    case 'N':
    case 'n':
    case 'O':
    case 'o':
    cout << "6";
    break;

    case 'P':
    case 'p':
    case 'Q':
    case 'q':
    case 'R':
    case 'r':
    case 'S':
    case 's':
    cout << "7";
    break;

    case 'T':
    case 't':
    case 'U':
    case 'u':
    case 'V':
    case 'v':
    cout << "8";
    break;

    case 'W':
    case 'w':
    case 'X':
    case 'x':
    case 'Y':
    case 'y':
    case 'Z':
    case 'z':
    cout << "9";
    break;
    cout << number;
    }

    if (i == 3)
        cout << "-";

    }
    cout << "To process another telephone number, enter Y/y." << endl;
    cout << "Enter any other letter to terminate the program." << endl;
    cin >> input;
}


return 0;
}
Last edited on
char letters;
One single char. This variable, letters, can hold ONE single char. How many are you trying to store in it?
Repeater,

I should hold up to 7 letters.
Last edited on
I don't know what to replace it with. I was only taught that char stores characters (letters).
You need to use a character array instead of character variable. Character variable can only store one character at a time.
Use this instead,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char input;
char letters[7]; 
int number;
int i;


    //Program
cout << "Enter Y/y to convert a telephone number form letters to digits." << endl;
cout << "Enter any other letter to terminate the program." << endl;
cin >> input;
while (input == 'Y' || input == 'y')
{
    cout << "Enter telephone number using letters: ";
    cin,getline(letters, 7);
    cout << endl;

And then apply the for loop for every index of the array
that is a a LOT of code to say:

1
2
3
4
5
6
7
8
9
10
11
12
13
int phoneval(char ch)
{
  ch = toupper(ch);
  return   (int)((ch-'A')/3.0 +2 -(ch=='S') - (ch == 'V') - (ch >= 'Y'));	
}

int main()
{
    string pn = "GETLOAN";
	for(int i = 0; i < pn.length(); i++)
	cout << phoneval(pn[i]);
   return 0;
}


your use of switch fall thru is excellent, though.
This isn't a criticism. Just showing you another way to look at it.
Last edited on
redfury,

So like this?

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
#include <iostream>
using namespace std;
int main ()
{
	char input;
	char letters [7];
	int number;
	int i;


    //Program
cout << "Enter Y/y to convert a telephone number form letters to digits." << endl;
cout << "Enter any other letter to terminate the program." << endl;
cin >> input;
while (input == 'Y' || input == 'y')
{
    cout << "Enter telephone number using letters: ";
    cin.getline (letters,7);
    cout << endl;

    cout << "The corresponding phone number is: ";

    for(int i = 0; i < 7; i++)
    {
        if ((letters >= 'A' && letters <= 'Z') || (letters >= 'a' && letters <= 'z'))
        switch (letters)
    {
    case 'A':
    case 'a':
    case 'B':
    case 'b':
    case 'C':
    case 'c':
    cout << "2";
    break;

    case 'D':
    case 'd':
    case 'E':
    case 'e':
    case 'F':
    case 'f':
    cout << "3";
    break;

    case 'G':
    case 'g':
    case 'H':
    case 'h':
    case 'I':
    case 'i':
    cout << "4";
    break;

    case 'J':
    case 'j':
    case 'K':
    case 'k':
    case 'L':
    case 'l':
    cout << "5";
    break;

    case 'M':
    case 'm':
    case 'N':
    case 'n':
    case 'O':
    case 'o':
    cout << "6";
    break;

    case 'P':
    case 'p':
    case 'Q':
    case 'q':
    case 'R':
    case 'r':
    case 'S':
    case 's':
    cout << "7";
    break;

    case 'T':
    case 't':
    case 'U':
    case 'u':
    case 'V':
    case 'v':
    cout << "8";
    break;

    case 'W':
    case 'w':
    case 'X':
    case 'x':
    case 'Y':
    case 'y':
    case 'Z':
    case 'z':
    cout << "9";
    break;
    cout << number;
    }

    if (i == 3)
        cout << "-";

    }
    cout << "To process another telephone number, enter Y/y." << endl;
    cout << "Enter any other letter to terminate the program." << endl;
    cin >> input;
}


return 0;
}
closed account (E0p9LyTq)
Mixing methods to get data from the input stream (std::cin >> and std::cin.getline) can pollute the input stream. You need to ignore any possible leftover characters still in the stream using std::cin.ignore.

http://www.cplusplus.com/reference/istream/basic_istream/ignore/

std::numeric_limits<std::streamsize>::max() ignores as many characters as the input stream can hold up to a '\n' character or the end of the stream is reached. (<limits>)

Your char array needs to be created as 8 characters in length, getline will make the final character the null character ('\0').

You can also convert any lower case character to upper case using ::toupper (<cctype>).

Good use of whitespace can be helpful, you can put all the relevant case labels on one line instead of each on a separate line:

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
#include <iostream>
#include <limits>
#include <cctype>

int main()
{
   char letters[8];

   std::cout << "Enter Y/y to convert a telephone number form letters to digits.\n";
   std::cout << "Enter any other letter to terminate the program.\n";
   char input;
   std::cin >> input;
   std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
   input = ::toupper(input);

   while (input == 'Y')
   {
      std::cout << "Enter telephone number using letters: ";
      std::cin.getline(letters, 8);
      std::cout << '\n';

      std::cout << "The corresponding phone number is: ";

      for (int i = 0; i < 7; i++)
      {
         letters[i] = ::toupper(letters[i]);

         if (letters[i] >= 'A' && letters[i] <= 'Z')
         {
            switch (letters[i])
            {
            case 'A': case 'B':case 'C':
               std::cout << "2";
               break;

            case 'D': case 'E': case 'F':
               std::cout << "3";
               break;

            case 'G':case 'H':case 'I':
               std::cout << "4";
               break;

            case 'J': case 'K': case 'L':
               std::cout << "5";
               break;

            case 'M': case 'N': case 'O':
               std::cout << "6";
               break;

            case 'P': case 'Q': case 'R': case 'S':
               std::cout << "7";
               break;

            case 'T': case 'U': case 'V':
               std::cout << "8";
               break;

            case 'W': case 'X': case 'Y':case 'Z':
               std::cout << "9";
               break;
            }
         }

         if (i == 2) // why 2?  arrays are zero-based.  letters[2] is the third element
         {
            std::cout << '-';
         }
      }

      std::cout << "\n\nTo process another telephone number, enter Y/y.\n";
      std::cout << "Enter any other letter to terminate the program.\n";
      std::cin >> input;
      input = ::toupper(input);
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
   }
}

Enter Y/y to convert a telephone number form letters to digits.
Enter any other letter to terminate the program.
y
Enter telephone number using letters: abcdefg

The corresponding phone number is: 222-3334

To process another telephone number, enter Y/y.
Enter any other letter to terminate the program.
y
Enter telephone number using letters: ghwznop

The corresponding phone number is: 449-9667

To process another telephone number, enter Y/y.
Enter any other letter to terminate the program.
n
Last edited on
Topic archived. No new replies allowed.