C语言实践应用交通处罚单管理系统内容:〔要求〕交通处罚单涉及到车辆、驾驶员和开单交警的信息,还有交通处罚单号码,处罚时间等信息。
功能:(1)要求可以输入、删除、浏览交通处罚单信息。
(2)可以按车辆、驾驶员和开单交警查询。
(3)统计某时间段某个驾驶员的交通处罚单数目及交通处罚单号码。
第二部分:需求分析1.交通处罚单信息用文件存储,提供文件的输入输出操作;2.要求可以输入、删除、浏览交通处罚单信息,因而要提供信息的输入、删除和显示操作;3.要车辆、驾驶员和开单交警查询,则要提供查找操作;4.另外提供系统操作和键盘式选择菜单以实现功能选择。
第三部分:程序总体设计思路由于C语言是面对过程的语言,故我的设计思路是根据目标程序运行的过程来编写的。
在编写本程序的过程中,首先,确定目标程序运行的次序与界面,即本程序首先运行【用户系统】菜单界面,菜单界面上为用户提供信息输入,信息删除,信息查询,信息浏览,信息统计,退出菜单共六种操作选择。
此功能用switch语句来实现。
其次,根据目标程序运行的次序与界面,确定设计顺序,设计界面(包括各部分菜单与用户提示信息)。
再次,按照程序运行的各界面下的菜单功能编写各功能模块,并调试程序各功能模块,使各模块能够稳定高效准确地完成对应功能。
第四部分:程序功能模块划分、图示及流程图系统的结构图:.【信息输入模块】该模块的功能是为用户提供信息输入界面,用户可以根据信息提示进行信息输入,用户输入的信息将被保存在文件当中。
【流程图】【程序】:void shuru(){FILE *fp;int i=0;if((fp=fopen("data.txt","wb"))==NULL){printf("Can not open the file\n");exit(0);//调用此函数时必须包含<stdlib.h>}printf("请输入车牌号码:\n");scanf("%d",&dan[NUM ].chepai);printf("请输入驾驶员姓名:\n");scanf("%s",dan[NUM ].name);printf("请输交警ID:\n");scanf("%d",&dan[NUM ].id);printf("请输入开单日期(以年/月/日形式输入):\n");scanf("%d/%d/%d",&dan[i].date.year,&dan[i].date.month,&dan[i].date.d ay);printf("请输入处罚单号:\n");scanf("%d",&dan[NUM ].num);for (i=0;i<=NUM;i++){if(fwrite(&dan[i],sizeof(struct cfd),1,fp)!=1)printf("file write error\n");} //此处for循环的作用是:在每次调用输入函数时都能够把结构体数组中已有的数据和本次输入的数据都记录在文件data.txt中printf("已经有%d个罚单\n",i);NUM++;//NUM用来记录罚单总数,每调用一次输入函数NUM 就加一fclose(fp);}【删除罚单模块】:按操作者的指令在结构体数组中找到删除的信息,把结构体数组中的信息抄到文件中去忽略要删除的信息达到要删除的目的。
【流程图】:【程序】:void shanchu(){int i;int c;//待删除罚单号码int w;//删除处罚单号FILE *fp;printf("请输入要删除的处罚单号:"); scanf("%d",&w);fp=fopen("data.txt","rb");for(i=0;i<NUM;i++){if(w==dan[i].num) //查找要删除的罚单号码c=i; //待删除罚单号码}fclose(fp);fp=fopen("data.txt","wb");for(i=0;i<NUM;i++){if(i!=c)fwrite(&dan[i],sizeof(struct cfd),1,fp); //如果罚单号与待删除罚单号不同,就写入文件} //此处for循环的作用是:从文件中把待删除的信息删除NUM--;//全局变量更新printf("删除成功\n罚单号是%d\n",dan[c].num );fclose(fp);}【信息浏览模块】:把储存在文件中信息全部输出。
【程序】:void liulan(){int i;FILE *fp;fp=fopen("data.txt","rb");printf("已有%d个罚单",NUM);for(i=0;i<NUM;i++){if(fread(&dan[i],sizeof(struct cfd),1,fp)){printf("第%d罚单信息\n",i+1);prntf(i);}else break;}fclose(fp);}【信息查询模块】:用户根据界面的提示选择查询方式,并根据进一步的提示进行相关输入,程序根据用户输入的信息通过for循环找到与之相对应的信息,并输出相关信息。
【流程图】:【程序】:void chaxun(){int i,w,x,flag;FILE *fp;char v[8]; //驾驶员名字printf("请输入你想查询的信息:\n");printf("1 - 按车牌号查询\n");printf("2 - 按司机姓名查询\n");printf("3 - 按警察ID查询\n");scanf("%d",&x);flag=0;//查找成功的标志,查找成功FLAG=1if(x==3){printf("请输入要查询的警察ID:\n");scanf("%d",&w);fp=fopen("data.txt","rb");for(i=0;i<NUM;i++){if(fread(&dan[i],sizeof(struct cfd),1,fp)!=1) break; if(dan[i].id==w){prntf(i);flag=1;break;}}if(flag==0)printf("找不到此处罚单信息!\n");fclose(fp);}else if(x==2){printf("请输入要查询的司机姓名:\n");scanf("%s",v);fp=fopen("data.txt","rb");for(i=0;i<NUM;i++){if(fread(&dan[i],sizeof(struct cfd),1,fp)!=1) break;if(strcmp(dan[i].name,v)==0) //使用此函数时必须包含string.h {prntf(i);flag=1;break;}}if(flag==0)printf("找不到此处罚单信息!\n");fclose(fp);}else if(x==1){printf("请输入要查询的车牌号:\n");scanf("%d",&w);fp=fopen("data.txt","rb");for(i=0;i<NUM;i++)if(fread(&dan[i],sizeof(struct cfd),1,fp)!=1) break;if(dan[i].num==w){prntf(i);flag=1;break;}}if(flag==0)printf("找不到此处罚单信息!\n");fclose(fp);}else printf("输入错误!\n");}信息统计模块:用户根据提示输入驾驶员姓名和一个时间段,程序将对储存在文件中的信息逐个进行检验看其是否与输入的信息相对应,若相对应,就会将其输出,并使统计变量加一,最终输出此驾驶员在此时间段内总共有多少罚单。
【流程图】:【程序】:void tongji(){ int a1,b1,c1;// 分别用来表示起始时间的年、月、日int a2,b2,c2;// 分别用来表示截止时间的年、月、日int t;//用来统计驾驶员在此时间段的罚单个数int i;char v[8];//要对其进行统计的驾驶员姓名printf("请输入驾驶员姓名:");scanf("%s",v);printf("请输入要统计的时间段(以年/月/日的形式表示日期):\n"); printf("请输入起始日期:");scanf("%d/%d/%d",&a1,&b1,&c1);printf("截止时间日期:");scanf("%d/%d/%d",&a2,&b2,&c2);for(i=0;i<=NUM;i++){if(strcmp(v,dan[i].name)==0)if(dan[i].date.year>a1&&dan[i].date.year<a2) {printf("%d\n",dan[i].num);t++;}else if(dan[i].date.year>a1&&dan[i].date.year==a2) {if(dan[i].date.month<b2){printf("%d\n",dan[i].num);t++;}else if(dan[i].date.month==b2&&dan[i].date.day<=c2) {printf("%d\n",dan[i].num);t++;}}else if(dan[i].date.year==a1&&dan[i].date.year<a2) {if(dan[i].date.month>b1){printf("%d\n",dan[i].num);t++;}else if(dan[i].date.month==b1&&dan[i].date.day==c2) {printf("%d\n",dan[i].num);t++;}}else if(dan[i].date.year==a1&&dan[i].date.year==a2){if(dan[i].date.month>b1&&dan[i].date.month<b2){printf("%d\n",dan[i].num);t++;}elseif(dan[i].date.month>b1&&dan[i].date.month==b2&&dan[i].date.day<=c2) {printf("%d\n",dan[i].num);t++;}elseif(dan[i].date.month==b1&&dan[i].date.month<b2&&dan[i].date.day>=c2) {printf("%d\n",dan[i].num);t++;}else if(dan[i].date.month==b1&&dan[i].date.month==b2){if(dan[i].date.day>=c1&&dan[i].date.day<=c2)printf("%d\n",dan[i].num);t++;}}}//此处for循环的作用是:将文件中的罚单信息与输入的驾驶员姓名和时间段进行比较,如果吻合就输出罚单信息,直到将所有满足条件的信息全部输出printf("从%d/%d/%d到%d/%d/%d这段时间内司机",a1,b1,c1,a2,b2,c2);puts(v);printf("共有罚单数目是:%d\n",t);}【信息输出模块】:由于程序中有多处都需要用到信息输出功能,为了使程序简洁明了,将信息输出拿出来,作为一个单独的模块供其它地方调用。