|   一派掌門 二十級 | 
              #include <conio.h>#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "ticket.h"
 
 int main()
 {
 while (1)
 {
 system("cls");
 show_menu();
 }
 return 0;
 }
 
 void input(int n)
 {
 struct ticket t;
 fflush(stdin);
 printf("请输入起点站: ");
 gets(t.start);
 printf("请输入终点站: ");
 gets(t.end);
 printf("请输入起飞日期: ");
 gets(t.date);
 
 printf("请输入张数: ");
 scanf("%d", &t.num);
 
 if (n == 1)
 {
 printf("请输入价格: ");
 scanf("%d", &t.price);
 }
 
 update(&t, n);
 }
 
 void manage()
 {
 int n;
 printf("\t*********************************\n");
 printf("\t*\t添加机票--------1\t*\n");
 printf("\t*\t删除机票--------2\t*\n");
 printf("\t*\t返回上级--------0\t*\n");
 printf("\t*********************************\n");
 printf("\t请选择: ");
 scanf("%d", &n);
 
 if (n != 1 && n != 2)
 return;
 
 input(n);
 }
 
 void sell_tickets()
 {
 FILE *fp = fopen("tickets.dat", "r");
 int n;
 fclose(fp);
 if (fp == NULL)
 {
 puts("暂无机票");
 fflush(stdin);
 _getch();
 return;
 }
 
 printf("\t*********************************\n");
 printf("\t*\t查看机票--------1\t*\n");
 printf("\t*\t购买机票--------2\t*\n");
 printf("\t*\t退订机票--------3\t*\n");
 printf("\t*\t返回上级--------0\t*\n");
 printf("\t*********************************\n");
 printf("\t请选择: ");
 scanf("%d", &n);
 
 switch (n)
 {
 case 1:
 view();
 break;
 case 2:
 input(4);
 break;
 case 3:
 input(3);
 break;
 }
 }
 
 void show_menu()
 {
 int n;
 printf("\t*********************************\n");
 printf("\t*\t欢迎使用飞机订票系统\t*\n");
 printf("\t*********************************\n");
 printf("\t*\t售票服务--------1\t*\n");
 printf("\t*\t系统管理--------2\t*\n");
 printf("\t*\t退出系统--------3\t*\n");
 printf("\t*********************************\n");
 printf("\t请选择: ");
 scanf("%d", &n);
 switch (n)
 {
 case 1:
 sell_tickets();
 break;
 case 2:
 manage();
 break;
 case 3:
 exit(0);
 }
 }
 
 void show_result(int n, int num, int price)
 {
 int money = abs(num) * price;
 int real;
 
 if (n == 3)
 printf("退票金额: %d元\n", money);
 else if (n == 4)
 {
 printf("应支付金额: %d元\n", money);
 printf("实付: ");
 scanf("%d", &real);
 printf("找回: %d元\n", real - money);
 }
 }
 
 void update(struct ticket *t, int n)
 {
 int num;
 struct ticket r;
 FILE *fp = fopen("tickets.dat", "r+");
 if (fp != NULL)
 {
 // 文件存在
 
 // 修改机票数量
 while (fread(&r, sizeof(r), 1, fp))
 {
 if (strcmp(r.start, t->start) == 0 && strcmp(r.end, t->end) == 0 && strcmp(r.date, t->date) == 0)
 {
 fseek(fp, -2 * (int)sizeof(int), SEEK_CUR);
 
 // 计算剩余票数
 num = r.num;
 if (n == 1 || n == 3)
 num += t->num;
 else
 num -= t->num;
 
 if (num < 0)
 puts("操作失败, 余票不够");
 else
 {
 fwrite(&num, sizeof(int), 1, fp); // 更新剩余票数
 if (n == 1)
 fwrite(&t->price, sizeof(int), 1, fp); // 更新机票价格
 fclose(fp);
 
 puts("操作成功");
 show_result(n, t->num, r.price);
 }
 _getch();
 return;
 }
 }
 
 if (n == 2 || n == 4)
 {
 puts("操作失败, 无该种机票!");
 _getch();
 return;
 }
 
 // 添加机票 / 退订已卖光的机票
 fwrite(t, sizeof(struct ticket), 1, fp);
 fclose(fp);
 }
 else
 {
 // 文件不存在
 if (n == 2 || n == 4)
 {
 // 没票时无法删除机票或购票
 puts("操作失败, 无该种机票!");
 return;
 }
 
 // 添加机票 / 退订已卖光的机票
 fp = fopen("tickets.dat", "w");
 fwrite(t, sizeof(struct ticket), 1, fp);
 fclose(fp);
 show_result(n, t->num, t->price);
 }
 
 puts("操作成功");
 _getch();
 }
 
 void view()
 {
 FILE *fp = fopen("tickets.dat", "r");
 struct ticket t;
 printf("起点站\t终点站\t日期\t\t票数\t价格\n");
 while (fread(&t, sizeof(struct ticket), 1, fp))
 {
 if (t.num > 0)
 printf("%-8s%-8s%-16s%-8d%-8d\n", t.start, t.end, t.date, t.num, t.price);
 }
 _getch();
 fclose(fp);
 }
 |