面向过程程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实践
姓 名
学 号
班 级
指 导 教 师
赵建喆
程序实践名称
面向过程程序设计实践
开 设 学 期
2013-2014第二学期
开 设 时 间
第3周——第5周
报告日期
2014年3月29日
评 定 成 绩
评定人签字
评 定 日 期
东北大学软件学院
一、程序实践概述
1、
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目名称:
面向过程程序设计实践—票务信息管理系统
2、 时间进度:
序号
日期
完 成 内 容
1
2014年3月20日
了解实验内容、
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
实验题目、选定实践题目
2
2014年3月22日
分析题目的功能要求、进行题目的模块设计和数据结构设计
3
2014年3月23日--
--2014年3月27日
完成系统的界面设计、编写函数、编写程序实现各自函数的功能并加以测试
4
2014年3月28日
函数汇总、调试程序、编译并修改程序、优化程序、对程序进行最后的调试和运行
5
2014年3月29日
撰写实验报告、整理代码
3、 开发环境:
Dev-C++
二、问题分析
1、功能说明:
1.本系统应有强大的容错能力而且可以在不同的错误产生时人性化选择是否重新输入以及返回各级菜单的功能,并将此功能做成该系统最主要特色。
2.鉴于现今社会网络的便利,越来越多的人使用网上购票,增加网上订票者的取票功能,并引入管理员身份对该功能进行管理。
3.加入文件的存储使得系统关键数据不会因系统的退出而删除。
4.系统界面的设计将对字体以及背景颜色进行设。
5.在主要功能上显示当前时间。
2、解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
:
1.因为希望系统不会因输入错误而意外退出,则在每个输入后都应有判断语句,而错误误产生后存在返回的问题。不使用goto语句,所以利用while(flag)的方法,在循环中实现类似goto语句的功能。
2.使用指针实现对车票信息的显示、查询等功能。
3.建立火车信息的结构体,将火车站台、火车车次、火车允许搭载人数、到站时间等存入结构体。
4.建立车票结构体,将购买者、出发站、终点站等存入结构体。
5.建立管理员结构体,将管理员账户、管理员密码存入结构体。
6.在不同函数中均要使用结构体、指针、文件等且根据功能初始化函数如下:
7.颜色的设计:加入windows.h头文件并基于setcolor (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_GREEN);格式设计各部分字体、背景颜色。
8.时间的显示:在windows.h头文件的基础下显示当前时间。将其写入函数,方便调用。
9.为不同站台之间的车票按站进行计算,并引入math.h头文件进行绝对值运算。
10.在每项功能加入返回上级菜单。并加入此结构体。
三、方案设计
1、模块结构:
一、管理人员
(1)管理人员登录
①当账号输入错误时将提示是否重新输入。
②当密码输入错误三遍时将自动退出程序。
(为此功能添加管理员登录管理员菜单管理两项函数)
(2)管理人员功能
①从文件在中查看网上购票者的姓名、取票号、车票信息。
②增加新的网上购票者并
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
进文件。
③返回菜单。
④退出程序。
(为此功能添加网票查询和新增网票两项函数)
二、乘客
(1)查询车票
①乘客可以根据起始地与终止地查看车票信息包括发车时间、车次、票价。
②如输入错误将选择是否重新输入。
③查询结束后将重新选择功能。
(为此功能添加功能菜单、子菜单、查询车票和票价计算四项函数)
(2)购买车票
①输入姓名后将进行车票的购买。
②车票数目将从文件中读取。
(为此功能购买车票函数并联合上方查询车票一同使用)
(3)退订车票
①从文件中查看已购买数目。
②输入退订数目并写入文件。
(为此功能退票函数并联合上方查询车票一同使用)
(4)退出程序
三、网上购票取票
查看系统中存在的订单并由顾客选择所需打印的车票。
2、数据结构:
需要三个结构体
3、总体流程:
4、 关键算法:
利用文件操作完成对网上取票的取票号进行存储以及订票退票数目的存储以及操作做。
使用指针实现对车票信息的显示、查询等功能。
使用结构体对不同结构进行操作。
利用while(flag){*****flag = 0;****}的方式实现类似goto的语句效果。
2.管理员登录
5、界面设计:
1.进入系统界面
4.乘客功能目录
3.管理员目录
6.退票功能
5.查询界面
8.退出界面
7.网上取票
颜色调整例:
//字体颜色设置程序
void setcolor(WORD attribute)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),attribute);
}
//退出程序
void exit_()
{
system("cls");
setcolor(BACKGROUND_RED);
printf("┏━━━━━━━━━━━━━━━┓\n");
printf("┃ ");
setcolor(FOREGROUND_GREEN);
printf("谢谢您的使用 欢迎下次光临!");
setcolor(BACKGROUND_RED);
printf(" ┃\n");
printf("┗━━━━━━━━━━━━━━━┛\n\n");
setcolor(FOREGROUND_BLUE|BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN);
printf("\n\t\tpress enter to exit");
fflush(stdin);
getchar();
exit(0);
}
//时间显示程序
void stime()
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
printf("现在时刻:%2d:%2d\n",timeinfo->tm_hour, timeinfo->tm_min);
printf("\n");
}
四、调试记录
前阶段主要调试的关键在对如何实现类似goto语句功能的方面进行调试。在充分查找资料以及学者的帮助下成功通过简单方式实现了这一功能,实现的程序设计的初衷。
后阶段主要在文件处理的方面进行调试,开始时在使用fprintf后读取采用了fread语句。
后来在老师的指导帮助下发现了问题所在,并将fprintf改为fwrite语句,从而成功实现文件的操作。
五、创新说明
1.原始代码中存在不少漏洞,例如即便是显示从沈阳到沈阳的车票也是88元等问题,起始站与目的地可重复等问题,我在函数中做了些调整。使得程序总体逻辑清晰,漏洞减少。
2.另外,我加入了网上购票与管理员的功能,现今网上购票越来越流行,这项功能使本系统功能更加完善。为该功能引入了文件的操作,使得由管理员输入的购票信息得以保存。引入管理员登录功能,密码错误3次将退出系统。
3.为使系统提供更多信息引入window.h头文件加入时间的函数通过调用本机的时间,使信息丰富,并用颜色函数使界面更加丰富。
4.写入文件记录了车票的数目,不论第几次运行程序,票数都能得到查询、保存和计算。在退票的程序中添加了退订张数的选择功能,使得用户人性化选择所需退票数目。
5.本程序最为特色的一点在于只要您不选择退出,无论是否有按照提示输入都不会因错误而退出,并且不会轻易返回菜单,人性化的选择是否进行重新输入或返回或退出。这将极大的方便用户的使用。
六、体会与建议
上个学期都是完成些小实验,对大的系统程序没有什么概念和想法,不过这次大实验给了我一个机会。这次的课程设计使我通过解决一个大的实际问题,巩固和加深上学期所学课程,提高了我分析和编写程序的能力,为我们以后的学习提供了很好的帮助,更为毕业设计和毕业以后从事计算机方面的工作奠定了基础。
通过这十天的分析、实践和思考,我对已学的知识有了比较深刻的认识,同时在查找资料或和其他同学交流的过程中,发现了一些问题,并拿出很多实践自己钻研和实践,虽然遇到了很多困难,但我没有放弃坚持自己探索。后来把自己的代码写好后和同组同学讨论,发现还是有一些整体上的思考漏洞,和同组同学的共同努力学习和讨论后终于把课题做完。
做完之后发现自己欠缺的还有很多,以后多自己尝试自己都做这方面的实验。因为对专业知识没有很深的认识,所以其中难免有一些是错误的或者是不合理的,希望老师多指教。在课程设计的过程中,老师的指导对我起了非常大的帮助,在此表示感谢,谢谢各位老师的辛勤工作!
/*ticket.c*/
#include
#include
#include
#include
#include
#define NUM 100
#define max 100
struct traininfor
{
char station[max][10];
char tnumber[20];
int lnumber;
char time[max][20];
char name[20];
int ID;
char IDstation[50];
}nobody[max],pemp,*pointtr;
struct ticket
{
char buyer[10];
char source[30];
char dest[30];
int bnumber;
};
struct guanliyuan
{
int ID;
int psw;
}gly = {12306,12306};
void glylogin(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //管理员登录程序
void glymenu(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //管理员菜单程序
void chaxun(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //查询网票程序
void xinzeng(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //新增网票程序
void menu(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //菜单显示程序
void show(struct ticket *pointtk,struct traininfor *pointtr,FILE *fp); //显示子菜单
void check(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //查询车票程序
void buy(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //购买车票程序
void price(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //票价计算程序
void returnt(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //退票程序
void online(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //网上取票程序
void restart(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp); //返回菜单程序
void setcolor(WORD attribute); //字体颜色设置程序
void stime(); //时间显示程序
void exit_(); //退出程序
int ZhanShu;
//主菜单
main()
{
FILE *fp;
struct ticket cheque[NUM];
struct ticket *pointtk;
pointtr = &pemp;
pointtk = cheque;
strcpy(pointtr->station[0],"沈阳");
strcpy(pointtr->station[1],"辽阳");
strcpy(pointtr->station[2],"鞍山");
strcpy(pointtr->station[3],"海城");
strcpy(pointtr->station[4],"瓦房店");
strcpy(pointtr->station[5],"金州");
strcpy(pointtr->station[6],"大连");
//strcpy(pointtr->tnumber,"T11");
pointtr->lnumber = 50;
strcpy(pointtr->time[0],"2008年8月8日18点18分");
pointtk->bnumber = 0;
int tab = 0;
if(tab == 0)
{
setcolor(FOREGROUND_RED|FOREGROUND_GREEN);
printf("┏━━━━━━━━━━━━━┓\n");
printf("┃ ****请按提示选择***** ┃\t\n");
printf("┃ 1.您是管理员 ┃\t\n");
printf("┃ 2.您是乘客 ┃\t\n");
printf("┃ 3.网上购票专用取票通道 ┃\t\n");
printf("┗━━━━━━━━━━━━━┛\n\n");
do{
setcolor(FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
scanf("%d",&tab);
setcolor(FOREGROUND_BLUE|BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN);
switch (tab)
{
case 1:
glylogin(pointtr,pointtk,fp);
break;
case 2:
menu(pointtr,pointtk,fp);
break;
case 3:
online(pointtr,pointtk,fp);
break;
default :
setcolor(FOREGROUND_RED|FOREGROUND_GREEN);
printf("您输入有误请重新输入\n");
}
} while(tab>3||tab<1);
}
}
//管理员登陆程序
void glylogin(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
system("cls");
int flag = 1;
int flag1 = 1;
int count = 0;
int gID,gPSW;
while(flag)
{
printf("请输入您的管理员账号:\n");
scanf("%d",&gID);
if(gID == gly.ID)
{
while(flag)
{
printf("请输入密码:\n");
scanf("%d",&gPSW);
if (gPSW == gly.psw)
{
printf("欢迎使用本系统管理系统\n");
flag1 = 0;
flag = 0;
setcolor(FOREGROUND_BLUE|BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN);
glymenu(pointtr,pointtk,fp);//*********************************************************************gongneng
}
else
{
count++;
printf("密码第%d次输入错误,系统将在第三次输入错误后退出",count);
if ( count > 3 )
{
flag = 0;flag1 = 0;
exit_();
}
}
}
}
else
{
printf("您不是本系统管理人员\n");
printf("重新输入管理员账号\n 1.是 \n 2.否\n");
int shu;
int xunhuan;
do
{
scanf("%d",&shu);
switch (shu)
{
case 1:
glylogin(pointtr,pointtk,fp);
break;
case 2:
restart(pointtr,pointtk,fp);
break;
default:
printf("输入错误,请重新输入\n是否重新输入管理员账号?\n1.是\n2.否\n");
xunhuan = 0;
}
}while (xunhuan == 0);
}
}
}
//管理员菜单程序
void glymenu(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
system("cls");
printf("\n");
stime();
int a;
printf("┏━━━━━━━━━━━━━━━┓\n");
printf("┃ 请输入您所需的功能 ┃\t\n");
printf("┃ 1.查询网票 ┃\t\n");
printf("┃ 2.新增网票 ┃\t\n");
printf("┃ 3.返回目录 ┃\t\n");
printf("┃ 4.退出程序 ┃\t\n");
printf("┗━━━━━━━━━━━━━━━┛\n\n");
printf("请输入选项号:");
scanf("%d",&a);
if (a==1)
{
chaxun(pointtr,pointtk,fp);
printf("是否重继续管理员操作?\n1.是\n2.否\n");
int shu;
int xunhuan;
do
{
scanf("%d",&shu);
switch (shu)
{
case 1:
glymenu(pointtr,pointtk,fp);
break;
case 2:
restart(pointtr,pointtk,fp);
break;
default:
printf("输入错误,请重新输入\n是否重新输入?\n1.是\n2.否\n");
xunhuan = 0;
}
}while (xunhuan == 0);
}
else if(a==2)
{
xinzeng(pointtr,pointtk,fp);
printf("是否重继续管理员操作?\n1.是\n2.否\n");
int shu;
int xunhuan;
do
{
scanf("%d",&shu);
switch (shu)
{
case 1:
glymenu(pointtr,pointtk,fp);
break;
case 2:
restart(pointtr,pointtk,fp);
break;
default:
printf("输入错误,请重新输入\n是否重新输入?\n1.是\n2.否\n");
xunhuan = 0;
}
}while (xunhuan == 0);
}
else if(a==3)
restart(pointtr,pointtk,fp);
else if(a==4)
exit_();
else
{
glymenu(pointtr,pointtk,fp);
}
}
//查询网票程序
void chaxun(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
int i = 0;
fp=fopen("OlineTicket","r");
printf("姓名\t取票号\t\t车站\n");
while(!feof(fp))
{
fread(nobody,sizeof(struct traininfor),1,fp);
printf("%s\t%d\t%s\n",nobody[i].name,nobody[i].ID,nobody[i].IDstation);
}
fclose(fp);
}
//新增网票程序
void xinzeng(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
int i;
int num;
pointtr = nobody;
fp=fopen("OlineTicket","a");
printf("请问您要输入几个的网上购票信息?");
scanf("%d",&num);
for(i=0;iname,&pointtr->ID,pointtr->IDstation);
}
for(i=0;i目的地:\t");
printf("%s------>",pointtk->source);
printf("%s\n",pointtk->dest);
printf("该车从起始站发车时间:\t",pointtk->source);
printf("%s\n",pointtr->time[0]);
printf("票价:\t");
price(pointtr,pointtk,fp);
printf("\t车票数量:\t");
f1=fopen("ticket","r");
if(NULL==f1){
perror("cannot open");
}
fscanf(f1,"%d", &pointtr->lnumber);
printf("%d\n",pointtr->lnumber);
fclose(f1);
}
//查询车票程序
void check(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
system("cls");
int i,j,count=0;
char sour[10];
char dest[10];
int flag = 1;
while (flag)
{
printf("您正在查询车票\t\t\t");
stime();
printf("请输入起始地:\n");
scanf("%s",sour);
printf("请输入目的地:\n");
scanf("%s",dest);
if(strcmp(sour,dest)==0)
{
system("cls");
printf("起始地与目的地相同,请重新输入\n");
}
else
flag = 0;
}
for ( i = 0 ; i < NUM ; i++ )
{
if((strcmp(pointtr->station[i],sour)==0))
{
for( j = 0 ; j < NUM ; j++ )
{
if(strcmp(pointtr->station[j],dest)==0)
{
ZhanShu=j-i;
strcpy(pointtk->source,pointtr->station[i]);
strcpy(pointtk->dest,pointtr->station[j]);
show(pointtk,pointtr,fp);
count++;
break;
}
}
}
}
if(count==0)
{
printf("无信息!\n");
strcpy(pointtk->source,"0");
strcpy(pointtk->dest,"0");
printf("是否重新输入?\n1.是\n2.否\n");
int shu;
int xunhuan;
do
{
scanf("%d",&shu);
switch (shu)
{
case 1:
check(pointtr,pointtk,fp);
xunhuan = 1;
break;
case 2:
restart(pointtr,pointtk,fp);
break;
default:
printf("输入错误,请重新输入\n是否重新输入?\n1.是\n2.否\n");
xunhuan = 0;
}
}while (xunhuan == 0);
}
}
//购买车票程序
void buy(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
FILE *f1;
system("cls");
printf("您正在购买车票\t\t\t");
stime();
int choice;
int buynumber;
printf("请输入您的姓名:\n");
scanf("%s",pointtk->buyer);
check(pointtr,pointtk,fp);
int f = 1;
while(f)
{
printf("您确定购买此票吗?\n 1.是 \n 2.否\n");
scanf("%d",&choice);
if (choice == 1)
{
int flag = 1;
while (flag == 1)
{
printf("请输入您要购买的张数:\n");
{
scanf("%d",&buynumber);
if(buynumber<0)return;
}
if(((pointtr->lnumber)-buynumber)>0)
{
printf("购买成功!\n");
pointtk->bnumber=buynumber;
(pointtr->lnumber)-=buynumber;
f1=fopen("ticket","w");
fprintf(f1,"%d",pointtr->lnumber);
fclose(f1);
restart(pointtr,pointtk,fp);
}
else
{
printf("车票售完或不足,不能购买!\n");
printf("是否重新输入购买张数吗?\n 1.是 \n 2.否\n");
int shu;
int xunhuan;
do
{
scanf("%d",&shu);
switch (shu)
{
case 1:
break;
case 2:
restart(pointtr,pointtk,fp);
break;
default:
printf("输入错误,请重新输入\n是否重新输入?\n1.是\n2.否\n");
xunhuan = 0;
}
}while (xunhuan == 0);
}
}
f = 0;
}
else if (choice == 2)
{
printf("放弃购买\n");
f = 0;
restart(pointtr,pointtk,fp);
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
//票价计算系统
void price(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
int realprice = fabs (ZhanShu *50);
printf(" %d",realprice);
}
//退票程序
void returnt(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
system("cls");
printf("您正在退票\t\t\t");
stime();
printf("您确定要退票吗\n 1.是\n 2.否\n");
int shu,m;
int xunhuan = 1;
FILE *f1;
do
{
scanf("%d",&shu);
switch (shu)
{
case 1:
printf("您当前购买数量:%d\n",50-(pointtr->lnumber));
printf("请问您退订几张?\n");
do
{
scanf("%d",&m);
if(m<=(50-(pointtr->lnumber)))
{
printf("退票成功!\n");
pointtr->lnumber+=m;
f1=fopen("ticket","w");
fprintf(f1,"%d",pointtr->lnumber);
fclose(f1);
restart(pointtr,pointtk,fp);
}
else
{
printf("退票数超过订票数\n");
printf("请重新输入\n");
}
}while(m>(50-(pointtr->lnumber)));
break;
case 2:
printf("放弃退票!\n");
restart(pointtr,pointtk,fp);
break;
default:
printf("输入错误,请重新输入\n是否重新输入?\n1.是\n2.否\n");
xunhuan = 0;
}
}while (xunhuan == 0);
}
//网上取票程序
void online(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
int num;
system("cls");
printf("您正在打印您在网上所订的票\t\t\t");
stime();
chaxun(pointtr,pointtk,fp);
printf("请输入您想打印的订票号\n");
scanf("%d",&num);
printf("正在打印%d的票\n",num);
restart(pointtr,pointtk,fp);
}
//返回菜单程序
void restart(struct traininfor *pointtr,struct ticket *pointtk,FILE *fp)
{
printf("\n\n请输入您现在所需的功能\n");
printf("1.返回至管理员操作\n");
printf("2.返回至乘客操作\n");
printf("3.返回至网上购票取票通道\n");
printf("4.结束操作,退出程序\n");
int com;
scanf("%d",&com);
if(com == 1)
{
system ("cls");
glylogin(pointtr,pointtk,fp);
}
else if(com == 2)
{
system ("cls");
menu(pointtr,pointtk,fp);
}
else if(com == 3)
{
system ("cls");
online(pointtr,pointtk,fp);
}
else if (com == 4)
exit_();
else
{
system("cls");
printf("输入错误\n\n");
restart(pointtr,pointtk,fp);
}
}
//字体颜色设置程序
void setcolor(WORD attribute)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),attribute);
}
//时间显示程序
void stime()
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
printf("现在时刻:%2d:%2d\n",timeinfo->tm_hour, timeinfo->tm_min);
printf("\n");
}
//退出程序
void exit_()
{
system("cls");
setcolor(BACKGROUND_RED);
printf("┏━━━━━━━━━━━━━━━┓\n");
printf("┃ ");
setcolor(FOREGROUND_GREEN);
printf("谢谢您的使用 欢迎下次光临!");
setcolor(BACKGROUND_RED);
printf(" ┃\n");
printf("┗━━━━━━━━━━━━━━━┛\n\n");
setcolor(FOREGROUND_BLUE|BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN);
printf("\n\t\tpress enter to exit");
fflush(stdin);
getchar();
exit(0);
}