航空订票系统load.c
上传用户:janny_wxd
上传日期:2010-02-03
资源大小:261k
文件大小:13k
源码类别:

控制台编程

开发平台:

C/C++

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #define OK 1
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define ERROR 0
  8. #define OVERFLOW -2
  9. #define PR printf
  10. typedef int status;
  11. typedef struct airline{
  12. char line_num[8];//航班号
  13. char plane_num[8];//飞机号
  14. char end_place[20];//目的的
  15. int total;//座位总数
  16. int left;//剩余座位
  17. struct airline *next;//下一个结点
  18. }airline;
  19. typedef struct customer{
  20. char name[9];//顾客名
  21. char line_num[8];//航班号
  22. int seat_num;//座位号
  23. struct customer *next;//下一个结点
  24. }customer;
  25. airline *init_airline(){//初始化链表
  26. airline *l;
  27. l=(airline*)malloc(sizeof(airline));
  28. if(l==NULL){
  29. exit(0);
  30. }
  31. l->next=NULL;
  32. return l;
  33. }
  34. customer * init_customer(){//初始化链表
  35. customer *l;
  36. l=(customer*)malloc(sizeof(customer));
  37. if(l==NULL){
  38. exit(0);
  39. }
  40. l->next=NULL;
  41. return l;
  42. }
  43. status insert_airline(airline **p,char *line_num,char *plane_num,char *end_place,int total,int left){//airline链表插入操作
  44. airline *q;
  45. q=(airline*)malloc(sizeof(airline));
  46. strcpy(q->line_num , line_num);
  47. strcpy(q->plane_num , plane_num);
  48. strcpy(q->end_place , end_place);
  49. q->total  =total;
  50. q->left =left;
  51. q->next=NULL;
  52. (*p)->next=q;
  53. (*p)=(*p)->next;
  54.  //   PR("insert %d ,%dis succssed!n",e,bl);
  55. return OK;
  56. }
  57. status insert_customer(customer **p,char *name,char *line_num,int seat){//customer链表插入操作
  58. customer *q;
  59. q=(customer*)malloc(sizeof(customer));
  60. /* {
  61. PR("内存分配失败n");
  62. return OVERFLOW;
  63. }*/
  64. strcpy(q->name , name);
  65. strcpy(q->line_num , line_num);
  66. q->seat_num =seat;
  67. q->next=NULL;
  68. (*p)->next=q;
  69. (*p)=(*p)->next;
  70.  //   PR("insert %d ,%dis succssed!n",e,bl);
  71. return OK;
  72. }
  73. airline *modefy_airline(airline *l,char *line_num)//修改airline链表中的数据
  74. {
  75. airline *p;
  76. p=l->next ;
  77. for(;p!=NULL;p=p->next )
  78. {
  79. if(strcmp(line_num,p->line_num )==0)
  80. {
  81. p->left ++;
  82. // PR("modefy %sn",p->line_num );
  83. return l;
  84. }
  85. }
  86. PR("没有这个航班,无法完成修改任务!n");
  87. return 0;
  88. }
  89. status delete_airline(airline *h,char *line_num)//删除航班
  90. {
  91. airline *p,*pr;
  92. pr=h;
  93. p=pr->next ;
  94. while(p!=NULL)
  95. {
  96. if(strcmp(line_num,p->line_num )==0)
  97. {
  98. pr->next =p->next ;
  99. PR("删除  %s  航班n",p->line_num  );
  100. return OK;
  101. }
  102. pr=pr->next ;
  103. p=pr->next ;
  104. }
  105. PR("无此航班,无法删除!n");
  106. return ERROR;
  107. }
  108. status delete_customer(customer *h,char *line_num)//删除顾客
  109. {
  110. customer *p,*pr;
  111. pr=h;
  112. p=pr->next ;
  113. while(p!=NULL)
  114. {
  115. if(strcmp(line_num,p->line_num )==0)
  116. {
  117. pr->next =p->next ;
  118. }
  119. pr=pr->next ;
  120. p=pr->next ;
  121. }
  122. // PR("无此航班,无法删除!n");
  123. return OK;
  124. }
  125. status delete_cus(customer *h,airline *l,char *name)//顾客退票
  126. {
  127. customer *p,*pr;
  128. char line_num[8];
  129. // qr=h;
  130. pr=h;
  131. p=pr->next ;
  132. // PR("开始删除n");
  133. while(p!=NULL)
  134. {
  135. if(strcmp(name,p->name )==0)
  136. {
  137. strcpy(line_num,p->line_num );
  138. l=modefy_airline(l,line_num);
  139. pr->next =p->next ;
  140. PR("顾客 %s 退票成功!n",p->name );
  141. return OK;
  142. }
  143. pr=pr->next ;
  144. p=pr->next ;
  145. }
  146. PR("无此顾客,无法退票!n");
  147. return ERROR;
  148. }
  149. status save_airline(airline *l)//保存airline.dat
  150. {
  151. FILE *fp_airline;
  152. char ch='#';
  153. airline *p=l->next ;
  154. char filename[]="c:\airline.dat";
  155. if((fp_airline=fopen(filename,"wb"))==NULL)
  156. {
  157. printf("can not open file to write:%sn",filename);
  158. return ERROR;
  159. }
  160. for(;p!=NULL;p=p->next )
  161. {
  162. // printf("%s,%s,%s,%d,%dn",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
  163. fprintf(fp_airline,"%s,%s,%s,%d,%d%cn",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left ,ch);
  164. }
  165. fclose(fp_airline);
  166. return OK;
  167. }
  168. status save_customer(customer *l)//保存顾客信息 customer.dat
  169. {
  170. FILE *fp_customer;
  171. char ch='#';
  172. customer *p=l->next ;
  173. char filename[]="c:\customer.dat";
  174. if((fp_customer=fopen(filename,"wb"))==NULL)
  175. {
  176. printf("can not open file to write:%sn",filename);
  177. return ERROR;
  178. }
  179. for(;p!=NULL;p=p->next )
  180. {
  181. // PR("%s,%s,%dn",p->name ,p->line_num ,p->seat_num );
  182. fprintf(fp_customer,"%s,%s,%d%c",p->name ,p->line_num ,p->seat_num ,ch);
  183. }
  184. fclose(fp_customer);
  185. return OK;
  186. }
  187. int changStrInt(char *ch)//把字符串转化为整型
  188. {
  189. int a=1,b=0,c=0,i;
  190. for (i=strlen(ch)-1;i>=0;i--)
  191. {
  192. if (ch[i]<58&&ch[i]>47)
  193. {
  194. b=a*(ch[i]-48);
  195. a=a*10;
  196. c=c+b;
  197. }
  198. else 
  199. {
  200. PR("%c 不合法,无法将此字符串转化为整形!n",ch[i]);
  201. return 0;
  202. }
  203. // printf("the c is %dn",c);
  204. }
  205. return c;
  206. }
  207. status insert_air(airline *l,char *line_num,char *plane_num,char *end_place,int total,int left){//airline链表插入操作
  208. airline *q;
  209. q=(airline*)malloc(sizeof(airline));
  210. strcpy(q->line_num , line_num);
  211. strcpy(q->plane_num , plane_num);
  212. strcpy(q->end_place , end_place);
  213. q->total  =total;
  214. q->left =left;
  215. q->next=l->next ;
  216. l->next=q;
  217.  //   PR("insert %d ,%dis succssed!n",e,bl);
  218. return OK;
  219. }
  220. status insert_cus(customer *l,char *name,char *line_num,int seat){//customer链表插入操作
  221. customer *q;
  222. q=(customer*)malloc(sizeof(customer));
  223. strcpy(q->name , name);
  224. strcpy(q->line_num , line_num);
  225. q->seat_num =seat;
  226. q->next=l->next ;
  227. l->next=q;
  228. return OK;
  229. }
  230. status load_airline(airline *l)
  231. {
  232. FILE *fp_airline;
  233. int flag=0,i=0;
  234. char ch;
  235. char line_num[8];//航班号
  236. char plane_num[8];//飞机号
  237. char end_place[20];//目的的
  238. char total_str[5];
  239. char left_str[5];
  240. int total;//座位总数
  241. int left;//剩余座位 
  242. // airline *p=l;
  243. char filename[]="c:\airline.dat";
  244. if((fp_airline=fopen(filename,"rb"))==NULL)
  245. {
  246. printf("can not open file to load:%sn",filename);
  247. return ERROR;
  248. }
  249. while(!feof(fp_airline))
  250. {
  251. ch=fgetc(fp_airline);
  252. if(ch!='#')
  253. {
  254. if(flag==0&&ch!=',')
  255. {
  256. line_num[i]=ch;
  257. i++;
  258. }
  259. else if(flag==1&&ch!=',')
  260. {
  261. plane_num[i]=ch;
  262. i++;
  263. }
  264. else if(flag==2&&ch!=',')
  265. {
  266. end_place[i]=ch;
  267. i++;
  268. }
  269. else if(flag==3&&ch!=',')
  270. {
  271. total_str[i]=ch;
  272. i++;
  273. }
  274. else if(flag==4&&ch!=',')
  275. {
  276. left_str[i]=ch;
  277. i++;
  278. }
  279. else if (ch==',')
  280. {
  281. flag++;
  282. i=0;
  283. }
  284. /* else 
  285. {
  286. PR("错误n");
  287. return ERROR;
  288. }*/
  289. }
  290. else
  291. {
  292. flag=0;
  293. i=0;
  294. total=changStrInt(total_str);
  295. left=changStrInt(left_str);
  296. PR("%8s%8s%8s%9d%9dn",line_num ,plane_num ,end_place ,total ,left );
  297. insert_air(l,line_num,plane_num,end_place,total,left);
  298. }
  299. }
  300. fclose(fp_airline);
  301. return OK;
  302. }
  303. status load_customer(customer *l)
  304. {
  305. FILE *fp_customer;
  306. int flag=0,i=0;
  307. char ch;
  308. char name[9];
  309. char line_num[8];//航班号
  310. char seat_num_str[5];
  311. int seat_num;//座位 
  312. // customer *p=*l;
  313. char filename[50]="c:\customer.dat";
  314. if((fp_customer=fopen(filename,"rb"))==NULL)
  315. {
  316. printf("can not open file to load:%sn",filename);
  317. return ERROR;
  318. }
  319. while(!feof(fp_customer))
  320. {
  321. ch=fgetc(fp_customer);
  322. printf("%cn",ch);
  323. if(ch!='#')
  324. {
  325. if(flag==0&&ch!=',')
  326. {
  327. name[i]=ch;
  328. i++;
  329. }
  330. else if(flag==1&&ch!=',')
  331. {
  332. line_num[i]=ch;
  333. i++;
  334. }
  335. else if(flag==2&&ch!=',')
  336. {
  337. seat_num_str[i]=ch;
  338. i++;
  339. }
  340. else if (ch==',')
  341. {
  342. flag++;
  343. i=0;
  344. }
  345. else 
  346. {
  347. PR("错误n");
  348. return ERROR;
  349. }
  350. }
  351. else
  352. {
  353. flag=0;
  354. seat_num=changStrInt(seat_num_str);
  355. PR("%10s      %10s       %dn",name ,line_num ,seat_num );
  356. insert_cus(l,name,line_num,seat_num);
  357. // p=p->next ;
  358. }
  359. }
  360. fclose(fp_customer);
  361. return OK;
  362. }
  363. status creat_airline(airline **l)//创建airline单链表
  364. {
  365. airline *p=*l;
  366. int i=0;
  367. char *line_num[3]={"bjnc01","bjsh02","shgz03"};
  368. char *plane_num[3]={"plane1","plane2","plane3"};
  369. char *end_place[3]={"nc","sh","gz"};
  370. int total[3]={100,100,100};
  371. int left[3]={51,50,78};
  372. for (i=0;i<3;i++){
  373. insert_airline(&p,line_num[i],plane_num[i],end_place[i],total[i],left[i]);
  374. }
  375. return OK;
  376. }
  377. status creat_customer(customer **l)////创建customer单链表
  378. {
  379. customer *p=*l;
  380. int i=0;
  381. char *name[3]={"ouyangj0","yhl","fs"};
  382. char *line_num[3]={"bjnc01","bjsh02","shgz03"};
  383. int seat_num[3]={1,5,10};
  384. for (i=0;i<3;i++){
  385. insert_customer(&p,name[i],line_num[i],seat_num[i]);
  386. }
  387. return OK;
  388. }
  389. status increase_air(airline *l,char *line_num,char *plane_num,char *end_place,int total)//增加航线
  390. {
  391. airline *p=l->next ;
  392. for(;p->next !=NULL;p=p->next){}
  393. insert_airline(&p,line_num,plane_num,end_place,total,total);
  394. PR("增加航班 %s 成功!n",line_num);
  395. return OK;
  396. }
  397. status book(airline *l,char *line_num,customer *c,char *name)//订票
  398. {
  399. airline *p=l;
  400. customer *q=c->next ;
  401. p=l->next ;
  402. for(;q->next !=NULL;q=q->next){}
  403. // PR("%sn",q->name );
  404. for(;p!=NULL;p=p->next )
  405. {
  406. if(strcmp(line_num,p->line_num )==0)
  407. {
  408. if(p->left >0)
  409. {
  410. PR("恭喜您!订票成功!n");
  411. PR("你的座位号是:  %dn",(p->total -p->left +1));
  412. insert_customer(&q,name,line_num,p->total -p->left +1);
  413. p->left --;
  414. return OK;
  415. }
  416. else PR("对不起,座位已满!n");
  417. return 0;
  418. }
  419. }
  420. PR("对不起,没有这个航班号!n");
  421. return ERROR;
  422. }
  423. status print_airline(airline *l)//打印航线信息
  424. {
  425. airline *p=l->next ;
  426. for(;p!=NULL;p=p->next )
  427. {
  428. PR("%8s%8s%8s%9d%9dn",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
  429. }
  430. return OK;
  431. }
  432. status print_customer(customer *l)//打印顾客信息
  433. {
  434. customer *p=l->next ;
  435. for(;p!=NULL;p=p->next )
  436. {
  437. PR("%10s      %10s       %dn",p->name ,p->line_num ,p->seat_num );
  438. }
  439. return OK;
  440. }
  441. void main()
  442. {
  443. char choice,choice2,name[9],line_num[8],password[9],plane_num[8],end_place[9];
  444. char pass[9]="wj024",re_pass_1[9],re_pass_2[9];
  445. int t=1,tt=1,total;
  446. airline *air=init_airline();
  447. customer *cus=init_customer();
  448. PR(" 微机024班 数据结构 课程设计 (一)n");
  449. PR(" 航空订票系统n");
  450. PR(" 小组成员:欧阳锦林,王峰,段静缘n");
  451. creat_airline(&air);
  452. creat_customer(&cus);
  453. // save_airline(air);
  454. // save_customer(cus);
  455. while(t==1)
  456. {
  457. PR("*----------------------------*n");
  458. PR("*--航空订票系统选择菜单------*n");
  459. PR("*  订票-------0        *n");
  460. PR("*  退票-------1        *n");
  461. PR("*  查询-------2        *n");
  462. PR("*  修改航线---3        *n");
  463. PR("*  读入文件---4        *n");
  464. PR("*  退出-------5        *n");
  465. PR("*----------------------------*n");
  466. PR("请选择: ");
  467. choice = getch();
  468. PR("%cn",choice);
  469. if(choice=='0')
  470. {
  471. PR("请输入你要订的航班号: ");
  472. scanf( "%s",line_num);
  473. PR("请输入你的姓名: ");
  474. scanf( "%s",name);
  475. book(air,line_num,cus,name);
  476. save_airline(air);
  477. save_customer(cus);
  478. }
  479. else if(choice=='1')
  480. {
  481. PR("n请输入你的姓名: ");
  482. scanf( "%s",name);
  483. delete_cus(cus,air,name);
  484. save_airline(air);
  485. save_customer(cus);
  486. }
  487. else if(choice=='2')
  488. {
  489. PR("n  航班号  飞机号   目的地    总票数   余票数n");
  490. print_airline(air);
  491. PR("    姓名            航班号      座位号n");
  492. print_customer(cus);
  493. }
  494. else if(choice=='3')
  495. {
  496. tt=1;
  497. PR("请输入密码: ");
  498. scanf("%s",password);
  499. if(strcmp(password,pass)==0)
  500. {
  501. while (tt==1){
  502. PR("n*------------------------------*n");
  503. PR("*-------航线信息修改:----------*n");
  504. PR("* 增加航班号-----'0'     *n");
  505. PR("* 删除航班号-----'1'     *n");
  506. PR("* 修改密码-------'2'     *n");
  507. PR("* 查询航线信息---'3'     *n");
  508. PR("* 退出航线修改---'4'     *n");
  509. PR("*------------------------------*n");
  510. PR("请选择: ");
  511. choice2=getch();
  512. PR("%cn",choice2);
  513. if(choice2=='0')
  514. {
  515. PR("请输入你要增加的航班号: ");
  516. scanf("%s",line_num);
  517. PR("请输入飞机号: ");
  518. scanf("%s",plane_num);
  519. PR("请输入目的地: ");
  520. scanf("%s",end_place);
  521. PR("请输入座位总数: ");
  522. scanf("%d",&total);
  523. increase_air(air,line_num,plane_num,end_place,total);
  524. save_airline(air);
  525. save_customer(cus);
  526. }
  527. else if (choice2=='1')
  528. {
  529. PR("请输入你要删除的航班号: ");
  530. scanf("%s",line_num);
  531. delete_airline(air,line_num);
  532. delete_customer(cus,line_num);
  533. save_airline(air);
  534. save_customer(cus);
  535. }
  536. else if(choice2=='2')
  537. {
  538. PR("注意:密码不能超过8位!n");
  539. PR("请输入新密码:");
  540. scanf("%s",re_pass_1);
  541. PR("请再输入一次: ");
  542. scanf("%s",re_pass_2);
  543. if(strcmp(re_pass_1,re_pass_2)==0)
  544. {
  545. strcpy(pass,re_pass_1);
  546. PR("密码修改成功!请记住.n");
  547. }
  548. else {
  549. PR("你两次输入的密码不一致!n");
  550. }
  551. }
  552. else if(choice2=='3')
  553. {
  554. PR("n  航班号  飞机号   目的地    总票数   余票数n");
  555. print_airline(air);
  556. }
  557. else if(choice2=='4')
  558. {
  559. tt=0;
  560. }
  561. else {
  562. PR("你的输入有误n");
  563. tt=0;
  564. }
  565. }//end while
  566. }//end if
  567. else {
  568. PR("对不起!你输入的密码不正确!n");
  569. }
  570. }//end else if 修改
  571. else if(choice=='4')
  572. {
  573. load_airline(air);
  574. load_customer(cus);
  575. }
  576. else if(choice=='5')
  577. {
  578. PR("再见!");
  579. t=0;
  580. }
  581. else 
  582. {
  583. PR("你的输入有误n");
  584. }
  585. }
  586. getch();
  587. }