Tilted Forum Project Discussion Community  

Go Back   Tilted Forum Project Discussion Community > Interests > Tilted Technology


 
 
LinkBack Thread Tools
Old 12-02-2004, 04:06 PM   #1 (permalink)
Junkie
 
zero2's Avatar
 
[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.
zero2 is offline  
Old 12-02-2004, 04:58 PM   #2 (permalink)
Crazy
 
Location: Salt Town, UT
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.
Rawb is offline  
Old 12-02-2004, 07:34 PM   #3 (permalink)
Junkie
 
zero2's Avatar
 
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.
zero2 is offline  
Old 12-02-2004, 09:56 PM   #4 (permalink)
a-j
Tilted
 
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;
a-j is offline  
Old 12-02-2004, 10:23 PM   #5 (permalink)
Crazy
 
Location: Salt Town, UT
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);
Rawb is offline  
Old 12-02-2004, 11:09 PM   #6 (permalink)
Junkie
 
zero2's Avatar
 
Excellent, I don't have to convert anything. Thanks again for helping me out, a-j & aoeuhtns.
zero2 is offline  
Old 12-03-2004, 10:54 AM   #7 (permalink)
Junkie
 
zero2's Avatar
 
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 is offline  
Old 12-05-2004, 10:35 AM   #8 (permalink)
Junkie
 
zero2's Avatar
 
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:  */

Last edited by zero2; 12-05-2004 at 08:21 PM..
zero2 is offline  
Old 12-05-2004, 04:43 PM   #9 (permalink)
Crazy
 
Location: Salt Town, UT
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.
Rawb is offline  
Old 12-05-2004, 04:59 PM   #10 (permalink)
Insane
 
Location: Wales, UK, Europe, Earth, Milky Way, Universe
Zero2, just to make this thread look more pleasant, how about changing that last [code] tag to [ /code] (without the space).
__________________
There are only two industries that refer to their customers as "users". - Edward Tufte
welshbyte is offline  
Old 12-05-2004, 08:50 PM   #11 (permalink)
Junkie
 
zero2's Avatar
 
Thank you, aoeuhtns , that was it. It now works.
zero2 is offline  
 

Tags
answers, strange


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -8. The time now is 10:19 PM.

Tilted Forum Project

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, 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