Tilted Forum Project Discussion Community

Tilted Forum Project Discussion Community (https://thetfp.com/tfp/)
-   Tilted Technology (https://thetfp.com/tfp/tilted-technology/)
-   -   [C] Help Im getting some strange answers (https://thetfp.com/tfp/tilted-technology/77614-c-help-im-getting-some-strange-answers.html)

zero2 12-02-2004 04:06 PM

[C] Help Im getting some strange answers
 
Im a beginner at C, and I need some help.

The problem that I have is a problem that calculates parking fee based on several variables.

For instance if it is a car then the first 3 hrs is free, if after 3 hrs 1.50. There's also two more vehicles such as a truck & bus that have unique rates.

Also if the vehicle is parked beyond midnight the vehicle is towed. Time is based on military time ex. 1:00 p.m. is 13:00.

The way that the book wants the info entered is with 5 scanf statements:

Type of vechicle?

Hour vehicle entered lot (0 - 24)?

Minute vehicle entered lot (0 - 59)?

Hour vehicle left lot (0 - 24)?

Minute vehicle left lot (0 - 59)?


So basically I have 4 integers named hrEnter, minEnter, hrOut, minOut. To evaluate the time as a whole I convert them to a float, using a modulo, and add them to the hr variable ex.(12hr + .20min = 12.20). Because I did it this way I get this weird error saying : error C2296: '%' : illegal, left operand has type 'float'. Plus, I get a bunch of these warning C4244: '=' : conversion from 'double' to 'float', possible loss of data.

Besides that, I just found another problem it mentions something about rounding the min. of to the next hour before creating the charge, I've never learned how to do that? This situation seems to get worse everytime I look at it.

I pretty much kind of have the logic worked out, but I'm not sure on a couple of things, such as rounding numbers.

Here's some of the code that I started:

Code:


/* This is Problem 58, Chapter 5 in the C book
Writen By: zero2
*/
#include <stdio.h>
int main (void)
{
/* Local Definitions */
char vehicle;
float bill;
int hrEnter;
int minEnter;
int hrOut;
int minOut;
float minFin;
int hrFin;
float time;


/* Statements */
printf("Type of vechicle?\n");
scanf("%c", &vehicle);
printf("Hour vehicle entered lot (0 - 24)?\n");
scanf("%d", &hrEnter);
printf("Minute vehicle entered lot (0 - 59)?\n");
scanf("%d", &minEnter);
printf("Hour vehicle left lot (0 - 24)?\n");
scanf("%d", &hrOut);
printf("Minute vehicle left lot (0 - 59)?\n");
scanf("%d", &minOut);

if (minEnter > minOut)
{
        minFin = minOut + 60;
        minFin = (minFin - minEnter) %100 ;
        hrFin = hrOut - 1;
        hrFin = hrFin - hrEnter;
        printf("%d : %2.2f\n", hrFin, minFin);
}
else
{       
hrFin = hrOut - hrEnter;
        minFin = (minOut - minEnter) %100;
        printf("%d : %f\n", hrFin, minFin);
}
if (hrFin < 0)
{
        printf("Vehicle later than midnight-Tow\n");
}
if (vehicle = 'c')
        if (hrFin <= 3)
        {
                bill =  0.00;
                printf("bill for car: %2.2f\n", bill);
        }
        else
        {
                time = hrFin + minFin;
                printf("time is %.2f", time);
                bill = (time - 3.00) * 1.50;
printf("bill for car: %.2f\n", bill);
        }
if (vehicle = 't')
{
        if (hrFin <= 2)
       
                time = hrFin + minFin;
                bill = time * 1.00;
                printf("bill for truck: %.2f\n", bill);
        }
        else
        {
                time = hrFin + minFin;
                bill = ((time - 2.00) * 2.30) + 2.00;
                printf("bill for truck: %.2f\n", bill);
        }
    return 0;
}
/* main */
/* Results: */

TIA, I appreciate any help or suggestions.

Rawb 12-02-2004 04:58 PM

My inital suggestion would be to calculate everything in minutes. Then you are always dealing with whole numbers, so you never calculate a total of 3.955555555555 for someone's bill. I have built large-scale billing systems for a few companies, and the first thing you learn is that you never calculate anything as a float that you can calculate as an int.

Next off, you cannot use modulo division (the %) on a float because there is no remainder when dividing floats. They are floating point numbers, so 7.0/3.0 = 2.333333, not 2 remainder 1.

Let me know if you need some more help, other than my random points of style.

zero2 12-02-2004 07:34 PM

This program is really killing me, I've gone over it at least a dozen times.

The thing is that in the instructions they need each variable to be seperate, hrIn, hrOut, minIn, minOut, and they all have to start out as an integer. For example:
Code:

ex. out @ 4:15
    -
    in @ 2: 45
----------------

The problem above is normally evaluated by subtracting the time out by the time in. However, since the hrs and mins are broken up if we try to do this in this case by subtracting 15 represented by minOut - 45 minIn we get a negative answer.

This is where you have this crazy calculation: if the minOut is < the minIn;
Add 60 min. to minOut, now subtract the total off minOut - minIn, finally subtract 1 from hrOut.

Code:

ex. out @ 4:15
    -
    in @ 2: 45
----------------
new totals:

out @ 3:75(added 60min. to 15min.)(subtracted 1hr from 4hrs)
    -
    in @ 2: 45
----------------
            1:30 (This the time spent in the garage calculated by subtracting out - in)

Now the thing is that even after those calculations you still have two seperate integers. One that keeps track of hr, and one that keeps track of min. which is pretty much useless because you can't calculate a bill unless of course we can round the 30 and change the 1 to a 2, but I don't know how to do that either. So what I did, was use a modulo, but it only return remainders so I guess I should of used division instead to convert an integer to a float??

Code:

for example if the minute is 30, I would do the following 30 / 100 to get 0.30 then add the hr which is 1 to 0.30, to get 1.30.  Then I possibly could round 1.30 up by formating the %f statement??

out @ 3:75
    -
    in @ 2: 45
----------------
          1:30

 hr 1
+
  0.30
-------
1.30

Finally now we can use 1.30 to calculate parking fee, maybe, if it works, that is.

As you can tell Im pretty much losing it, I gonna give it another attempt this time trying division, instead of modulo, I think that's the only thing I can think of at this point.

a-j 12-02-2004 09:56 PM

It sounds like you pretty much got everything figured out, here is another way by converting everything to minutes like aoeuhtns suggested.
Code:

mins = 60*(hrOut - hrIn) + (minOut - minIn);

//Find number of hours rounded up
hours = (mins+59)/60;


Rawb 12-02-2004 10:23 PM

Minutes are sections of an hour, each one is 1/60th, or 0.01666666666 of an hour, which doesn't make for easy, or accurate math. However, an hour converts into 60 minutes, which looks like a nice and easy round integer to me.

The formula that a-j gave you should let you calculate the entire time that they are in the parking garage. One point of style I would like to impress on you is this. "Programming languages have no order of operation" (in reality they do, but, instead of relying on it, use extra ()'s to SHOW what you mean, it works out in your favor at 11:30 at night when you are finishing of your second margirita). So instead of what a-j wrote, I would use the exact same thing, but I would put in some extra verboseness to make it look like this:
mins = (60*(hrOut - hrIn)) + (minOut - minIn);

zero2 12-02-2004 11:09 PM

Excellent, I don't have to convert anything. Thanks again for helping me out, a-j & aoeuhtns.

zero2 12-03-2004 10:54 AM

Im still having some problems with the time, I used some test data to test the formula, and these are the results I get.

14: 22 Out
12: 40 In
------------

and I get 2.68 as the answer, instead of 1.42.

I also tested:

8 : 40 Out
8 : 20 In
------------

And I got 1. 20 instead of .20

This is the output I got after entering it into the program, also Im not sure why everything is printing out, it should only print one statement, instead it prints out both truck and bus:
Code:

Type of vehicle?
c
Hour vehicle entered lot?
8
Minute vehicle entered lot?
20
Hour vehicle left lot?
8
Minute vehicle left lot?
40
1 : 20<---- This time spent in parking lot

                PARKING LOT CHARGE

                Type of Vehicle: Car
                TIME-IN                8 : 20
                TIME-OUT              8 : 40
                                          --------

                PARKING TIME        1 :1
                ROUNDED TOTAL            0
                                          --------
                TOTAL CHARGE      $ 0.000000

                PARKING LOT CHARGE

                Type of Vehicle: Truck
                TIME-IN                8 : 20
                TIME-OUT              8 : 40
                                          --------

                PARKING TIME        1 :20
                ROUNDED TOTAL          0
                                          --------
                TOTAL CHARGE      $ 1.000000

                PARKING LOT CHARGE

                Type of Vehicle: Bus
                TIME-IN                8 : 20
                TIME-OUT              8 : 40
                                          --------

                PARKING TIME        1 :20
                ROUNDED TOTAL          0
                                          --------
                TOTAL CHARGE      $ 2.000000
Press any key to continue

Here's how I coded it:

Code:

/*        This program is created by: A Frustrated Programmer
*/
#include <stdio.h>

int main (void)
{
/*        Local Definitions */
        char vec;
        int hrIn;
        int hrOut;
        int minIn;
        int minOut;
        int min;
        int hour;
        float fee;
        int round;

/*        Statements */
        printf("Type of vehicle?\n");
        scanf("%c", &vec);
        printf("Hour vehicle entered lot?\n");
        scanf("%d", &hrIn);
        printf("Minute vehicle entered lot?\n");
        scanf("%d", &minIn);
        printf("Hour vehicle left lot?\n");
        scanf("%d", &hrOut);
        printf("Minute vehicle left lot?\n");
        scanf("%d", &minOut);

/* Time Calculations */
        min = (60* (hrOut - hrIn)) + (minOut - minIn);
/* Round Up Time */
        hour = (float)(min + 59) / 60;
/* Print Check to see if Time is Correct */
        printf("%d : %d\n", hour, min);
/* Tow */
        if (hour >= 24)
                printf("Tow");

/* Conditions */

if(vec = 'c')
        if(hour <= 3)
        {
                fee = 0.00;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Car\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, hour, fee);
        }
        else
        {
                fee = (hour - 3) * 1.50;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Car\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, hour, fee);
        }
if(vec = 't')
        if (hour <= 2)
        {
                fee = hour * 1.00;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Truck\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, hour, fee);
        }
        else
        {
                fee = ((hour - 2.00) * 2.30) + 2.00;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Truck\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, hour, fee);
        }
if(vec = 'b')
        if(hour <= 1)
        {
                fee = hour * 2.00;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Bus\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, hour, fee);
        }
        else
        {
                fee = ((hour - 1.00) * 3.70) + 2.00;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Bus\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, hour, fee);
        }

