1、 《C语言程序设计》 课程设计报告 一.目的 通过本教学环节的充分编程实践和实际应用,进一步熟悉与巩固C语言语法知识和程序设计的基本方法,通过应用进一步体会数据就够重常用算法的实质,建立算法优劣的概念以及算法评估分析和比较的方法。借助适当题材的程序设计实训,加深体会利用数据结构的算法和C语言程序设计解决实际问题的思维过程。通过一定的文档要求,培养学生良好的程序设计风格,包括程序结构形式,行文格式和程序正文格式等。 二.内容 利用C语言这种程序设计语言设计一个应用程序,实现的题目和具体内容自拟 三. 实验要求 进行简单的需求分析、设计说明
2、写出程序结构框架,阐明设计思路、用到的原理和方法。程序规模适中,着重于内核功能,对界面无要求。要求采用面向对象的程序设计方法来进行课程设计。 四.算法思想 该程序为地铁的价格查询系统,用到C语言中的选择结构程序设计,循环控制,函数。其中,选择结构程序设计用到了if语句的嵌套,switch语句;循环控制用到了for,do……while语句实现循环,还有break语句,循环的嵌套;函数就用到了函数的嵌套调用。该系统难点在于转站问题,不过已经解决了。 a) 需求分析: 1.该系统主要提供地铁的价格查询功能,外附显示所要乘坐的站数以及经过的地铁站,转站等功能。 2.该系统还可以让地
3、铁的乘客清晰地知道自己乘坐所需要的付费,还有知道一共要经过多少个站,经过哪些站等,让乘客对自己的行程有个了解。 3.该系统的界面清晰易懂,乘客看着界面可以明白地知道自己所在的位置以及可以轻松地选择目的地。其中,界面如下所示: ◎欢迎使用广州地铁价格查询系统◎ ************************************************************** *
4、 * * 广州地铁一号线 * *____________________________________________________________* * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * * 0 0 0 0 0 0 0
5、 0 0 1 1 1 1 1 1 1 * * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 * * 西 坑 花 芳 黄 长 陈 西 公 农 烈 东 杨 体 体 广 * * 湖 口 地 村 沙 寿 家 门 园 讲 士 山 箕 育 育 州 * * 湾 路 祠 口 前 所 陵 口 西 中 东 * *
6、 园 路 心 站 * * * * 广州地铁二号线 * *____________________________________________________________* * 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
7、 2 2 2 2 * * 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 * * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 * * 琶 新 磨 赤 客 鹭 中 晓 江 市 海 公 纪 越 广 三 远 广 新 江* * 洲 港 碟 岗 村 江 大 港 南 二 珠 园 念 秀 州 元 景 州 市 夏* * 东 沙 西 宫 广
8、前 堂 公 火 里 体 * * 场 园 车 育 * * 站 馆 * * * **************************************************************
9、 4.对输入数据的格式要求为:只要输入数字就行了,可是输入的数字必需在101~106,201~220之间,否则输出错误提示,乘客需要继续输入,直到输入正确为止,输出结果后会有提示是否要继续。 5.该软件可以在Turbo C/C++ for Windows内测试。 b) 概要设计 第一模块:函数调用模块(分两种情况讨论): 第一种情况:起点站和输出站都在同一号线 if(c/100==d/100) { a=max(c,d); b=min(c,d); j=a-b; subway(j); change_line( c, d);
10、 name_passed_station( c, d); } 第一种情况:起点站和终点站不在同一号线(又分两种情况): (1)起点站在一号线,终点站在二号线在: if(c<200) { a=max(109,c)-min(109,c); b=max(212,d)-min(212,d); j=a+b; subway(j); change_line( c, d); name_passed_station( c, d); } (2)起点站在二号线,终点站在一号线: els
11、e { a=max(212,c)-min(212,c); b=max(109,d)-min(109,d); j=a+b; subway(j); change_line( c, d); name_passed_station(c, d); } 第二模块:函数定义模块 把起点站序号跟终点站序号比较,取出较少着: int min(int c,int d) { int z; if(c>d) z=d; else z=c;
12、return(z); } 把起点站跟终点站比较,取出较大者: int max(int c,int d) { int z; if(c>d) z=c; else z=d; return(z); } 输出所要的费用: void subway(int j) { switch(j) { case 0: printf("Sorry,你已经在本站,不用再乘座了。Thanks! ^_^\n");break; case 1: case 2: case 3: printf("
13、收费2元,Thanks! ^_^\n");break; case 4: case 5: case 6: printf("收费3元, Thanks! ^_^\n");break; case 7: case 8: case 9: printf("收费4元, Thanks! ^_^\n");break; case 10: case 11: case 12: printf("收费5元, Thanks! ^_^\n");break; case 13: case 14: ca
14、se 15: printf("收费6元, Thanks! ^_^\n");break; case 16: case 17: case 18: printf("收费7元, Thanks! ^_^\n");break; case 19: case 20: printf("收费8元,Thands! ^_^\n"); } } 该函数检查是否需要转线 void change_line(int c,int d) { if(c/100==d/100) printf("不需要转线,可直达^_^
15、\n"); else printf("请注意:要到公园前站转线\n"); } 输出途径的站名,分两种情况: 情况一:不需要转线 (1)起点站和终点站都在一号线 if(c/100==1&&d/100==1) { for(i=c%100;i<=d%100;i++) switch(i) { case 1: printf("西湖\t");break; case 2: printf("坑口\t");break; case 3: printf("花地湾\t")
16、break; case 4: printf("芳村\t");break; case 5: printf("黄沙\t");break; case 6: printf("长寿路\t");break; case 7: printf("陈家祠\t");break; case 8: printf("西门口\t");break; case 9: printf("公园前\t");break; case 10: printf("农讲所\t");break; case 11: print
17、f("烈士陵园\t");break; case 12: printf("东山口\t");break; case 13: printf("杨箕\t");break; case 14: printf("体育西路\t");break; case 15: printf("体育中心\t");break; case 16: printf("广州东站\t");break; } } (2)起点站和终点站都在二号线 if(c/100==2&&d/100==2) {
18、for(i=c%100;i<=d%100;i++) switch(i) { case 1: printf("琶洲\t");break; case 2: printf("新港东\t");break; case 3: printf("磨碟沙\t");break; case 4: printf("赤岗\t");break; case 5: printf("客村\t");break; case 6: printf("鹭江\t");break; case 7: printf(
19、"中大\t");break; case 8: printf("晓港\t");break; case 9: printf("江南西\t");break; case 10: printf("市儿宫\t");break; case 11: printf("海珠广场\t");break; case 12: printf("公园前\t");break; case 13: printf("纪念堂\t");break; case 14: printf("越秀公园\t");break; case
20、15: printf("广州火车站\t");break; case 16: printf("三元里\t");break; case 17: printf("远景\t");break; case 18: printf("广州体育馆\t");break; case 19: printf("新市\t");break; case 20: printf("江夏\t");break; } } 情况二:需要转线——分四种情况 (1)起点站和终点站都是在公园前站前面 if(c<=109&&d<=212&&d>=20
21、1) { for(i=c%10;i<=9;i++) switch(i) { case 1: printf("西湖\t");break; case 2: printf("坑口\t");break; case 3: printf("花地湾\t");break; case 4: printf("芳村\t");break; case 5: printf("黄沙\t");break; case 6: printf("长寿路\t");break;
22、 case 7: printf("陈家祠\t");break; case 8: printf("西门口\t");break; case 9: printf("公园前\t");break; } for(j=d%100;j<=11;j++) switch(j) { case 1: printf("琶洲\t");break; case 2: printf("新港东\t");break; case 3: printf("磨碟沙\t");break; case 4:
23、printf("赤岗\t");break; case 5: printf("客村\t");break; case 6: printf("鹭江\t");break; case 7: printf("中大\t");break; case 8: printf("晓港\t");break; case 9: printf("江南西\t");break; case 10: printf("市儿宫\t");break; case 11: printf("海珠广场\t");break; }
24、} (2)起点站在公园前站前面,而终点站在公园前站后面 if(c<=109&&d>=212) { for(i=c%10;i<=9;i++) switch(i) { case 1: printf("西湖\t");break; case 2: printf("坑口\t");break; case 3: printf("花地湾\t");break; case 4: printf("芳村\t");break; case 5: print
25、f("黄沙\t");break; case 6: printf("长寿路\t");break; case 7: printf("陈家祠\t");break; case 8: printf("西门口\t");break; case 9: printf("公园前\t");break; } for(j=13;j<=d%100;j++) switch(j) { case 13: printf("纪念堂\t");break; case 14: printf("越秀公园\t")
26、break; case 15: printf("广州火车站\t");break; case 16: printf("三元里\t");break; case 17: printf("远景\t");break; case 18: printf("广州体育馆\t");break; case 19: printf("新市\t");break; case 20: printf("江夏\t");break; } } (3)起点站在公园前站后面,终点站在前面 if(c>=109&&d<=212&
27、d>=201) { for(i=9;i<=c%100;i++) switch(i) { case 9: printf("公园前\t");break; case 10: printf("农讲所\t");break; case 11: printf("烈士陵园\t");break; case 12: printf("东山口\t");break; case 13: printf("杨箕\t");break; case 14: printf("体育西路\t");break; cas
28、e 15: printf("体育中心\t");break; case 16: printf("广州东站\t");break; } for(j=d%100;j<=11;j++) switch(j) { case 1: printf("琶洲\t");break; case 2: printf("新港东\t");break; case 3: printf("磨碟沙\t");break; case 4: printf("赤岗\t");break; case 5: printf(
29、"客村\t");break; case 6: printf("鹭江\t");break; case 7: printf("中大\t");break; case 8: printf("晓港\t");break; case 9: printf("江南西\t");break; case 10: printf("市儿宫\t");break; case 11: printf("海珠广场\t");break; } } (4)起点站和终点站都在公园前站后面 if(c>=109&&d>=212)
30、 { for(i=9;i<=c%100;i++) switch(i) { case 9: printf("公园前\t");break; case 10: printf("农讲所\t");break; case 11: printf("烈士陵园\t");break; case 12: printf("东山口\t");break; case 13: printf("杨箕\t");break; case 14: printf("体育西路\t")
31、break;
case 15: printf("体育中心\t");break;
case 16: printf("广州东站\t");break;
}
for(j=13;j 32、
case 17: printf("远景\t");break;
case 18: printf("广州体育馆\t");break;
case 19: printf("新市\t");break;
case 20: printf("江夏\t");break;
} }
c)详细设计
开始
声明函数name_passed_station(),change_line(),subway(),
Max(),min(),stull()
定义变量a,b,c,d,j,n
调用stull()
输出界面
输入c
(101<=c& 33、c<=116)||(201<=c&&c<=220)
输入错误,请重输
输入d
(101<=d&&d<=117)||(201<=d&&d<=220)
输入错误,请重输
c/100==d/100
a=max(c,d);b=min(c,d); j=a-b;subway(j);change_line( c, d);name_passed_station( c, d);调用函数见附图函数调用部分
c<200
a=max(c,d);b=min(c,d); j=a-b;subway(j);change_line( c, d);name_passed_station( c, d);调用函 34、数见附图函数调用部分
a=max(212,c)-min(212,c);
b=max(109,d)-min(109,d);
j=a+b; subway(j);
change_line( c, d);
name_passed_station(c, d);
输入n
n=='Y'
返回开始
结束
附图:
max()
Int c,d ,z
c>d
z=c
z=d
return(z)
min()
Int c,d ,z
z=c
return(z)
c>d
z=d
subway(int j)
判断I值
输出票价
结束
change_line(int 35、c,int d)
c/100==d/100
输出不用转线
输出在公元前转线
结束
name_passed_station(int c,int d)
int i,j
c/100==1&&d/100==1)
c/100==2&&d/100==2
i=c%100;i<=d%100;i++
c/100==2&&d/100==2
输出各站名
输出各站名
c<=109&&d<=212&&d>=201
c<=109&&d>=212
c>=109&&d<=212&&d>=201
i=c%10;i<=9
j=d%100;j<=11
输出站点
输出站点
i=c% 36、10;i<=9
j=13;j<=d%100
输出站点
输出站点
i=9;i<=c%100
j=d%100;j<=11
输出站点
输出站点
c>=109&&d>=212
i=9;i<=c%100
输出站点
j=13;j






