12-02-2004, 04:06 PM | #1 (permalink) |
Junkie
|
[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: */ |
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. |
12-02-2004, 07:34 PM | #3 (permalink) |
Junkie
|
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 ---------------- 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) 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 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. |
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); |
12-03-2004, 10:54 AM | #7 (permalink) |
Junkie
|
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 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: */ |
12-05-2004, 10:35 AM | #8 (permalink) |
Junkie
|
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.. |
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. |
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 |
Tags |
answers, strange |
|
|