资源描述
课
程
设
计
报
告
专业:电气工程及其自动化
年级:
学号:
姓名:
成绩:
批改时间:
红河学院 工学院编制说 明
1、本报告供学生课程设计时使用。
2、学生应认真阅读课程设计规定。
3、课程设计报告里面的内容要手工填写,以备存档使用(源程序可打印)。
4、课程设计的总评成绩根据课程的性质,按一定比例计入该门课程成绩。
5、课程设计报告中的各模块填写的内容是评分的重要依据,假如不够书写,可以自行添加附页。
6、按规定的时间提交报告给教师评估成绩,由任课教师交到工学院存档。
课程设计目录
课程名称:高级语言程序设计
序号
课程设计名称
起止页码
29
交通处罚单管理系统
设计任务
题目
名称
交通处罚单管理系统
班级
指导
教师
地点
成绩
学年
开始
日期
结束
日期
一、问题分析(围绕设计题目,进行课程设计开始前的准备过程,在此以问题分析的形式展开,从设计的总体性上对所承担的设计题目的思考,分析,此模块内容请手工填写)
(1)需求分析:
交通处罚单信息用文献存储,提供文献的输输出操作;规定可以输入,输出,删除,浏览交通处罚单信息,因而要提供输入,删除和显示操作;要实现按车辆,驾驶员和开单交警查询,则要提供查找操作;此外提供记录操作和键盘式选择菜单以实现功能选择。
(2)总体设计:
整个管理系统被设计为信息输入模块,信息删除模块,信息浏览模块,信息查询模块,信息记录模块。
交通处罚单管理系统
统
计
输
入
查
找
删
除
退出
二、设计流程图(问题分析与算法设计,并画出流程图,此模块内容请打印)
1、 主函数
[主函数流程图]
显示一系列功能选项
输入n,判断n是否是1—6
根据n的值调用各功能模块函数
2·[输入模块流程图]
输入用户要输入处罚单纪录的条数j
能否打开文献
退出
i从0到j-1依次输入处罚单信息,并保存到文献中
j
开始
选择浏览还是返回主菜单
3·[删除模块流程图]
打开文献
记录出文献中的处罚单总数m
输入要删除的处罚单的处罚单号j
j==dan[i].num
把此i的值赋给作为比较的变量n
关闭文献后再打开文献
依次比较i!=n
把不规定删除的罚单信息在文献中输入
选择浏览还是返回主菜单
4·[查询模块流程图] 打开文献
输入用户要查询的信息x
让用户选择
输入查询的车牌号j
输入查询的驾驶员姓名m
输入查询的开单警察j
输入错误
dan[i].chepai==j
dan[i].id==j
strcmp(dan[i].name,m)==0
显示“找不到此罚单信息
关闭文献
选择浏览还是返回主菜单
显示“找不到此罚单信息
显示“找不到此罚单信息
显示“找不到此罚单信息
5·[记录模块流程图]
输入需要记录的时间段和驾驶员姓名
打开文献
依次查找是否有符合记录规定的处罚单信息
输出处罚单号
输出“找不到记录罚单信息”
记录找到的处罚单条数
关闭文献
选择浏览还是返回主菜单
6·
[一个任务结束时是选择浏览还是返回的函数的流程图]
开始选择
What do you want to do?
调用浏览函数
调用主界面函数
1、 主函数
[主函数流程图]
显示一系列功能选项
输入n,判断n是否是1—6
根据n的值调用各功能模块函数
[主函数程序]
menu() /*主界面*/
{
int n,w; /*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单相应数字范围内*/
do
{
printf("\t\t\t欢迎来到交通处罚单管理系统!\n\n");
printf("\t\t*******************MENU*******************\n\n");
printf("\t\t\t\t1.信息输入\n");
printf("\t\t\t\t2.信息删除\n");
printf("\t\t\t\t3.信息浏览\n");
printf("\t\t\t\t4.信息查询\n");
printf("\t\t\t\t5.信息记录\n");
printf("\t\t\t\t6.退出\n");
puts("\n\n\t\t********************************************\n");
printf("\t\t请输入您的操作(1-6):[ ]\b\b");
scanf("%d",&n);
if(n<1||n>6) /*对选择的数字作判断*/
{
w=1;
getchar();
}
else
w=0;
}
while(w==1); /*选择功能*/
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);
}
return(n);
}
void main() /*主函数*/
{
menu();
}
2、 各功能模块设计
(1)、输入模块
[数据结构]
采用结构体的形式,把处罚单的处罚单号、车牌号码、驾驶员姓名、开单警察ID、处罚时间作为结构体成员,用结构体数组的形式存放若干条处罚单信息。
struct fandan
{
int num; /*处罚单号码*/
int chepai; /*车牌号码*/
char name[8]; /*驾驶员名字*/
int id; /*开单警察的信息ID*/
char time[11]; /*处罚时间为年月日排列*/
}dan[N]; /*dan[500]中每个数组元素相应一个处罚单信息*/
[注意]
dan[N]中的N为处罚单条数,本程序采用宏定义#define N 500。
[输入模块流程图]
输入用户要输入处罚单纪录的条数j
能否打开文献
退出
i从0到j-1依次输入处罚单信息,并保存到文献中
j
开始
选择浏览还是返回主菜单
[输入模块程序]
void shuru() /*输入模块*/
{
int i,j;
FILE *fp;
if((fp=fopen("data.txt","w"))==NULL)
{
printf("无法打开文献!\n");
exit(0);
}
printf("\n你要输入多少条处罚单信息:");
scanf("%d",&j);
for(i=0;i<j;i++)
{
printf("\n请依次输入罚单信息:\n");
printf("\n罚单号 车牌号 驾驶员姓名 警察ID 处罚时间\n");
scanf("%3d %5d %8s %5d %11s",&dan[i].num,&dan[i].chepai,&dan[i].name,&dan[i].id,&dan[i].time);
fprintf(fp,"\n%3d %5d %8s %5d %11s",dan[i].num,dan[i].chepai,dan[i].name,dan[i].id,dan[i].time);
/*输入罚单信息*/
printf("输入信息成功!\n");
}
fclose(fp);
printf_back();
}
(2)、删除模块
[删除模块流程图]
打开文献
记录出文献中的处罚单总数m
输入要删除的处罚单的处罚单号j
j==dan[i].num
把此i的值赋给作为比较的变量n
关闭文献后再打开文献
依次比较i!=n
把不规定删除的罚单信息在文献中输入
选择浏览还是返回主菜单
[删除模块程序]
void shanchu() /*删除模块*/
{
int i,j,m,n;
FILE *fp;
printf("请输入要删除的处罚单号:");
scanf("%d",&j);
fp=fopen("data.txt","r");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%3d %5d %8s %5d %11s",&dan[i].num,&dan[i].chepai,&dan[i].name,&dan[i].id,&dan[i].time);
}
m=i; /*记录出文献中罚单总数*/
for(i=0;i<m;i++)
{
if(j==dan[i].num)
n=i;
}
fclose(fp);
fp=fopen("data.txt","w");
for(i=0;i<m;i++)
{
if(i!=n)
{
fprintf(fp,"\n%3d %5d %8s %5d %11s",dan[i].num,dan[i].chepai,dan[i].name,dan[i].id,dan[i].time);
/*把不规定删除的罚单信息在文献中输入*/
}
}
fclose(fp);
printf_back();
}
(3)、浏览模块
[需求分析]
该模块的功能是显示文献中所有的处罚但记录信息。
[浏览模块流程图]
打开文献
逐条显示文献中的处罚单信息
关闭文献
选择浏览还是返回主菜单
[浏览模块程序]
void liulan() /*浏览模块*/
{
int i;
FILE *fp;
fp=fopen("data.txt","r");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%3d %5d %8s %5d %11s",&dan[i].num,&dan[i].chepai,&dan[i].name,&dan[i].id,&dan[i].time);
printf("------------------------------\n");
printf("处罚单号:%d\n",dan[i].num);
printf("车牌号码:%d\n",dan[i].chepai);
printf("驾驶员姓名:%s\n",dan[i].name);
printf("开单警察ID:%d\n",dan[i].id);
printf("处罚时间:%s\n",dan[i].time);
printf("------------------------------\n"); /*逐条输出文献信息*/
}
fclose(fp);
printf_back();
}
(4)、查询模块
[需求分析]
该模块的功能是可以实现按车辆、驾驶员和开单交警查询。
[查询模块流程图] 打开文献
输入用户要查询的信息x
让用户选择
输入查询的车牌号j
输入查询的驾驶员姓名m
输入查询的开单警察j
输入错误
dan[i].chepai==j
dan[i].id==j
strcmp(dan[i].name,m)==0
显示“找不到此罚单信息
关闭文献
选择浏览还是返回主菜单
显示“找不到此罚单信息
显示“找不到此罚单信息
显示“找不到此罚单信息
[查询模块程序]
void chaxun() /*查询模块*/
{
int i,j,x,flag=0;
FILE *fp;
char m[8];
printf("请输入您想查询的信息: \n");
printf("1_按车牌号查询\n");
printf("2_按驾驶员姓名查询\n");
printf("3_按开单警察ID查询\n");
scanf("%d",&x);
if(x==1)
{
printf("请输入您要查询的车牌号: \n");
scanf("%d",&j);
fp=fopen("data.txt","r");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%3d %5d %8s %5d %11s",&dan[i].num,&dan[i].chepai,&dan[i].name,&dan[i].id,&dan[i].time);
if(dan[i].chepai==j)
{
printf("处罚单号:%d\n",dan[i].num);
printf("车牌号码:%d\n",dan[i].chepai);
printf("驾驶员姓名:");puts(dan[i].name);
printf("开单警察ID:%d\n",dan[i].id);
printf("处罚时间:");puts(dan[i].time);
printf("--------------------------\n");
flag=1;
break;
}
}
if(flag==0)
printf("找不到此罚单信息!\n");
fclose(fp);
printf_back();
}
else if(x==2)
{
printf("请输入您要查询的驾驶员姓名: ");
scanf("%s",m);
fp=fopen("data.txt","r");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%3d %5d %8s %5d %11s",&dan[i].num,&dan[i].chepai,&dan[i].name,&dan[i].id,&dan[i].time);
if(strcmp(dan[i].name,m)==0)
{
printf("处罚单号:%d\n",dan[i].num);
printf("车牌号码:%d\n",dan[i].chepai);
printf("驾驶员姓名:");puts(dan[i].name);
printf("开单警察ID:%d\n",dan[i].id);
printf("处罚时间:");puts(dan[i].time);
printf("-------------------------\n");
flag=1;
break;
}
}
if(flag==0)
printf("找不到此罚单信息!\n");
fclose(fp);
printf_back();
}
else if(x==3)
{
printf("请输入您要查询的开单警察ID: ");
scanf("%d",&j);
fp=fopen("data.txt","r");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%3d %5d %8s %5d %11s",&dan[i].num,&dan[i].chepai,&dan[i].name,&dan[i].id,&dan[i].time);
if(dan[i].id==j)
{
printf("处罚单号:%d\n",dan[i].num);
printf("车牌号码:%d\n",dan[i].chepai);
printf("驾驶员姓名:");puts(dan[i].name);
printf("开单警察ID:%d\n",dan[i].id);
printf("处罚时间:");puts(dan[i].time);
printf("-------------------------\n");
flag=1;
break;
}
}
if(flag==0)
printf("找不到此处罚单信息!\n");
fclose(fp);
printf_back();
}
else
{ printf("输入错误!\n");
printf_back();
}
}
(5)、记录模块
[需求分析]
该模块的功能是可以实现记录某时间段某个驾驶员的交通处罚单数目及交通处罚单号码。
[记录模块流程图]
输入需要记录的时间段和驾驶员姓名
打开文献
依次查找是否有符合记录规定的处罚单信息
输出处罚单号
输出“找不到记录罚单信息”
记录找到的处罚单条数
关闭文献
选择浏览还是返回主菜单
3、公共函数
一个任务结束时是选择浏览还是返回的函数:
[一个任务结束时是选择浏览还是返回的函数的流程图]
开始选择
What do you want to do?
调用浏览函数
调用主界面函数
[一个任务结束时是选择浏览还是返回的函数的程序]
void printf_back() /*一个任务结束时是选择浏览还是返回主界面*/
{
void liulan();
int w;
printf("\nWhat do you want to do?\n\n\t(1).浏览\t(2).返回主界面 [ ]\b\b");
scanf("%d",&w);
if(w==1)
liulan();
else
menu();
}
三、程序代码(源程序清单,规定给出必要的说明与注释,此模块内容请打印)
(1)主菜单函数
(2)输入处罚信息
(3)按司机姓名查找并浏览相关处罚信息模块
(4)按交通警察姓名查找并浏览相关信息模块
(5)按车牌号码查询并浏览相关信息模块
(6)删除处罚单模块
(7)数据记录模块
程序代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
struct Plist //处罚单
{
char vno[20]; //车牌号
char dname[20]; //驾驶员姓名
char pname[20]; //交警姓名
char pno[20]; //交警编号
char no[20]; //处罚单编号
char date[20]; //处罚日期
} list[N]; //处罚单数组
void input(); //输入模块
void dele(); //删除模块
void browse(); //浏览模块
void search(); //查询模块
void count(); //记录模块
void menu(); //主菜单
void vno_search(); //按车牌号查询
void dna_search(); //按驾驶员姓名查询
void pna_search(); //按开单交警姓名查询
main()
{
menu();
getchar();
}
void menu()
{
int n;
int r;
do
{
system("cls");
printf("\n\t\t\t\t交通处罚单管理系统\n");
printf("????????????????????????????????????????");
printf(" 菜单: 1-信息录入 2-信息删除 3-信息浏览 4-信息查询 5-信息记录 6-退出系统\n");
printf("????????????????????????????????????????");
printf("请从输入数字选择相应的功能:");
scanf("%d", &n);
if(n < 1 || n > 6)
{
r = 1;
getchar();
}
else r = 0;
}
while(r == 1);
switch(n)
{
case 1:
input();
break;
case 2:
dele();
break;
case 3:
browse();
break;
case 4:
search();
break;
case 5:
count();
break;
case 6:
exit(0);
}
}
void input()
{
FILE *fp;
int num;
int i, j;
if((fp = fopen("list.txt", "r+")) == NULL)
{
if((fp = fopen("list.txt", "w")) == NULL)
{
printf("文献打开或创建失败!\n");
printf("\npress enter to return menu\n");
getchar();
menu();
}
printf("\n请输入处罚单数量:");
scanf("%d", &i);
printf("\n\n");
for(j = 0; j < i; j++)
{
printf("输入第%d张处罚单的:\n", j + 1);
printf("\n 车牌号、驾驶员姓名、交警姓名、交警号、处罚单号、日期(如20231112)\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 < i; 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("\npress enter to return menu\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("\npress enter to return menu\n");
getchar();
getchar();
menu();
}
printf("\n");
for(j = 0; j < i; j++)
{
printf("输入第%d张处罚单的:\n", j + 1);
printf("\n车牌号、驾驶员姓名、交警姓名、交警号、处罚单号、日期(如20231112)\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 < i; 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("\npress enter to return menu\n");
getchar();
getchar();
menu();
}
void dele()
{
int j;
int num;
int f = -1;
FILE *fp1, *fp2;
char s1[20];
if((fp1 = fopen("list.txt", "r")) == NULL)
{
printf("can not open file\n");
printf("\npress enter to return menu\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 < num; j++)
{
if(strcmp(s1, list[j].no) == 0)
{
f = j;
if(f < num - 1)
{
for(j = f; j < num - 1; 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("\npress enter to return menu\n");
getchar();
menu();
}
for(j = 0; j < num - 1; 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("\npress enter to return menu\n");
getchar();
getchar();
menu();
}
}
if(f < 0)
{
printf("\n没有找到该学号的记录:\n");
printf("\npress enter to return menu\n");
getchar();
getchar();
menu();
}
}
void browse()
{
int j;
int num;
FILE *fp;
if((fp = fopen("list.txt", "r")) == NULL)
{
printf("can not open file\n");
printf("\npress enter to return menu\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 < num; 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("\npress enter to return menu\n");
getchar();
getchar();
menu();
}
void search()
{
int n;
int r;
do
{
system("cls");
printf("\n请选择查询类型:\n\t1-按车牌号 2-按驾驶员姓名3:按开单交警姓名 4-返回主菜单\n");
printf("\n请输入数字选择:");
scanf("%d", &n);
if(n < 1 || n > 4)
展开阅读全文