Page 1 of 212> Show 40 post(s) from this thread on one page

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/forums/cpp/)
-   -   Code Help (http://www.go4expert.com/forums/code-help-t16106/)

 carvin317 6Feb2009 21:30

Code Help

Hey guys im new I was wondering how to do something in my new program and im stumped.

I have a program that prices and i have 5 states

GA
FL
SC
TN
AL

the program asks the user what state they live in. I want to associate the tax to state so Ga=.06, FL=.04, SC=.05, TN=.06, AL=.02, & Other=No Tax Applied.

So my question is how do i declare the states to represent a numeric value.

Im going to plug it into a formula that i have for example.

Ftotalprice=(Fgallons*Fprice)State

Any Help would be great thanks

 xpi0t0s 7Feb2009 00:25

Re: Code Help

You want a lookup table that associates the state ID with its tax bracket. This could be in the form of a couple of arrays, e.g. one that lists the states and one that lists the taxes:
Code:

```char *states[]={"GA","FL","SC"}; float taxes[]={0.06,0.04,0.05};```
then a loop that looks for the state and picks out the tax:
Code:

```float tax=0.0; for (int i=0; i<3; i++)   if (!strcmp(test_state, states[i]))     tax=taxes[i];```

 carvin317 10Feb2009 20:18

Re: Code Help

okay that kind of makes sense to me, like i said im a beginner programmer so where would the

"char *states[]={"GA","FL","SC"};
float taxes[]={0.06,0.04,0.05};"

be placed ?

and what about if the state is something other than that like TX will that just assume it as zero ?

 carvin317 10Feb2009 20:21

Re: Code Help

i guess there isnt an edit button, I found where to put, but i guess my question is now how do i add all the rest of the states without really adding them ? is there way i can say if it is not listed do not tax ? or is that implied

 cpulocksmith 11Feb2009 01:56

Re: Code Help

i think you could just put... under your if statement ...

Code:

`else {tax = 0};`
i guess it really depends on how you did the rest of your code. if you post the whole code i could tell ya... i love debugging <3... its like a hobby ^^

 xpi0t0s 11Feb2009 04:50

Re: Code Help

No, you wouldn't put "else tax=0" after the if, that would just set tax(which is already 0) to 0 again unnecessarily. The way my suggestion code works is that it sets tax to 0 then looks at states it knows about, only setting the tax rate if it finds one. If it doesn't find one then tax is unchanged from the default zero.

You would place this code iin the function that calculates the tax, perhaps, or maybe make it a global, depending on the design. It depends really how many functions need access to that data. Global variables are generally considered evil because of the dependencies they create, but this would be global static data so I think the rules are probably not as strict. But get used to localisation of data, it's good practice. So for example (untested code):

Code:

```double calc_tax(double price,char *state) {   char *states[]={"GA","FL","SC"};   double taxes[]={0.06,0.04,0.05};   double tax=0.0;   for (int i=0; i<3; i++)     if (!strcmp(test_state, states[i]))       tax=taxes[i];   double total_price=price*(1.0+tax);   return total_price; }```
To extend this to more states just add the states and the tax rate to the arrays and increase the loop termination constant from 3.
Code:

```  char *states[]={"GA","FL","SC","UK"};   double taxes[]={0.06,0.04,0.05,0.15}; ...   for (int i=0; i<4; i++) // note change from 3 to 4 ...```
Of course, keeping the constant in line with the arrays is tedious, perhaps you might use an array entry to indicate end of the array:
Code:

```  char *states[]={"GA","FL","SC","UK","X"};   double taxes[]={0.06,0.04,0.05,0.15}; ...   for (int i=0; states[i][0]!='X'; i++) ...```
Note the difference between "X" and 'X'. "X" is equivalent to 'X','\0' - because strings are char constants plus a terminating zero. 'X' is an integer constant and can be compared with operators like !=, but "X" cannot be compared in the same way, you must use strcmp. "X"[0]='X' so we use states[i][0]!='X' to check for the end of the array.

"X"[0] is actually a valid C expression, try printf("%c","X"[0]); and maybe some variations like printf("%c","Hello"[2]); and because of the way the square brackets work "Hello"[2] is identical to 2["Hello"] (try it! you won't break your computer, although you might confuse the hell out of people trying to read your code).

Lots for you to have a play with there :-)

 carvin317 11Feb2009 05:21

Re: Code Help

Okay here is my whole code. I went with an if else statement to do it, but for some weird reason it is not working how i want it. when i run the program it says with tax 0 and i know that is not right. The problem with setting the tax as 0 is that when it runs i multiplies the cost of the paint by 0 resulting in the price being zero. so i guess i would need for any other state not listed to skip that step. If any of you could help me i would literally donate to the site.

Code:

```/*Program: PaintModule   Programmer: Nathan Marcarelli   Date: 01/22/09   Prgoram:ModuleProgram.cpp   Version:1 */ /*-------------------------PREPROCESSING DIRECTIVES-----------------------------------------------------*/ #include <iostream> #include <iomanip> #include <cmath> #include <cctype> #include <cstdlib> #include <cstring>         using namespace std; /*-------------------------FUNCTION PROTOTYPES----------------------------------------------------------*/  void GetRoomDimensions(void);  void PerformCalc(void);  void PerformSalesCalc(void);  //tc prototype  void PrintOutput(void);  void GetName(void);  void RepeatCode (void);  void LoopQuestion (void);  void DisplayHeader(void);                         void Dashes(void);                         void SalesDayScreen (void);  void Center (char *s);     /*-----------------------Global Variables--------------------------------------------------------------*/         //input variables         float Flength;         float Fwidth;         float Fheight;         char sCname[25];         char sRepeat;         char sSales='Y';         char sState[3];         //Calculated Data         float Farea;                                // = wall 1 + wall 2         float Fwall1;                                // Length * Height *2         float Fwall2;                                // Width * Height *2         float Fareagallon;                        // Amount of area a gallon will cover         float Fgallons;                                // Total Number of gallons it will take to paint         float Fbeforediscount;                //before discount         float Fafterdiscount;                //After discount         float Ftax;                                        //With Tax         float Fcostper;                                //Cost per gallon of paint         float Famountoff;                        //amount off discount /*--------------------Main Module------------------------------------------------------------------*/         int main ()         {                 SalesDayScreen();                 //tc I would consider moving this logical comparison further                 //down the line.  In other words, you do not need an entire                 //routine called SalesPath.  All you really need is the if                 //statement surrounding the check to see if you need to call PerformSalesCalc                                         GetRoomDimensions();                 if (sSales=='Y')                                                         {                                         PerformSalesCalc();                                 }                                 PerformCalc();  //tc note: Fafterdiscount will need to be set to                                                 //the cost before discount if it is not a sales day.                 PrintOutput();                 LoopQuestion();                 system("pause");                         return 0;                 }         /*----------------------------------------------------------------------------------------------------- Name: SalesDayScreen Desc: Asks user if it is a sales day Return: Void Parameters: Void ---------------------------------------------------------------------------------------------------*/ void SalesDayScreen (void) {                DisplayHeader();         Center("Acme Paint Shop - Sales Day Question");         Dashes();         cout<<"Is it a sales day (Y/N)?";         cin>>sSales;         cin.ignore();         return; } /*----------------------------------------------------------------------------------------------------- Name: GetName        Desc: Gets Name Return: Void Parameters: Void ---------------------------------------------------------------------------------------------------*/ void GetName (void) {                 cout<<"Enter the customer's first and last name?";         cin.getline(sCname, 25);                 return; } /*----------------------------------------------------------------------------------------------------- Name: GetRoomDimensions Desc: Gets Room Dimensions Return: Void Parameters: Void ---------------------------------------------------------------------------------------------------*/         void GetRoomDimensions(void)         {                                 DisplayHeader();                 Center("Acme Paint Shop - Input");                 Dashes();                 GetName();                 cout<<"What is the length of the room in feet?";                 cin>> Flength ;                 cout<<"What is the width of the room in feet?";                 cin>>Fwidth;                 cout<<"What is the height of the room in feet?";                 cin>>Fheight;                 cout <<"What is the area covered by a gallon of paint?";                 cin>>Fareagallon;                 cout <<"What is the cost of paint per gallon?";                 cin >> Fcostper;                 cout<<"What state are you located?";                 cin>>sState;                                 system("cls");                                                 return;         }         /*--------------------------------------------------------------------------------------------------------- Name:PerformCalc Desc:Calculate Area Return: Void Parameters:Void ----------------------------------------------------------------------------------------------------------*/         void PerformCalc (void)         {         Fwall1 = (Flength * Fheight)* 2;         Fwall2 = (Fwidth * Fheight) * 2;         Farea = (Fwall1+ Fwall2);         Fgallons = Farea/Fareagallon;         Fbeforediscount = ceil(Fgallons) *  Fcostper;                         if (sState=="GA")         {                                 Ftax = Fbeforediscount * 0.06f;         }                         else if (sState=="FL")         {                                Ftax=Fbeforediscount*0.04f;         }                else if (sState=="SC")         {                                        Ftax=Fbeforediscount*0.05f;         }                        else if (sState=="TN")         {                                        Ftax=Fbeforediscount*0.06f;         }         else if (sState=="AL")         {                 Ftax=Fbeforediscount*0.02f;         }         Ftax *= Fbeforediscount;         return;         } /*--------------------------------------------------------------------------------------------------------- Name:PerformSalesCalc Desc:Calculate Area Return: Void Parameters:Void ----------------------------------------------------------------------------------------------------------*/ void PerformSalesCalc (void) {         Fwall1 = (Flength * Fheight)* 2;         Fwall2 = (Fwidth * Fheight) * 2;         Farea = (Fwall1+ Fwall2);         Fgallons = Farea/Fareagallon;         Fbeforediscount = ceil(Fgallons) *  Fcostper;         if (Fgallons==1)         {                                 Famountoff = Fcostper * .05f;         }                         else if (Fgallons <=3 && Fgallons >=2)         {                                Famountoff = Fcostper * .10f;         }                else if (Fgallons == 4)         {                                        Famountoff = Fcostper * .15f;         }                        else if (Fgallons >=5)         {                                        Famountoff = Fcostper * .25f;         }         //tc 1. move the call to after the Famountoff calculation         //tc the calculation is not correct.  Look at Famoutoff. Haven't         //you already multiplied the cost per can by the discount amount?         Fafterdiscount=ceil(Fgallons)* (Fcostper-Famountoff);         //State Tax                 if (sState=="GA")         {                                 Ftax=Fafterdiscount*0.06f;         }                         else if (sState=="FL")         {                                Ftax=Fafterdiscount*0.04f;         }                else if (sState=="SC")         {                                        Ftax=Fafterdiscount*0.05f;         }                        else if (sState=="TN")         {                                        Ftax=Fafterdiscount*0.06f;         }         else if (sState=="AL")         {                 Ftax=Fafterdiscount*0.02f;         }         Ftax *= Fafterdiscount;                                 return; } /*----------------------------------------------------------------------------------------------------------- Name:PrintOutput Desc:Display Output on Monitor Return:Void Parameter: Void ------------------------------------------------------------------------------------------------------------*/         void PrintOutput (void) {         DisplayHeader();         Center("Acme Paint Shop - Single Customer Calculation");         Dashes();         cout <<endl;         cout<<"Customer Name (first and last):"<<sCname;         cout<<endl;         cout <<"Number of gallons needed: ";         cout <<ceil(Fgallons);         cout <<endl;         cout <<"Cost before discount \$";         cout <<Fbeforediscount;         cout << endl;         cout<<"Cost after discount \$";         cout <<Fafterdiscount;         cout<<endl;         cout<<"Cost with Tax \$";         cout<<Ftax;         cout<<endl;                 return;         } /*----------------------------------------------------------------------------------------------------- Name: RepeatCode        Desc: Code Inside Loop Return: Void Parameters: ---------------------------------------------------------------------------------------------------*/   void RepeatCode () {         DisplayHeader();         GetName();         GetRoomDimensions();         PerformSalesCalc ();         PrintOutput();         LoopQuestion();                                                           return;   }                 /*----------------------------------------------------------------------------------------------------------- Name:Loop Desc:Loops Program Return:Void Parameter: Void ------------------------------------------------------------------------------------------------------------*/         void LoopQuestion (void) {         cout<<endl;         cout <<"Do you want to continue (Y/N)?";         cin >>sRepeat;         sRepeat = toupper(sRepeat);         system("cls");         cin.ignore(); //tc         return;                 } /*----------------------------------------------------------------------------------------------------------- Name:Display Header Desc:Display Header Return:Void Parameter: Void ------------------------------------------------------------------------------------------------------------*/         void DisplayHeader (void) {         system("cls");         Dashes();         return;         } /*----------------------------------------------------------------------------------------------------------- Name:Dashes Desc:Displays Dashes Return:Void Parameter: Void ------------------------------------------------------------------------------------------------------------*/         void Dashes (void) {         int iCounter=0;                 for(iCounter = 0; iCounter <=79; ++iCounter)         cout<< "*";         return;         } /*----------------------------------------------------------------------------------------------------------- Name:Center Desc:Centers Text ------------------------------------------------------------------------------------------------------------*/ void Center(char *s) {   int len;   len = 42+(strlen(s)/2);   cout.width(len);   cout << s << '\n'; }```

 xpi0t0s 11Feb2009 18:13

Re: Code Help

Code:

`if (sState=="GA")`
Yep, that's precisely what I said you CAN'T do. To compare strings you have to use strcmp:
Code:

`if (!strcmp(sState,"GA"))`

 xpi0t0s 11Feb2009 18:20

Re: Code Help

There is ONE scenario in which state=="GA" will work, and I've used it in the past as a space optimisation technique. If state is a char* and NOT a char[], AND you specify a compiler flag that merges (i.e. stores at the same location in static data) duplicate strings so "GA" will always evaluate as same memory location, AND you initialise state with those same strings, e.g. char *state="GA", THEN AND ONLY THEN can you expect state=="GA" to return TRUE.

The only other way to make something like state=="GA" return TRUE is to declare state as a C++ std::string. This class implements operator==(char*) (or something similar) and basically performs a strcmp behind the scenes for you.

 carvin317 11Feb2009 21:27

Re: Code Help

okay so now im onto data validation. When it asks for how much a gallon of pain is i want the numeric number to be between 1-50 if it is not i want a message to display enter a number between 1-50 and have the question asked again and then when they do it move onto the next question. would that be a do while loop ? am i on the right track?

Code:

``` do{         cout <<"What is the cost of paint per gallon?";                 cin >> Fcostper;                 cout<<endl;        }        while (Fcostper < 0 || Fcostper >50)                 cout<<"What state are you located?";                 cin>>sState;                 cout<<endl;```

 All times are GMT +5.5. The time now is 23:29. Page 1 of 212> Show 40 post(s) from this thread on one page