#include /* Michael A. Redmond */ /* PA State Police fine calculation program */ /* 10/20/99 */ /* Calculate Miles per hour */ /* Given: * Number of miles * Number of minutes traveled * Returns: * MPH */ double calcMPH (double miles, double minutes) { const int minPerHour = 60; double mph; /* mph is miles per minute times 60 minutes in an hour */ mph = (miles / minutes) * minPerHour; return mph; } /* Calculate Fine for Driver */ /* Given: * drivers speed in miles per hour * speed limit in miles per hour * Returns: * Drivers fine - $20 base fine * if 5 mph or less over limit, no further fine * if more than 5 and less than 10 mph over limit, * add $2 additional for each mph over speed limit * if more than 10 and less than 20 mph over limit * add $4 additional for each mph over speed limit * extra special fine if more than 20 mph over limit - * $50 plus $5 for every mph over speed limit */ double calcFine (double mph, int speedLimit) { double overLimit; double fine; /* handle not speeding */ if (mph <= speedLimit) { fine = 0; } /* determine how much over speed limit */ overLimit = mph - speedLimit; /* determine if low speeding - 5 mph or less under speed limit */ /* intentionally put .0001 on tests to deal with inexactness of floats - so if 5 is represented as 5.000000000001 we still treat it as 5 */ if (overLimit <= 5.0001) { /* low speeding */ fine = 20; } /* determine if between 5 and 10 mph above limit */ if (overLimit <= 10.0001) { fine = (20 + (2 * overLimit)); } /* determine if between 10 and 20 mph above limit */ if (overLimit <= 20.0001) { fine = (20 + (4 * overLimit)); } else { /* more than 20 mph over speed limit */ fine = (50 + (5 * overLimit)); } return fine; } /* print drivers bill for speeding fine */ /* Given: * number of miles traveled * number of minutes driving on the turnpike * calculated speed in mph * speed limit on stretch of turnpike travelled * calculated fine for driver * Returns: * Nothing * Side Effect: * prints bill */ void printBill(double miles,double minutes,double MPH,int speedLimit,double Fine) { printf("\n"); printf("===========================< CUT HERE >===============================\n"); printf(" Bill\n"); printf("\n"); printf(" You traveled %6d miles in %6.1f minutes \n",miles,minutes); printf(" - an average speed of %5.1f miles per hour\n",MPH); printf(" This compares to a speed limit of %2d \n",speedLimit); printf(" The fine of %7.2f has been charged to your account \n",Fine); printf("\n"); printf("===========================< CUT HERE >===============================\n"); printf("\n"); } /********/ /* MAIN */ /********/ int main() { int numCars; int cnt; double minutes; double miles; double currMPH; double currFine; int speedLimit; double totalMPH = 0.0; int numSpeeding = 0; double totalFines; double percSpeeding; double aveFinePerSpeeding; double aveFinePerCar; double aveMPH; /* executable */ /* get how many drivers to process */ printf("How many cars will be logged in this batch? "); scanf("%d",&numCars); printf("\n"); /* ensure valid number of drivers */ while (numCars <= 0) { printf("Please enter a positive number of cars"); scanf("%d",&numCars); } /*************************************************/ /* loop through user specified number of cars */ /* getting distance and time, calculating speed, */ /* fine, and displaying bill if appropriate. */ /* and keep track of summary stats */ /*************************************************/ for (cnt = 0;cnt < numCars; cnt++) { /* get time on turnpike and validate */ printf("Car %2d \n",(cnt + 1)); printf("Time on Turnpike (in minutes): "); scanf("%lf",&minutes); while (minutes <= 0) { printf("\nPlease enter a positive number of minutes"); scanf("%lf",&minutes); } /* get miles traveled on turnpike and validate */ printf("Miles on Turnpike: "); scanf("%lf",&miles); while (miles <= 0) { printf("\nPlease enter a positive number of miles"); scanf("%lf",&miles); } /* get speed limit on turnpike and validate */ printf("Speed Limit on Turnpike: "); scanf("%d",&speedLimit); while ((speedLimit < 35) || (speedLimit > 65)) { printf("\nPlease enter a speed limit between 35 and 65"); scanf("%d",&speedLimit); } printf("\n"); /* calculate drivers speed, update accumulator, and display speed */ currMPH = calcMPH(miles,minutes); totalMPH += currMPH; printf("\nSpeed: %5.1f \n",currMPH); /* calculate drivers fine */ currFine = calcFine(currMPH,speedLimit); /* determine if driver is to be fined */ if (currFine > 0.0001) { /* driver is to be fined - print bill, * update count of speeders, and asccumulator for fines */ printBill(miles,minutes,currMPH,speedLimit,currFine); numSpeeding++; totalFines += currFine; } } /* end for loop */ /* determine percent of drivers speeding */ /* Take ratio and multiply by 100 to get percent */ percSpeeding = (numSpeeding / numCars) * 100.0; /* calculate mean fine per speeding driver */ /* avoid divide by 0 */ if (numSpeeding > 0) { /* there are speeders - calculate average */ aveFinePerSpeeding = totalFines / numSpeeding; } else { /* no speeders */ /* average is not really 0, but must display something */ aveFinePerSpeeding = 0; } /* calculate average fine per car (all cars, speeding or not) */ aveFinePerCar = totalFines / numCars; /* calculate average speed per car */ aveMPH = totalMPH / numCars; /* final report for batch of cars */ printf("\n"); printf("\n\n Final Report\n"); printf(" ------------\n"); printf("\n"); printf(" In a batch of %2d cars %2d were speeding \n",numCars,numSpeeding); printf("\n"); printf(" This represents %6.2f percent of cars \n",percSpeeding); printf("\n"); printf(" The total fines charged were %8.2f \n",totalFines); printf(" This represents an average per speeding car of %6.2f \n",aveFinePerSpeeding); printf(" OR an average for all cars of %6.2f \n",aveFinePerCar); printf("\n The average speed of all cars was %6.2f miles per hour \n",aveMPH); printf("\n"); printf("Goodbye \n"); return 0; }