#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
struct Plist
{
char car[8]; //车牌号
char jianame[100]; //驾驶员姓名
char jiaoname[100]; //交警姓名
char jiaonumber[100];//交警编号
char number[100]; //交通处罚单号码
char date[100]; //处罚日期
}list[N];
void shuru();//输入
void shanchu();//删除
void liulan();//浏览
void chaxun();//查询
void tongji();//统计模块
void menu();//主菜单
void c_search();//车牌号查找
void J_search();//交警查找
void K_search();//驾驶员查找
void N_search();//处罚单编号查找
int main()
{
menu();
getchar();
}
void menu()
{
int i,n;
do
{
system("cls");
printf("\n\t\t\t交通处罚单管理系统\n");
printf("********************************************************************");
printf("\n\n菜单:1-信息录入 2-信息删除 3-信息浏览 4-信息查询 5-信息统计 6-退出\n\n");
printf("********************************************************************");
printf("\n请输入数字以办理相应的功能");
scanf("%d",&n);
if(n>=1&&n<=6)
{
i=1;
getchar();
}
else
{
i=0;
printf("请输入正确的数字!");
}
}while(i==0);
switch(n)
{
case 1:shuru();break;
case 2:shanchu();break;
case 3:liulan();break;
case 4:chaxun();break;
case 5:tongji();break;
case 6:exit(0);
}
}
void shuru()
{
FILE*fp;//*fp是指向文件结构体的指针变量,通过fp可找到存放某个文件信息的结构变量,根据这个结构变量的信息找到该文件,实施对文件的操作。fp通常被成为一个指向文件的指针。
int num;
int i,j,n;
if((fp=fopen("list.txt","r+"))==NULL) //原文件为空文件是创建一个新文件,并输入数据
{
if((fp=fopen("list.txt","w"))==NULL)
{
printf("文件打开失败\n");
printf("\n请按回车键返回菜单");
getchar();
menu();
}
printf("\n请输入罚单数量:");
scanf("%d",&i);
for(j=0;j<i;j++) //输入数据存到结构体变量中
{
printf("请输入第%d张罚单的信息\n");
printf("\n 车牌号,驾驶员姓名,交警姓名,交警号,处罚单号,日期(如:20210504) \n");
scanf("%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname,&list[j].jiaonumber, &list[j].number, &list[j].date);
}
for(j=0;j<i;j++) //保存数据到文件中
{
fprintf(fp,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);//将数据保存到文件中fprintf
}
fclose(fp);//用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。必要时刷新缓冲区。
printf("保存成功,请按回车键返回菜单\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].car, &list[j].jianame, &list[j].jiaoname,&list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j+i;
n=j;
if(num>N)
{
printf("\n 结构体数组的N过小,请先修改N的值\n");
printf("按回车键返回菜单\n");
getchar();
getchar();
menu();
}
printf("\n");
for(j=n;j<num;j++) //输入新的数据
{
printf("请输入第%d张罚单的信息\n",j+1);
printf("\n 车牌号,驾驶员姓名,交警姓名,交警号,处罚单号,日期(如:20210504)");
scanf("%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname,&list[j].jiaonumber, &list[j].number, &list[j].date);
}
for(j=n;j<num;j++)
{
fprintf(fp,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);//将数据保存到文件中fprintf
}
fclose(fp);//用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。必要时刷新缓冲区。
printf("保存成功,请按回车键返回菜单\n");
getchar();
getchar();
menu();
}
void shanchu()
{
int j,k;
int num;
int f=-1;
FILE*fp1;
FILE*fp2;
char s1[20];
if((fp1=fopen("list.txt","a+"))==NULL)
{
printf("无法找到文件");
printf("\n请按回车返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp1);j++) //读取文本中的全部数据
fscanf(fp1,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname, &list[j].jiaonumber, &list[j].number, &list[j].date);
num=j;
fclose(fp1);
printf("请输入要删除的处罚单编号:\n");
scanf("%s",s1);
for(j=0;j<num;j++)
{
if(strcmp(s1,list[j].number)==0)
{
f=j;
if(f<num-1) //删除的数据为不为最后一个
{
for(j=f;j<num-1;j++) //后一个数据覆盖前一个数据
{
strcpy(list[j].car,list[j+1].car);
strcpy(list[j].date,list[j+1].date);
strcpy(list[j].jianame,list[j+1].jianame);
strcpy(list[j].jiaoname,list[j+1].jiaoname);
strcpy(list[j].number,list[j+1].number);
strcpy(list[j].jiaonumber,list[j+1].jiaonumber);
}
}
if(f=num-1) //要删除的数据为最后一个
{
f=-2;
}
}
}
if((fp2=fopen("list.txt","w"))==NULL)
{
printf("文件无法打开");
printf("\n 请按回车键返回菜单");
getchar();
menu();
}
if(f!=-2)
{
for(j=0;j<num-1;j++)//保存文件
{
fprintf(fp2,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
fclose(fp2);
if(f<0)
{
printf("没有找到该编号信息:\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
printf("删除成功\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
if(f==-2)
{
fp2=fopen("list.txt","w");
for(j=0;j<num-1;j++)//保存文件
{
fprintf(fp2,"\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
fclose(fp2);
printf("删除成功\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
}
void liulan()
{
int j;
int num;
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("无法打开文件\n");
printf("请按回车键返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp);j++)//读取文件
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname,&list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j;
fclose(fp);
printf("\n已添加%d条记录\n\n",num);
printf("车牌号 驾驶员姓名 交警姓名 交警编号 处罚单编号 处罚时间\n");
for(j=0;j<num;j++)
{
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
printf("\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
void chaxun()
{
int n,r;
do
{
system("cls");
printf("\n 请输入查询类型:\n\t1-按车牌号 2-按驾驶员姓名 3-按交警姓名 4-按交通处罚单号 5-返回菜单\n");
scanf("%d",&n);
if(n<1||n>6)
{
r=1;
getchar();
}
else
r=0;
}while(r==1);
switch(n)
{
case 1:c_search();break;
case 2:K_search();break;
case 3:J_search();break;
case 4:N_search();break;
case 5:menu();break;
}
}
void c_search()
{
int f=-1;
int num;
int j;
char no[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件无法打开\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp);j++)
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname, &list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j;
fclose(fp);
printf("\n 请输入车牌号:");
scanf("%s",&no);
printf("\n 处罚单信息为:\n");
printf("车牌号 驾驶员姓名 交警姓名 交警编号 处罚单编号 处罚日期\n");
for(j=0;j<num;j++)
{
if(strcmp(no,list[j].car)==0)
{
f=1;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
}
if(f<0)
{
printf("没有找到该车牌号的记录\n");
}
printf("\n请按回车键返回查找菜单");
getchar();
getchar();
chaxun();
}
void K_search()
{
int f=-1,n,j,num;
char name[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件无法打开\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp);j++)
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname, &list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j;
fclose(fp);
printf("\n请输入驾驶员姓名:");
scanf("%s",&name);
printf("罚单信息为:\n\n");
printf("车牌号 驾驶员姓名 交警姓名 交警编号 处罚单编号 处罚日期");
for(j=0;j<num;j++)
{
if(strcmp(name,list[j].jianame)==0)
{
f=j;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
}
if(j<0)
{
printf("未找到该驾驶员信息\n");
}
printf("请按回车键返回查询菜单");
getchar();
getchar();
chaxun();
}
void J_search()
{
int f=-1,n,j,num;
char name[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件无法打开\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp);j++)
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname, &list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j;
fclose(fp);
printf("\n请输入交警姓名:");
scanf("%s",&name);
printf("罚单信息为:\n\n");
printf("车牌号 驾驶员姓名 交警姓名 交警编号 处罚单编号 处罚日期");
for(j=0;j<num;j++)
{
if(strcmp(name,list[j].jiaoname)==0)
{
f=j;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
}
if(j<0)
{
printf("未找到该交警信息\n");
}
printf("请按回车键返回查询菜单");
getchar();
getchar();
chaxun();
}
void N_search()
{
int f=-1,n,j,num;
char number[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件无法打开\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp);j++)
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname, &list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j;
fclose(fp);
printf("\n请输入处罚单编号:");
scanf("%s",&number);
printf("罚单信息为:\n\n");
printf("车牌号 驾驶员姓名 交警姓名 交警编号 处罚单编号 处罚日期");
for(j=0;j<num;j++)
{
if(strcmp(number,list[j].number)==0)
{
f=j;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
}
if(j<0)
{
printf("未找到该处罚单编号信息\n");
}
printf("请按回车键返回查询菜单");
getchar();
getchar();
chaxun();
}
void tongji()
{
int f=-1;
int num,j;
int t=0;
char name[20];
char time1[20];
char time2[20];
FILE*fp;
if((fp=fopen("list.txt","r"))==NULL)
{
printf("文件无法打开\n请按回车键返回菜单");
getchar();
getchar();
menu();
}
for(j=0;!feof(fp);j++)
{
fscanf(fp,"%s%s%s%s%s%s",&list[j].car, &list[j].jianame, &list[j].jiaoname, &list[j].jiaonumber, &list[j].number, &list[j].date);
}
num=j;
fclose(fp);
printf("请根据提示输入驾驶员的姓名和一个时间段,统计某个驾驶员在某段时间内的处罚单数目和处罚单号\n");
printf("\n请输入驾驶员姓名:");
scanf("%s",name);
printf("\n请分别输入一个较早的时间:");
scanf("%s",time1);
printf("请输入一个较晚的时间:");
scanf("%s",time2);
printf("车牌号 驾驶员姓名 交警姓名 交警编号 处罚单编号 处罚日期");
for(j=0;j<num;j++)
{
if((strcmp(name,list[j].jianame)==0) && (strcmp(list[j].date,time1)>=0) && (strcmp(list[j].date,time2)<=0))
{
f=j;
t++;
printf("\n%s\t%s\t%s\t%s\t%s\t%s",list[j].car,list[j].jianame,list[j].jiaoname,list[j].jiaonumber,list[j].number,list[j].date);
}
}
if(j<0)
{
printf("未找到相关信息\n");
}
printf("\n共找到%d条记录\n\n",t);
printf("请按回车键返回菜单");
getchar();
getchar();
menu();
}
需求分析
题目:处罚单信息管理系统 交通处罚单管理系统
要求:实现简单的交通处罚单信息管理,系统要求以菜单方式工作,因而根据题目要求,提供键盘式选择菜单实现功能选择,交通处罚单信息包括车牌号、驾驶员姓名、交警姓名、交警警号、处罚单单号、开单时间等(处罚单单号不重复)。交通处罚单信息采用文件保存,所以应提供文件的输入、输出等操作;在程序中需要浏览交通处罚单的信息,应提供显示、查找、等操作;要实现交通处罚单信息的查询,则要提供查找功能(包括按车牌号查询、驾驶员姓名查询、交警姓名查询、处罚单单号查询四种查询方式);要实现处罚单信息的删除、修改,则要提供文件记录的删除 、修改功能;要实现统计某驾驶员在某段时间中的处罚单数量,则要提供统计功能。
- 系统以菜单方式工作。
- 处罚单信息录入功能(处罚单信息用文件保存)。
- 处罚单信息浏览功能 。
- 处罚单信息查询功能。
查询方式:
- 车牌号查询
- 驾驶员姓名查询
- 交警名查询
- 处罚单单号查询
- 处罚单信息统计功能。
总体设计
根据上面的需求分析,可以将这个系统设计分为以下模块:处罚单信息输入模块、处罚单信息浏览模块、处罚单信息查询模块、处罚单信息删除与修改模块、处罚单信息统计模块。
详细设计
1.数据信息
建立处罚单信息结构体,结构体成员包括车牌号、驾驶员姓名、交警姓名、交警编号、交通处罚单编号、处罚日期。
struct Plist
{
char car[8]; //车牌号
char jianame[100]; //驾驶员姓名
char jiaoname[100]; //交警姓名
char jiaonumber[100];//交警编号
char number[100]; //交通处罚单号码
char date[100]; //处罚日期
}list[N];
2.模块设计
- 输入模块:输入处罚单的工号、姓名以及其它的一些处罚单的相关信息,通过自己定义的void shuru()函数来实现。
- 浏览模块:浏览所有处罚单的相关信息,通过自己定义的void liulan()函数来实现。
- 查询模块:可以按车牌号来查询处罚单的相关信息,通过自己定义的void c_search()函数来实现。按交警姓名查询处罚单的相关信息,通过J_search()查询模块:可以按处罚单号来查询处罚单的相关信息,通过自己定义的void N_search()函数来实现。
- 删除模块:可以按处罚单编号删除处罚单相关信息,通过自己定义的void shanchu()函数来实现。
- 统计模块:可以根据驾驶员姓名,统计出某段时间内,该驾驶员的交通处罚单信息,通过自己定义的void tongji()函数实现。
- 输入模块
是 否
- 查询模块
否 是 否 是
- 浏览模块
4.删除模块
是 否
- 统计模块
- 调试与测试
运行程序菜单模块初始化,如图6.1所示.
图 6.1 主菜单
-
- 按1进入处罚单信息录入模块,输入处罚单信息车牌号123456,驾驶员姓名李华,交警姓名张三,交警号123456,处罚单号001,处罚时间20211217.如图6.2所示
图6.2 录入
-
- 在输入完1个数据后,按3进入处罚单信息浏览模块,浏览信息,如图6.3所示
图 6.3 浏览
-
- 按4进入处罚单查询模块,如图6.4所示
图 6.4 查询
-
- 按1进入按车牌号查询模块,输入123456查询,如图6.5所示
图 6.5 按学号查询
-
- 按2进入驾驶员姓名查询模块,输入李华,如图6.6所示
图 6.6 按驾驶员姓名查询
-
- 按3进入按交警姓名查询模块,输入张三,如图6.7所示
图 6.7 按交警姓名查询模块
-
- 按4进入按交通处罚单号查询,输入001,如图6.8所示
图6.8按交通处罚单号查询模块
-
- 按5返回菜单,如图6.9
图6.9返回菜单
-
- 在菜单界面按2进入删除模块,输入001,如图6.10
图6.10删除模块
-
- 按5进入统计模块输入如图所示信息,如图6.11
图6.11统计模块
总结及分析
程序能较为完整的完成需求,不足是排版不够美观简洁,在删除模块中删除列表中的最后一组数据时,未能清理缓存区的数据,使得在浏览模块中仍然可以看到数据,文本文件中已经没有了数据,但程序中仍然可以通过访问缓存区,查询到数据。
自己也学会了简单的模块化设计,并实际完成了一个程序的设计,编写,调试,把之前学到的一些基础知识能够融汇到一个程序中。
在程序的设计中,面临过一些未掌握的知识,通过在论坛中学习他人的博客文章,以及看书的方法解决这一些问题。
在今后的学习中,要更加努力的学习,提高自己的编程水平及算法思维。