数据结构课程设计报告之成绩分析与全国交通咨询模拟_第1页
数据结构课程设计报告之成绩分析与全国交通咨询模拟_第2页
数据结构课程设计报告之成绩分析与全国交通咨询模拟_第3页
数据结构课程设计报告之成绩分析与全国交通咨询模拟_第4页
数据结构课程设计报告之成绩分析与全国交通咨询模拟_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、数据结构课程设计报告1、 成绩分析问题2、 全国交通咨询模拟 学院(系): 计算机科学与工程学院 班 级: 11级36X班 学生姓名: XXX 学号1110306010X 指导教师: XXX 2012年12月17日 到2013年1月 4日一、课程设计概述:本次数据结构课程设计共完成两个题:成绩分析问题和全国交通咨询模拟。使用语言:C+编译环境:TC3.0 / VC6.0二、课程设计题目一实验内容成绩分析文档资料问题描述录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。需求分析1.通过键盘输入各学生的多门课程的成绩,建立相应的文件sc.txt2.对文件sc.txt中的数据进行处理,要求具有

2、如下功能:a.按各门课程的成绩排序,并生成相应的文件输出b.计算每人的平均成绩,按平均成绩排序,并生成文件c.求出各门课程的平均成绩、不及格人数、6069分人数、7079分人数、8089分人数、90分以上人数d.根据姓名或学号查询某人的各门课成绩,重名也要能处理3.界面美观概要设计-=ADT=-save(int n)/保存函数int load()/加载记录或可以计算记录个数的函数void printf_face()/显示一个记录的函数browse()/浏览(全部)模块函数void printf_back()/一个任务结束时的选择浏览还是返回的函数average(int i)/求平均值函数no_

3、input(int i,int n)/学号输入函数score_input(int i)/分数输入函数input(int i)/输入一个记录函数modify_data(int i,int n)/修改记录函数enter()/输入模块函数add()/追加模块函数modify()/修改模块函数del()/删除模块函数int h(char k)/ 查找模块函数insert()/插入模块函数void sift(RecNode r,int t,int w)/ 排序模块(按平均成绩) 函数void fenduantongji()/统计模块函数teacher()/教师界面函数st()/学生界面函数distin(

4、)/密码函数menu()/主界面函数 存储结构struct student/学生信息结构体char num11;/学号 char name20;/姓名 int score8;/成绩(英语 数学 C语言 管理学 信检 体育 近代史 线数) double ave;/平均分stuN;typedef struct node unsigned long int key; struct node * link;HNode;typedef structint key; /*排序码*/ float data;/*其他数据项*/RecNode; 流程图(1)程序设计组成框图学生成绩管理系统1. 输入新数据2.

5、添加学生数据3. 修改学生数据4. 删除学生数据5. 浏览全部学生数据6.按学号查询7.插入学生信息8. 按平均分排序9. 分段统计10.退出11. 返回主界面 (2)模块功能说明1 输入新数据:完成全部学生记录的输入。2 添加数据:添加新学生所有信息。3 增加功能:增加新学生的部分信息。 4 删除功能:删除学生信息。5浏览全部学生数据:输出所有学生信息。6学号查询:按学号查询学生信息。7插入学生信息:插入新学生信息。8按平均分排序:按平均分高低显示学生记录。9分段统计:查询各等次学生信息。 10 退出系统。11. 返回主界面。(3)程序流程图开始输入指令(111)输入新数据添加学生数据修改学

6、生数据删除学生数据浏览全部学生数据学号查询插入学生信息按平均分排序分段统计退出123456789100结束110详细设计 源程序清单(重要程序段和其重要变量的说明)#include<string.h>#include<stdio.h>#include<malloc.h>/*控制学生记录的容量*/#define N 40#define PR printf("nr%s %s %s %s %s %s %s %s %s %s %s ",stui.num,,stui.score0,stui.score1,stui.score2,s

