C Board  

Go Back   C Board > General Programming Boards > C Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 11-08-2009, 10:39 AM   #1
Registered User
 
Join Date: Oct 2009
Posts: 7
Error checking issues

This program compiles, builds and runs; however, I am having 2 issues with the error checking in the program. The first issue is that when I choose case 4 to exit the program you get an error message to enter a valid choice; however, when you re-enter 4, the program decides to work and tells you to press enter to exit the program. The second issue is that when you choose a location and enter a valid numerical value the program continues; however, when you enter a letter or invalid input, the program goes into an endless loop. Any help would be greatly appreciated, thanks.

The code is below:

Code:
#include <stdio.h>
#include <system.h>
#include <ctype.h>
#include <stdlib.h>

/*The main function*/
void main()
{

char Purchase[32]; /* Declare variables */

int i,Return=0;

/*Variables for tax calculator*/
     int iResponse;
     #define DelMarRate 7.25 
     #define EncinitasRate 7.5
     #define LaJollaRate 7.75
     float DelMarTax = 0.0;
     float EncinitasTax = 0.0;
     float LaJollaTax = 0.0;
     float Amount = 0.0;
           
/*Sales tax calculations for each of Kudler's locations*/
     
     DelMarTax = Amount * DelMarRate / 100;
     EncinitasTax = Amount * EncinitasRate / 100;
     LaJollaTax = Amount * LaJollaRate / 100;
    
/*Menu to chose location*/
	printf("\n*********************************");
   	printf("\n* Welcome to Kudler Fine foods! *");
   	printf("\n*********************************");
   	printf("\n\n");
	
	printf("\n1. Del Mar\n");
	printf("\n2. Encinitas\n");
	printf("\n3. La Jolla\n");
	printf("\n4. End Program\n");
	
	printf("\nPlease Choose Kudler Location or 4 to exit: ");//Lets user know what tp input
	
	do {    /*Start loop*/  
 
	scanf("%d", &iResponse);
		if  (iResponse == 1 || iResponse <= 3) //Validates user input 
		{
		printf("\n\nPlease Enter the customer's purchase amount:$"); //display for user and prompt for input
		}
		else  	
		{
		printf("\nInvalid entry. Please select another option!\n");//Shows error and prompts user for a correct entry
		}
			
	scanf("%f", &Amount);	
	
     switch (iResponse){ /*Switch for case selection*/
   
/*Displays cases for tax calculation output*/  
       case 1: /*Tax Calculation output for Del Mar*/
       
        for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
            
	  DelMarTax = Amount * DelMarRate / 100;
          printf("\nDel Mar Tax on $%.2f = $%4.2f; Total = $%4.2f",Amount,DelMarTax,Amount+DelMarTax);
          printf("\n\n\n");                   
          printf("\nChoose another city or 4 to exit program: ");/*prompt user for input*/
          break;
      
       case 2: /*Tax Calculation output for Encinitis*/
       
          for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
            
	  EncinitasTax = Amount * EncinitasRate / 100;
          printf("\nEncinitas Tax on $%.2f = $%4.2f; Total = $%4.2f",Amount,EncinitasTax,Amount+EncinitasTax); 
          printf("\n\n\n");       
          printf("\nChoose another city or 4 to exit program: ");/*prompt user for input*/
          break;
     
       case 3: /*Tax Calculation output for LaJolla*/
       
          for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
            
	  LaJollaTax = Amount * LaJollaRate / 100;
          printf("\nLa Jolla Tax on $%.2f = $%4.2f; Total = $%4.2f",Amount,LaJollaTax,Amount+LaJollaTax); 
          printf("\n\n\n");      
          printf("\nChoose another city or 4 to exit program: ");/*prompt user for input*/
          break;           
 
       case 4:
       
        printf("\nThank You for using the Kudler Fine Foods Tax Calculator\n"); //ends program	
	printf("\n\nPlease Press The Enter Key To Exit Program!\n\n");
	} /*End Switch*/
	}  while (iResponse!=4); /*End while loop*/

 scanf("%c\n");     
}/*end main*/
mistymoon1966 is offline   Reply With Quote
Old 11-08-2009, 10:58 AM   #2
Epy
I like turtles
 
