1

My Cheque generator program has worked flawlessly for any input you give it to make it output the numerals in words. for example if I were to input "1234.56" it will out put "One Thousand Two Hundred Thirty Four Dollars and ... 56 Cents". However whenever I want to output something like "1000" it will output "One Thousand Zero Dollars and ... 0 Cents". Obviously its not 1000 Zero dollars, The cents are perfectly fine, however I wish to get rid of that "Zero" but I need that in there for moments such as if you were to type in "0.01" It would output "Zero Dollars and 1 Cent".

The code is as follows:

#include <stdio.h>

void printNum(int);
void printNum2(int);
int main()
{

int a = 0;
int b = 0;
int c = 0;
int d = 0; 
int num = 0;
int printcents; //To convert the float "cents" to an integer.

float inclusive;
float cents;

printf("Welcome to the IPC144 Cheque Generator!!\n");
printf("PAY TO THE ORDER OF... amahmood29 (018359133)\n");
printf("Enter a monetary value from $0.01 to $9999.99 inclusive: ");
scanf("%f", &inclusive);

if(inclusive < 0.00 || inclusive >= 10000.00) {
    printf("Sorry, cannot create cheque for that amount, try again next time!\n");
       }
else
{                                             
    a = inclusive / 1000;                          //This data is replacing our variable by diving whatever the vaulue is by either 1000, 100, 10.
    inclusive = inclusive - (a*1000);
    b = inclusive / 100; 
    inclusive = inclusive - (b*100);
if ( inclusive > 19 ){
    c = inclusive / 10; 
    inclusive = inclusive - (c*10);
}
else
{
    c = inclusive;
    d = 0;
}
    d = inclusive;
    num = inclusive;
    cents = (inclusive - num)*100; //To calculate our "Cents" with numerals.
    printcents = cents;


          /*Printing if the variables are in the thousands, hundreds, tens or ones categories.*/
if (a > 0){ 
    printNum(a);  
    printf("Thousand ");
}
if (b > 0){
    printNum(b);
    printf("Hundred ");
}
    printNum2(c);   
if (d > 0){
    printNum(d);
    printf("Dollars and ... ");
}
else if (d == 0){
    printf("Zero Dollars and ... ");
}
    printf("%d", printcents);
    printf(" Cents\n");
    }
}

void printNum(int x)  //Created functions to easily output various if statements.
{

if ( x == 1)
    printf("One ");
else if ( x == 2)
    printf("Two ");
else if (x == 3)
    printf("Three ");
else if (x == 4) 
    printf("Four ");
else if (x == 5)
    printf("Five ");
else if (x == 6)
    printf("Six ");
else if (x == 7)
    printf("Seven ");
else if (x == 8)
    printf("Eight ");
else if (x == 9)
    printf("Nine ");

}
void printNum2(int x)
{
 if ( x == 10)
     printf("Ten ");
 else if ( x == 11)
     printf("Eleven ");
 else  if ( x == 12)
     printf("Twelve ");
 else if ( x == 13)
     printf("Thirteen ");
 else if (x == 14)
     printf("Fourteen ");
 else if (x == 15)
     printf("Fifteen ");
 else if (x == 16)
     printf("Sixteen ");
 else if (x == 17)
     printf("Seventeen ");
 else if (x == 18)
     printf("Eighteen ");
 else if (x == 19)
     printf("Ninteen ");
 else if (x == 2)
     printf("Twenty ");
 else if (x == 3)
     printf("Thirty ");
 else if (x == 4)
     printf("Forty ");
 else if (x == 5)
     printf("Fifty ");
 else if (x == 6)
     printf("Sixty ");
 else if (x == 7)
     printf("Seventy ");
 else if (x == 8)
     printf("Eighty ");
 else if (x == 9)
     printf("Ninety ");
}
Derrick Rose
  • 664
  • 2
  • 9
  • 21
  • 1
    Change `else if (d == 0){` --> `else if (d == 0 && c == 0 && b == 0 && a == 0){` – chux - Reinstate Monica Jun 13 '15 at 01:39
  • 3
    Storing currency, or any value requiring exact precision, in `float` is seldom a good idea, for the _binary_ floating point number cannot accurately represent _decimals_. `double` would probably suffice for _displaying_ values that would realistically go on a cheque, but even so it would be better to use a decimal type (for this use you could easily make a decimal fixed point representation by simply using an integer number of cents). – Arkku Jun 13 '15 at 01:41
  • Indenting your code properly will make it a lot easier to read. Exiting when the amount was wrong will avoid an indent level too. – M.M Jun 13 '15 at 02:03
  • @chux Thanks I used the code you wanted me to change, and everything works terrific, however when I input "0.01" in my scanf all I get is "Dollars and ... 1 Cents" What can I do so that it says "Zero Dollars and 1 Cents"? – Derrick Rose Jun 13 '15 at 02:15
  • Likely your `a,b,c,d` has a _small_ value remaining in due to typical floating point issue. I'll undelete a former asnwer - the advice may help. Overall, I would recommend a re-write using integer math. – chux - Reinstate Monica Jun 13 '15 at 02:45

1 Answers1

1

Various subtractions like inclusive = inclusive - (c*10) are suffering round-off error and therefore have a tiny amount left when doing if (d > 0).

Suggest rounding to nearest 0.01. Example: inclusive = round(100*(inclusive - (c*10)))/100.0 and other places.

Or re-do all in integer number of cents.

chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256