7、tui.score3,stui.score4,stui.score5,stui.score6,stui.score7,stui.score8,stui.ave)struct studentchar num11; char name20; int score8; float ave;stuN;typedef struct node unsigned long int key; struct node * link;HNode;typedef structint key; /*排序码*/ float data;/*其他数据项*/RecNode;/*全新保存函数*/save(int n) /*保存函

8、数,保存n个记录*/FILE *fp; int i; if(fp=fopen("sc.txt","wb")=NULL) /*以输出打开方式,在此前的记录被覆盖*/ printf("n不能打开文件n"); getch();return NULL; for(i=0;i<n;i+) if(stui.ave!=0) /*stui.ave=0表此记录已删除*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("文件输入错误n"); fclose(f

9、p); return 0;/*加载记录或可以计算记录个数的函数*/int load() /*加载记录或可以计算记录个数的函数*/FILE *fp; int i; if(fp=fopen("sc.txt","rb")=NULL) /*以输出打开方式,在此前的记录被覆盖*/ printf("n不能打开文件n"); getch();return NULL; for(i=0;!feof(fp);i+) fread(&stui,sizeof(struct student),1,fp); fclose(fp); return(i-1);

10、/*返回记录个数*/void puts_() /*显出-函数*/puts("n-");/*显示数据结构项目函数*/void printf_face() /*显示数据结构项目*/printf("n 学号 姓名 英语 数学 C语言 管理学 信检 体育 近代史 线数 平均分n");/*显示一个记录的函数*/printf_one(int i) /*显示一个记录的函数*/int j; printf("%12s %-9s",stui.num,); for(j=0;j<8;j+) printf("%-6d"

11、;,stui.scorej); printf("%-7.2fn",stui.ave); return 0;teacher();/*浏览(全部)模块*/browse() /*浏览(全部)模块*/int i,n; n=load(); /*加载记录*/ system("cls"); puts_(); printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) if(i!=0)&&(i%10=0) /*目的是分屏显示*/ printf("nnPass any key to contiune .

12、. ."); getch(); puts("nn"); printf_one(i); /*调用显示一个记录的函数*/ puts_(); printf("tThere are %d record.n",n); printf("nPass any key to back . . ."); getch(); /*按任意健*/ teacher(); return 0;/*一个任务结束时的选择浏览还是返回的函数*/void printf_back() /*一个任务结束时的选择浏览还是返回*/int w; printf("nn

13、t-成功 -nn"); printf("请选择:nnt1).现在浏览全部t2).返回: bb"); scanf("%d",&w);system("cls"); if(w=1) browse(); else teacher();average(int i) /*对第i个记录的分数求平均值*/int j; int sum; for(sum=0,j=0;j<8;j+) sum+=stui.scorej; stui.ave=sum/8.0; return 0;/*学号输入函数*/no_input(int i,int n

14、) /*i表示第i个的学生信息,n表示比较到第n个学生*/int j,k,w1; do w1=0; printf("学号:"); scanf("%s",stui.num); for(j=0;stui.numj!='0'j+) /*学号输入函数,作了严格规定*/ if(stui.numj<'0'|stui.numj>'9') /*判断学号是否为数字*/ puts("Input error! Only be made up of (0-9).Please reinput!n");

