2011年度高级语言课程设计期末大作业
《题目》
院 系: 工学院机械系
专 业: 机械工程及自动化 年 级: 10 级 学生姓名: 学 号: 指导教师:
题 号:
2011年6月
一、题目(课程设计题库第X题)
【说明及要求】
实现交通罚款信息(车辆牌号、驾驶证号、交警代号、违章时间、罚款金额、缴费状态) 的登记、删除、修改功能,并能分别按车辆牌号、驾驶证号、交警代号查询交通罚款信息。 【提示】
(1)定义结构体表示罚款信息; (2)用文件实现罚款信息存储;
(3)分别编写函数实现罚款信息登记、修改、删除以及按车辆牌号、驾驶证号、交警代号 查询交通罚款信息。
(4)在 main 函数中调用上述函数进行演示。
二、问题分析
(一)需求分析
1.交通处罚单信息用文件储存,提供文件的输入输出操作; 2.要求可以输入、删除、浏览交通处罚单信息,因而要提供信息的输入、删除和显示操作;
3.要车辆、驾驶员和开单交警查询,则要提供查找操作; 4.另外提供系统操作和键盘式选择菜单以实现功能选择。
(二)该问题可以分为以下几个模块
三、程序流程图
【信息输入模块】
【删除罚单模块】
【信息查询模块】
【信息查询模块】
四、程序代码
#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 车牌号、驾驶员姓名、交警姓名、交警号、处罚单号、日期(如20110601)\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车牌号、驾驶员姓名、交警姓名、交警号、处罚单号、日期(如20110601)\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) { r=1; getchar(); }
else r=0; }while(r==1); switch(n) {
case 1:vno_search();break; case 2:dna_search();break; case 3:pna_search();break; case 4:menu(); } }
void vno_search() {
int f=-1; int num; int j;
char no[20]; FILE*fp;
if((fp=fopen("list.txt","r"))==NULL) {
printf("文件打不开!\n"); printf("\npress enter to return menu\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<num;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("\npress enter to return sub menu\n"); getchar(); getchar(); search(); }
void dna_search() {
int f=-1; int num; int j;
char name[20]; FILE*fp;
if((fp=fopen("list.txt","r"))==NULL) {
printf("文件打不开!\n"); printf("\npress enter to return menu\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<num;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("\npress enter to return sub menu\n"); getchar(); getchar(); search(); }
void pna_search() {
int f=-1; int num; int j;
char name[20]; FILE*fp;
if((fp=fopen("list.txt","r"))==NULL) {
printf("文件打不开!\n"); printf("\npress enter to return menu\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<num;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("\npress enter to return sub menu\n"); getchar(); getchar(); search(); }
void count() {
int f=-1;
int num; //所有罚单单数 int j;
int total=0; //某驾驶员的罚单数 char name[20]; char time1[20]; char time2[20]; FILE*fp;
if((fp=fopen("list.txt","r"))==NULL) {
printf("文件打不开!\n"); printf("\npress enter to return menu\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<num;j++) {
if((strcmp(list[j].date,time1)>=0)&&(strcmp(list[j].date,time2)<=0)) {