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

控制台编程

开发平台:

C/C++

  1. #include"airplane.h"
  2. airline *init_airline(){//初始化链表
  3. airline *l;
  4. l=(airline*)malloc(sizeof(airline));
  5. if(l==NULL){
  6. exit(0);
  7. }
  8. l->next=NULL;
  9. return l;
  10. }
  11. customer * init_customer(){//初始化链表
  12. customer *l;
  13. l=(customer*)malloc(sizeof(customer));
  14. if(l==NULL){
  15. exit(0);
  16. }
  17. l->next=NULL;
  18. return l;
  19. }
  20. status insert_airline(airline **p,char *line_num,char *plane_num,char *end_place,int total,int left){//airline链表插入操作
  21. airline *q;
  22. q=(airline*)malloc(sizeof(airline));
  23. /*{
  24. PR("内存分配失败n");
  25. return OVERFLOW;
  26. }*/
  27. strcpy(q->line_num , line_num);
  28. strcpy(q->plane_num , plane_num);
  29. strcpy(q->end_place , end_place);
  30. q->total  =total;
  31. q->left =left;
  32. q->next=NULL;
  33. (*p)->next=q;
  34. (*p)=(*p)->next;
  35.  //   PR("insert %d ,%dis succssed!n",e,bl);
  36. return OK;
  37. }
  38. status insert_customer(customer **p,char *name,char *line_num,int seat){//customer链表插入操作
  39. customer *q;
  40. q=(customer*)malloc(sizeof(customer));
  41. /* {
  42. PR("内存分配失败n");
  43. return OVERFLOW;
  44. }*/
  45. strcpy(q->name , name);
  46. strcpy(q->line_num , line_num);
  47. q->seat_num =seat;
  48. q->next=NULL;
  49. (*p)->next=q;
  50. (*p)=(*p)->next;
  51.  //   PR("insert %d ,%dis succssed!n",e,bl);
  52. return OK;
  53. }
  54. airline *modefy_airline(airline *l,char *line_num)//修改airline链表中的数据
  55. {
  56. airline *p;
  57. p=l->next ;
  58. for(;p!=NULL;p=p->next )
  59. {
  60. if(strcmp(line_num,p->line_num )==0)
  61. {
  62. p->left ++;
  63. // PR("modefy %sn",p->line_num );
  64. return l;
  65. }
  66. }
  67. PR("没有这个航班,无法完成修改任务!n");
  68. return 0;
  69. }
  70. status delete_airline(airline *h,char *line_num)//删除航班
  71. {
  72. airline *p,*pr;
  73. pr=h;
  74. p=pr->next ;
  75. while(p!=NULL)
  76. {
  77. if(strcmp(line_num,p->line_num )==0)
  78. {
  79. pr->next =p->next ;
  80. PR("删除  %s  航班n",p->line_num  );
  81. return OK;
  82. }
  83. pr=pr->next ;
  84. p=pr->next ;
  85. }
  86. PR("无此航班,无法删除!n");
  87. return ERROR;
  88. }
  89. status delete_customer(customer *h,char *line_num)//删除顾客
  90. {
  91. customer *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. }
  100. pr=pr->next ;
  101. p=pr->next ;
  102. }
  103. // PR("无此航班,无法删除!n");
  104. return OK;
  105. }
  106. status delete_cus(customer *h,airline *l,char *name)//顾客退票
  107. {
  108. customer *p,*pr;
  109. char line_num[8];
  110. // qr=h;
  111. pr=h;
  112. p=pr->next ;
  113. // PR("开始删除n");
  114. while(p!=NULL)
  115. {
  116. if(strcmp(name,p->name )==0)
  117. {
  118. strcpy(line_num,p->line_num );
  119. l=modefy_airline(l,line_num);
  120. pr->next =p->next ;
  121. PR("顾客 %s 退票成功!n",p->name );
  122. return OK;
  123. }
  124. pr=pr->next ;
  125. p=pr->next ;
  126. }
  127. PR("无此顾客,无法退票!n");
  128. return ERROR;
  129. }
  130. status save_airline(airline *l)//保存airline.dat
  131. {
  132. FILE *fp_airline;
  133. char ch='#';
  134. airline *p=l->next ;
  135. char filename[]=".\airline.dat";
  136. if((fp_airline=fopen(filename,"wb"))==NULL)
  137. {
  138. printf("can not open file to write:%sn",filename);
  139. return ERROR;
  140. }
  141. for(;p!=NULL;p=p->next )
  142. {
  143. // printf("%s,%s,%s,%d,%dn",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
  144. fprintf(fp_airline,"%s,%s,%s,%d,%d%cn",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left ,ch);
  145. }
  146. fclose(fp_airline);
  147. return OK;
  148. }
  149. status save_customer(customer *l)//保存顾客信息 customer.dat
  150. {
  151. FILE *fp_customer;
  152. char ch='#';
  153. customer *p=l->next ;
  154. char filename[]=".\customer.dat";
  155. if((fp_customer=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. // PR("%s,%s,%dn",p->name ,p->line_num ,p->seat_num );
  163. fprintf(fp_customer,"%s,%s,%d%c",p->name ,p->line_num ,p->seat_num ,ch);
  164. }
  165. fclose(fp_customer);
  166. return OK;
  167. }
  168. int changStrInt(char *ch)//把字符串转化为整型
  169. {
  170. int a=1,b=0,c=0,i;
  171. for (i=strlen(ch)-1;i>=0;i--)
  172. {
  173. if (ch[i]<58&&ch[i]>47)
  174. {
  175. b=a*(ch[i]-48);
  176. a=a*10;
  177. c=c+b;
  178. }
  179. else 
  180. {
  181. PR("%c 不合法,无法将此字符串转化为整形!n",ch[i]);
  182. return 0;
  183. }
  184. // printf("the c is %dn",c);
  185. }
  186. return c;
  187. }
  188. status creat_airline(airline **l)//创建airline单链表
  189. {
  190. airline *p=*l;
  191. int i=0;
  192. char *line_num[3]={"bjnc01","bjsh02","shgz03"};
  193. char *plane_num[3]={"plane1","plane2","plane3"};
  194. char *end_place[3]={"南昌","上海","广州"};
  195. int total[3]={100,100,100};
  196. int left[3]={51,50,78};
  197. for (i=0;i<3;i++){
  198. insert_airline(&p,line_num[i],plane_num[i],end_place[i],total[i],left[i]);
  199. }
  200. return OK;
  201. }
  202. status creat_customer(customer **l)////创建customer单链表
  203. {
  204. customer *p=*l;
  205. int i=0;
  206. char *name[3]={"欧阳锦林","尹焕亮","付胜"};
  207. char *line_num[3]={"bjnc01","bjsh02","shgz03"};
  208. int seat_num[3]={1,5,10};
  209. for (i=0;i<3;i++){
  210. insert_customer(&p,name[i],line_num[i],seat_num[i]);
  211. }
  212. return OK;
  213. }
  214. status increase_air(airline *l,char *line_num,char *plane_num,char *end_place,int total)//增加航线
  215. {
  216. airline *p=l->next ;
  217. for(;p->next !=NULL;p=p->next){}
  218. insert_airline(&p,line_num,plane_num,end_place,total,total);
  219. PR("增加航班 %s 成功!n",line_num);
  220. return OK;
  221. }
  222. status book(airline *l,char *line_num,customer *c,char *name)//订票
  223. {
  224. airline *p=l;
  225. customer *q=c->next ;
  226. p=l->next ;
  227. for(;q->next !=NULL;q=q->next){}
  228. // PR("%sn",q->name );
  229. for(;p!=NULL;p=p->next )
  230. {
  231. if(strcmp(line_num,p->line_num )==0)
  232. {
  233. if(p->left >0)
  234. {
  235. PR("恭喜您!订票成功!n");
  236. PR("你的座位号是:  %dn",(p->total -p->left +1));
  237. insert_customer(&q,name,line_num,p->total -p->left +1);
  238. p->left --;
  239. return OK;
  240. }
  241. else PR("对不起,座位已满!n");
  242. return 0;
  243. }
  244. }
  245. PR("对不起,没有这个航班号!n");
  246. return ERROR;
  247. }
  248. status print_airline(airline *l)//打印航线信息
  249. {
  250. airline *p=l->next ;
  251. for(;p!=NULL;p=p->next )
  252. {
  253. PR("  %-8s%-8s%-9s%7d%9dn",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
  254. }
  255. return OK;
  256. }
  257. status print_customer(customer *l)//打印顾客信息
  258. {
  259. customer *p=l->next ;
  260. for(;p!=NULL;p=p->next )
  261. {
  262. PR("  %-10s      %-10s       %dn",p->name ,p->line_num ,p->seat_num );
  263. }
  264. return OK;
  265. }
  266. status air_main()
  267. {
  268. char choice,choice2,name[9],line_num[8],password[9],plane_num[8],end_place[9];
  269. char pass[9]="wj024",re_pass_1[9],re_pass_2[9];
  270. int t=1,tt=1,total,i;
  271. FILE *pass_f;
  272. char filename[]=".\pass.dat";
  273. airline *air=init_airline();
  274. customer *cus=init_customer();
  275. creat_airline(&air);
  276. creat_customer(&cus);
  277. save_airline(air);
  278. save_customer(cus);
  279. if((pass_f=fopen(filename,"r"))==NULL)
  280. {
  281. printf("can not open file to read(fscanf):%sn",filename);
  282. return ERROR;
  283. }
  284. fscanf(pass_f,"%s",pass);
  285. fclose(pass_f);
  286. while(t==1)
  287. {
  288. PR("*-------------------------------------*n");
  289. PR("*--航空订票系统选择菜单---------------*n");
  290. PR("*  订票----------------0        *n");
  291. PR("*  退票----------------1        *n");
  292. PR("*  查看所有信息--------2        *n");
  293. PR("*  修改航线(需密码)----3        *n");
  294. PR("*  退出航空订票系统----4        *n");
  295. PR("*-------------------------------------*n");
  296. PR("请选择: ");
  297. choice =getch();
  298. PR("%cn",choice);
  299. if(choice=='0')
  300. {
  301. PR("n请输入你要订的航班号: ");
  302. scanf( "%s",line_num);
  303. PR("请输入你的姓名: ");
  304. scanf( "%s",name);
  305. book(air,line_num,cus,name);
  306. save_airline(air);
  307. save_customer(cus);
  308. }
  309. else if(choice=='1')
  310. {
  311. PR("n请输入你的姓名: ");
  312. scanf( "%s",name);
  313. delete_cus(cus,air,name);
  314. save_airline(air);
  315. save_customer(cus);
  316. }
  317. else if(choice=='2')
  318. {
  319. PR("n  航班号  飞机号  目的地    总票数   余票数n");
  320. print_airline(air);
  321. PR("    姓名            航班号      座位号n");
  322. print_customer(cus);
  323. }
  324. else if(choice=='3')
  325. {
  326. tt=1;
  327. PR("请输入密码:n!注意:不能修改,如退格,ENTER之类,你的密码:  ");
  328. // scanf("%s",password);
  329. for (i=0;i<strlen(pass);i++)
  330. {
  331. // putchar(password[i]=getch());
  332. // if(password[i]!=10){
  333. password[i]=getch();
  334. putchar('*');
  335. // }
  336. // else break;
  337. }
  338. password[i]='';
  339. if(strcmp(password,pass)==0)
  340. {
  341. while (tt==1){
  342. PR("n*------------------------------*n");
  343. PR("*-------航线信息修改:----------*n");
  344. PR("* 增加航班号-----'0'     *n");
  345. PR("* 删除航班号-----'1'     *n");
  346. PR("* 修改密码-------'2'     *n");
  347. PR("* 查询航线信息---'3'     *n");
  348. PR("* 退出航线修改---'4'     *n");
  349. PR("*------------------------------*n");
  350. PR("请选择: ");
  351. choice2=getch();
  352. PR("%cn",choice2);
  353. if(choice2=='0')
  354. {
  355. PR("请输入你要增加的航班号: ");
  356. scanf("%s",line_num);
  357. PR("请输入飞机号: ");
  358. scanf("%s",plane_num);
  359. PR("请输入目的地: ");
  360. scanf("%s",end_place);
  361. PR("请输入座位总数: ");
  362. scanf("%d",&total);
  363. increase_air(air,line_num,plane_num,end_place,total);
  364. save_airline(air);
  365. save_customer(cus);
  366. }
  367. else if (choice2=='1')
  368. {
  369. PR("请输入你要删除的航班号: n");
  370. scanf("%s",line_num);
  371. delete_airline(air,line_num);
  372. delete_customer(cus,line_num);
  373. save_airline(air);
  374. save_customer(cus);
  375. }
  376. else if(choice2=='2')
  377. {
  378. PR("注意:密码只能是8位!n");
  379. PR("请输入新密码:");
  380. for (i=0;i<8;i++)
  381. {
  382. re_pass_1[i]=getch();
  383. putchar('*');
  384. }
  385. re_pass_1[i]='';
  386. PR("n请再输入一次: ");
  387. for (i=0;i<8;i++)
  388. {
  389. re_pass_2[i]=getch();
  390. putchar('*');
  391. }
  392. re_pass_2[i]='';
  393. if(strcmp(re_pass_1,re_pass_2)==0)
  394. {
  395. strcpy(pass,re_pass_1);
  396. PR("n密码修改成功!请记住.n");
  397. if((pass_f=fopen(filename,"w"))==NULL)
  398. {
  399. printf("can not open file to write(fprintf):%sn",filename);
  400. return ERROR;
  401. }
  402. fprintf(pass_f,pass);
  403. fclose(pass_f);
  404. }
  405. else {
  406. PR("n你两次输入的密码不一致!n");
  407. }
  408. }
  409. else if(choice2=='3')
  410. {
  411. PR("n  航班号  飞机号   目的地    总票数   余票数n");
  412. print_airline(air);
  413. }
  414. else if(choice2=='4')
  415. {
  416. tt=0;
  417. }
  418. else {
  419. PR("你的输入有误n");
  420. tt=0;
  421. }
  422. }//end while
  423. }//end if
  424. else {
  425. PR("n对不起!你输入的密码不正确!n");
  426. }
  427. }//end else if 修改
  428. else if(choice=='4')
  429. {
  430. // PR("再见!n");
  431. t=0;
  432. }
  433. else 
  434. {
  435. PR("你的输入有误n");
  436. }
  437. }
  438. // getch();
  439. return OK;
  440. }