计算机程序编程课程设计报告.doc_第1页
计算机程序编程课程设计报告.doc_第2页
计算机程序编程课程设计报告.doc_第3页
计算机程序编程课程设计报告.doc_第4页
计算机程序编程课程设计报告.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机程序编程课程设计实验报告实验一 车辆违章管理系统(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 *next;lnode;数据域定义如下:typedef struct Pechar vno8;/*车牌号*/char name15; /*车主姓名*/int times1;/*违章停车次数*/int times2;/*闯红灯次数*/int times3;/*超速次数*/PECCANCY;用法说明:本程序使用结构体数据类型数组编程,首先申明结构体,数组上限为500个数据。基于车牌号查询每台车辆的违章情况及罚款总金额车辆及违章信息的录入(数组循环输入)三程序结构(画流程图) 开始车辆及违章信息的录入。(循环体1继续输入0输入停止)基于车牌号查询每台车辆的违章情况。基于车牌号统计每台车辆的罚款总金额。(循环体输入车牌号查找,如果没有该信息则输出查无此人,如果有则输出相关信息及罚款总金额。)4 各模块的功能 1.录入车辆及违章信息 建立数组,通过循环体为数组中每一组数据赋值。1继续赋值,0输入停止。 2.输入车牌号查询其违章情况及罚款金额 输入需要查询的车牌号,通过循环体将该车牌号与数组中的数据做比较,直到一组数据中的车牌号与所查找的车牌号相同,输出该车牌号所相关的信息及违章情况并计算出罚款总金额后输出。若在数组中无此车牌号,则输出“未找到符合条件的车辆”,并结束。5 实验结果(包括输入数据和输出结果)输入数据: 输出结果: 6 体会通过本次编程,复习了C语言的结构体和数组知识,并对结构体和数组做了巩固和提高,为下一个编程使用结构体和链表打下基础。通过这个简单程序的编译,我认为最大的收获是培养了编程的思想以及对程序如何编译如何简化的粗浅感受。其实所有大程序都是由许多小程序相互串联形成的,只有把每个小程序编好大程序才能手到擒来。编成功后进一步巩固C语言的学习,主要目的是培养一定的综合编程能力。对于编译错误,灵活使用注释,一点点确定出问题的代码,结合基本知识,改正。对于运行有错:学习使用调试工具,灵活设置断点,并在断点处观察变量值,逐步分析确定错误代码,改正。七附录:程序清单#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; PECCANCY a500;printf(请输入车辆信息:n);for(i=0;i500;i+)printf(请输入车牌号:n);scanf(%s,ai.vno); printf(请输入车主姓名:n);scanf(%s,); 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);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,);printf(违章停车次数:);printf(%dn,ai.times1);printf(闯红灯次数:);printf(%dn,ai.times2);printf(超速次数:);printf(%dn,ai.times3);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.统计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 BirthDay; /*出生日*/float score4; /*成绩*/float sum; /*总分*/float average; /*平均分*/student;用法同实验一相同。三、各模块的功能1. 输入数据同实验一中的输入数据部分。2.显示数据同实验一中的显示数据部分。3.插入记录先进行排序,再从头查找,当要插入的数据在两个节点中间时,将输入的数据插入其中。1. 删除记录输入要删除的数据中的姓名,从头节点开始向后查找,如果姓名相同显示该数据,询问是否删除,如果选是,删除该节点;如果选否,取消删除。5查找记录输入要删除的数据中的姓或名,从头节点开始向后查找,如果符合,显示该数据。6. 保存到文件输入文件名,将当前的全部数据输出到该文件中保存。7. 从文件读取输入文件名,从该文件中导入数据。8. 统计进行各种数据的统计。9. 按班级查询成绩输入班级号,显示该班所有同学的成绩。0退出四、实验结果菜单: 按下回车键 1.插入记录 2. 显示记录3. 插入记录 4. 删除记录5.查找记录6. 保存到文件7. 从文件读取8. 统计学生成绩 输入1输入2 例如:输入1 例如:输入5输入39.按班级查询成绩五、体会这次的课程设计,在实验一的基础上,熟悉了对文件的操作。从结果上来看,虽然要求的功能全都实现了,但程序代码不精简,很多模块运行效率很低,但是功能可以正常运行。这次试验除了掌握各种语法现象外,我们还要设身处地从计算机的思维角度看待和处理问题等等。这一点要远比掌握各种语法重要的多,也更加难以培养。同时经过这次的编程,对C语言的理解及认识有了深一步的了解。我以后要更加努力地学习编程,因为不仅编程很有意思,能激发我的兴趣,更重要的是,它是一个取之不尽用之不竭的宝库,对我将来的生活,工作有很大作用。以后我还要学习更高深的汇编语言,所以我要先好好学习C语言,为我以后的学习打下良好的基础。通过这学期我还发现,有时候对于编程,知识并不是最主要的,最主要的是思维,对于所要编程的东西的想法,构思。但我也知道这并不是一蹴而就就能练成的,所以我会努力!七附录:程序清单#include#include#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;typedef struct linknode /节点定义,DT1是数据域,NEXT是指针student dt1;struct linknode *next;Stu;int ll_cnt;/计录节点个数int empty_ll(Stu *head)/判断是否为空if(head=NULL)return 1;elsereturn 0;/*输出用*void printdt(student pr) /*用来输出数据的函数*/ printf(学号:%s ,pr.IDNumber);printf(姓名:%s %s ,pr.FamilyName,pr.GivenName);if(pr.sex=0)printf(性别:女 );elseprintf(性别:男 );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_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);printf(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比较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(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=P1p1=head-next;while(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=P1p1=head-next;while(p1!=NULL) if(p1-dt1.scoreihead-dt1.scorei)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=P1p1=head-next;while(p1!=NULL)if(strcmp(p1-dt1.IDNumber,head-dt1.IDNumber)next;head=head-next;printf(排序完成n);/*输入数据用*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)/说明输入的是0return dt; i=1;for(m=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)/说明输入的是0return dt;i=1;for(m=0;m=0)&(dt.IDNumberm=9)&i;printf(n);/-姓名-printf(请输入姓名,格式为(姓 名):);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.FamilyNamem=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.BirthMonth,&dt.BirthDay);if(y-dt.BirthYear)70)/接受错误输入的解决方法while(y-dt.BirthYear)70)printf(n输入有误,请重新输入(学生年龄范围应在10,70周岁):n);printf(请输入出生年月日,格式为(年 月 日));scanf(%d %d %d,&dt.BirthYear,&dt.BirthMonth,&dt.BirthDay);/-成绩-printf(请输入四门课程的成绩nn);printf(外语:);scanf(%f,&dt.score0);if(dt.score0100)/菜单接受错误输入的解决方法while(dt.score0100)printf(n输入有误,请重新输入(成绩范围应在0,100)nn);scanf(%f,&dt.score0);printf(高数:);scanf(%f,&dt.score1);printf(C语言:);scanf(%f,&dt.score2);printf(马哲:);scanf(%f,&dt.score3);dt.sum=dt.score0+dt.score1+dt.score2+dt.score3;dt.average=dt.sum/4;return dt;/*1111111111111111111111111111*Stu *create_ll() /*头插法建表*/Stu *head,*p1;head=NULL;ll_cnt=0;/*创建的结点个数*/while(1) p1=(Stu *)malloc(sizeof(Stu);printf(n请输入第%d个学生的数据:(输入0 终止录入)n,ll_cnt+1); p1-dt1=scandt();if(p1-dt1.IDNumber0=0)&(p1-dt1.IDNumber1=0) /*这里判断是否为0*/free(p1);break;else ll_cnt+;p1-next=head;head=p1;printf(n数据录入完毕,共录入了%d个学生的数据nn,ll_cnt);return head;/*2222222222222222222222*voidprint_ll(Stu*head) /*输出链表用的函数*/ Stu *p1;int m1=1;p1=head;if(empty_ll(p1)printf(没有数据n);return;else while(p1!=NULL)printf(%d. ,m1);printdt(p1-dt1);printf(n);p1=p1-next;m1+;/*333333333333333333333*Stu *insert_id(Stu *head)/用于按学号插入数据Stu *p1,*p2;student dti;/接受输入用int ist_cnt=0;/插入总数printf(先进行排序.n);sort_ll_id(head);print_ll(head);while(1)printf(n请输入要插入的数据:(输入0 终止录入)n);dti=scandt();if(dti.IDNumber0=0)&(dti.IDNumber1=0)return head;elseif(strcmp(dti.IDNumber,head-dt1.IDNumber)dt1=dti;p1-next=head;head=p1;ist_cnt+;printf(n已成功插入%d个数据nn,ist_cnt);else/比头节点大,继续向后比较p2=head;/每次与P2的下一个节点比较while(p2-next!=NULL)if(strcmp(dti.IDNumber,p2-next-dt1.IDNumber)next=p2-next;p1-dt1=dti;p2-next=p1;ist_cnt+;printf(n已成功插入%d个数据nn,ist_cnt);break;p2=p2-next;if(p2-next=NULL)/P2已经是最后一个节点,而且数据应插在P2之后p1=(Stu *)malloc(sizeof(Stu);p1-next=NULL;/这是最后一个节点p1-dt1=dti;p2-next=p1;Stu *insert_ll(Stu *head)/在头部插入数据char menu_num;/接受菜单数 y or nint ist_cnt;/记录插入个数Stu *p1;/追加用if(empty_ll(head)/如果链表空的话printf(没有数据n想要创建新记录吗?(y/n)nn);fflush(stdin);scanf(%c,&menu_num);if(menu_num!=y)&(menu_num!=Y)&(menu_num!=n)&(menu_num!=N)/菜单接受错误输入的解决方法while(menu_num!=y)&(menu_num!=Y)&(menu_num!=n)&(menu_num!=N) printf(n输入有误,请重新输入nn);scanf(%c,&menu_num);switch(menu_num)case y:case Y:head=create_ll();return head;case n:case N:return head;/链表不空时while(1)printf(nInsert record to list 插入记录nnn);printf(1.追加n);printf(2.按学号插入n);printf(0.退出nn);printf(n);scanf(%d,&menu_num);switch(menu_num)case 1:ist_cnt=0;while(1)p1=(Stu *)malloc(sizeof(Stu);printf(n请输入要插入的数据:(输入0 终止录入)n);p1-dt1=scandt();if(p1-dt1.IDNumber0=0)&(p1-dt1.IDNumber1=0)/这里判断是否为0free(p1);break;elseist_cnt+;printf(n已成功插入%d个数据nn,ist_cnt);p1-next=head;head=p1;break;case 2:head=insert_id(head);break;case 0:return head;system(pause);/按任意键继续system(cls);/*444444444444444444444*Stu *delete_ll(Stu *head) /删除节点用的函数char c,xing16,ming16;Stu *p1,*p2;p1=head;if(empty_ll(head) /如果链表空的话printf(没有数据n);return head;elsep2=NULL; /标记为NULL,用于下面判断是否要删头节点printf(请输入要删除学生的姓名,格式为(姓 名):);scanf(%s %s,xing,ming); getchar(); /接受上一个SCANF的回车while(p1!=NULL)/满足时要进行删除,要删除的是P1指向的节点/if(!(strcmp(p1-dt1.FamilyName,xing)|(strcmp(p1-dt1.GivenName,ming)printf(n找到了要删除的数据n);while(1)printdt(p1-dt1); /输出该节点的数据并确认是否删除printf(n确认要删除吗?(Y/N)n); scanf(%c,&c);switch(c)case y: /选择了YES/case Y:if(p2=NULL) /p2若为NULL,说明要删除的是头节点/p2=p1;p1=p1-next;free(p2);printf(数据已删除n);return p1;else /要删除的不是头节点,此时P2指向前一个节点/p2-next=p1-next; /把下一个节点的地址赋给前一个P2的NEXT域,完成脱节的过程free(p1);printf(数据已删除n);return head;case n: /选择了NO/case N:printf(取消删除n); return head;default: break;printf(输入有误,请重新确认n);else/不是要删除的节点/p2=p1;p1=p1-next;printf(n不存在该数据n);return head;/*555555555555555555*void find_ll(Stu *head) /查找int cnt=0;char xing16;/存姓或名用Stu *p1;p1=head;if(empty_ll(p1)/如果链表空的话printf(没有数据n);return;elseprintf(请输入姓或名:);scanf(%s,xing); fflush(stdin);/接受上一个SCANF的回车system(cls);/清屏while(p1!=NULL)/满足时输出,要输出的是P1指向的节点/if(strcmp(p1-dt1.FamilyName,xing)=0|strcmp(p1-dt1.GivenName,xing)=0)cnt+; /找到要查找的人printf(n%d.n,cnt);printdt(p1-dt1);p1=p1-next;if(cnt=0)printf(没找到这个人);printf(n查找完毕nn);/*66666666666666666666*void fout_ll(Stu *head) /输出至某一文件/FILE *fp;char c;/y or nchar filenameMAXFL;if(empty_ll(head) /如果链表空的话printf(没有数据n);return;while(1)printf(导出至哪个文件?(输入0退出));scanf(%s,filename);if(strcmp(filename,0)=0)return;if(fp=fopen(filename,r)!=NULL)/存在同名文件printf(存在同名文件,是否覆盖?(y/n);fflush(stdin);scanf(%c,&c);if(!(c=y)|(c=n)|(c=Y)|(c=N)/菜单接受错误输入的解决方法while(!(c=y)|(c=n)|(c=Y)|(c=N)printf(n输入有误,请重新输入nn);scanf(%c,&c);if(c=y|c=Y)break;else/没有同名文件break;if(fp=fopen(filename,w)=NULL)printf(file open error.);return;while(head!=NULL)fprintf(fp,%s,%s,%s,head-dt1.IDNumber,head-dt1.FamilyName,head-dt1.GivenName);fprintf(fp,%d,%d,head-dt1.sex,head-dt1.Birt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论