Converting numbers into text

This is my first post so if I did something wrong let me know. Ok, so I have been reading the book practical C++ programming. One of the practice problems asks you take a number that is entered by a user and turn that into printed text. Ex. 85 would be eight five. The problem I am having is I'm not quite sure how to go about this. I don't know if I should use an array, string, or something else. If you could point me in the right direction I would appreciate it.

P.S. I don't want anyone to write the code I just need to know how to go about this.

Thanks,

Rafen

Re: Converting numbers into text

Quote:

Originally Posted by

**Rafen**
This is my first post so if I did something wrong let me know. Ok, so I have been reading the book practical C++ programming. One of the practice problems asks you take a number that is entered by a user and turn that into printed text. Ex. 85 would be eight five.

Shouldn't that be "eighty five"?

Quote:

The problem I am having is I'm not quite sure how to go about this.

Believe it or not, that **is** the assignment -- whether you have the skills to come up with a method to solve the problem.

This assignment is one of the classical ones handed out to programming students. The "change a number into words" assignment has it as a goal to see if **you** can devise a scheme to solve the problem using whatever means you have.
Quote:

I don't know if I should use an array, string, or something else.

That's the point -- you can use an array, string, or something else. There are literally scores of ways to solve this problem, but again, the goal of the assignment is to see if **you** can figure it out (and of course, implement your idea).

Personally, I think that an assignment like this tests the programmer's design skills and if they have the knowledge to take the tools that they have and create a program without a teacher's (or our) help.
Quote:

If you could point me in the right direction I would appreciate it.

You know exactly what the program requires -- it is very simple. Your goal is to break this down into discrete steps. The first steps is to match each sub number into a word:

Code:

`1 -> one`

2 -> two

3 -> three

4 -> four

...

9 -> nine

Now you do the "two-digit" names

Code:

`10 -> ten`

11 -> eleven

12 -> twelve

13 -> thirteen

...

19 -> nineteen

Then you do the "tens"

Code:

`20 -> twenty`

30 -> thirty

40 -> forty

50 -> fifty

...

90 -> ninety

Then you do the multiples of 10 starting with 100

Now you have the "comma" names

Code:

`one comma -> thousand`

two commas -> million

three commas -> billion

**All** worded numbers consist of a combination of the above. There are no further names to consider. So now you have a number:

How would you set up the above to print "four". Easy. Now you have a two digit number:

How would you print "twenty four"? You have to somehow parse the number, getting the "2" and doing some sort of a look up to find the word "twenty". Then you need to parse the "4" to get the "four".

Then you try 3 digit numbers, 4 digit numbers, etc.

Regards,

Paul McKenzie

Re: Converting numbers into text

Alright thanks a lot for the help. I think I figured a way out so I will go try it and see if it works.

Re: Converting numbers into text

Quote:

Originally Posted by

**Rafen**
Alright thanks a lot for the help. I think I figured a way out so I will go try it and see if it works.

Well, to give you an idea, you lay out the digits in groups of 3.

For example:

Code:

`187932 -> 187 932`

4 -> 004

123 -> 123

19371387 -> 019 371 387

The pattern is that a group of three numbers will never be greater than 999. So if you can write the words for all numbers up to 999, then you have 80% of the assignment done. The rest of the assignment is to figure out which "comma" word to use (or if you need to use one) for each group of 3.

Regards,

Paul McKenzie

Re: Converting numbers into text

Thanks a lot. I have one other question...Is this suppose to take a while or is it like a test to see how well of a programmer you are?

Re: Converting numbers into text

Quote:

Originally Posted by

**Rafen**
Thanks a lot. I have one other question...Is this suppose to take a while or is it like a test to see how well of a programmer you are?

Both.

Just to let you know, a professional programmer would be able to write this up (or get very close to finishing) in less than an hour, and more than likely, less than a half-hour. However, for a good student -- maybe a day or two at most.

Regards,

Paul McKenzie

Re: Converting numbers into text

Yeah I thought it might take awhile for me to complete this. Thanks a lot for all your help.

Re: Converting numbers into text

I dont think having C++ for a single semester has given me enough background to write the code for this program.

I am stuck and have no idea what I'm doing wrong. I haven't typed all the code just enough so I could get everything working then I would finish the rest of the code. I have been trying to change "125" into words. The problem is when I enter this number the only thing that prints to the screen is "Hundred". Any help would be appreciated. Thanks.

Code:

`#include <iostream>`

using namespace std;

int main()

{

int num,ones,tens,hundreds;

cout << "Please enter a number to be converted to words: ";

cin >> num;

tens = num/10;

ones = num%10;

hundreds = num/100;

// this is for the ones place.

switch(num)

{

case 0 :

cout << "zero";

break;

case 1:

cout << "one";

break;

case 2:

cout << "two";

break;

case 3:

cout << "three";

break;

case 4:

cout << "four";

break;

case 5:

cout << "five";

break;

case 6:

cout << "six";

break;

case 7:

cout << "seven";

break;

case 8:

cout << "eight";

break;

case 9:

cout << "nine";

break;

case 10:

cout << "ten";

break;

}

// this is for the tens place.

switch(tens)

{

case 2:

cout << "twenty -";

break;

}

// this is for the hundreds place

switch(hundreds)

{

case 1:

cout << "Hundred";

break;

}

}

