📄 travel14.c
字号:
/* Travel Accounting Program Dwayne Phillips November 1992 Command Line: travel [return] Purpose: This program performs the same function as the travel accounting system used by the secretaries on the Wang Alliance system prior to January 1993. It takes input concerning a person's trip, stores that to a file for later use, calculates the money due or due back, and prints an accounting. It's major advantages are: (1) no more Wang, and (2) it saves the accounting data to a disk for later retrieval, editing, and printing. The Wang program did not save the accounting to disk so you could not edit it. This program will run on the UNIX workstations and (with a minor change) on an IBM PC or clone. It is written entirely in C and is basic terminal and file input and output. Files: The program uses two files: (1) the data file, and (2) a print file. Data File The data file contains the accounting data entered on a traveller. This data contains information about the traveller, advances, and expenses. Each travel accounting has certain data items associated with it. These include: Name - name of the person traveling (1) ORN - ORN for this travel accounting (1) Cash advance amount (1) GTR or Ticket Advance Amount - (1,many) Transportation Costs (1,many) Mode Carrier Travel Class Amount Itenerary (1,many) Depart Date Leaving Location Depart Time Depart Via Arrive Date Arrive Location Arrive Time Daily Expense (1,many) Max Lodging MIE Actual Lodging POV Miles POV Description Rental Car Rental Car Description Taxi Taxi Description Parking Parking Description Official Phone Official Phone Description Other Expenses Other Description Rental Car (1) Personal Mileage Total Mileage Total Gas I store these items in a data file in the following order: name - L chars ORN - L chars cash_advance - long GTR - struct GTR_struct ts - struct trans_struct its - struct itinerary_struct ds - struct daily_struct rs - struct rental_struct Print File This program prints the results in a nice looking form just like the Wang program did. Since the workstations are on a network with many different printers, the program "prints" to a temporary print file, and then uses the "system" command to print that file to a network printer. The use enters the name of the desired netowrk printer. Linked Lists: Most of the information about the traveller is kept in linked lists of structures. This is because you do not know how many pieces of data the traveller will have when the program starts. Therefore, you use a linked list and allocate new nodes in the list as you need them. I always create at least one blank struct in the linked list. That way, you can write something to the data file and read something back. Money: All money in this progam is kept in penneys using a long variable. There are routines that transform this penney value to a float value for keyboard input and display and print output. POV: The POV money is kept in a long, but it is in penneys times ten. This will accomodate fractions of cents. For example, POV=265 for 26.5 cents a mile. The POV calculations take this into account and divide by 10 at the appropriate time. Possibile Changes: There are three global variables you will need to change in the future. These are (1) MIE rates and (2) POV_RATE. These change from time to time with inflation and you must update them. They are in the define area before the main program. UNIX and DOS Versions: This program is very basic C and will run on UNIX and DOS platforms (and probably others too). You must set the values of the UNIX_SYSTEM and DOS_SYSTEM global variables before compiling. Just set them to 1 and 0. These are in the define area fbefore the main program. Revision History: Version 1 - February 1993 Version 1.01 - 9 February 1993 Made a small change to get_money so it would not lose a penney. Version 1.1 - 12 February 1993 Added the rental car structure. Previous versions did not do this because the secrataries did not need it. They changed their minds, so I added it. Version 1.2 - 22 February 1993 Made a change in the print_daily subroutine. If your actual lodging exceeds the max allowed lodging, then you must use the max lodging in calculations. Version 1.3 - 20 April 1993 Made several changes: (1) Added 3 more MIE values. Earlier versions only used MIE1 and MIE2. This version uses MIE1 through MIE5. This is because our organization changed the meals and incidental expense rates for the cities. So, I added a couple of lines of code to the MIE loop in the routines edit_daily_expenses and get_daily_expenses. DP - 4-15-93 (2) The program now displays the name of the date file right after it closes that file. This will help the user know where the data is stored. (3) The DOS_SYSTEM version of the program gets the data file name directly from the user for new cases. When the user enters a file name, the program checks for the existance of that file. If it already exists, the program asks for another file name. (4) Changed several edit functions so you can skip to the end of a long linked list. The changes were in edit_trans_cost edit_intinerary edit_daily_expenses Version 1.4 - 8 September 1993 I changed all occurences of SAD to CAC to reflect our new division name.*//*****************************************************//*****************************************************//*PAGE Includes and data structures */#include <time.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define L 100#define LPP 66#define TAB 5#define END_OF_LIST 0x00 /* Here are the money values that change with inflation. Recall, the POV_RATE is in cents times ten. The MIE rates are in cents. Changed from 3 MIE rates to 5 MIE rates - DP - 4/15/93 */#define MIE1 0#define MIE2 2600#define MIE3 3000#define MIE4 3400#define MIE5 3800#define POV_RATE 250 /* Here are the globals you set before compiling for UNIX or DOS. */#define UNIX_SYSTEM 1#define DOS_SYSTEM 0 /* Here are the structures. Most of these are for linked lists that the program creates dynamically as it goes along. */ /* The Month-Day-Year Structure */struct MDY_struct{ short month; short day; short year;}; /* The Transportation Cost Structure */struct trans_struct{ char mode[L]; char carrier[L]; char travel_class[L]; long amount; struct trans_struct *next;}; /* The Itenerary Structure */struct itinerary_struct{ struct MDY_struct depart_date; char leave_loc[L]; long depart_time; char depart_via[L]; struct MDY_struct arrive_date; char arrive_loc[L]; long arrive_time; struct itinerary_struct *next;}; /* The Daily Expense Structure */struct daily_struct{ struct MDY_struct today; long max_lodging; long mie; long actual_lodging; long pov_miles; char pov_desc[L]; long rental_car; char rental_car_desc[L]; long taxi; char taxi_desc[L]; long parking; char parking_desc[L]; long phone; char phone_desc[L]; long other; char other_desc[L]; struct daily_struct *next;}; /* The GTR Advance Structure */struct GTR_struct{ long GTR; struct GTR_struct *next;}; /* The Rental Car Structure */struct rental_struct{ long personal_mileage; long total_mileage; long total_gas;}; /* Here are the functions I needed to define. */float dollars_of();long calculate_mie();long get_money();long pennies_of();struct GTR_struct * get_GTRs();struct trans_struct * get_transportation_cost();struct itinerary_struct * get_itinerarys();struct daily_struct * get_daily_expenses();struct rental_struct * get_rental_expenses();struct GTR_struct * retrieve_GTRs();struct trans_struct * retrieve_transportation_cost();struct itinerary_struct * retrieve_itinerarys();struct daily_struct * retrieve_daily_expenses();struct rental_struct * retrieve_rental_expenses();struct itinerary_struct * traverse_itinerary();/*****************************************************//*****************************************************//*PAGE main */main(argc, argv) int argc; char *argv[];{ int choice, i, not_finished = 1, lines=0; long cash_advance; /* the cash advance */ short days=0; char data_file_name[L], date_string[L], name[L], ORN[L], print[L], print_file_name[L], printer_name[L], r[L]; /* Declare the two files */ FILE *data_file, *print_file; /* Declare the pointers for the linked lists. */ struct GTR_struct *GTR; struct trans_struct *ts; struct itinerary_struct *its; struct daily_struct *ds; struct rental_struct *rs; struct MDY_struct first_day, last_day; get_date(date_string); GTR = END_OF_LIST; ts = END_OF_LIST; its = END_OF_LIST; ds = END_OF_LIST; rs = END_OF_LIST; /* Start the basic loop which continues until the user says quit. */ while(not_finished){ show_main_menu(); gets(r); choice = atoi(r); switch(choice){ case 0: printf("\nTHE END\n\n"); not_finished = 0; break; /* Process new travel accounting */ case 1: printf("\ncase 1"); /* Get the input from the user */ /* get traveller's name and ORN */ get_name(name); get_orn(ORN); get_data_file_name(name, date_string, data_file_name); data_file = fopen(data_file_name, "w"); if(data_file == '\0'){ printf("\nERROR: Could not create data file %s", data_file_name); exit(-1); } /* ends opening data file */ /* get the Cash Advance */ printf("\n\tCash Advance Amount? "); cash_advance = get_money(); /* get the GTR or Ticket Advance(s) */ GTR = get_GTRs(); /* get the transportation cost structure(s) */ ts = get_transportation_cost(); /* get the itinerary structure(s) */ its = get_itinerarys(); get_first_last_dates(its, &first_day, &last_day); /* get the daily expenses */ ds = get_daily_expenses(&first_day, &last_day, &days); /* get the rental car expenses if any */ rs = get_rental_expenses(); /* save the data to the data file */ fwrite(name, (L*sizeof(char)), 1, data_file); fwrite(ORN, (L*sizeof(char)), 1, data_file); fwrite(&cash_advance, sizeof(long), 1, data_file); save_GTRs(GTR, data_file); save_transportation_cost(ts, data_file); save_itinerarys(its, data_file); save_daily_expenses(ds, data_file); save_rental_expenses(rs, data_file); fclose(data_file); printf("\n\nWrote your data to file: %s", data_file_name); printf("\nDo you want to print? (y or n)"); gets(print); if(print[0] == 'y' || print[0] == 'Y'){ tmpnam(print_file_name); print_file = fopen(print_file_name, "wt"); if(print_file == '\0'){ printf("\nERROR Could not open print file %s", print_file_name); exit(2); } /* ends if could not open print file */ get_first_last_dates(its, &first_day, &last_day); print_accounting(date_string, name, ORN, days, &lines, print_file, &first_day, &last_day, cash_advance, GTR, ts, its, ds, rs); lines = 0; fclose(print_file); if(UNIX_SYSTEM){ printf("\nEnter the name of the printer:"); printf(" (e.g. GE02_SPARC, ps1, ps, etc.)"); printf("\n __________\b\b\b\b\b\b\b\b\b\b"); gets(printer_name); sprintf(r, "lpr -P%s %s", printer_name, print_file_name); } if(DOS_SYSTEM) sprintf(r, "type %s > prn", print_file_name); system(r); unlink(print_file_name); } /* ends if yes print */ break; /* Process old travel accounting */ case 2: printf("\ncase 2");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -