免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
昆明理工大学课程设计(论文)任务书信息工程与自动化 学院 计算机科学与技术 专业 2007 级学生姓名(学号): 刘正朝 200711014103 课程设计目的: 通过设计一个较为简单的管理系统,进一步熟悉C+中类的概念、类的封装、继承的实现方式。了解系统开发的需求分析、类层次设计、模块分析、编码测试、模块组装与整体调试的全过程,加深对C+的理解与Visual C+环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。课程设计(论文)题目及具体内容:(一) 写程序车票订购统计系统:下图是昆明北京的沿途车站与票价:昆明长沙武汉郑州北京距离:700KM票价:68元距离:1100KM票价:90元距离:1000KM票价:85元距离:500KM票价:60元请用C语言为之开发一个售票程序,要求如下:1、 乘客购票时用菜单选择起点站和终到站。如果选择的起点站和终到站为同一个站则报错,程序退出。2、 选好起点站和终到站之后,通过调用函数int BuyTicket() 为之计算票价和里程,并在屏幕上显示出来。3、 用文件类型存储每一次售票记录,并统计一天的总售票金额,到各站的旅客流量。(二) 读程序,给出80%的注释,每个主要功能模块画出流程图。读程序,给出80%的注释,每个主要功能模块画出流程图 设计(论文)指导教师:(签字)_2010年06月28日 摘要本次课程设计在 Windows 7平台上,以Microsoft Visual C+6.0作为开发工具,分析设计了 “车票订购统计系统”。程序代码在Visual C+6.0,Dev-C+以上编程环境均可运行。 本车票订购统计系统系统功能简单,只适合对系统要求不高的用户,乘客购票时用菜单选择起点站和终到站。如果选择的起点站和终到站为同一个站则报错,程序退出,本软件无需很高的硬件配置,一般的配置均可运行,占用系统资源少。选好起点站和终到站之后,通过调用函数为之计算票价和里程,并在屏幕上显示出来, 用文件类型存储每一次售票记录,并统计一天的总售票金额,到各站的旅客流量本报告中首先说明了车票订购统计系统的特点与业务需求,之后详细说明了系统开发代码,重点介绍了系统各模块的功能及相关功能的具体实现。另外,本报告中还包含了贪吃蛇程序,添加了大量的注释,对程序的功能模块,系统调用的函数进行了详细的介绍,并附有程序流程图。关键词 车票订购统计系统;C语言程序设计;Visual C+ 6.0目录昆明理工大学课程设计任务书1摘要2编程题4分析程序题16总结与体会24参考文献24一、编程题:(三) 需求分析实现了对购票的菜单式管理和购票、计算路程和票价、统计出站人数、统计进站人数、查询一天到各地的客流量和总售票金额等功能。(四) 设计1、数据分析struct Ticket:结构体名。它是一个类型名,可以用来定义变量的类型,但系统不为它分配空间。int distance:结构体struct Ticket的成员,是定义路程的整型变量。int price:结构体struct Ticket的成员,是定义车票价格的整型变量。int z5:结构体struct Ticket的成员,是存放起始站的站名的整型数组。int g5:结构体struct Ticket的成员,是存放终点站的站名的整型数组。ticket4、s、total、count:都是结构体的变量名。系统会给它分配空间,用来存放结构体中的内容。 int in6=0:整型数组,数组中的数都为0。是用来存放进站人数的数组。int out6=0:整型数组,数组中的数都为0。是用来存放出站人数的数组int a2:整型数组。用来存放起点和终点的数组。int all=0:全局整型变量。用来对总售票金额进行计数的变量。FILE *fp、*f :定义文件型的指针变量。可以使fp指向一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。2、程序流程分析(1)、主程序的基本构成 主程序主要由void SellTicket() ,void BuyTicket(int a,int b) ,void Out() , void In() void Demand()及主函数构成,实现了对购票的菜单式管理和购票、计算路程和票价、统计出站人数、统计进站人数、查询一天到各地的客流量和总售票金额等功能。(2)、函数设计 void main():无返回的函数定义。程序的主函数。主要是显示程序的主菜单,用户可以通过菜单,根据自己的需要选择不同的操作。void SellTicket():无返回的函数定义。是购买车票的函数,首先进入程序选择起 始站和终点站,如果选择了相同的站名就会报错,若选择继续购票就可以再次选择起始站和终点站了。程序会显示你所选的起始站和终点站,并将这个信息写到文件里,方便再次查询,然后调用BuyTicket()函数计算票价和里程。void BuyTicket():无返回的函数定义。是计算路程和票价的函数,同过该函数计算出所选车票的票价和里程,并显示给用户,除此之外还能继续选择其他功能。void Out():无返回的函数定义。统计出站人数的函数。void In():无返回的函数定义。统计进站人数的函数。void Demand():无返回的函数定义。查询函数的函数,在该函数中用户可以通过菜单选择查询到各地的客流量和查询总售票金额的操作,选择后函数就可以将文件中的信息显示出来。(3)、函数的调用关系主函数main()中调用了SellTicket () 、Demand () ;在购票函数SellTicket () 中,当a0=a1时,调用了SellTicket () 和Demand () ,当a0!=a1时,在循环里调用了统计出站和进站人数的函数Out() 和In() ,最后还调用了计算路程和票价的函数BuyTicket();在计算路程和票价的函数BuyTicket()的最后调用了SellTicket () 和Demand () 。(4)、各部分的流程图 main(): startfp=fopen(count,w);f=fopen(ticket,a); IN a 1 2 3 Demand () 退出SellTicket () ENDSellTicket() start:fp=fopen(count,r); int i=0 i2 N Yscanf(%d,&ai);a0=a1 Y N i = 0 IN b i2b=y|b=Y N Y N ai Y int xDemand()SellTicket()Out();In();Out();In();Out();In();Out();In();Out();In(); 退出fp=fopen(count,w);fp=fopen(count,r);BuyTicket(a0,a1);fp=fopen(ticket,w);fp=fopen(ticket,r); ENDstartBuyTicket():Int a,int bba N Ym=b;b=a;a=m; i=a-1ib-1 N Ys.distance=s.distance+ticketi.distance;s.price=s.price+ticketi.price;f=fopen(ticket,r);total.price=total.price+s.price;all=total.price; IN e 1 2 3 退出SellTicket()Demand() ENDOut( ):In( ) 与之类似: start h=a0n=1 N n=2 Y in 1+; Nn=3 Y in 2+; Nn=4 Y in 3+; N Yn=5 in 4+; Y in 5+; END startDemand( ): IN b 退出printf( 今日总售票金额:%dn,all); Demand()printf(昆明站 流出 %d人,流入 %。n,out1/2,in1/2); Demand(); END(五) 编码及调试#include#include struct Ticket int distance; int price; int z5;/存放起始站的站名 int g5;/存放终点站的站名ticket4=700,68,1100,90,1000,85,500,60,s,total,count; void SellTicket();/购票函数的声明 void BuyTicket(int a,int b);/计算路程和票价的函数声明 void Out();/统计出站人数的函数声明 void In();/统计进站人数的函数声明 void Demand();/查询函数的声明 int in6=0;/存放进站人数的数组 int out6=0;/存放出站人数的数组 int a2; int con=0;/对购买的车票量计数 int all=0;/总售票金额 void main() FILE *fp; FILE *f;/文件指针int a;printf( 昆明-北京沿途车站与票价n);printf( _n);printf( n 700tM 1100tM 1000tM 500tMn);printf( 昆明-长沙-武汉-郑州-北京n);printf( 68元 90元 85元 60元n);printf( _n);system(pause);system(cls); fp=fopen(count,w);/打开文件countif(fwrite(&count,sizeof(struct Ticket),1,fp)!=1)/输入到磁盘文件printf(File write errorn);fclose(fp);/关闭文件f=fopen(ticket,a);if(fwrite(&total,sizeof(struct Ticket),1,f)!=1)/输入到磁盘文件 printf(File write errorn);fclose(f); printf(n 欢迎进入购票系统n); printf(n 1.购票 2.查询当天购票情况 3.退出n); scanf(%d,&a);/选择购票选项 switch(a) case 1:SellTicket(); break; case 2:Demand(); break; case 3:break; void SellTicket()/购票函数 FILE *fp; char b; int i,x; printf( 1.昆明 2.长沙 3.武汉 4.郑州 5.北京n); printf(n 请选择起点站和终点站:); if(con1000) fp=fopen(count,r);/打开文件countif(fp=fopen(count,a)=NULL)printf(CAN NOT OPEN THE FILE.);return;fread(&count,sizeof(struct Ticket),1,fp);/从count文件中读取数据 fclose(fp);for(i=0;i2;i+)scanf(%d,&ai);/输入起点站和终点站system(cls); if(a0=a1)printf(n选择错误(起始站和终点站不能相同)。n);printf(n是否继续购票(Y/N):n);scanf(%c,&b);if(b=y|b=Y)printf(n1.购票 2.查询当天购票情况 3.退出n);scanf(%d,&x);switch(x) case 1:printf(n); SellTicket();break; case 2:Demand();break; case 3:break; elseprintf(n您选择的起始站和终点站分别是:);for(i=0;i2;i+)switch(ai)case1:Out();In();printf(昆明 );count.z0+;count.g1=count.z1;count.g2=count.z2;count.g3=count.z3;count.g4=count.z4; break;case2:Out();In();printf(长沙 );count.z1+;count.g0=count.z0;count.g2=count.z2;count.g3=count.z3;count.g4=count.z4; break;case3:Out();In();printf(武汉 );count.z2+;count.g0=count.z0;count.g1=count.z1;count.g3=count.z3;count.g4=count.z4; break; case4:Out();In();printf(郑州 );count.z3+;count.g0=count.z0;count.g1=count.z1;count.g2=count.z2;count.g4=count.z4; break;case5:Out();In();printf(北京 );count.z4+;count.g0=count.z0;count.g1=count.z1;count.g2=count.z2;count.g3=count.z3; break; count.g0=count.z0;count.g1=count.z1;count.g2=count.z2;count.g3=count.z3;count.g4=count.z4;printf(n);fp=fopen(count,w);if(fwrite(&count,sizeof(struct Ticket),1,fp)!=1)printf(File write errorn);fclose(fp);fp=fopen(count,r);if(fp=fopen(count,r)=NULL)printf(CAN NOT OPEN THE FILE.);return;fread(&count,sizeof(struct Ticket),1,fp);fclose(fp);BuyTicket(a0,a1);fp=fopen(ticket,w);if(fwrite(&total,sizeof(struct Ticket),1,fp)!=1)/*将BuyTicket函数计算的结果存放进文件*/printf(File write errorn);fclose(fp);fp=fopen(ticket,r);if(fp=fopen(ticket,r)=NULL)printf(CAN NOT OPEN THE FILE.);return;fread(&total,sizeof(struct Ticket),1,fp);fclose(fp);con+; else printf(今日的车票已经卖完。); exit(0); void BuyTicket(int a,int b)/计算路程和票价的函数 int m,i,e; FILE *f; s.distance=0; s.price=0; if(ba) m=b;b=a;a=m; for(i=a-1;ib-1;i+) s.distance=s.distance+ticketi.distance ;/路程的计算s.price=s.price+ticketi.price;/票价的计算f=fopen(ticket,r);if(f=fopen(ticket,r)=NULL)printf(CAN NOT OPEN THE FILE.); return;fread(&total,sizeof(struct Ticket),1,f);fclose(f);total.price=total.price+s.price;/计算一天的总售票金额all=total.price; printf(n 路程:%d, 票价:%d。n,s.distance,s.price); printf(n 1.购票 2.查询当天购票情况 3.退出n); scanf(%d,&e); switch(e) case 1:SellTicket(); break; case 2:Demand(); break; case 3:exit(0); void Out()/统计各站流出的人数 int h; h=a0; if(h=1) out1+; if(h=2) out2+; if(h=3) out3+; if(h=4) out4+; if(h=5) out5+; void In()/统计各站流入的人数 int n; n=a1; if(n=1) in1+; if(n=2) in2+; if(n=3) in3+; if(n=4) in4+; if(n=5) in5+; void Demand()/购票的查询 system(cls); int b; printf(nt 欢迎进入购票查询系统n); printf(n); printf(1.查询到各地的客流量 2.查询总售票金额 3.退出n); scanf(%d,&b); switch(b) case 1: printf( 今日各地客流量如下:n); printf(昆明站 流出 %d 人,流入 %d 人。n,out1/2,in1/2); printf(长沙站 流出 %d 人,流入 %d 人。n,out2/2,in2/2); printf(武汉站 流出 %d 人,流入 %d 人。n,out3/2,in3/2); printf(郑州站 流出 %d 人,流入 %d 人。n,out4/2,in4/2); printf(北京站 流出 %d 人,流入 %d 人。n,out5/2,in5/2); system(pause); Demand(); break; case 2: printf( 今日总售票金额:%dn,all); system(pause); Demand(); break; case 3: break; 调试运行结果: 二、分析程序题:#include graphics.h#include stdio.h#define MAX 200 /横坐标和纵坐标最大的格数 #define MAXX 30 /横坐标最大格数#define MAXY 30 /纵坐标最大格数/*定义蛇可能移动的方向*/#define UP 18432 /控制蛇头上走#define DOWN 20480 /控制蛇头下走#define LEFT 19200 /控制蛇头左走#define RIGHT 19712 /控制蛇头右走#define ESC 283 /键盘Esc键控制游戏退出#define ENTER 7181 /键盘Enter键控制游戏开始#define PAGEUP 18688 /键盘PageUp键加大游戏等级难度#define PAGEDOWN 20736 /键盘PageDown键减小游戏等级难度#define KEY_U 5749 #define KEY_K 9579#define CTRL_P 6512 /键盘Ctrl+P控制游戏暂停#define TRUE 1 #define FALSE 0 #define GAMEINIT 1 /键盘1键进人游戏#define GAMESTART 2 /键盘2键控制游戏开始#define GAMEHAPPY 3 /游戏胜利#define GAMEOVER 4 /键盘4键控制游戏结束struct SPlaceint x;/点的横坐标;int y;/点的纵坐标;int st;/一个辅助变量; placeMAX;/定义了200个点对象;int speed;/速度int count;/吃到的食物数int score;/得分;int control;/定义一个全局控制量,用于控制坐标向3左,4向右,2向上,1向下移动;int head;/int tear;/int x,y;int babyx,babyy;/食物的坐标;int class;/表示关卡int eat;/标识是否吃到食物,FALSE没吃到,TRUE 吃到了;int game;/用于表示游戏的状态;int gamedelay=5000,4000,3000,2000,1000,500,250,100;int gamedelay2=1000,1;/(hit为FALSE)超出界限时为1000,(hit为TURE)没有超出时为1;static int hitme=TRUE,hit = TRUE;void init(void);void nextstatus(void);void draw(void);void init(void)/初始化数据int i;for(i=0;iMAX;i+) placei.x = 0; placei.y = 0; placei.st = FALSE;/使用bool类型,由于游戏的一个辅助参数; /将所有的点都置0; place0.st = TRUE; place1.st = TRUE; place1.x = 1; speed = 9; /对蛇的速度初始化为9 count = 0; /对蛇身长度初始化为0 score = 0; /对游戏分数初始化为0 control = 4; /对游戏控制初始化为4 control = 4; /控制方向为向右; head = 1; /对蛇头初始化为1 tear = 0; x = 1; y = 0; babyx = rand()%MAXX;/随机产生X坐标; babyy = rand()%MAXY;/随机产生y坐标;产生食物的坐标; eat = FALSE; /赋值eat为:0表示当前没有吃到食物 game = GAMESTART;/赋值game为 2,用于标识游戏的状态;void nextstatus(void)int i;int exit; /退出控制量,TRUE退出,FALSE继续游戏;int xx,yy;xx = x;yy = y; switch(control) case 1: y-; yy = y-1; break;/将点的纵坐标减1,即下移1 case 2: y+; yy = y+1; break;/将点的纵坐标加1,即上移1 case 3: x-; xx = x-1; break;/将点的横坐标减1,即左移1 case 4: x+; xx = x+1; break;/将点的横坐标加1,即右移1 hit = TRUE;/默认没有超出界限; if ( (control = 1) | (control =2 ) & ( (y = MAXY-1) | (control = 3) | (control = 4) & (x = MAXX-1) ) ) ) hit = FALSE;/标记为超出界限; if ( (y = MAXY)|(x = MAXX) ) game = GAMEOVER; control = 0; return; /如果x和y小于0,或大于最大值时,即超出边界时,游戏结束赋值game值为:4; for (i = 0; i = MAX) head = 0; placehead.x = x; placehead.y = y; placehead.st= TRUE; if (eat = FALSE) placetear.st = FALSE; tear +; if (tear = MAX) tear = 0; else eat = FALSE; exit = TRUE; while(exit) babyx = rand()%MAXX;/随机产生X坐标; babyy = rand()%MAXY;/随机产生y坐标; exit = FALSE; for( i = 0; i MAX; i+ ) if( (placei.st)&( placei.x = babyx) & (placei.y = babyy) exit +;/游戏继续进行 if (head = tear) game = GAMEHAPPY;void draw(void) char temp50; int i,j; for (i = 0; i MAX; i+ ) setfillstyle(1,9); /设置填充模式和颜色,使用SOLID_FILL 单色实填充,选择高分辨率显示模式(有效颜色值为9); if (placei.st) bar(placei.x*15+1,placei.y*10+1,placei.x*15+14,placei.y*10+9);/一条线一条线的画. setfillstyle(1,4);/设置填充模式和颜色,使用SOLID_FILL 单色实填充,选择高分辨率显示模式(有效颜色值为4); bar(babyx*15+1,babyy*10+1,babyx*15+14,babyy*10+9); setcolor(8);/将当前图形屏幕的当前笔画颜色值置为8. setfillstyle(1,8);/设置填充模式和颜色,使用SOLID_FILL 单色实填充,选择高分辨率显示模式(有效颜色值为8);bar(placehead.x*15+1,placehead.y*10+1,placehead.x*15+14,placehead.y*10+9);/画一个二维的图形, rectangle(0,0,15*MAXX,10*MAXY); /指定矩形左下角的逻辑X坐标为0,指定矩形左上角的逻辑y坐标为15*MAXX,指定矩形右下角的逻辑X坐标为10*MAXY,指定矩形右下角的逻辑Y坐标为0; sprintf(temp,Count: %d,count);/将整型count以字符串的形式储存在temp中;输出吃到的食物个数count。 settextstyle(1,0,2);/设置字体为:TRIPLEX_FONT 大小为2,且为横向输出; setcolor(8);/将当前图形屏幕的当前笔画颜色值置为8 outtextxy(512,142,temp);/在指定位置显示一字符串,在(512,142)处输出字符串temp; setcolor(11);/将当前图形屏幕的当前笔画颜色值置为11; outtextxy(510,140,temp);/在(510,140)处输出字符串temp; sprintf(temp,1P: %d,score);/将整型score以字符串的形式储存在temp中;输出得分score。 settextstyle(1,0,2);/设置字体为:TRIPLEX_FONT 大小为2,且为横向输出; setcolor(8); /将当前图形屏幕的当前笔画颜色值置为8. outtextxy(512,102,temp);/在指定位置显示一字符串,在(512,102)处输出字符串temp; setcolor(12);/将当前图形屏幕的当前笔画颜色值置为12; outtextxy(510,100,temp);/在指定位置显示一字符串,在(510,100)处输出字符串temp; sprintf(temp,Class: %d,class);/将整型class以字符串的形式储存在temp中;输出关卡 class; setcolor(8);/将当前图形屏幕的当前笔画颜色值置为8. outtextxy(512,182,temp);/在指定位置显示一字符串,在(512,182)处输出字符串temp; setcolor(11);/将当前图形屏幕的当前笔画颜色值置为11; outtextxy(510,180,temp); /在指定位置显示一字符串,在(510,180)处输出字符串temp;int main()int pause = 0;char temp50;int d,m;int key;int p;static int keydown = FALSE;/TRUE已经按下按键,FALSE没有按下;int exit = FALSE;/退出控制量,TRUE退出,FALSE继续游戏;int stchange = 0;d = VGA;m = VGAMED;initgraph( &d, &m, );/初始化图形系统 ,上涨指向图形驱动序号变量值为:PC3270 ,指向图形显示模式序号变量值为:640x350 ;直接将图形显示;setbkcolor(3);/设置屏幕背景色为青色CYAN(3) class = 3;init();/初始化数据;p = 1;while(!exit)if (kbhit()/检查是否按下按键,如果按下了,就执行if语句; key = bioskey(0); switch(key) case UP: if( (control != 2)& !keydown)/按下向上键时检查,正在向上运动,如果不是,而且不能同时按下其他键 control = 1;/向下运动 keydown = TRUE; break; case DOWN: if( (control != 1)& !keydown) control = 2;/向上运动 keydown = TRUE; break; case LEFT: if( (control != 4)& !keydown) control = 3;/向左运动 keydown = TRUE; break; case RIGHT: if( (control != 3)& !keydown) control = 4;/向右运动 keydown = TRUE; break; case ESC: exit = TRUE;break;/esc键退出 case ENTER: init();break;/enter键重新开始; ca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 慢病管理培训试题及答案
- 招标采购中级考试试题及答案
- 数字化转型战略在传统制造业的实施与成效试题及答案
- 狱中联欢课件APP
- 2025 年大学物理学(热学)试题及答案
- 2025 年高职包装设计(绿色包装设计)试题及答案
- 新《安全生产法》考试题及答案
- 有限空间作业-考试题
- 机械制造装备设计期末考试试题(含答案)
- 村会计考试试题及答案
- 长周期物料管理办法
- 托管班的转让合同协议书
- 公路试验室租赁合同范本
- 市场监管局关于全市企业商业秘密保护工作情况调研报告
- 汇丰银行课件
- 2025年导游资格证考试押题试卷 导游业务与政策法规实战押题卷
- 大型会议场所消防安全方案
- 酒店安全巡查日常检查记录表
- DB4205T 57-2018 新型职业农民专业技术职称评定规范
- 2025年事业单位考试职业能力倾向测验(医疗卫生类E类)复习试题及答案
- T-GDPHA 001-2025 广州市非急救医疗转运管理标准
评论
0/150
提交评论