Please let me know anything that I am doing wrong.

Re: Converting numbers into text

Quote:

Originally Posted by

**Rafen**
I dont think having C++ for a single semester has given me enough background to write the code for this program.

Before you write one line of code, you should have written out the steps required to convert the number. You didn't do that and you're trying to figure out what to do while writing the program. That is the **wrong** way to go about doing this.

Write out the steps in English first:

Code:

`1) Determine the number of digits in the input.`

2) If the number of digits is equal to 1, then the number is a straight lookup.

3) If the number of digits is equal to 2 then

a) extract the tens digit.

a2) if the tens digit is greater than 1, then map the digit to twenty, thirty, forty, etc. Add this to your sentence and go to step b)

a3) if the tens digit is a 1, then you map it to ten, eleven twelve, thirteen, etc. This is your sentence -- done.

b) extract the ones digit

b2) add the digit word to your sentence. Done.

etc...

It doesn't take C++ to write these out -- that's why the assignment is about design, and not necessarily about C++. With these steps written out, it should be able to be coded in any language.

Regards,

Paul McKenzie

Re: Converting numbers into text

Thanks for the help I will try to write out the steps from now on before I even write a line of code. We never programmed like that in class we just jumped right into the program and started coding. I will have to take a different approach to programming after see how easy it was to figure out what to code once you wrote the program out in english.

Thanks Again,

Richard

Re: Converting numbers into text

I have been working on this for a couple days here and there. I can't figure out what to do on this program. I didn't get any further than I was before I just took a different way of writing the program. Do you think I should just put this program to the side and read over the book until I understand how to problem solve better? I know what I need to do in the steps that you listed out above I just can't seem to figure out how exactly to do it. I am just guessing and can't figure out how exactly to do it.

Code:

`#include <iostream>`

#include <string>

#include <sstream>

using namespace std;

int main()

{

int integer;

int places;

int ones,tens;

string num;

cout << "Please enter a number to be converted to words: ";

getline(cin, num);

places = num.length();

if(!(stringstream(num)>> integer)) integer = 0;

ones = integer%10;

tens = integer/10;

switch(ones)

{

case 1:

cout << "one";

break;

case 2:

cout << "two";

break;

}

switch(tens)

{

case 2:

cout << "twenty -";

break;

}

}

I was using "22" as a tester and I get "twotwenty -" to print to the screen.

Re: Converting numbers into text

1) Concentrate on converting numbers between 1 and 999. Write a function just to do that.

2) To do 1), you should write a function that extracts the hundreds, tens, and units digit first.

For example:

Code:

`#include <iostream>`

using namespace std;

int main()

{

int nNumber;

cout << "Enter a number: ";

cin >> nNumber;

int nHundreds, nTens, nUnits;

nHundreds = ???;

nTens = ???;

nUnits = ???;

cout << "Hundreds: " << nHundreds << endl << "Tens: " << nTens << endl << "Units: " << nUnits;

}

Once you know how to extract the digits, you then can use the digits to help you figure out how to print the number. For example, you need to have "one", "two", "three", up until "nine" in one array, "ten", "eleven", up until "nineteen" in another array, "twenty", "thirty", etc. in another array. Then you use the extracted digits, logic, and the tables to determine how to print the full number (the logic is required to know if you need to have the string "hundred" in the final output).

I won't help with the extraction of the digits -- simple computer math using divisions and modulus is what you need to know to use. But assume you did extract the digits correctly. Given the extracted digits, how do you use the tables that were set up to print the correct string? You can write the steps out, assuming you know to get the individual digits from the number.

Basically this is how you approach a problem like this. You do each piece, making sure it works before proceeding.

Once you have that, create a function that returns the 1-999 string. Then you concentrate on how to write the comma strings such as million, thousand, billion (if you get that high a number), etc. but using the function that you wrote above to generate the 1-999 string for each group of three digits.

On a lark, I got then entire assignment working in a few minutes (if you subtract the time it took to type in the number strings).

Regards,

Paul McKenzie

Re: Converting numbers into text

Quote:

Originally Posted by

**Rafen**
I just can't seem to figure out how exactly to do it. I am just guessing and can't figure out how exactly to do it.

Regardless of the number, you should extract all the digits (this is assuming the number is between 1 and 999, and it's this range you should put the most time in).

As to your code:

1) Even if the hundreds, tens, or units place is 0, you extract that value.

2) Your code does not extract the hundreds digit.

3) You don't need to make the input a string. Make it an integer and use cin, not getline().

4) Please create your arrays of names I stated above.

Code:

`const char *unitName[] = {"zero", "one", "two", /* ... */, "nine"};`

const char* tensNames[] = {"ten", "twenty", "thirty", /* ... */, "ninety"};

const char* teensNames[] = {"eleven", "twelve", /* ... */, "nineteen"};

Once you have 1) and 4) staring at you, it shouldn't take a long time to write the logic to print the correct number. For example, If the hundreds digit is > 0, then you know you need to do a lookup in the units array for the hundred's digit name, and then print the word "hundred" after it. That's as far as I'm going to help you