1、软 件 工 程 专 业 14 级 数 据 结 构 课 程 设 计 报 告设计题目: 飞机订票系统 班 级: 软 件 14 姓 名: 指导教师: 2015 年 11 月 20 日目 录一、设计任务与要求 11.1 总体目标与任务要求 .11.2 题目选择与目的意义 .11.3 所选题目的主要工作.1二、需求分析 22.1 用户需求分析.22.2 功能需求分析.22.3 系统需求分析.2三、概要设计 33.1 各模块的算法设计说明.33.2 存储结构设计说明.8四、详细设计 .10五、源代码 .11六、运行结果分析 .21七、收获与体会 .28八、主要参考资料 .28第 0 页一 、 设 计 任
2、务 与 要 求1.1 总 体 目 标 与 任 务 要 求制 作 一 个 订 票 系 统 , 通 过 此 系 统 可 以 实 现 如 下 功 能 : 1) 录 入 可 以 录 入 航 班 情 况 ( 数 据 可 以 存 储 在 一 个 数 据 文 件 中 , 数 据 结 构 、 具 体 数 据自 定 ) 。 2) 查 询 可 以 查 询 某 个 航 线 的 情 况 ( 如 , 输 入 航 班 号 , 查 询 起 降 时 间 , 起 飞 抵 达 城 市 ,航 班 票 价 , 票 价 折 扣 , 确 定 航 班 是 否 满 仓 ) 可 以 输 入 起 飞 抵 达 城 市 , 查 询 飞 机 航班 情
3、 况 。3) 订 票 可 以 订 票 , 如 果 该 航 班 已 经 无 票 , 可 以 提 供 相 关 可 选 择 的 航 班 ( 订 票 情 况可 以 存 在 一 个 数 据 文 件 中 , 结 构 自 己 设 定 )。4) 退 票可 退 票 , 退 票 后 修 改 相 关 数 据 文 件 ; 客 户 资 料 有 姓 名 , 证 件 号 , 订 票 数 量 及航 班 情 况 , 订 单 要 有 编 号 。 5) 修 改 航 班 信 息当 航 班 信 息 改 变 可 以 修 改 航 班 数 据 文 件 。 根 据 以 上 功 能 说 明 , 设 计 航 班 信 息 , 订 票 信 息 的 存
4、 储 结 构 , 设 计 程 序 完 成 功能 。1.2 题 目 选 择 与 目 的 意 义选 择 这 个 题 目 的 原 因 是 , 订 票 系 统 在 现 实 生 活 中 应 用 很 广 泛 , 通 过 这 个 系 统可 以 使 订 票 、 退 票 等 变 得 简 便 。 与 传 统 的 人 工 用 纸 、 笔 来 记 录 办 理 订 票 、 退 票 等相 比 , 使 用 这 个 系 统 也 会 增 加 工 作 效 率 。 这 个 题 目 做 出 来 的 系 统 还 是 比 较 实 用 的 ,所 以 我 选 择 了 订 票 系 统 这 个 题 目 。完成此系统,需要综合运用数据结构课程中学
5、到的几种典型数据结构,以及程序设计语言(C 语言) ,自行实现一个较为完整的应用系统的设计与开发。通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。1.3 所 选 题 目 的 主 要 工 作这 个 题 目 的 主 要 工 作 是 使 订 票 系 统 可 以 录 入 航 班 情 况 , 查 询 某 个 航 线 的 情 况 、第 1 页办 理 订 票 、 办 理 退 票 、 修 改 航 班 信 息 、 查 询 订 票 信 息
6、等 。二 、 需 求 分 析2.1 用 户 需 求 分 析用 户 使 用 此 程 序 所 要 完 成 的 工 作 主 要 为 : 查 询 所 有 航 线 信 息 、 查 看 已 订 票 客户 信 息 、 查 询 航 线 、 办 理 订 票 业 务 、 办 理 退 票 业 务 。 通 过 此 系 统 可 以 方 便 的 进 行上 述 工 作 。每条航线所涉及的信息有:终点站名、航班号、飞行时间、票价、乘员定额、余票量。已订票的客户名单信息包括姓名、订票量、舱位等级(1,2 或 3) 。等候替补的客户名单信息包括姓名、所需票量。查询航线功能可以根据旅客提出的终点站名输出航班号、飞行时间、票价、乘员
7、定额、余票量。订票业务功能根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于定票额,则需重新询问客户要求。若需要,可登记排队候补购票。退票业务功能根据客户提供的情况(航班号、姓名)为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。2.2 功 能 需 求 分 析功 能 需 求 分 析 模 块 图 如 图 2.1 所 示 。图 2.1 功 能 模 块 图第 2 页2.3 系 统 需 求 分 析开 发 环 境 : Windo
8、ws 7 系 统使 用 软 件 : 编 写 实 验 报 告 : Microsoft Office Word制 作 程 序 : Microsoft Visual C+ 6.0三 、 概 要 设 计3.1 各 模 块 的 算 法 设 计 说 明1 浏 览 航 线 信 息 功 能 , 调 用 display 函 数 进 行 输 出 。 如 图 3.1 所 示 。 浏览 航 线 信 息 流 程 图 :图 3.1 浏 览 航 线 信 息 流 程 图 :其 中 display 函 数 的 流 程 图 如 图 3.2 display 函 数 流 程 图 :第 3 页图 3.2 display 函 数 流 程
9、 图2 浏 览 已 订 票 客 户 信 息 功 能 , 按顺序输出客户信息链表中的信息。 流 程 图如 图 3.3 浏 览 已 订 票 客 户 信 息 功 能 流 程 图 :图 3.3 浏 览 已 订 票 客 户 信 息 功 能 流 程 图3 查 询 航 线 功 能 , 根 据 客 户 提 出 的 终 点 站 名 输 出 航 线 信 息 。 流 程 图 如 图3.4 查 询 航 线 流 程 图 :第 4 页图 3.4 查 询 航 线 流 程 图4 办 理 订 票 业 务 功 能 , 根 据 客 户 提 出 的 航 线 信 息 等 进 行 订 票 。 流 程 图 如 图3.5 办 理 订 票 业
10、 务 功 能 流 程 图 :第 5 页图 3.5 办 理 订 票 业 务 功 能 流 程 图5 办 理 退 票 业 务 功 能 , 根 据 客 户 提 出 的 航 线 信 息 等 进 行 退 票 。 流 程 图 如 图3.6 办 理 退 票 业 务 功 能 流 程 图 :第 6 页图 3.6 办 理 退 票 业 务 功 能 流 程 图6 主 函 数 流 程 图 如 图 3.7 主 函 数 流 程 图 :第 7 页图 3.7 主 函 数 流 程 图3.2 存 储 结 构 设 计 说 明typedef struct wat_ros /*单 链 队 列 存 储 等 候 替 补 的 客 户 信 息 *
11、/ char name10; /*姓 名 */int req_amt; /*订 票 量 */struct wat_ros *next; qnode,*qptr;第 8 页typedef struct pqueue /*等 候 替 补 的 客 户 名 单 */ qptr front; qptr rear; linkqueue;上 述 单 链 队 列 用 来 存 储 排 队 等 候 的 客 户 名 单 , 这 样 可 以 通 过 队 先 进 先 出 的 特点 来 进 行 操 作 。 先 排 队 的 客 户 可 以 先 订 票 成 功 。typedef struct ord_ros /*乘 员 名
12、单 */ char name10; /*客 户 姓 名 */int ord_amt; /*订 票 量 */ int grade; /*舱 位 等 级 */struct ord_ros *next;linklist;上 述 单 链 表 用 来 存 储 乘 员 的 信 息 , 包 括 姓 名 、 订 票 量 、 舱 位 等 级 。struct airline /*航 线 信 息 */ char ter_name10; /*抵 达 城 市 */char air_num10; /*航 班 号 */char time10; /*飞 机 时 间 */char pri7; /*票 价 */int tkt_a
13、mt; /*乘 员 定 额 */int tkt_sur; /*余 票 量 */linklist *order; /*乘 员 名 单 域 , 指 向 乘 员 名 单 链 表 的 头 指 针 */linkqueue wait; /*等 候 替 补 的 客 户 名 单 域 , 分 别 指 向 排 队 等 候 名 单 队 头队 尾 的 指 针 */lineinfo;这 个 结 构 体 存 储 了 航 线 信 息 , 包 括 抵 达 城 市 、 航 班 号 、 飞 行 时 间 、 票 价 、 乘员 定 额 、 余 票 量 等 。#define MAXSIZE 5 /*定 义 航 线 数 量 , 可 修
14、改 */struct airline airMAXSIZE= /*初 始 化 航 线 信 息 */“beijing“,“1“,“1200“,“860“,30,30, “shanghai“,“2“,“1000“,“770“,20,20,“london“,“3“,“1330“,“960“,10,10,第 9 页“harbin“,“4“,“1700“,“760“,50,50,“dalian“,“5“,“1400“,“550“,40,40;通 过 修 改 全 局 变 量 MAXSIZE 的 数 值 即 可 更 改 航 线 数 。 在 struct airline airMAXSIZE中 可 以 修 改
15、 、 增 加 、 删 除 航 线 信 息 。 航 线 信 息 内 容 依 次 为 抵 达 城 市 、航 班 号 、 飞 行 时 间 、 票 价 、 乘 员 定 额 、 余 票 量 ( 飞 行 时 间 1200 即 12: 00) 。四 、 详 细 设 计1. 查 看 航 线 信 息编 写 void list()函 数 来 查 看 全 部 航 线 信 息 。 其 中 调 用 了 void display(struct airline *info)函 数 , 该 函 数 的 功 能 是 打 印 每 条 航 线 的 基 本 信息 。 这 样 即 可 按 顺 序 打 印 出 struct airlin
16、e 链 表 中 存 储 的 全 部 航 线 信 息 。2. 查 看 已 订 票 客 户 信 息编 写 void prtlink()函 数 来 查 看 已 订 票 客 户 信 息 。 这 个 函 数 中 需 要 输 入 要 查 询的 航 线 , 通 过 find()函 数 来 寻 找 这 个 航 线 然 后 输 出 该 航 线 乘 员 域 的 乘 员 信 息 。3. 查 询 航 线编 写 void search()函 数 来 实 现 查 询 航 线 的 功 能 。 用 户 输 入 抵 达 城 市 名 , 该 函 数会 在 航 线 信 息 链 表 中 进 行 查 询 。 如 果 有 该 城 市 ,
17、 则 会 输 出 此 航 线 的 信 息 。4. 办 理 订 票 业 务编 写 void order()函 数 来 实 现 订 票 功 能 。 首 先 提 示 用 户 输 入 航 班 号 , 然 后 调 用find()函 数 来 查 找 此 航 班 , 如 果 该 航 班 存 在 , 则 会 提 示 用 户 输 入 信 息 并 调 用linklist *insertlink(linklist *head,int amount,char name,int grade)在 订 票 乘 员 名 单域 中 添 加 客 户 信 息 。 如 果 余 票 不 足 , 则 会 提 示 用 户 进 行 排 队
18、, 如 果 排 队 , 则 会 调用 提 示 用 户 输 入 信 息 并 调 用 linkqueue appendqueue(linkqueue q,char name,int amount)在 排 队 等 候 乘 员 名 单 域 中 添 加 客 户 信 息 。5. 办 理 退 票 业 务编 写 void return_tkt()函 数 来 实 现 退 票 功 能 。 首 先 提 示 用 户 输 入 航 班 号 , 然 后调 用 find()函 数 来 查 找 此 航 班 , 如 果 该 航 班 存 在 , 则 会 提 示 用 户 输 入 信 息 , 信 息正 确 则 会 提 示 退 票 成
19、功 。 此 时 将 乘 员 信 息 中 的 该 乘 员 信 息 删 除 , 然 后 检 查 替 补 乘员 链 表 中 的 信 息 , 如 果 其 订 票 量 可 以 得 到 满 足 , 则 会 将 其 插 入 到 订 票 客 户 名 单 链表 中 , 提 示 他 订 票 成 功 。6. 退 出 系 统主 函 数 中 无 限 循 环 输 出 菜 单 for(;), 用 户 在 菜 单 页 面 下 输 入 6 回 车 即 exit(0),即 可 退 出 系 统 。第 10 页五 、 源 代 码#include #include #include #include #include #define
20、MAXSIZE 5 /*定义航线数量,可修改*/typedef struct wat_ros /*单链队列存储等候替补的客户信息 */ char name10; /*姓名*/int req_amt; /*订票量*/struct wat_ros *next; qnode,*qptr;typedef struct pqueue /*等候替补的客户名单*/ qptr front; /*等候替补客户名单域的队头指针*/qptr rear; /*等候替补客户名单域的队尾指针*/linkqueue;typedef struct ord_ros /*乘员名单*/ char name10; /*客户姓名*/i
21、nt ord_amt; /*订票量*/ int grade; /*舱位等级*/struct ord_ros *next;linklist;struct airline char ter_name10; /*抵达城市*/char air_num10; /*航班号*/char time10; /*飞机时间*/char pri7; /*票价*/第 11 页int tkt_amt; /*乘员定额*/int tkt_sur; /*余票量*/linklist *order; /*乘员名单域,指向乘员名单链表的头指针*/linkqueue wait; /*等候替补的客户名单域,分别指向排队等候名单队头队尾的
22、指针*/lineinfo;struct airline *start;void display(struct airline *info) /*打印每条航线的基本信息*/printf(“%8st%3st%stt%4st%3dt%10dn“,info-ter_name,info-air_num,info-time,info-pri,info-tkt_amt,info-tkt_sur);void list() /*打印全部航线信息*/ struct airline *info;int i=0;info=start;printf(“终点站名t航班号 t飞行时间t票价t乘员定额t余票量n“);whil
23、e(iter_name) /*有该站名 strcmp则返回,if(!0)即break*/break;info+;i+;if(i=MAXSIZE) /*没有匹配的航线*/printf(“对不起,没有这条航线!n“);elseprintf(“终点站名t航班号t飞行时间t票价t 乘员定额t余票量n“);display(info); /*调用display 函数输出航线信息*/struct airline *find() / *根据系统提出的航班号查询并以指针形式返回*/ struct airline *info;char number10; /*查询的航班号*/int i=0;info=start;
24、printf(“请输入航班号:“);scanf(“%s“,number);while(iair_num) /*有匹配航班*/return info; 第 13 页info+;i+; /*无匹配航班*/printf(“对不起,没有这条航线!n“);return NULL;void prtlink() /*打印订票乘员名单域的客户名单信息 */ linklist *p;struct airline *info;info=find();p=info-order;if(p!=NULL) /*按顺序输出客户信息链表*/printf(“客户姓名 订票数额 舱位等级n“);while(p) printf(“
25、%stt%dt%dn“,p-name,p-ord_amt,p-grade);p=p-next; else /*没有人订这个航班*/printf(“该航线没有客户信息!n“);linklist *insertlink(linklist *head,int amount,char name,int grade) /*增加订票乘员名单域的客户信息*/ linklist *p1,*new1;p1=head;new1=(linklist*)malloc(sizeof(linklist);if(!new1) /*存储空间不足*/ printf(“nOut of memory!n“);return NULL
26、;第 14 页strcpy(new1-name,name);new1-ord_amt=amount;new1-grade=grade;new1-next=NULL;if(head=NULL) /*若原订票客户信息为空*/head=new1;new1-next=NULL;else head=new1;new1-next=p1;return head;linkqueue appendqueue(linkqueue q,char name,int amount) /*增加排队等候的客户名单域*/ qptr new1;new1=(qptr)malloc(sizeof(qnode);strcpy(new
27、1-name,name);new1-req_amt=amount;new1-next=NULL;if(q.front=NULL) /*若原排队等候客户名单域为空*/q.front=new1;elseq.rear-next=new1;q.rear=new1;return q;第 15 页void order() /*办理订票业务*/ struct airline *info;int amount,grade; /*订票数量,舱位等级*/char name10; /*要订的航班号*/info=start;if(!(info=find() /*根据客户提供的航班号进行查询,如为空,退出该模块*/re
28、turn;printf(“请输入您需要的票数:“);scanf(“%d“,if(amountinfo-tkt_amt) /*若客户订票额超过乘员定票总额,退出*/ printf(“n对不起,您输入票数已经超过乘员定额!“);return;if(amounttkt_sur) /*若客户订票额末超过余票量,订票成功并等记信息*/ int i;printf(“请输入您的姓名:“);scanf(“%s“,name);printf(“请输入您需要的舱位等级(1,2或):“);scanf(“%d“,info-order=insertlink(info-order,amount,name,grade); /
29、*在订票乘员名单域中添加客户信息*/for(i=0;itkt_amt-info-tkt_sur+i+1);info-tkt_sur-=amount; /*该航线的余票量应减掉该客户的订票量*/printf(“n祝您乘坐愉快!n“);第 16 页else /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/ char r;printf(“n没有这么多票了,您需要排队等候吗?(Y/N)“);r=getch();printf(“%c“,r);if(r=Y|r=y) printf(“n请输入您的姓名:“);scanf(“%s“,name);info-wait=appendqueue(info
30、-wait,name,amount); /*在排队等候乘员名单域中添加客户信息*/printf(“n注册排队成功!n“);else printf(“n欢迎您再次订购!n“);void return_tkt() /*退票模块*/ struct airline *info;qnode *t,*back,*f,*r;int grade;linklist *p1,*p2,*head;char cusname10;if(!(info=find() /*调用查询函数,根据客户提供的航线进行搜索*/return;head=info-order;p1=head;第 17 页printf(“请输入你的姓名:“)
31、;scanf(“%s“,cusname);while(p1!=NULL) /*根据客户提供的姓名到订票客户名单域进行查询*/if(!strcmp(cusname,p1-name) break;p2=p1;p1=p1-next;if(p1=NULL) /*若未找到,退出本模块 */ printf(“对不起,您没有订过票!n“);return;else /*若信息查询成功,删除订票客户名单域中的信息*/if(p1=head) head=p1-next;elsep2-next=p1-next;info-tkt_sur+=p1-ord_amt;grade=p1-grade;printf(“%s退票成功
32、 !n“,p1-name);free(p1);info-order=head; /*重新将航线名单域指向订票单链表的头指针*/f=(info-wait).front; /*f指向排队等候名单队列的头结点*/r=(info-wait).rear; /*r指向排队等候名单队列的尾结点*/t=f; /*t为当前满点条件的排队候补名单域*/第 18 页while(t)if(info-tkt_sur=info-wait.front-req_amt) /*若满足条件者为头结点*/int i;info-wait.front=t-next;printf(“%s订票成功 !n“,t-name);for(i=0;
33、ireq_amt;i+) /*输出座位号*/printf(“%s的座位号是:%dn“,t-name,(info-tkt_sur)-i);info-tkt_sur-=t-req_amt;info-order=insertlink(info-order,t-req_amt,t-name,grade);/*插入到订票客户名单链表中*/free(t);break;back=t;t=t-next;if(info-tkt_sur)=(t-req_amt)back-next=t-next;printf(“%s订票成功 !n“,t-name);for(i=0;ireq_amt;i+) /*输出座位号*/pri
34、ntf(“s seat number is:%dn“,t-name,(info-tkt_sur)-i);info-tkt_sur-=t-req_amt;info-order=insertlink(info-order,t-req_amt,t-name,grade);/*插入到订票客户名单链表中*/free(t);break;if(f=r) 第 19 页break;int menu_select() /*菜单界面*/ int c;char s20;printf(“t订票系统n“);printf(“n“);printf(“1.查看航线信息n“);printf(“2.查看已订票客户信息n“);pri
35、ntf(“3.查询航线n“);printf(“4.办理订票业务n“);printf(“5.办理退票业务n“);printf(“6.退出系统n“);printf(“n“);doprintf(“请选择(1-6):“);scanf(“%s“,s);c=atoi(s);while(c6);return c;void main() struct airline airMAXSIZE= /*初始化航线信息*/“beijing“,“1“,“1200“,“860“,30,30, “shanghai“,“2“,“1000“,“770“,20,20,“london“,“3“,“1330“,“960“,10,10,
36、“harbin“,“4“,“1700“,“760“,50,50,第 20 页“dalian“,“5“,“1400“,“550“,40,40;start=air; for(;) /*无限循环(除非用户选择.退出)*/system(“cls“); /*清空屏幕*/switch(menu_select()case 1:list(); /*打印全部航线信息*/break;case 2:prtlink(); /*浏览已订票客户信息*/break;case 3:search(); /*查询航线*/break;case 4:order(); /*订票*/break;case 5:return_tkt();
37、/*退票*/break;case 6:printf(“n感谢您的使用,再见!n“); /*退出系统*/exit(0); /*正常退出程序*/printf(“n任意键继续.n“);getch(); /*任意键继续*/六 、 运 行 结 果 分 析1.菜 单 : 进 入 系 统 后 , 会 出 现 如 下 菜 单 , 如 图 6.1 菜 单 :第 21 页图 6.1 菜 单用 户 根 据 自 己 需 求 选 择 输 入 数 字 ( 1-6) 即 可 进 入 相 应 功 能 。2.查看航线信息:在菜单页面下输入数字 1,回车,即可浏览全部航线信息。如图6.2 查看航线信息:图 6.2 查看航线信息3
38、.查看已订票客户信息:在菜单页面下输入数字 2,回车,然后输入航班号即可查看。如图 6.3 查看航线信息:图 6.3 查看航线信息该航线有客户预定则显示客户预定的信息。如图 6.3 查看客户预定信息:第 22 页6.3 查看客户预定信息如果该航线没有客户预定,则会提示该航线没有客户信息。如图 6.4 无人预定航线:图 6.4 无人预定航线4.查询航线:在菜单页面下输入数字 3,回车,即可进入查询航线功能。如图 6.5 查询航线页面:图 6.5 查询航线页面根据提示输入要抵达城市的名称即可查询。如果有该航线,则会显示该航线的信息。如图 6.6 航线信息:第 23 页图 6.6 航线信息如果没有该
39、航线,则会显示对不起,没有这条航线。如图 6.7 无此航线:图 6.7 无此航线5.办理订票业务:在菜单页面下输入数字 4,回车,即可进入办理订票业务功能。如图 6.8 订票页面:图 6.8 订票页面用户根据提示依次输入航班号、票数、姓名、舱位等级即可。如图 6.9 订票信息:第 24 页图 6.9 订票信息如果订票成功,则会显示座位号,并提示祝您乘坐愉快。如图 6.10 订票成功:图 6.10 订票成功如果在输入订票信息时,输入的票数大于额定乘员数,则会订票失败并提示。第 25 页图 6.11 订票失败如果在输入订票信息时,输入的票数小于额定乘员数,大于余票数,则会提示没有这么多票了,询问是
40、否进行排队等候。如图 6.12 询问是否排队等候:图 6.12 询问是否排队等候如果输入 N,代表不排队,则会提示欢迎下次订购。如果输入 Y,代表进行排队等候。这是会提示用户输入姓名进行排队。如图 6.13 排队等候:图 6.13 排队等候6.办理退票业务:在菜单页面下输入数字 5,回车,即可进入办理退票业务功能。如图 6.14 办理退票业务页面:第 26 页图 6.14 办理退票业务页面根据提示输入航线号和姓名即可进行退票。如果此时这条航线有人排队等候,余票数可以满足其需求,其订票即可成功。如图 6.15 排队等候订票成功:图 6.15 排队等候订票成功第 27 页7.退出系统:在菜单页面下
41、输入数字 6,回车,即可退出系统。如图 6.16 退出系统:图 6.16 退出系统七、收获与体会在编写的时候只使用了相对较为简单的基础语言,代替了相对较为复杂的语言,降低了运行效率。测试输入的数据也有一定的局限性,但是基本可以满足订票系统的需求。这个程序有许多地方可以改进,例如: 数据全部存储在内存中,可以考虑继续编写将数据保存在文件中,这样不会丢失。 航线信息只能通过修改代码来修改,可以编写一个函数来修改航线信息并将其保存在文件中。 使用的语言较基础,运行效率较低,可以考虑写一些较为复杂但运行效率高的语言。 界面不够美观,菜单也只是局限在左上角,可以修改。八、参考文献1 严蔚敏,吴伟民,数据结构(C 语言版)M. 清华大学出版社,1997.2 夏涛. C 语言程序设计,北京邮电大学出版社,2007.3 谭浩强. C 程序设计(第三版)M. 清华大学出版社,2006.4 百度. 百度知道. 百度文库