Write say.cpp, a program to print the English translation of non-negative intege
ID: 3774497 • Letter: W
Question
Write say.cpp, a program to print the English translation of non-negative integers entered on the command line. You should include a recursive function, printEnglish (int n), that calls itself for values greater than 1,000. (In fact our solution calls itself up to four times, depending on the size of its parameter's value.) main must extract as many numbers as the user types on the command line. For each valid entry, invoke printEnglish to print results. Negative values are not valid. Match the output of our solution, including the handling of usage errors - note the program does not stop processing if it encounters a bad argument. IMPORTANT: every number printed by printEnglish (except the special case of zero) is followed by a single space at the end of the line. Here are some useful strings and constants from our say.cpp solution. You may copy and paste them into your solution if you want.Explanation / Answer
/* Program to print a given number in words. The program handles
numbers from 0 to 9999 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* A function that prints given number in words */
void convert_to_words(char *num)
{
int len = strlen(num); // Get number of digits in given number
/* Base cases */
if (len == 0) {
fprintf(stderr, "empty string ");
return;
}
if (len > 4) {
fprintf(stderr, "Length more than 4 is not supported ");
return;
}
/* The first string is not used, it is to make array indexing simple */
char *single_digits[] = { "zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
/* The first string is not used, it is to make array indexing simple */
char *two_digits[] = {"", "ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
/* The first two string are not used, they are to make array indexing simple*/
char *tens_multiple[] = {"", "", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"};
char *tens_power[] = {"hundred", "thousand"};
/* Used for debugging purpose only */
printf(" %s: ", num);
/* For single digit number */
if (len == 1) {
printf("%s ", single_digits[*num - '0']);
return;
}
/* Iterate while num is not '' */
while (*num != '') {
/* Code path for first 2 digits */
if (len >= 3) {
if (*num -'0' != 0) {
printf("%s ", single_digits[*num - '0']);
printf("%s ", tens_power[len-3]); // here len can be 3 or 4
}
--len;
}
/* Code path for last 2 digits */
else {
/* Need to explicitly handle 10-19. Sum of the two digits is
used as index of "two_digits" array of strings */
if (*num == '1') {
int sum = *num - '0' + *(num + 1)- '0';
printf("%s ", two_digits[sum]);
return;
}
/* Need to explicitely handle 20 */
else if (*num == '2' && *(num + 1) == '0') {
printf("twenty ");
return;
}
/* Rest of the two digit numbers i.e., 21 to 99 */
else {
int i = *num - '0';
printf("%s ", i? tens_multiple[i]: "");
++num;
if (*num != '0')
printf("%s ", single_digits[*num - '0']);
}
}
++num;
}
}
/* Driver program to test above function */
int main(void)
{
convert_to_words("999");
//convert_to_words("523");
//convert_to_words("89");
//convert_to_words("8989");
getchar();
return 0;
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.