15、 w1=1;break; if(w1!=1) for(k=0;k<n;k+) /*比较到第n个学生*/ /*排除第i个学生记录即你要修改的*/ if(k!=i&&strcmp(stuk.num,stui.num)=0) /*判断学号是否有雷同*/ puts("该记录已存在. 请重新输入!n"); w1=1;break; while(w1=1); return 0;/*对分数输入*/score_input(int i)int j;printf(" 1.英语 2.数学 3.C语言 4.管理学 5.信检 6.体育 7.近代史 8.线性代数n&quo

16、t;); for(j=0;j<8;j+) printf("score %d:",j+1); scanf("%d",&stui.scorej); return 0;/*输入一个记录函数*/input(int i) /*输入一个记录函数*/ no_input(i,i); /*调用学号输入函数*/ printf("姓名:"); scanf("%s",); score_input(i); /*调用分数输入函数*/ average(i); /*调用求平均值函数*/ return 0;/*修改记

17、录函数*/modify_data(int i,int n) /*修改数据函数,修改第i个记录*/int c,w1; do /*输入选择作个判断*/ puts("nmodify by =>nn 1).学号 2.姓名 3).英语 4).数学n 5).C语言 6).管理学 7).信检 8).体育 9).近代史n 10).线性代数 11).all score 12).all data 13).cancel and back"); printf("请选择: bb"); scanf("%d",&c);system("cls

18、"); if(c>13|c<1) puts("n选择错误! 重新选择!"); /*判断选择是否错误,若是则重新选择性*/ getchar(); /*当输入是字符时可以防止死循环*/ while(c>13|c<1); do switch(c) /*选择要修改的项目*/ case 1:no_input(i,n);break; /*调用学号输入函数*/ case 2:printf("姓名:");scanf("%s",);break; case 3:printf("英语:"

19、;);scanf("%d",&stui.score0);break; case 4:printf("数学:");scanf("%d",&stui.score1);break; case 5:printf("C语言:");scanf("%d",&stui.score2);break; case 6:printf("管理学:");scanf("%d",&stui.score3);break; case 7:printf(&quo

20、t;:信检");scanf("%d",&stui.score4);break; case 8:printf("体育:");scanf("%d",&stui.score5);break; case 9:printf("近代史:");scanf("%d",&stui.score6);break; case 10:printf("线性代数:");scanf("%d",&stui.score7);break; case 1

21、1:score_input(i);break; /*调用分数输入函数*/ case 12:input(i);break; /*调用输入整条学生记录*/ case 13:teacher(); /*直接返回教师介面*/ if(c>2&&c<10) average(i); /*调用求平均值函数*/ puts("nNow:n"); printf_face(); /*调用显示数据结构项目函数*/ printf_one(i); /*修改后的记录让用户确认*/ printf("n是否确定?nnt1).确定 2).重新修改 3).不保存返回 bb&qu

22、ot;); /*是否确定*/ scanf("%d",&w1); /*选择2则表示这次修改错误要重新修改*/ while(w1=2); return(w1); /*返回控制值*/*输入模块*/enter() /*输入模块*/int i,n; printf("输入学生总数(0-%d)?:",N); scanf("%d",&n); /*要输入的记录个数*/ printf("n现在输入数据nn"); for(i=0;i<n;i+) printf("nInput %dth student re

23、cord.n",i+1); input(i); /*调用输入函数*/ if(i!=0) save(n); /*调用保存函数*/ printf_back(); return 0;/*一个任务结束时让用户选择是浏览还是返回*/*追加模块*/add() /*追加模块*/int i,n,m,k; FILE *fp; n=load(); printf("增加的学生总数(0-%d)?:",N-n); scanf("%d",&m); system("cls"); /*输入要追加的记录个数*/ k=m+n; for(i=n;i<

24、;k;i+) printf("nInput %dth student record.n",i-n+1); input(i); /*调用输入函数*/ if(fp=fopen("sc.txt","ab")=NULL) /*以ab方式打开文件,追加保存*/ printf("不能打开文件n"); return 0; for(i=n;i<k;i+) /*输入出到文件*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("文件输入错误n&q

25、uot;); fclose(fp); printf_back(); return 0;/*一个任务结束时的选择浏览还是返回*/ /*修改模块*/modify() /*修改模块*/struct student s; int i,n,k,w0=1,w1,w2=0; n=load(); do system("cls"); k=-1; /*给用户看全部记录以便确认要修改的记录*/ puts_(); /*显示-*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) if(i!=0)&&(i%10=0) /*目的是分屏

26、显示*/ printf("nnRemember NO.which needed modify. pass any key to contiune . . ."); getch(); puts("nn"); printf_one(i); /*调用显示一个记录的函数*/ puts_(); do printf("nn输入修改学号! NO.:"); scanf("%s",s.num); system("cls"); /*输入要修改的数据的学号*/ for(i=0;i<n;i+) /*查找要修改的数

27、据*/ if(strcmp(s.num,stui.num)=0) k=i; /*找到要修改的记录*/ s=stui; /*把stui(即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/ if(k=-1) printf("nn不存在! 重新输入"); while(k=-1); /*当K=-1表示没有找到*/ printf_face(); /*调用显示数据结构项目函数*/ printf_one(k); /*调用显示一个记录的函数*/ w1=modify_data(k,n); /*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/ if(w1=1) /*

28、W1等于1时则表示用户确定这次修改*/ printf("n - 成功 -.nn是否修改其他?nnt1).是 2).保存返回t bb"); scanf("%d",&w0); w2=1; /*来控制保存,使w2=1是标记已有过修改*/ else w0=0; if(w2=1) stuk=s; /走到这里是由于用户没有确认这次修改(在调用修改函数w1=modify_data(k,n);时没有确认). 使W0=0,为了让终止循环, /stuk=s/,则把备份的s恢复给stuk(即当次修改的),这样的好处是确保在此之前修改过的成功保存,而本次(用户没有确认的

29、)不修改*/ if(w0!=1&&w2=1) /*W0不等于1则表示正常返回,w2=1表示在此之前有过修改,这时就保存用户已确认修改的并返回*/ save(n); /*w2不等于1表示在此次之前没有修改过(即:第一次),而又反悔这次修改,则不保存返回*/ while(w0=1); teacher(); return 0;/*删除模块*/del() /*删除模块*/struct student s; int i,n,k,c,w0=1; n=load(); do system("cls"); k=-1; /*给用户看全部记录以便确认要删除的记录*/ puts_(

30、); printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) if(stui.ave!=0) if(i!=0)&&(i%10=0) /*目的是分屏显示,每10个一屏*/ printf("nnRemember NO. which needed del. pass any key to contiune . . ."); getch(); puts("nn"); printf_one(i); /*调用显示一个记录的函数*/ puts_(); do printf("nn输入删除学号! NO

31、.:"); scanf("%s",s.num); system("cls"); /*输入要修改的数据的学号*/ for(i=0;i<n;i+) /*查找要修改的数据*/ if(strcmp(s.num,stui.num)=0) k=i; /*找到要修改的记录的下标赋给K*/ s=stui; if(k=-1) printf("nn不存在! 重新输入"); /*K=-1,表示没有找到相同之的*/ while(k=-1); puts("n"); printf_face(); /*调用显示数据结构项目函数*

32、/ printf_one(k); /*调用显示一个记录的函数*/ printf("n是否确定?nt1).是 2).否且删除其他 3).保存全部返回 bb"); scanf("%d",&c);system("cls"); if(c=1) stuk.ave=0; /*stuk.ave=0用来标识这个记录是要删除的.保存时则不保存stuk.ave=0的数据*/ printf("nn - 成功 -.nn是否重输?nt1).是 2).返回菜单t bb"); /*问是否继续*/ scanf("%d"

33、,&w0); if(c=3) w0=0; /*w0=0不删除直接返回*/ if(w0!=1&&c!=3) /*只有当确认删除后返回才保存,不删除直接返回则不保存,且不保存在此之前删除过的记录*/ save(n); while(w0=1); teacher(); return 0;/*返回教师介面*/ /*查找模块*/int h(char k)return(k%5);int linkinsert(HNode *t,char k)/*向用拉链法处理冲突的散列表t中插入关键字为k的记录*/int i;HNode *p;i=h(k);if(ti=NULL)p=(HNode*)m

34、alloc(sizeof(HNode);p->key=k;p->link=NULL;ti=p;printf("n inserted %lun ",k);return(1);elsep=ti;while(p!=NULL)if(p->key=k)printf("n retrieval %lun ",k);return(0);else if(p->link!=NULL) p=p->link;elsep->link=(HNode*)malloc(sizeof(HNode);p=p->link;p->key=k;p-

35、>link=NULL;printf("n inserted %lun ",k);return(1);getch();return 0;HNode *linksearch(HNode *t,char k)/*在用拉链法处理冲突的散列表t中查找关键字为给定值k的记录*/HNode *p;int i;i=h(k);if(ti=NULL)return(NULL);p=ti;while(p!=NULL)if(p->key=k)printf("%lun",p->key);return(p);else p=p->link;return(NULL

36、);search() /*查找模块*/int i,n,k,w1=1,w2,w3,w4; struct student s; n=load(); do do k=-1; printf("nn输入查找学号! NO.:"); scanf("%s",s.num); /*输入要修改的数据的学号*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i<n;i+) /*查找要修改的数据*/ if(strcmp(s.num,stui.num)=0) k=i; /*找到要修改的记录*/ printf_one(k);break; /*调

37、用显示一个记录的函数*/ if(k=-1) printf("nn不存在! 请重新输入"); printf("nn是否确定?nt1).是 2).否且返回 bb"); scanf("%d",&w1);system("cls"); while(k=-1&&w1=1); /*如果w1不等于1则直接返回*/ w4=0;w3=0; if(k!=-1) /*k不等于-1表示找到,如果找到则选择操作*/ printf("nn请选择:nt1).查找另一个数据 2).修改 3).删除 4).返回目录

38、bb"); scanf("%d",&w2); switch(w2) case 2:w3=modify_data(k,n);break; /*调用修改数据函数*/ case 3:printf("n是否确定?nt1).是 2).否且返回 bb"); scanf("%d",&w4); if(w4=1) stuk.ave=0; /*表示删除*/ break; if(w3=1|w4=1) save(n); printf("nn - 成功 -."); printf("nn请选择:nt1).查

39、找另一个数据 2).返回 bb"); scanf("%d",&w2);system("cls"); while(w2=1); teacher(); return 0;/*插入模块*/insert() /*插入模块*/int i,j,n,c; struct student s; n=load(); puts("n输入一个数据.n"); do input(n); /*输入到第n个记录,即插入到最后*/ printf_face(); printf_one(n); printf("nn是否确定?nnt1).是t2)