Join Date: Sep 2009
Location: Ohio
Posts: 179
Code:
(iResponse == 1 || iResponse <= 3)
iResponse == 4 will make it go to the else part and say invalid entry. Should be iResponse <= 4
__________________
Jake, that CAD guy
Hazudra Fodder
Epy is offline   Reply With Quote
Old 11-08-2009, 11:01 AM   #3
Epy
I like turtles
 
Join Date: Sep 2009
Location: Ohio
Posts: 179
Also, it looks like your program scans for the amount even if an invalid entry is pressed. You should have it keep prompting for the iResponse until it's a valid entry.
__________________
Jake, that CAD guy
Hazudra Fodder
Epy is offline   Reply With Quote
Old 11-08-2009, 11:15 AM   #4
Registered User
 
Join Date: Oct 2009
Posts: 7
Okay, I changed
Code:
 (iResponse == 1 || iResponse <= 3)
to
Code:
 (iResponse == 1 || iResponse <= 4)
I still have to hit 4 2 times to exit the program as now I am asked to enter an amount when I hit 4 so this did not work. Also, I still have an endless loop if I enter an invalid entry in the amount of purchase for the location. Thanks.
mistymoon1966 is offline   Reply With Quote
Old 11-09-2009, 09:11 AM   #5
Registered User
 
Join Date: Oct 2009
Posts: 7
Finally, the program works good except for 1 last issue. The last issue is that, in the input checking for the calculation for each case, if I enter a non-numeric value, I get an endless loop, any suggestions. The code that gives me an endless loop if I enter a non-numeric value when the program asks for a purchase amount is:

Code:
case 1: /*Tax Calculation output for Del Mar*/
       
      do{
      Return = 0;
        /* Loop - Test the numeric values*/ 
        for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
                             
	}while (Return == 1);
The complete program code is:

Code:
#include <stdio.h>
#include <system.h>
#include <ctype.h>
#include <stdlib.h>

