南京航空航天大学
——C语言课程设计报告——
课程名称:交通处罚单管理系统 姓名: 班级: 学号:
1
2014年4月
一.题目要求
用结构体数组结构实现简单的交通处罚单管理功能,要求具有如下功能: (1)可以输入、删除、显示、修改某个驾驶员的交通处罚单信息; (2)可以按驾驶员查询交通处罚单。
程序执行过程为:循环显示主菜单,用户在Give you Choice:处输入选项,即按照功能列表输入0~8中的任意一个数字,按回车后即执行相应的功能。 各项菜单功能如下:
1. Input Records(输入若干条记录)
从键盘一次输入一张交通处罚单的信息,依次存放到结构体数组中,插入一条记录后,显示提示信息:确认是否输入下一条记录,如确认,继续输入,否则,退出输入功能。 2. Display All Records(显示所有记录)
按顺序显示所有记录,每屏显示10条记录,每显示10条,按
输入待删除记录的姓名,显示提示信息,让用户再次确认是否要删除,确认后,将该姓名的记录删除。 4. Sort(排序)
以姓名为序升序排列数组。
5. Insert a Record(插入一条记录)
在以姓名为序排列的数组中插入一条记录,插入后,数组仍有序。输出插入成功的信息。 6. Query(查找并显示一个记录)
输入驾驶员姓名,查找包含该驾驶员名字的记录,并显示该驾驶员的所有罚单信息。 7. Add Records from a Text File(从文件中添加数据到结构体数组中)
用户可提前建立一个文件data.txt。存放多个待加入的记录,提示输入文件的文件名,然后从该文件中一次性加入多条处罚单记录。 8. Write to a Text File
将数组中的全部记录写入文件records.txt。
二.题目分析、心得体会
先建立主菜单,程序执行时,循环显示。让用户在Give your choice:处输入选项,按回车后,即按列表执行相应功能。然后,分别写出具有相应功能的函数。
通过课程设计,发现了很多平时学习过程中没有遇到的问题。在细节方面,做导入模块的时候竟然忘记放入data.txt文件,结果数据一直导不出来,后来导出模块的时候,又因为格式与课程要求不符调试了很多次才成功。在态度方面,一开始因为写出的程序存在很多问题,心情比较焦躁,一度无法进行下去,后来参考了一些网上的资料,把书又翻了一遍,也咨询了别人,最后调试成功。
简言之,在做C语言时要仔细,注重细节。另外,在做课程设计的时候我认识到要多与他人交流,要多问,要多想多探讨,只有这样才能让自己不断前进。
三.程序设计 总体设计
根据题目要求,将系统设计分为9个模块:输入模块、显示模块、删除模块、排序模块、插入模块、查找模块、导入模块、导出模块。
交处单理统 通罚管系输入模块 显示模块 删除模块 排序模块 插入模块 查找模块 导入模块 导出模块
详细设计
#include
int m=10;
/*------------------结构体定义------------------------*/ //定义结构体,取名为Traffic typedef struct { 2
char driver[10]; /*司机姓名 int car;
*/ */
/*驾驶的车牌号
char police[10]; /*开罚单的交警姓名 */ int num; int year; int date;
/*罚单编号
*/ */ */ */
/*开罚单的年 /*开罚单的月 /*开罚单的日
int month;
}Traffic;
(1)输入模块
该模块的功能是为用户提供信息输入界面,用户可以根据信息提示进行信息输入,用户输入的信息将被保存在文件当中。 代码:
/************************************************/ /*功能:输入数据 */ /************************************************/ Traffic *Input(Traffic *trafdynlist,int *j) { char s[5]; Traffic *p=trafdynlist+(*j); for(;;) { //显示当前已有记录数 printf(\ //输入车主姓名 printf(\ scanf(\ //输入车牌号 printf(\ scanf(\ //输入警察姓名 printf(\ scanf(\ //输入罚单号 printf(\
3
scanf(\
//输入罚单年 printf(\ scanf(\ //输入罚单月 printf(\ scanf(\ //输入罚单日 printf(\ scanf(\ *j = *j+1; //记录超过10条时,重新申请存储空间 if(*j >= m) { trafdynlist=flexible_array(trafdynlist,&m),p=trafdynlist+m-1; } //是否继续输入 printf(\ scanf(\ if((!strcmp(\ { break; } p++; } //返回处罚单列表的指针 return trafdynlist; }
(2)输出模块
该模块的功能是按顺序显示所有记录,每屏显示10条记录,每显示10条,按
代码:
/************************************************/ /*功能:输出数据 */
/*显示出所有姓名成绩,每10个暂停一下,n为数组元素个数*/ /************************************************/ void Display(Traffic traflist[],int n) { Traffic *p=traflist; int i,j=0; for(i=1;i<=n;i++) { printf(\·\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ //记录超过10条时,清屏 if(i==0) { system(\ } p++; } }
(3)删除模块
该模块的功能是按姓名删除相对应的记录。
代码:
/************************************************/ /*功能:删除记录 */ /*删除姓名为name的记录,返回数组中的记录数 */ /************************************************/
int Delete(Traffic traflist[],int n,char *name) { Traffic *p=traflist,*p1=traflist+1; int i,j; for(i=1;i<=n;i++) { //如果找到需要删除的项,将之后的项都向前一个位置 if(strcmp(p->driver,name)==0) { for(j=i+1;j<=n;j++) { *p=*p1,p++,p1++; } } else { } } n--; //返回记录数 return n; }
/************************************************/ /*功能:删除记录 */ /*输入待删除姓名,经确认后调用Delete函数删除记录*/ /************************************************/ int Delete_a_record(Traffic traflist[],int n) { char s[10],s1[5]; int l; printf(\ scanf(\ for(;;) { printf(\
4
scanf(\ if(!strcmp(s1,\ { //调用Delete函数 l=Delete(traflist,n,s); if(l==n) { printf(\ return l; } else { printf(\ return l; } break; } else { printf(\ } scanf(\ } }
(4)排序模块
该模块的功能是以姓名为序升序排列数组。
代码:
/************************************************/ /*功能:按姓名升序排序 */ /************************************************/ void Sort_by_name(Traffic traflist[],int n) { int i,j; Traffic t; Traffic *l,*p=traflist;
for(i=1,p=traflist;p l=p; for(j=1;j<=n-i;j++) if(strcmp(strlwr(l->driver),strlwr((p+j)->driver))>0) { l=p+j; } else { } if(p!=l) { t=*l,*l=*p,*p=t; } else { } } } (5)插入模块 该模块的功能是以姓名为序排列的数组中插入一条记录,插入后,数组仍有序。 代码: /************************************************/ /*功能:有序插入 */ /*按姓名插入记录,返回记录个数 */ /************************************************/ Traffic *Insert(Traffic *trafdynlist,int *j,Traffic *s) { //读出记录数 int n=*j; Traffic *p=trafdynlist,*p1; if(n>=m) { //超过10条时,申请新空间 trafdynlist=flexible_array(trafdynlist,&m); } 5