40、.取消重输t3).不保存返回 bb"); scanf("%d",&c); if(c=1) for(j=0;j<n;j+) /*用起泡法排序*/ for(i=n;i>j;i-) if(stui.ave>stui-1.ave) s=stui-1;stui-1=stui;stui=s; save(n+1); printf_back(); else if(c!=2) teacher(); while(c=2); return 0;/*排序模块(按平均成绩)*/void sift(RecNode r,int t,int w) /*用筛选法调整堆*/

41、int i,j;RecNode x;i=t;x=ri;j=2*i+1;while(j<=w)if(j<w)&&(rj.key>rj+1.key)j+;if(x.key>rj.key)ri=rj;i=j;j=2*j+1;else break;ri=x;void heapsort(RecNode r,int n) /*堆排序*/int i;RecNode x;for(i=n/2-1;i>=0;i-)sift(r,i,n-1);for(i=n-1;i>0;i-)x=r0;r0=ri;ri=x;sift(r,0,i-1);/*排序模块(按平均成绩)*

42、/order() /*排序模块(按平均成绩)*/int i,j,k,n; struct student s; n=load(); for(i=0;i<n-1;i+) /*选择法排序*/ k=i; for(j=i+1;j<n;j+) if(stuj.ave<stuk.ave) k=j; s=stui;stui=stuk;stuk=s; save(n); puts("nn"); printf_back(); return 0;/*统计模块*/void fenduantongji()int k,u,n,i,w1=1,x;int a,b,c,d,e;a=0;b=0