/*The main function*/
void main()
{

char Purchase[32]; /* Declare variables */

int i,Return=0;

/*Variables for tax calculator*/
     int iResponse;
     #define DelMarRate 7.25 
     #define EncinitasRate 7.5
     #define LaJollaRate 7.75
     float DelMarTax = 0.0;
     float EncinitasTax = 0.0;
     float LaJollaTax = 0.0;
     float Amount = 0.0;
           
/*Sales tax calculations for each of Kudler's locations*/
     
     DelMarTax = Amount * DelMarRate / 100;
     EncinitasTax = Amount * EncinitasRate / 100;
     LaJollaTax = Amount * LaJollaRate / 100;
    
/*Menu to chose location*/
	printf("\n*********************************");
   	printf("\n* Welcome to Kudler Fine foods! *");
   	printf("\n*********************************");
   	printf("\n\n");
	
	printf("\n1. Del Mar\n");
	printf("\n2. Encinitas\n");
	printf("\n3. La Jolla\n");
	printf("\n4. End Program\n");
	
	printf("\nPlease Choose Kudler Location or 4 to exit: "); /*requests user input*/
	do {    /*Start loop*/  
 
	scanf("%d", &iResponse);
        if  (iResponse == 1 || iResponse <= 4) /*validates user input*/
        { 
          if(iResponse == 1 || iResponse <= 3)
              {
                   printf("\n\nPlease Enter the customer's purchase amount:$");
                   scanf("%f", &Amount);	
               }
        }
        else     
        {
        printf("\nInvalid entry. Please select another option!\n");/*shows error*/
        }
	
     switch (iResponse){ /*Switch for case selection*/
   
	/*Displays cases for tax calculation output*/  
      case 1: /*Tax Calculation output for Del Mar*/
       
      do{
      Return = 0;
        /* Loop - Test the numeric values*/ 
        for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
                             
	}while (Return == 1);
            
	  DelMarTax = Amount * DelMarRate / 100;
	  
          printf("*************************************************\n");
          printf("\nDel Mar Tax on $%.2f = $%4.2f; Total = $%4.2f",Amount,DelMarTax,Amount+DelMarTax);
          printf("\n\n\n");                   
          printf("\nChoose another location or 4 to exit program: ");/*prompt user for input*/
          break;
      
       case 2: /*Tax Calculation output for Encinitis*/
       
       do{
       Return = 0;
       
        /* Loop - Test the numeric values*/ 
        for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
                             
	}while (Return == 1);
            
	  EncinitasTax = Amount * EncinitasRate / 100;
	  
	  printf("*************************************************\n");
          printf("\nEncinitas Tax on $%.2f = $%4.2f; Total = $%4.2f",Amount,EncinitasTax,Amount+EncinitasTax); 
          printf("\n\n\n");       
          printf("\nChoose another location or 4 to exit program: ");/*prompt user for input*/
          break;
     
       case 3: /*Tax Calculation output for LaJolla*/
       
       do{
       Return = 0;
       
        /* Loop - Test the numeric values*/ 
        for(i=0; Purchase[i]; i++) 
        {
            if(Purchase[i] < '0' || Purchase[i] > '9') /* Test for a numeric value (0-9) */
            {
            if (Purchase[i] == '.') /* If character is a decimal continue */
            continue;
                else
                Return=1; /* Set Non-Numerical Value flag */
                break; 
            } 
        }

            if (Return == 1) /* If Non-Numerical Value print Error Message and allow user to re-enter purchase price */
            {
                printf("\n\nError! Invalid Purchase Amount [ %s ]\n",Purchase);
                fflush(stdin);
                printf("\n\nPlease Re-enter Purchase Amount:$"); 
                scanf("%s", Purchase);                
            } 
                             
        }while (Return == 1);

	  LaJollaTax = Amount * LaJollaRate / 100;
	  
	  printf("*************************************************\n");
          printf("\nLa Jolla Tax on $%.2f = $%4.2f; Total = $%4.2f",Amount,LaJollaTax,Amount+LaJollaTax); 
          printf("\n\n\n");      
          printf("\nChoose another location or 4 to exit program: ");/*prompt user for input*/
          break;           
 
       case 4:
       
        printf("\nThank You for using the Kudler Fine Foods Tax Calculator\n");   
    	printf("\n\nPress The Enter Key To Exit Program!\n\n");

    	
	break;
	default:
	printf("\n\nPress 4 to Exit Program!\n\n");

	} /*End Switch*/
	}  while (iResponse!=4); /*End while loop*/

 scanf("%c\n");
      
}/*end main*/
The program works great as long as a non-numeric value is not entered after the user enters a location option and the program asks for a purchase amount. Thanks a lot for all your help everyone.
mistymoon1966 is offline   Reply With Quote
Old 11-09-2009, 09:43 AM   #6
Jack of many languages
 
Join Date: Nov 2007
Location: Katy, Texas
Posts: 1,929
Check the return value of scanf() for the numeric value. If zero, suck a character out of the buffer and try again.
__________________
Mac and Windows cross platform programmer. Ruby lover.

Memorable Quotes From Recent Posts:

I can't remember.
Dino is offline   Reply With Quote
Old 11-09-2009, 10:20 AM   #7
Registered User
 
Join Date: Oct 2009
Posts: 7
how do I check the return value of scanf(), thanks.
mistymoon1966 is offline   Reply With Quote
Old 11-09-2009, 11:53 AM   #8
Jack of many languages
 
Join Date: Nov 2007
Location: Katy, Texas
Posts: 1,929
int return_value = scanf(......) ;
if (return_value == ......) { ... }
else { .... }
__________________
Mac and Windows cross platform programmer. Ruby lover.

Memorable Quotes From Recent Posts:

I can't remember.
Dino is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Serious template issues (!!!) Mikal C++ Programming 2 07-23-2009 08:46 AM
issues OrAnGeWorX C Programming 35 11-19-2008 12:18 AM
Bitmap scroll issues Gerread Windows Programming 4 05-14-2007 05:18 AM
Directx issues dpro Game Programming 7 03-30-2005 01:58 PM
hexdump issues daluu C Programming 2 03-04-2003 09:01 PM


All times are GMT -6. The time now is 05:29 PM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22