/* end if */
return 0;
}
/* main */
/*        Results:  */


zero2 12-05-2004 10:35 AM

I now have the time thing figured out or at least kind of faked it for the moment. This will be probably be the last question that I ask about this problem.

Ok here's what my ouput is returning, but I only want the total specific to the vehicle that I picked. I figure that it must be how I set up the blocks or maybe not, Im not sure, Im so close to being done, can anyone help?

Code:

 
Type of vehicle?
c
Hour vehicle entered lot (0 - 24)?
12
Minute vehicle entered lot (0 - 60)?
40
Hour vehicle left lot (0 - 24)?
14
Minute vehicle left lot (0 - 60)?
22
1 : 42

                PARKING LOT CHARGE

                Type of Vehicle: Car
                TIME-IN                12 : 40
                TIME-OUT                14 : 22
                                        --------

                PARKING TIME            1 :42
                ROUNDED TOTAL          2
                                        --------
                TOTAL CHARGE            $ 0.000000

                PARKING LOT CHARGE

                Type of Vehicle: Truck
                TIME-IN                12 : 40
                TIME-OUT                14 : 22
                                        --------

                PARKING TIME            1 :42
                ROUNDED TOTAL          2
                                        --------
                TOTAL CHARGE            $ 2.000000

                PARKING LOT CHARGE

                Type of Vehicle: Bus
                TIME-IN                12 : 40
                TIME-OUT                14 : 22
                                        --------

                PARKING TIME            1 :42
                ROUNDED TOTAL          2
                                        --------
                TOTAL CHARGE            $ 5.700000
