C语言程序设计交通处罚单管理系统.docx
《C语言程序设计交通处罚单管理系统.docx》由会员分享,可在线阅读,更多相关《C语言程序设计交通处罚单管理系统.docx(27页珍藏版)》请在冰点文库上搜索。
C语言程序设计交通处罚单管理系统
C语言设计实习报告
课程名称计算机高级语言课程设计(C)
教师姓名孔春芳
本科生姓名
本科生学号*******
本科生专业电子信息工程
所在院系机械与电子信息学院
类别:
C.本科生
日期:
2013-7-5
课程设计评语
对课程论文的评语:
平时成绩:
课程论文成绩:
总成绩:
评阅人签名:
注:
1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
1.题目要求
【要求】:
交通处罚单涉及到车辆,驾驶员和开单交警的信息,还有交通处罚单的号码,处罚时间等信息。
【功能】:
(1)要求可以输入,删除,浏览交通处罚单信息。
(2)可以按车辆,驾驶员和开单交警查询。
(3)统计某时间段某个驾驶员的交通处罚数目及交通处罚单号码。
2.需求分析
交通处罚单信息用文件存储,提供文件的输输出操作;要求可以输入,输出,删除,浏览交通处罚单信息,因而要提供输入,删除和显示操作;要实现按车辆,驾驶员和开单交警查询,则要提供查找操作;另外提供统计操作和键盘式选择菜单以实现功能选择。
3.总体设计
整个管理系统被设计为信息输入模块,信息删除模块,信息浏览模块,信息查询模块,信息统计模块。
4.详细设计
1,处罚单管理系统界面函数
此函数包括的功能是建立新的罚单,按司机姓名查询罚单并浏览相关信息,按交警姓名查询罚单并浏览相关信息,按罚单号查询罚单并浏览相关信息,删除罚单,数据统计和退出处罚单管理系统。
voidmenu()
{intn,r;
do
{system(“cls”);
printf(“\n\t\t\t交通处罚管理系统\n”);
printf(“**********************************”);
printf(“菜单:
1-信息录入\n”);
printf(“2-信息删除\n”);
printf(“3-信息浏览\n”);
printf(“4-信息查询\n”);
printf(“5-信息统计\n”);
printf(“6-退出系统\n”);
printf(“*******************************”);
printf(“请从输入数字选择相应的功能:
”);
scanf(“%d”,&n);
if(n<1||N>6)
{r=1;
getchar();
}
elser=0;
}while(r==1);
switch(n)
{case1:
input();break;
case2:
dele();break;
case3:
browse();break;
case4:
search();break;
case5:
count();break;
case6:
exit(0);
}
}
2,各功能模块设计
(1)输入模块
处罚单包含的内容有处罚单号,车牌号,司机姓名,交警姓名,和处罚日期,因此相应的函数也应包含这些内容,在这个函数所控制的操作会依次提示输入以上内容。
特别的,罚单号不能有重复,若输入的罚单号有重复,操作界面会提示罚单好重复,请重新输入。
结构体数组;
structPlist//处罚单
{
charvno[20];//车牌号
chardname[20];//驾驶员姓名
charpname[20];//交警姓名
charpno[20];//交警编号
charno[20];//处罚单编号
chardate[20];//处罚日期
}list[N];//处罚单数组
说明:
其中list[N]中的N为处罚单数量,程序中采用宏定义的方式,可随时在源程序宏定义中修改,本程序宏定义#defineN50。
输入模块程序流程图如下所示。
程序:
程序中涉及到文件的处理,要新建一个文件夹,将输入的信息保存进文件夹voidinput()
{
FILE*fp;
intnum;
inti,j;
if((fp=fopen("list.txt","r+"))==NULL)
{
if((fp=fopen("list.txt","w"))==NULL)
{
printf("文件打开或创建失败!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
menu();
}
printf("\n请输入处罚单数量:
");
scanf("%d",&i);
printf("\n\n");
for(j=0;j
{
printf("输入第%d张处罚单的:
\n",j+1);
printf("\n车牌号、驾驶员姓名、交警姓名、交警号、处罚单号、日期(如20101112)\n");
printf("\n注意:
中间用空格隔开!
\n");
scanf("%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
for(j=0;j
{
fprintf(fp,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);/*开辟存储空间,将信息输入到指针指向的位置*/
}
fclose(fp);/*关闭文件*/
printf("\n保存成功!
");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
printf("\n请输入处罚单数量:
");
scanf("%d",&i);
for(j=0;!
feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);/*将指针中输入的数据送到指定的存储位置*/
}
num=j+i;
if(num>N)
{
printf("\n结构体数组数的N太小,请先修改N的值\n");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
printf("\n");
for(j=0;j
{
printf("输入第%d张处罚单的:
\n",j+1);
printf("\n车牌号、驾驶员姓名、交警姓名、交警号、处罚单号、日期(如20101112)\n");
printf("\n注意:
中间用空格隔开!
\n");
scanf("%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
for(j=0;j
{
fprintf(fp,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);
}
fclose(fp);
printf("\n保存成功!
");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
(2)删除模块
该模块删除多余信息,需要先以只读的形式打开,可以以其中一个信息输入内容确定需删除的信息,本程序输入处罚单的编号,根据编号删除记录。
删除记录时,将数据从文件中删除,删除位置后面的记录往前移。
该模块的流程图如下。
程序:
voiddele()
{
intj;
intnum;
intf=-1;
FILE*fp1,*fp2;
chars1[20];
if((fp1=fopen("list.txt","r"))==NULL)
{
printf("cannotopenfile\n");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
for(j=0;!
feof(fp1);j++)//读取文件
{
fscanf(fp1,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
num=j;
fclose(fp1);
printf("请输入要删除的处罚单的编号\n");
scanf("%s",s1);
for(j=0;j{
if(strcmp(s1,list[j].no)==0)
{
f=j;
if(f{
for(j=f;j{
strcpy(list[j].vno,list[j+1].vno);
strcpy(list[j].dname,list[j+1].dname);
strcpy(list[j].pname,list[j+1].pname);
strcpy(list[j].pno,list[j+1].pno);
strcpy(list[j].no,list[j+1].no);
strcpy(list[j].date,list[j].date);
}
}
if((fp2=fopen("list.txt","w"))==NULL)
{
printf("文件打不开!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
menu();
}
for(j=0;j{
fprintf(fp2,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);
}
fclose(fp2);
printf("\n删除成功!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
}
if(f<0)
{
printf("\n没有找到该学号的记录:
\n");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
}
(3).浏览模块
该功能时显示删除某些信息后处罚单上的所有记录。
这部分显示处罚单的数量,再打开文件,按结构体数组的形式输出所有信息即可。
其程序如下所示。
程序:
voidbrowse()
{
intj;
intnum;
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("cannotopenfile\n");
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
for(j=0;!
feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
fclose(fp);
num=j;
printf("\n已添加%d条记录\n\n",num);
printf("车牌号驾驶员姓名交警姓名交警编号处罚单编号处罚日期\n");
for(j=0;j{
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);
}
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
(4).查询模块
该模块有三个查询类型可供选择,可选择以车牌号、驾驶员姓名、开单交警姓名三种方式来查询,这些都将以菜单的形式选择,所以有一个主菜单和各个分模块。
同样查询模块也必须先打开文件夹。
菜单流程图如下。
分模块的流程图基本相同,现以按车牌号查询为例,编写其流程图。
菜单程序:
voidsearch()
{
intn;
intr;
do
{
system("cls");
printf("\n请选择查询类型:
\n\t1-按车牌号2-按驾驶员姓名3:
按开单交警姓名4-返回主菜单\n");
printf("\n请输入数字选择:
");
scanf("%d",&n);
if(n<1||n>4)
{
r=1;
getchar();
}
elser=0;
}while(r==1);
switch(n)
{
case1:
vno_search();break;
case2:
dna_search();break;
case3:
pna_search();break;
case4:
menu();
}
}
各分模块程序:
按车牌号查询
voidvno_search()/*按车牌号查询*/
{
intf=-1;
intnum;
intj;
charno[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件打不开!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
menu();
}
for(j=0;!
feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
num=j;
fclose(fp);
printf("\n请输入车牌号:
");
scanf("%s",no);
printf("\n罚单的信息为:
\n\n");
printf("车牌号驾驶员姓名交警姓名交警编号处罚单编号处罚日期\n");
for(j=0;j{
if(strcmp(no,list[j].vno)==0)
{
f=j;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);
}
}
if(f<0)
printf("\n没有找到该车牌号的记录!
\n");
printf("\npressentertoreturnsubmenu\n");
getchar();
getchar();
search();
}
按驾驶员姓名查询
voiddna_search()/*按驾驶员姓名查询*/
{
intf=-1;
intnum;
intj;
charname[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件打不开!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
menu();
}
for(j=0;!
feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
num=j;
fclose(fp);
printf("\n请输入驾驶员的姓名:
");
scanf("%s",name);
printf("\n罚单的信息为:
\n\n");
printf("车牌号驾驶员姓名交警姓名交警编号处罚单编号处罚日期\n");
for(j=0;j{
if(strcmp(name,list[j].dname)==0)
{
f=j;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);
}
}
if(f<0)
printf("\n没有找到该驾驶员的记录!
\n");
printf("\npressentertoreturnsubmenu\n");
getchar();
getchar();
search();
}
按开单交警姓名查询
voidpna_search()/*按开单交警姓名查询*/
{
intf=-1;
intnum;
intj;
charname[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件打不开!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
menu();
}
for(j=0;!
feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
num=j;
fclose(fp);
printf("\n请输入开单交警的姓名:
");
scanf("%s",name);
printf("\n罚单的信息为:
\n\n");
printf("车牌号驾驶员姓名交警姓名交警编号处罚单编号处罚日期\n");
for(j=0;j{
if(strcmp(name,list[j].pname)==0)
{
f=j;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].vno,list[j].dname,list[j].pname,list[j].pno,list[j].no,list[j].date);
}
}
if(f<0)
printf("\n没有找到该开单交警的记录!
\n");
printf("\npressentertoreturnsubmenu\n");
getchar();
getchar();
search();
}
(5).统计模块
该模块先输入驾驶员的姓名和一个时间段,就可以统计某个驾驶员在某段时间内的处罚单数目和处罚单号。
程序为:
voidcount()
{
intf=-1;
intnum;//所有罚单单数
intj;
inttotal=0;//某驾驶员的罚单数
charname[20];
chartime1[20];
chartime2[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件打不开!
\n");
printf("\npressentertoreturnmenu\n");
getchar();
menu();
}
for(j=0;!
feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].vno,&list[j].dname,&list[j].pname,&list[j].pno,&list[j].no,&list[j].date);
}
num=j;
fclose(fp);
printf("\n请根据提示输入驾驶员的姓名和一个时间段,统计某个驾驶员在某段时间内的处罚单数目和罚单号\n");
printf("\n\n请输入驾驶员的姓名:
");
scanf("%s",name);
printf("\n请输入一个较早的时间:
");
scanf("%s",time1);
printf("\n请输入一个最近的时间:
");
scanf("%s",time2);
for(j=0;j{
if((strcmp(list[j].date,time1)>=0)&&(strcmp(list[j].date,time2)<=0))
{
f=j;
total++;
printf("\n罚单号:
%s\n",list[j].no);
}
}
if(f<0)
printf("\n没有找到记录!
\n");
printf("\n罚单总数为:
%d\n",total);
printf("\npressentertoreturnmenu\n");
getchar();
getchar();
menu();
}
5.上机操作
1,数据源
(1)处罚单号01车牌号码2001