43、;c=0;d=0;e=0;printf(" 1.英语 2.数学 3.C语言 4.管理学 5.信检 6.体育 7.近代史 8.线性代数n"); printf("请输入要统计的科目:");scanf("%d",&u);system("cls");if(u<=8)n=u; x=load(); for(i=0;i<x;i+)k=stui.scorex-1;if(k>=90&&k<100)a=a+1;else if(k<90&&k>=80)b=b+1

44、;else if(k<80&&k>=70)c=c+1;else if(k<70&&k>=60)d=d+1;else if(k>=0&&k<60)e=e+1;printf("学生成绩在 90100 间有:n %dn",a);printf("学生成绩在 8089 间有 :n %dn",b);printf("学生成绩在 7079 间有 :n %dn",c);printf("学生成绩在 6069 间有 :n %dn",d);printf(&

45、quot;低于60的有:n %dn",e); printf("n是否继续?nnt1).是 2).否 bb"); scanf("%d",&w1);system("cls");if(w1=1) fenduantongji(); elseteacher(); menu();/*教师界面*/teacher() /*教师界面*/int n,w1; do system("cls"); /*清屏*/ puts("tt*MENU*nn"); puts("tttt1.输入新数据&quo

46、t;); puts("tttt2.添加数据"); puts("tttt3.修改数据"); puts("tttt4.删除数据"); puts("tttt5.浏览全部"); puts("tttt6.学号查询"); puts("tttt7.插入数据"); puts("tttt8.按平均分排序"); puts("tttt9.分段统计"); puts("tttt10.退出"); puts("tttt11.返回主界面&

47、quot;); puts("nntt*n"); printf("请选择序号:(1-11): bb"); scanf("%d",&n); system("cls"); if(n<1|n>11) /*对选择的数字作判断*/ w1=1;getchar(); else w1=0; while(w1=1); /*选择功能*/ switch(n) case 1:enter();break; /*输入模块*/ case 2:add();break; /*追加模块*/ case 3:modify();break; /*修改模块*/ case 4:del();break; /*删除模块*/ case 5:browse();break; /*浏览模块*/ case 6:search();

温馨提示

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

评论

0/150

提交评论