学生成绩管理系统.doc_第1页
学生成绩管理系统.doc_第2页
学生成绩管理系统.doc_第3页
学生成绩管理系统.doc_第4页
学生成绩管理系统.doc_第5页
免费预览已结束,剩余20页可下载查看

下载本文档

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

文档简介

软件综合课程设计 学生成绩管理系统稀疏矩阵应用 二一四 年 六 月学生成绩管理系统一、问题陈述现有学生成绩信息文件1(1.txt),内容如下姓名 学号 语文 数学 英语 张明明 01 67 78 82李成友 02 78 91 88张辉灿 03 68 82 56王露 04 56 45 77陈东明 05 67 38 47. . . 学生成绩信息文件2(2.txt),内容如下:姓名学号 语文 数学 英语 陈果 31 57 68 82李华明 32 88 90 68张明东 33 48 42 56 李明国 34 50 45 87陈道亮 35 47 58 77. . . . 试编写一管理系统,要求如下:1)实现对两个文件数据进行合并,生成新文件3.txt。2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt。3)合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)。4)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)。5)要求使用结构体,链或数组等实现上述要求。6)采用多种方法且算法正确者,可适当加分。二、需求分析本系统要求实现具体的五项功能,根据提供的这五项功能,运行时系统提供了相应的功能菜单,选择不同的选项来实现相应的功能。1采用了读文件和写文件的方式,边读边写,合并两个文件成为一个文件。2.采用结构体数组存入从文件中读入的数据,再通过对于数据中的相关成绩判断该学生是否需要补考,如果需要补考则将其信息写入另外一个文件。3.采用快速排序、选择排序、冒泡排序的方法按总分对学生数据进行排序。4.采用了二种查找的方法找到学生信息并输出。5.通过调用函数exit(0)退出程序。三、概要设计1、实现对文件1.txt和文件2.txt数据进行合并,生成新文件3.txt。调用函数Unitedfile()来实现,函数以读的方式打开1.txt文件,以写的方式打开3.txt文件,从1.txt读入一个数据并写入3.txt文件,直到遇到1.txt文件结束。关闭1.txt文件,再以读的方式打开2.txt文件,用上述方式直到遇到2.txt文件结束。关闭2.txt,3.txt文件。实现对于文件的合并。2、抽取出三科成绩中有补考的学生并保存在一个新文件4.txt。调用函数findout()来实现。函数以读的方式打开3.txt文件,以写的方式打开4.txt文件。读入3.txt文件的一个数据到结构体stud中,判断学生信息中语文、数学和英语成绩中是否有不及格的,如果有,则将数据写入4.txt中,直至遇到3.txt文件结束。3、对合并后的文件3.txt中的数据按总分降序排序。调用函数sortfile()来实现。函数提供了三种排序方法,通过调用函数kuaisu()来实现快速排序,通过调用函数xuanze()来实现选择排序,通过调用函数maopao()来实现冒泡排序。4、输入一个学生姓名后,能查找到此学生的信息并输出结果。调用函数findoutstudent()来实现。函数也提供了两种查找方法:(1) 通过调用函数derectfindoutstudent()实现从文件从3.txt中逐个读入数据,再进行查找判断,如果找到所需要的数据,则查找结束,否则继续查找直至文件结束。(2) autofindoutstudent()在进行第三步的过程中,已经把3.txt中的学生数据读入了结构体数组当中,调用函autofindoutstudent()直接从结构体中进行查找。5、通过调用函数exit()退出。mainfindout()sortfile()findoutstudent()exit()Unitedfile()Kuaisu()Maopao()Xuanzhe()derectfindoutstudent()autofindoutstudent()四、详细设计1把1.txt和2.txt文件中的内容放到3.txt文件中。调用Unitedfile()文件,打开文件1和文件3,从1.txt中读入学生数据进结构体,把结构体中学生数据放到文件3中。关闭文件1,从2.txt中读入学生数据进结构体,把结构体中学生数据放到文件3中。关闭文件2和文件3。void Unitedfile()FILE *fp,*p;Student stud;fp=fopen(d:1.txt,r);p=fopen(d:3.txt,w);while(fscanf(fp,%s%s%d%d%d,,stud.id,&stud.chinese,&stud.math,&stud.english )!=EOF)fprintf(p,%-6s %-6s %-6d %-6d %-6dn,,stud.id,stud.chinese,stud.math,stud.english );fclose(fp);fp=fopen(d:2.txt,r);while(fscanf(fp,%s%s%d%d%d,,stud.id,&stud.chinese,&stud.math,&stud.english )!=EOF)fprintf(p,%-6s %-6s %-6d %-6d %-6dn,,stud.id,stud.chinese,stud.math,stud.english );fclose(fp);fclose(p);2. 抽取出三科成绩中有分数低于60分的学生并保存在一个新文件4.txt从3.txt中读入学生数据进结构体,判断是否有不及格的课程,如果有,则写入文件4.txt中void findout()FILE *fp,*p;Student stud;fp=fopen(d:3.txt,r);p=fopen(d:4.txt,w);while(fscanf(fp,%s%s%d%d%d,,stud.id,&stud.chinese,&stud.math,&stud.english )!=EOF)if(stud.chinese60|stud.english60|stud.math60)fprintf(p,%-6s %-6s %-6d %-6d %-6dn,,stud.id,stud.chinese,stud.math,stud.english ); fclose(fp);fclose(p);3对文件3.txt中的数据按总分以降序进行排序(三种方法:选择排序、快速排序、冒泡排序)void sortfile()char c;cout请选择排序方法:endl;cout1.选择排序endl;cout2.快速排序endl;cout3.冒泡排序c;switch(c)case1:xuanze();/选择排序break;case2:kuaisu();/快速排序break;case3: maopao();/直接插入排序break;3.1选择排序void xuanze()int j,k,max1,sum1,sum2,q;i=0;Student temp;FILE *fp;fp=fopen(d:3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)i+;fclose(fp);for(j=0;ji;j+)studj.sum=studj.chinese +studj.math+studj.english;for(j=0;ji-1;j+)/对结构体数组中的数据进行选择排序max1=j;sum1=studj.sum;for(k=j+1;ki;k+)sum2=studk.sum;if(sum1sum2)max1=k;sum1=sum2;if(max1!=j)temp=studmax1;studmax1=studj;studj=temp;studj.sum=sum1;fp=fopen(d:3.txt,w);/将排序后的数据写入3.txt中for(q=0;qi;q+)fprintf(fp,%-8s %-8s %-8d %-8d %-8d %-8dn,,studq.id,studq.chinese,studq.math,studq.english,studq.sum );fclose(fp);3.2 快速排序void kuaisu()int i,low,high;FILE *fp;fp=fopen(d:3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)studi.sum=studi.chinese+studi.math+studi.english;i+; fclose(fp);low=0;high=i-1;QSort(low,high);/快速排序fp=fopen(d:3.txt,w);/将排序后的数据写入3.txt中for(int j=0;ji;j+)fprintf(fp,%-8s %-8s %-8d %-8d %-8d %-8dn,,studj.id,studj.chinese,studj.math,studj.english,studj.sum );fclose(fp); 3.3 冒泡排序void maopao() int j,k,q; Student temp;FILE *fp;fp=fopen(d:3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)studi.sum=studi.chinese+studi.math+studi.english;i+;int n=i;for( i=0;in-1;i+) k=i;for(j=i+1;jstudk.sum)k=j;temp=studi;studi=studk;studk=temp;fp=fopen(d:3.txt,w);/将排序后的数据写入3.txt中for(q=0;qn;q+)fprintf(fp,%-8s %-8s %-8d %-8d %-8d %-8dn,,studq.id,studq.chinese,studq.math,studq.english,studq.sum );fclose(fp);4. 输入一个学生姓名后,能查找到此学生的信息并输出结果。(1、从文件3中直接查找;2、在运行第三步的基本上查找)void findoutstudent()/提供两种查找方法char c;cout请选择查找方法endl;cout1.从文件3中直接查找endl;cout2.在运行第三步的基础上查找c;cout请输入学生姓名:;if(sign1=0&c=2)cout请执行操作3后再执行此项操作!NAME;while(fscanf(fp,%s%s%d%d%d%d,,stud1.id,&stud1.chinese,&stud1.math,&stud1.english,&stud1.sum )!=EOF)if(strcmp(,NAME)=0)flag=1;cout*姓名*学号*语文*数学*英语*总分*endl;cout stud1.id ;coutstud1.chinese stud1.math stud1.english stud1.sumendl;break;if(flag=0)cout无此学生相关信息Name;for(k=1;k=n;k+)if(strcmp(,Name)=0)flag=1;cout*姓名*学号*语文*数学*英语*总分*endl;cout studk.id ;coutstudk.chinese studk.math studk.english studk.sumendl;break; if(flag=0)cout无此学生相关信息endl;fclose(fp); 五、程序代码#includeusing namespace std;#define SIZE 100typedef struct char name8;char id2;int chinese;int math;int english;int sum;Student;Student studSIZE;int i;int sign=0,sign1=0,sign2=0,sign3=0;void Unitedfile()FILE *fp,*p;Student stud;fp=fopen(d:1.txt,r);/以读的方式打开1.txtp=fopen(d:3.txt,w);/以写的方式打开3.txtwhile(fscanf(fp,%s%s%d%d%d,,stud.id,&stud.chinese,&stud.math,&stud.english )!=EOF)fprintf(p,%-6s %-6s %-6d %-6d %-6dn,,stud.id,stud.chinese,stud.math,stud.english );/读取1.txt的数据进入结构体中,写入3.txt,继续读取直结束fclose(fp);/关闭文件1.txtfp=fopen(d:2.txt,r);/以写的方式打开2.txtwhile(fscanf(fp,%s%s%d%d%d,,stud.id,&stud.chinese,&stud.math,&stud.english )!=EOF)fprintf(p,%-6s %-6s %-6d %-6d %-6dn,,stud.id,stud.chinese,stud.math,stud.english );fclose(fp);fclose(p);void findout()FILE *fp,*p;Student stud;fp=fopen(d:3.txt,r);p=fopen(d:4.txt,w);while(fscanf(fp,%s%s%d%d%d,,stud.id,&stud.chinese,&stud.math,&stud.english )!=EOF)if(stud.chinese60|stud.english60|stud.math60)fprintf(p,%-6s %-6s %-6d %-6d %-6dn,,stud.id,stud.chinese,stud.math,stud.english ); fclose(fp);fclose(p);void xuanze() /对合并后的文件3.txt中的数据按总分降序排序int j,k,max1,sum1,sum2,q;i=0;Student temp;FILE *fp;fp=fopen(d:3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)i+;/从3.txt中读入数据进结构体数组stud中fclose(fp);for(j=0;ji;j+)studj.sum=studj.chinese +studj.math+studj.english;for(j=0;ji-1;j+)/对结构体数组中的数据进行选择排序max1=j;sum1=studj.sum;for(k=j+1;ki;k+)sum2=studk.sum;if(sum1sum2)max1=k;sum1=sum2;if(max1!=j)temp=studmax1;studmax1=studj;studj=temp;studj.sum=sum1;fp=fopen(d:3.txt,w);/将排序后的数据写入3.txt中for(q=0;qi;q+)fprintf(fp,%-8s %-8s %-8d %-8d %-8d %-8dn,,studq.id,studq.chinese,studq.math,studq.english,studq.sum );fclose(fp);void maopao() int j,k,q; Student temp;FILE *fp;fp=fopen(d:3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)studi.sum=studi.chinese+studi.math+studi.english;i+;int n=i;for( i=0;in-1;i+) k=i;for(j=i+1;jstudk.sum)k=j;temp=studi;studi=studk;studk=temp;fp=fopen(d:3.txt,w);/将排序后的数据写入3.txt中for(q=0;qn;q+)fprintf(fp,%-8s %-8s %-8d %-8d %-8d %-8dn,,studq.id,studq.chinese,studq.math,studq.english,studq.sum );fclose(fp);int Partition(int low,int high)/区分int p;/p是pivotkey初始关键字Student temp;temp=studlow;p=studlow.sum;while(lowhigh)while(lowhigh&studhigh.sum=p)-high;studlow=studhigh;while(low=p)+low;studhigh=studlow;studlow=temp;return low;void QSort(int low,int high)/快速排序int k;if(lowhigh)k=Partition(low,high);QSort(low,k-1);QSort(k+1,high);void kuaisu()/读取文件,快速排序,将结果写入3.txtint i,low,high;FILE *fp;fp=fopen(d:3.txt,r);i=0;while(fscanf(fp,%s%s%d%d%d,,studi.id,&studi.chinese,&studi.math,&studi.english )!=EOF)studi.sum=studi.chinese+studi.math+studi.english;i+;/从文件3.txt中读入数据进结构体数组stud中fclose(fp);low=0;high=i-1;QSort(low,high);/快速排序fp=fopen(d:3.txt,w);/将排序后的数据写入3.txt中for(int j=0;jNAME;while(fscanf(fp,%s%s%d%d%d%d,,stud1.id,&stud1.chinese,&stud1.math,&stud1.english,&stud1.sum )!=EOF)if(strcmp(,NAME)=0)flag=1;cout*姓名*学号*语文*数学*英语*总分*endl;cout stud1.id ;coutstud1.chinese stud1.math stud1.english stud1.sumendl;break;if(flag=0)cout无此学生相关信息Name;for(k=1;k=n;k+)if(strcmp(,Name)=0)flag=1;cout*姓名*学号*语文*数学*英语*总分*endl;cout studk.id ;coutstudk.chinese studk.math studk.english studk.sumendl;break; if(flag=0)cout无此学生相关信息endl;fclose(fp);void findoutstudent()/提供两种查找方法char c;cout请选择查找方法endl;cout1.从文件3中直接查找endl;cout2.在运行第三步的基础上查找c;cout请输入学生姓名:;if(sign1=0&c=2)cout请执行操作3后再执行此项操作!endl;return;switch(c)case1:derectfindoutstudent();/从文件3中直接查找break;case2:autofindoutstudent();/从结构体数据中直接查找break;void sortfile()/提供两种排序方法char c;cout请选择排序方法:endl;cout1.选择排序endl;cout2.快速排序endl;cout3.冒泡排序c;switch(c)case1:xuanze();/选择排序break;case2:kuaisu();/快速排序break;case3: maopao();/直接插入排序break;int main()/*主程序*/ int choice; while(1) /*主菜单*/if(sign3=0)printf(*学生成绩管理系统*n);printf(t1. 合并1.txt和2.txt为3.txtn); printf(t2. 抽取出三科成绩中有补考的学生并保存在一个新文件4.txtn); printf(t3. 对合并后的文件3.txt中的数据按总分降序排序n); printf(t4. 输入一个学生姓名,查找到此学生的信息并输出结果n);printf(t5. 退出n);printf(请选择(1-5):n);printf(*n);sign3=1;scanf(%d,&choice);switch(choice) case 1: Unitedfile();sign=1;cout操作1成功!endl;break; case 2: if(sign=0)cout请执行操作1后再执行此项操作!endl;break;cout操作2成功!endl;findout();break; case 3:if(sign=0)cout请执行操作1后再执行此项操作!endl;break;sortfile();cout操作3成功!endl;sign1=1;break; case 4:while(1)char c;findoutstudent();cout继续查找请输入Y:endl;cout返回主菜单请输入N:c;if(c=N|c=n)break;sign3=0;break;case 5:exit(0);break; return 0; 六、运行结果与测试七、设计体会与总结通过本次课程设计,进一步熟悉了数据结构课程设计的基本设计思想,加深了对于数据结构的认识。本系统为学生成绩管理系统,能够用于基本的学生成绩管理。在设计这个程序时,首先我们要弄清楚文件的存储,你是怎么把文件中的数据转移到另一个文件中去,之间的过程是什么样的。按照题目的要求一步一步下来。怎么抽取文件3中三科成绩中有补考的学生成绩到文件4中。在设计这个程序时,我遇到了很多困难,不知道文件是如何的进行存储的,怎么把其他文件中的数据传递到另个一文件中,两个文件能同时打开吧数据传递到第三个文件中去吗?怎么把文件中的数据调用到程序中来,被使用。在这次课程设计中,我发现写代码不是重要的,了解题目的意思,会设计程序框架才是最重要的。知道程序内部是怎么进行实现的才是设计程序的关键。如果没有以上的基本,根本学不出一个好的程序。稀疏矩阵应用一、问题陈述:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。(1)稀疏矩阵的存储(2)稀疏矩阵加法(3)矩阵乘法(4)矩阵转置二、程序代码:#include#include#define MAXSIZE 100 int num100; typedef struct OLNodeint i,j;int e;struct OLNode *right,*down;OLNode,*OLink;typedef struct int mu,nu,tu;OLink *rhead,*chead;CrossList; /十字链表结构体定义typedef structint i,j;int e;Triple;typedef structTriple dataMAXSIZE;int rposMAXSIZE + 1;int nu,mu,tu;TSMatrix; /三元组结构体定义;int CreateSMatix_OL(CrossList &M)int i,j,e;OLink q;OLink p;printf(请输入稀疏矩阵的行数,列数,非零元素的个数:); scanf(%d%d%d,&M.mu,&M.nu,&M.tu);M.rhead=(OLink *)malloc(M.mu+1)*sizeof(OLNode); M.chead=(OLink *)malloc(M.nu+1)*sizeof(OLNode); for( i=1;i=M.mu;i+)M.rheadi=NULL; for( i=1;ii=i;p-j=j;p-e=e;if(M.rheadi=NULL|M.rheadi-jj)p-right=M.rheadi;M.rheadi=p;Elseq=M.rheadi;while(q-right&q-right-jright;p-right=q-right;q-right=p;if(M.cheadj=NULL|M.cheadj-ii) p-down=M.cheadj;M.cheadj=p;elseq=M.cheadj;while(q-down&q-down-idown;p-down=q-down;q-down=p;scanf(%d%d%d,&i,&j,&e);return 0;/创建十字链表void CreateSMatrix(TSMatrix &M)printf(请输入稀疏矩阵的行数、列数和非零元个数:);scanf(%d%d%d,&M.mu,&M.nu,&M.tu);if(M.mu=0)|(M.nu=0)|(M.tuM.mu*M.nu) printf(输入有误!);for(int i=1;i=M.tu;i+)/输入稀疏矩阵元素printf(请输入元素坐标(所在行,所在列)及大小:);scanf(%d%d%d,&M.datai.i,&M.datai.j,&M.datai.e);if(M.datai.i=0)|(M.datai.j=0)printf(输入错误,请重新输入);scanf(%d%d%d,&M.datai.i,&M.datai.j,&M.datai.e);int num100;if(M.tu)int i;for(i = 1; i = M.mu; i+) numi = 0;/初始化for(int t = 1; t = M.tu; t+) +numM.datat.i; M.rpos1 = 1;for(i = 2; i = M.mu; i+) M.rposi = M.rposi-1 + numi-1;/创建三元组Void TransposeSMatrix(TSMatrix M,TSMatrix &T) T.nu=M.mu;T.mu=M.nu;T.tu=M.tu;int q=1;for(int

温馨提示

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

评论

0/150

提交评论