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

控制台编程

开发平台:

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