Press any key to continue


Code:


/*        This program is created by: A Frustrated Programmer
*/
#include <stdio.h>

int main (void)
{
/*        Local Definitions */
        char vec;
        int hrIn;
        int hrOut;
        int minIn;
        int minOut;
        int min;
        int hour;
        float fee;
        int roundhr;
        int roundmin;
        int calcMin;
        int calcHr;

/*        Statements */
        printf("Type of vehicle?\n");
        scanf("%c", &vec);
        printf("Hour vehicle entered lot (0 - 24)?\n");
        scanf("%d", &hrIn);
        printf("Minute vehicle entered lot (0 - 60)?\n");
        scanf("%d", &minIn);
        printf("Hour vehicle left lot (0 - 24)?\n");
        scanf("%d", &hrOut);
        printf("Minute vehicle left lot (0 - 60)?\n");
        scanf("%d", &minOut);

/* Time Calculations */
        if (minOut < minIn)
        {
                calcMin = minOut + 60;
                calcHr = hrOut - 1;
                hour = calcHr - hrIn;
                min= calcMin - minIn;
        }
                else
                {
                        hour = hrOut - hrIn;
                        min = minOut -minIn;
                }
/* Round Time */
if (min >= 1)
{
        roundhr = hour + 1;
        roundmin = 0;
}
/* Print Check to see if Time is Correct */
        printf("%d : %d\n", hour, min);
/* Tow */
        if (hour >= 24)
                printf("Tow");

/* Conditions */

if(vec = 'c')
        if(roundhr <= 3)
        {
                fee = 0.00;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Car\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn, minIn, hrOut, minOut, hour, min, roundhr, fee);
        }
        else
        {
                fee = (roundhr - 3) * 1.50;
                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Car\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, roundhr, fee);
        }
                if(vec = 't')
                                if (roundhr <= 2)
                        {
                                fee = roundhr * 1.00;
                                printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Truck\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, roundhr, fee);[/color]
                        }
                else
                        {
                fee = ((roundhr - 2.00) * 2.30) + 2.00;
                        printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Truck\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, roundhr, fee);
                        }
                if(vec = 'b')
                                        if(roundhr <= 1)
                                {
                                        fee = roundhr * 2.00;
                                        printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Bus\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, roundhr, fee);
                                }
                        else
                                {
                                fee = ((roundhr - 1.00) * 3.70) + 2.00;
                                        printf("\n\t\tPARKING LOT CHARGE\n\n\t\tType of Vehicle: Bus\n\t\tTIME-IN\t\t\t%d : %d\n\t\tTIME-OUT\t\t%d : %d\n\t\t\t\t\t--------\n\n\t\tPARKING TIME\t\t%d :%d\n\t\tROUNDED TOTAL\t\t%d\n\t\t\t\t\t--------\n\t\tTOTAL CHARGE\t\t$ %f\n", hrIn,minIn, hrOut, minOut,hour, min, roundhr, fee);
                                }

/* end if */
return 0;
}
/* main */
/*        Results:  */


Rawb 12-05-2004 04:43 PM

I think either your code got mangled, or I couldn't read it anyways.

But here is my helpful tip for you, that will probably get you finished with this project:
ALWAYS use {}'s after an if. ALWAYS. Literally, never, ever, ever skip out on the {}'s, pretend that it is a bug in the compiler that it will compile things without {}'s

Here is another tip that I like, but never actually practice, is to put the static part of the equals before the variable part. Like (2 == foo) or ('j' == bar) if you did something like you did above (and what crashed a space probe), your compiler will warn you and fail.

If you just want to know what you went wrong, here's the spoiler for you:
Code:

Spoiler over here -----------------------------------------------------------------------------------------------> You used single equal signs in the if statements, overwriting the variable. Switch to double equals and you should be good.

welshbyte 12-05-2004 04:59 PM

Zero2, just to make this thread look more pleasant, how about changing that last [code] tag to [ /code] (without the space).

zero2 12-05-2004 08:50 PM

Thank you, aoeuhtns :thumbsup: , that was it. It now works.


All times are GMT -8. The time now is 02:15 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Search Engine Optimization by vBSEO 3.6.0 PL2
© 2002-2012 Tilted Forum Project


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360