C语言课程设计交通处罚单管理系统

#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. 系统以菜单方式工作。
  2. 处罚单信息录入功能(处罚单信息用文件保存)。
  3. 处罚单信息浏览功能 。
  4. 处罚单信息查询功能。

查询方式:

  1. 车牌号查询
  2. 驾驶员姓名查询
  3. 交警名查询
  4. 处罚单单号查询
  5. 处罚单信息统计功能。
    总体设计

根据上面的需求分析,可以将这个系统设计分为以下模块:处罚单信息输入模块、处罚单信息浏览模块、处罚单信息查询模块、处罚单信息删除与修改模块、处罚单信息统计模块。


  • 详细设计

1.数据信息

建立处罚单信息结构体,结构体成员包括车牌号、驾驶员姓名、交警姓名、交警编号、交通处罚单编号、处罚日期。

struct Plist

{

char car[8]; //车牌号

char jianame[100]; //驾驶员姓名

char jiaoname[100]; //交警姓名

char jiaonumber[100];//交警编号

char number[100]; //交通处罚单号码

char date[100]; //处罚日期

}list[N];

2.模块设计

  1. 输入模块:输入处罚单的工号、姓名以及其它的一些处罚单的相关信息,通过自己定义的void shuru()函数来实现。
  2. 浏览模块:浏览所有处罚单的相关信息,通过自己定义的void liulan()函数来实现。
  3. 查询模块:可以按车牌号来查询处罚单的相关信息,通过自己定义的void c_search()函数来实现。按交警姓名查询处罚单的相关信息,通过J_search()查询模块:可以按处罚单号来查询处罚单的相关信息,通过自己定义的void N_search()函数来实现。
  4. 删除模块:可以按处罚单编号删除处罚单相关信息,通过自己定义的void shanchu()函数来实现。
  5. 统计模块:可以根据驾驶员姓名,统计出某段时间内,该驾驶员的交通处罚单信息,通过自己定义的void tongji()函数实现。
  1. 输入模块

       是                                              否

  1. 查询模块

否                     是                否                   是

  1. 浏览模块

4.删除模块

是 否

  1. 统计模块

  • 调试与测试

运行程序菜单模块初始化,如图6.1所示.

图 6.1 主菜单

    1. 按1进入处罚单信息录入模块,输入处罚单信息车牌号123456,驾驶员姓名李华,交警姓名张三,交警号123456,处罚单号001,处罚时间20211217.如图6.2所示

图6.2 录入

    1. 在输入完1个数据后,按3进入处罚单信息浏览模块,浏览信息,如图6.3所示

图 6.3 浏览

    1. 按4进入处罚单查询模块,如图6.4所示

图 6.4 查询

    1. 按1进入按车牌号查询模块,输入123456查询,如图6.5所示

图 6.5 按学号查询

    1. 按2进入驾驶员姓名查询模块,输入李华,如图6.6所示

图 6.6 按驾驶员姓名查询

    1. 按3进入按交警姓名查询模块,输入张三,如图6.7所示

图 6.7 按交警姓名查询模块

    1. 按4进入按交通处罚单号查询,输入001,如图6.8所示


图6.8按交通处罚单号查询模块

    1. 按5返回菜单,如图6.9

图6.9返回菜单

    1. 在菜单界面按2进入删除模块,输入001,如图6.10

图6.10删除模块

    1. 按5进入统计模块输入如图所示信息,如图6.11

图6.11统计模块

总结及分析

程序能较为完整的完成需求,不足是排版不够美观简洁,在删除模块中删除列表中的最后一组数据时,未能清理缓存区的数据,使得在浏览模块中仍然可以看到数据,文本文件中已经没有了数据,但程序中仍然可以通过访问缓存区,查询到数据。

自己也学会了简单的模块化设计,并实际完成了一个程序的设计,编写,调试,把之前学到的一些基础知识能够融汇到一个程序中。

在程序的设计中,面临过一些未掌握的知识,通过在论坛中学习他人的博客文章,以及看书的方法解决这一些问题。

在今后的学习中,要更加努力的学习,提高自己的编程水平及算法思维。

  • 15
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值