home *** CD-ROM | disk | FTP | other *** search
/ Telecom / 1996-04-telecom-walnutcreek.iso / carriers / att-reach.out-calculator < prev    next >
Internet Message Format  |  1991-12-13  |  9KB

  1. From telecom@delta.eecs.nwu.edu Wed Nov 27 03:00:16 1991
  2. Received: from delta.eecs.nwu.edu by gaak.LCS.MIT.EDU via TCP with SMTP
  3.     id AA21231; Wed, 27 Nov 91 03:00:07 EST
  4. Received: by delta.eecs.nwu.edu id AA21459
  5.   (5.65c/IDA-1.4.4 for ptownson@gaak.lcs.mit.edu); Wed, 27 Nov 1991 01:59:48 -0600
  6. Date: Wed, 27 Nov 1991 01:59:48 -0600
  7. From: TELECOM Moderator <telecom@delta.eecs.nwu.edu>
  8. Message-Id: <199111270759.AA21459@delta.eecs.nwu.edu>
  9. To: ptownson@gaak.LCS.MIT.EDU
  10. Subject: cost figuring program
  11. Status: RO
  12.  
  13. >From telecom Mon Nov 25 11:15:33 1991
  14. Received: by delta.eecs.nwu.edu id AA00056
  15.   (5.65c/IDA-1.4.4 for \telecom); Mon, 25 Nov 1991 11:15:24 -0600
  16. Received: from valhalla.ee.rochester.edu by delta.eecs.nwu.edu with SMTP id AA21221
  17.   (5.65c/IDA-1.4.4 for <telecom@eecs.nwu.edu>); Mon, 25 Nov 1991 11:14:56 -0600
  18. Received: from moscom.UUCP by valhalla.ee.rochester.edu with UUCP (4.1/2.5ee) id AA27251; Mon, 25 Nov 91 12:14:17 EST
  19. Received: by moscom.com (4.1/SMI-4.1)
  20.     id AA06031; Mon, 25 Nov 91 11:41:11 EST
  21. Date: Mon, 25 Nov 91 11:41:11 EST
  22. From: lb@moscom.com (Lawrence Beck)
  23. Message-Id: <9111251641.AA06031@moscom.com>
  24. To: telecom@eecs.nwu.edu
  25. Subject: AT&T long distance calling plans
  26. Cc: lb@moscom.com
  27. Status: RO
  28.  
  29.  
  30. To anybody interested in this:
  31.  
  32. The following program will determine the best combination of AT&T long distance
  33. calling plans for you based on previous months' bills (you determine how many
  34. months).   It was designed for Reach Out America/Reach Out New York
  35. combinations, but can be modified to support other AT&T intrastate plans.
  36.  
  37. Let me know if I let any bugs slip through ...
  38.  
  39. Larry Beck (lb@moscom.com)
  40.  
  41.  
  42.  
  43.  
  44. #ifndef lint
  45. static char sccs_ident[] = "@(#)longdist.c    1.1 91/11/25 11:33:55 ";
  46. #endif
  47.  
  48. /******************************************************************************
  49. **
  50. **    Source File:    longdist.c
  51. **
  52. **    Author:        Lawrence Beck    (lb@moscom.com)
  53. **
  54. **    Creation Date:    11/22/91
  55. **
  56. **    Description:    This file contains a program that calculates the best
  57. **                combination of AT&T calling plans based on past phone
  58. **                bills.  This program was designed to calculate the
  59. **                cost of all direct-dialed long distance calls using all
  60. **                combinations of Reach Out America and Reach Out New York
  61. **                plans.  It prints a matrix of the total cost of all calls
  62. **                using all combinations, and then prints the best
  63. **                combination.
  64. **
  65. **                To use this program, one or more files containing a subset
  66. **                of phone bill information must be specified on the
  67. **                command line.  Each file should contain a month's worth of
  68. **                billing information.  The information should be formatted
  69. **                on separate lines as follows:
  70. **
  71. **                <State>    <Duration>    <Call Type>    <Cost>
  72. **
  73. **                <State> is the 2-letter uppercase state abbreviation.
  74. **                <Duration> is the length of the call in minutes.
  75. **                <Call Type> is DN, DE, or DD for Direct-Night, Direct-
  76. **                    Evening, and Direct-Day respectively.
  77. **                <Cost> is the undiscounted cost of the call.
  78. **
  79. **                The rates for Reach Out America and Reach Out New York
  80. **                are specified in two data structures.  They may be
  81. **                modified to accomodate changes in the rate structure or
  82. **                to accomodate a different intrastate calling plan.  If
  83. **                a New York is not the home state, change HOME_STATE to the
  84. **                appropriate 2-letter abbreviation for the desired state.
  85. **
  86. **    
  87. ******************************************************************************/
  88. #include <stdio.h>
  89. #include <stdlib.h>
  90. #include <string.h>
  91.  
  92. #define TRUE    1
  93. #define FALSE    0
  94.  
  95. #define DD    0
  96. #define DE    1
  97. #define DN    2
  98.  
  99. #define NONE        0
  100. #define BASIC        1
  101. #define EVENING    2
  102. #define _24HOUR    3
  103.  
  104. #define HOME_STATE    "NY"
  105.  
  106. char *plan[] = {
  107.     "none",
  108.     "basic",
  109.     "evening",
  110.     "24 hour"
  111. };
  112.  
  113. struct rate_info {
  114.     double
  115.         initial_hour,
  116.         additional_hours,
  117.         evening_discount,
  118.         day_discount,
  119.         intrastate_discount;
  120. };
  121.  
  122. struct rate_info interstate_info[] = {
  123.     {    0.00, 0.00, 0.00, 0.00, 0.00 },
  124.     {    7.15, 6.60, 1.00, 1.00, 0.95 },
  125.     {    7.80, 6.60, 0.85, 1.00, 0.95 },
  126.     {    8.70, 6.60, 0.75, 0.90, 0.95 }
  127. };
  128.  
  129. struct rate_info intrastate_info[] = {
  130.     {    0.00, 0.00, 0.00, 0.00, 0.00 },
  131.     {    7.50, 7.20, 1.00, 1.00, 0.00 },
  132.     {    8.20, 7.20, 0.85, 1.00, 0.00 },
  133.     {    8.50, 7.20, 0.85, 0.95, 0.00 }
  134. };
  135.  
  136. double
  137.     compute_rates();
  138.  
  139. main(argc, argv)
  140. int argc;
  141. char **argv;
  142. {
  143.     int
  144.         best_i,
  145.         best_j,
  146.         i,
  147.         j;
  148.     FILE
  149.         *fp;
  150.     double
  151.         plan_totals[4][4],
  152.         best_total=0.;
  153.  
  154.     /* initialize totals for all plan combinations */
  155.     for(i=NONE; i<=_24HOUR; i++)
  156.         for(j=NONE; j<=_24HOUR; j++)
  157.             plan_totals[i][j] = 0.;
  158.  
  159.     /* process all command line arguments */
  160.     while (argc > 1) {
  161.         argc--;
  162.         argv++;
  163.  
  164.         /* open the bill file */
  165.         fp = fopen(*argv, "r");
  166.         if (fp == NULL)
  167.             continue;
  168.  
  169.         /* compute the total for all plan combinations */
  170.         for(i=NONE; i<=_24HOUR; i++)
  171.             for(j=NONE; j<=_24HOUR; j++) {
  172.                 (void)fseek(fp, 0L, 0);
  173.                 plan_totals[i][j] += compute_rates(fp, i, j);
  174.             }
  175.  
  176.         /* close the file */
  177.         (void)fclose(fp);
  178.     }
  179.  
  180.     /* print the matrix of all plan combination totals (save the best one) */
  181.     (void)printf("%20s%-20s\n", "", "interstate plans");
  182.     (void)printf("%20s%-10s%-10s%-10s%-10s\n", "",
  183.            plan[0], plan[1], plan[2], plan[3]);
  184.     for(i=NONE; i<=_24HOUR; i++) {
  185.         (void)printf("%-12s%-8s", "intrastate", plan[i]);
  186.         for(j=NONE; j<=_24HOUR; j++) {
  187.             if (best_total == 0 || plan_totals[i][j] < best_total) {
  188.                 best_total = plan_totals[i][j];
  189.                 best_i = i;
  190.                 best_j = j;
  191.             }
  192.             (void)printf("%-10.2f", plan_totals[i][j]);
  193.         }
  194.         (void)printf("\n");
  195.     }
  196.  
  197.     /* print the best plan combination */
  198.     (void)printf("\nthe best plan combination for these bills is:\n");
  199.     (void)printf("intrastate plan: %s\n", plan[best_i]);
  200.     (void)printf("interstate plan: %s\n", plan[best_j]);
  201.  
  202.     return(EXIT_SUCCESS);
  203. }
  204.  
  205. double
  206. compute_rates(fp, intrastate_plan, interstate_plan)
  207. FILE *fp;
  208. int intrastate_plan;
  209. int interstate_plan;
  210. {
  211.     int
  212.         i,
  213.         intrastate_duration[3],
  214.         interstate_duration[3],
  215.         period,
  216.         duration;
  217.     double
  218.         intrastate_cost[3],
  219.         interstate_cost[3],
  220.         total_cost,
  221.         cost;
  222.     char
  223.         input[80],
  224.         state[3],
  225.         calltype[3];
  226.  
  227.     /* initialize the durations and costs for all call types */
  228.     for(i=0; i < 3; i++) {
  229.         intrastate_duration[i] = 0;
  230.         interstate_duration[i] = 0;
  231.         intrastate_cost[i] = 0.;
  232.         interstate_cost[i] = 0.;
  233.     }
  234.  
  235.     /* read all lines from the bill file */
  236.     while (fgets(input, sizeof(input), fp) != NULL) {
  237.  
  238.         /* extract the billing information from the input line */
  239.         (void)sscanf(input, "%s %d %s %lf",
  240.                      state, &duration, calltype, &cost);
  241.  
  242.         /* determine the period */
  243.         if (strcmp(calltype, "DD") == 0)
  244.             period = DD;
  245.         else if (strcmp(calltype, "DE") == 0)
  246.             period = DE;
  247.         else if (strcmp(calltype, "DN") == 0)
  248.             period = DN;
  249.         else
  250.             continue;
  251.  
  252.         /* if the call is intrastate ... */
  253.         if (strcmp(state, HOME_STATE) == 0) {
  254.             intrastate_cost[period] += cost;
  255.             intrastate_duration[period] += duration;
  256.         }
  257.         /* else if the call is interstate ... */
  258.         else {
  259.             interstate_cost[period] += cost;
  260.             interstate_duration[period] += duration;
  261.         }
  262.     }
  263.  
  264.     /* if using Reach Out America ... */
  265.     if (interstate_plan != NONE) {
  266.  
  267.         /* calculate the night period cost */
  268.         interstate_cost[DN] = interstate_info[interstate_plan].initial_hour;
  269.  
  270.         interstate_duration[DN] -= 60;
  271.         if (interstate_duration[DN] > 0)
  272.             interstate_cost[DN] +=
  273.                 interstate_info[interstate_plan].additional_hours *
  274.                 (double)interstate_duration[DN]/60.;
  275.  
  276.         /* calculate the other period costs */
  277.         interstate_cost[DE] *=
  278.             interstate_info[interstate_plan].evening_discount;
  279.         interstate_cost[DD] *=
  280.             interstate_info[interstate_plan].day_discount;
  281.  
  282.         /* apply intrastate discount, if no intrastate plan */
  283.         if (intrastate_plan == NONE) {
  284.             intrastate_cost[DD] *=
  285.                 interstate_info[interstate_plan].intrastate_discount;
  286.             intrastate_cost[DE] *=
  287.                 interstate_info[interstate_plan].intrastate_discount;
  288.             intrastate_cost[DN] *=
  289.                 interstate_info[interstate_plan].intrastate_discount;
  290.         }
  291.     }
  292.  
  293.     /* if using Reach Out <Your State> ... */
  294.     if (intrastate_plan != NONE) {
  295.  
  296.         /* calculate the night period cost */
  297.         intrastate_cost[DN] = intrastate_info[intrastate_plan].initial_hour;
  298.  
  299.         intrastate_duration[DN] -= 60;
  300.         if (intrastate_duration[DN] > 0)
  301.             intrastate_cost[DN] +=
  302.                 intrastate_info[intrastate_plan].additional_hours *
  303.                 (double)intrastate_duration[DN]/60.;
  304.  
  305.         /* calculate the other period costs */
  306.         intrastate_cost[DE] *=
  307.             intrastate_info[intrastate_plan].evening_discount;
  308.         intrastate_cost[DD] *=
  309.             intrastate_info[intrastate_plan].day_discount;
  310.     }
  311.  
  312.     /* return the total cost */
  313.     total_cost =    interstate_cost[DN] +
  314.                 interstate_cost[DE] +
  315.                 interstate_cost[DD] +
  316.                 intrastate_cost[DN] +
  317.                 intrastate_cost[DE] +
  318.                 intrastate_cost[DD];
  319.  
  320.     return(total_cost);
  321. }
  322.  
  323.  
  324.