1、计算机程序编程课程设计报告计算机程序编程课程设计实验报告实验一 车辆违章管理系统(2-6页)实验二 学生成绩管理系统(7-37页) 学号:52112333班级:11级23班 姓名:王晓宇 2013年8月31日实验一 车辆违章管理系统一.系统功能模块结构图1.车辆及违章信息的录入。2.基于车牌号查询每台车辆的违章情况。3.基于车牌号统计每台车辆的罚款总金额。主函数3.查找、修改数据2.显示输出1.创建数据二、数据结构设计及用法说明用链表存储数据:typedef struct linknode /*结点定义,DT1是数据域,NEXT是指针*/ data1 dt1; struct linknode
2、*next;lnode;数据域定义如下:typedef struct Pe char vno8; /*车牌号*/ char name15; /*车主姓名*/ int times1; /*违章停车次数*/ int times2; /*闯红灯次数*/ int times3; /*超速次数*/PECCANCY;用法说明:本程序使用结构体数据类型数组编程,首先申明结构体,数组上限为500个数据。三程序结构(画流程图)4各模块的功能 1.录入车辆及违章信息 建立数组,通过循环体为数组中每一组数据赋值。1继续赋值,0输入停止。 2.输入车牌号查询其违章情况及罚款金额 输入需要查询的车牌号,通过循环体将该车
3、牌号与数组中的数据做比较,直到一组数据中的车牌号与所查找的车牌号相同,输出该车牌号所相关的信息及违章情况并计算出罚款总金额后输出。若在数组中无此车牌号,则输出“未找到符合条件的车辆”,并结束。5实验结果(包括输入数据和输出结果)输入数据: 输出结果: 6体会通过本次编程,复习了C语言的结构体和数组知识,并对结构体和数组做了巩固和提高,为下一个编程使用结构体和链表打下基础。通过这个简单程序的编译,我认为最大的收获是培养了编程的思想以及对程序如何编译如何简化的粗浅感受。其实所有大程序都是由许多小程序相互串联形成的,只有把每个小程序编好大程序才能手到擒来。编成功后进一步巩固C语言的学习,主要目的是培
4、养一定的综合编程能力。对于编译错误,灵活使用注释,一点点确定出问题的代码,结合基本知识,改正。对于运行有错:学习使用调试工具,灵活设置断点,并在断点处观察变量值,逐步分析确定错误代码,改正。七附录:程序清单#include#includetypedef struct Pe char vno8; /*车牌号*/ char name15; /*车主姓名*/ int times1; /*违章停车次数*/ int times2; /*闯红灯次数*/ int times3; /*超速次数*/ PECCANCY;void main() int d=0,sum=0; int i,b,c,f; char e8
5、; PECCANCY a500; printf(请输入车辆信息:n); for(i=0;i500;i+) printf(请输入车牌号:n); scanf(%s,ai.vno); printf(请输入车主姓名:n); scanf(%s,ai.name); printf(请输入违章停车次数:n); scanf(%d,&ai.times1); printf(请输入闯红灯次数:n); scanf(%d,&ai.times2); printf(请输入超速次数:n); scanf(%d,&ai.times3); printf(请输入1继续输入车辆信息,输入0结束输入车辆信息n); scanf(%d,&b)
6、; if(b=0) break; printf(nnn); printf(请输入车牌号查询其违章情况及罚款金额:n); for(c=0;c500;c+) printf(输入车牌号:n); scanf(%s,e); for(i=0;i500;i+) if(strcmp(e,ai.vno)=0) printf(车主姓名:); printf(%sn,ai.name); printf(违章停车次数:); printf(%dn,ai.times1); printf(闯红灯次数:); printf(%dn,ai.times2); printf(超速次数:); printf(%dn,ai.times3);
7、sum=(ai.times1)*100+(ai.times2*200)+(ai.times3)*500; printf(车牌号为:); printf(%s,e); printf(的罚款总金额:); printf(%dn,sum); d=1; break; if(d!=1) printf(未找到符合条件的车辆n); printf(请输入1继续输入车辆信息,输入0结束输入车辆信息n); scanf(%d,&f); if(f=0) break; printf(nnn); 实验二 学生成绩管理系统一、系统功能模块结构图1.创建数据2.显示输出3.插入记录4.删除记录主函数5.查找记录6.文件输出7.文
8、件输入8.统计9.按班输出二、数据结构设计及用法说明用链表存储数据:typedef struct linknode /*结点定义,DT1是数据域,NEXT是指针*/ student dt1; struct linknode *next;Stu;数据域定义如下:typedef struct St1 char IDNumber16;/*学号*/ char FamilyName16; /*姓*/ char GivenName16; /*名*/ int sex; /*性别(0代表女,1代表男)*/ int BirthYear; /*出生年*/ int BirthMonth; /*出生月*/ int B
9、irthDay; /*出生日*/ float score4; /*成绩*/ float sum; /*总分*/ float average; /*平均分*/student;用法同实验一相同。三、各模块的功能1. 输入数据同实验一中的输入数据部分。2.显示数据同实验一中的显示数据部分。3.插入记录先进行排序,再从头查找,当要插入的数据在两个节点中间时,将输入的数据插入其中。1. 删除记录输入要删除的数据中的姓名,从头节点开始向后查找,如果姓名相同显示该数据,询问是否删除,如果选是,删除该节点;如果选否,取消删除。5查找记录 输入要删除的数据中的姓或名,从头节点开始向后查找,如果符合,显示该数据。
10、6. 保存到文件输入文件名,将当前的全部数据输出到该文件中保存。7. 从文件读取 输入文件名,从该文件中导入数据。8. 统计进行各种数据的统计。9. 按班级查询成绩输入班级号,显示该班所有同学的成绩。0退出四、实验结果菜单: 按下回车键 1.插入记录 2.显示记录3.插入记录 4.删除记录5.查找记录6.保存到文件7.从文件读取8.统计学生成绩 输入1输入2 例如:输入1 例如:输入5输入39.按班级查询成绩五、体会这次的课程设计,在实验一的基础上,熟悉了对文件的操作。从结果上来看,虽然要求的功能全都实现了,但程序代码不精简,很多模块运行效率很低,但是功能可以正常运行。这次试验除了掌握各种语法
11、现象外,我们还要设身处地从计算机的思维角度看待和处理问题等等。这一点要远比掌握各种语法重要的多,也更加难以培养。同时经过这次的编程,对C语言的理解及认识有了深一步的了解。我以后要更加努力地学习编程,因为不仅编程很有意思,能激发我的兴趣,更重要的是,它是一个取之不尽用之不竭的宝库,对我将来的生活,工作有很大作用。以后我还要学习更高深的汇编语言,所以我要先好好学习C语言,为我以后的学习打下良好的基础。通过这学期我还发现,有时候对于编程,知识并不是最主要的,最主要的是思维,对于所要编程的东西的想法,构思。但我也知道这并不是一蹴而就就能练成的,所以我会努力!七附录:程序清单#include#inclu
12、de#include#include#include#define MAXFL 20typedef struct St1 char IDNumber16;/*学号*/ char FamilyName16; /*姓*/ char GivenName16; /*名*/ int sex; /*性别(0代表女,1代表男)*/ int BirthYear; /*出生年*/ int BirthMonth; /*出生月*/ int BirthDay; /*出生日*/ float score4; /*成绩*/ float sum; /*总分*/ float average; /*平均分*/student;ty
13、pedef struct linknode /节点定义,DT1是数据域,NEXT是指针 student dt1; struct linknode *next;Stu;int ll_cnt; /计录节点个数int empty_ll(Stu *head)/判断是否为空 if(head=NULL) return 1; else return 0;/*输出用*void printdt(student pr) /*用来输出数据的函数*/ printf(学号:%s ,pr.IDNumber); printf(姓名:%s %s ,pr.FamilyName,pr.GivenName); if(pr.sex=
14、0) printf(性别:女 ); else printf(性别:男 ); printf(“出生年月日:%d/%d/%dn,pr.BirthYear,pr.BirthMonth,pr.BirthDay); printf(各科成绩:n); printf(外语:%f,高数:%f,C语言:%f,马哲:%fn,pr.score0,pr.score1,pr.score2,pr.score3); printf(总成绩:%f,平均成绩:%fn,pr.sum,pr.average);void print_ll_cj(Stu *head) Stu *p1; int m1=1; p1=head; if(empty
15、_ll(p1) printf(没有数据n); return; else while(p1!=NULL) printf(%dn,m1); printf(学号:%s ,p1-dt1.IDNumber); printf(姓名:%s %s ,p1-dt1.FamilyName,p1-dt1.GivenName); printf(各科成绩:n); printf(平均成绩:%fn,p1-dt1.average); printf(外语:%f,高数:%f,C语言:%f,马哲:%fn, p1-dt1.score0,p1-dt1.score1,p1-dt1.score2,p1-dt1.score3); print
16、f(n); p1=p1-next; m1+; /*排序用*Stu *insert_avr_new(Stu *head,Stu *p)/按成绩 将P 中的数据插入数据 Stu *p1,*p2; if(head=NULL) printf(空链表,无法进行插入n); return NULL; if(p-dt1.averagehead-dt1.average)/先与头节点比较,比头节点大 p-next=head; /新节点成为头节点 head=p; return head; else /比头节点小,继续向后比较 p1=head; /p1是P2的前一个节点 p2=p1-next; /准备每次与P2比较
17、while(p2!=NULL) if(p-dt1.averagep2-dt1.average) p-next=p2; p1-next=p; return head; p1=p2; /p1是P2的前一个节点 p2=p1-next; /在这里P2=NULL,数据应插在P1之后 p-next=p2; p1-next=p; return head; Stu *sort_avr_new(Stu *head) /先断开头节点,作为新的链表,再依次将后面的节点按大小插入到该表中 Stu *p1; p1=head-next;/P1指向头节点的下一个节点 head-next=NULL;/先断开头节点 while
18、(p1!=NULL) head=insert_avr_new(head,p1); p1=p1-next; return head;void exchng_ll(Stu *p1,Stu *p2)/互换节点数据域的函数 student dtc; dtc=p1-dt1; p1-dt1=p2-dt1; p2-dt1=dtc;void sort_ll_avr(Stu *head) /按平均成绩排序,按数据域从大到小排序,只交换数据域,无返回 Stu *p1; while(head-next!=NULL) /选择排序法,HEAD在后,P1在前 HEAD-NEXT=P1 p1=head-next; whil
19、e(p1!=NULL) if(p1-dt1.averagehead-dt1.average) exchng_ll(p1,head); p1=p1-next; head=head-next; printf(排序完成n);void sort_ll_score(Stu *head,int i) /按平均成绩排序,按数据域从大到小排序,只交换数据域,无返回 Stu *p1; while(head-next!=NULL) /选择排序法,HEAD在后,P1在前 HEAD-NEXT=P1 p1=head-next; while(p1!=NULL) if(p1-dt1.scoreihead-dt1.score
20、i) exchng_ll(p1,head); p1=p1-next; head=head-next; printf(排序完成n);void sort_ll_id(Stu *head) /按学号排序,按数据域从小到大排序,只交换数据域,无返回 Stu *p1; while(head-next!=NULL) /选择排序法,HEAD在后,P1在前 HEAD-NEXT=P1 p1=head-next; while(p1!=NULL) if(strcmp(p1-dt1.IDNumber,head-dt1.IDNumber)next; head=head-next; printf(排序完成n);/*输入数
21、据用*student scandt() /用来输入数据的函数,返回数据类型 student dt; /暂存输入的数据 unsigned int i,m; /判断用 /-判断时间用- struct tm* ptm; long ts; int y; ts = time(NULL); ptm = localtime(&ts); y = ptm- tm_year+1900; /年 /-学号- printf(请输入学号:); scanf(%s,dt.IDNumber); if(dt.IDNumber0=0)&(dt.IDNumber1=0) /说明输入的是0 return dt; i=1; for(m=
22、0;m=0)&(dt.IDNumberm=9)&i; /确认0-m 个数据 是否 均在 允许范围内 if(!(dt.IDNumber8=0)&i) /输入不合法 while(!(dt.IDNumber8=0)&i) printf(n输入有误nn); printf(请输入学号(八位数,如52102115):); scanf(%s,dt.IDNumber); if(dt.IDNumber0=0)&(dt.IDNumber1=0) /说明输入的是0 return dt; i=1; for(m=0;m=0)&(dt.IDNumberm=9)&i; printf(n); /-姓名- printf(请输入
23、姓名,格式为(姓 名):); scanf(%s %s,dt.FamilyName,dt.GivenName); i=0; for(m=1;m16;m+) /接受错误输入的解决方法 i=(dt.FamilyNamem=0)|i; /i=1,合法,i=0不合法 if(!i) /输入不合法 while(!i) printf(n输入有误,姓或名的长度不能超过15个字母nn); printf(请输入姓名,格式为(姓 名):); scanf(%s %s,dt.FamilyName,dt.GivenName); i=0; for(m=1;m16;m+) /接受错误输入的解决方法 i=(dt.FamilyNa
24、mem=0)|i;/i=1,合法,i=0不合法 i=0; for(m=1;m16;m+) /接受错误输入的解决方法 i=(dt.GivenNamem=0)|i;/i=1,合法,i=0不合法 if(!i) /输入不合法 while(!i) printf(n输入有误,姓或名的长度不能超过15个字母nn); printf(请输入姓名,格式为(姓 名):); scanf(%s %s,dt.FamilyName,dt.GivenName); i=0; for(m=1;m女,1-男):); scanf(%d,&dt.sex); if(!(dt.sex=0|dt.sex=1) /接受错误输入的解决方法 while(!(dt.sex=0|dt.sex=1) printf(n输入有误,请重新输入(0-女,1-男):n); scanf(%d,&dt.sex); /-出生年月日- printf(请输入出生年月日,格式为(年 月 日)); scanf(%d %d %d,&dt.BirthYear,&dt.B