C语言课程设计报告--学生成绩管理系统_第1页
C语言课程设计报告--学生成绩管理系统_第2页
C语言课程设计报告--学生成绩管理系统_第3页
C语言课程设计报告--学生成绩管理系统_第4页
C语言课程设计报告--学生成绩管理系统_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、.学生成绩管理系统课程设计报告 2010-7-9一、程序整体规划:1.系统的基本功能 数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息; 数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息; 数据的插入:插入某个学生信息; 数据的查询:如按学号查询、按姓名查询等; 数据的删除:如删除指定学号、或者指定姓名的学生及其选修课程信息; 平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息; 考虑用文件把数据保存起来2、首先是结构体的定义:typedef struct message_student char number6; c

2、har name20; char sex4; float subjectnumsubs; float score; float average; int index;student;int numstus; 定义学生数目student *pointer; 指向结构体数组int lens; 次迟到时候分配内存3、部分重要函数声明:int menu_select(); 决定主界面的函数 int openfile(student stu); 打开文件的函数int findrecord(student stud); 查找信息的函数int writetotext(student stud); 保存文件的

3、函数 void sort(student stu); 查找信息的函数void deleterecord(student stu,int i); 删除信息的函数void addrecord(student stud); 增加学生信息的函数void display(student stud,int n1,int n2); 数据的显示函数void sortnum(student stud); 以下几个均为排序函数void sortnum2(student stud); void sortname(student stud);void sortname2(student stud);void sort

4、count(student stud);void sortcount2(student stud);4、设计思路1、主函数以switch和case语句引出其他子函数。然后进行其他子函数的调用。2、定义结构体student,让其包含如姓名性别等基本信息。同时定义结构体指针,以便后面子函数对某一项排序后输出该学生的全部信息。LENS给结构体数组分配内存。3、各个函数运行并相互调用其他子函数,例如几个排序函数全部被其它函数调用并输出结果。具体各子函数之间的关系见源代码。4、student stui表示的是一个结构体,内填大于等于0的数,这可以解释各个子函数中出现此类情况:例如strcmp(str,s

5、)=0是该结构体内的第i+1个学生满足上述条件。由Studi.变量来引用各结构体中的变量,然后用输出函数相应输出该结构体内的信息。二 程序模板细致分析:1.程序涉及的模板:主程序模板. 查询模块.删除模板. 将所有记录写入文件.输出模板.修改信息模板.录入信息模板. 和排序模板.排序模板可按如下进行分类:按学号:按学号降序排序模块.按学号升序排序模块.按姓名:按姓名降序排序模块. 按姓名升序排序模块. 按名次:按名次降序排序模块. 按名次升序排序模块. 2.功能结构联系图如下图所示:主函数模板增加学生记录查询学生记录修改学生记录 学生纪录排序保存文件 打开文件 统计信息 现对

6、各个功能的实现及个人认为每个功能中所用到的程序的闪光点和难点:1.增加学生记录增加学生记录已有记录是否覆盖当输入数据过多时内存的扩展输入数字为1.0,但是结果输出为男.女2已有记录是否覆盖:if(numstus!=0) printf(已有记录存在是否覆盖?(y/n)n); fflush(stdin); gets(str); if(str0=Y|str0=y) i=0;当输入数据过多时内存的扩展: (通过定义LENS开辟增加内存) if(numstuslens) lens+=50; pointer=(student *)realloc(pointer,lens*LEN);输入数字为1.0,但是结

7、果输出为男.女: printf(请输入性别(男/女 1/0):); gets(studi.sex); if(studi.sex0=0) strcpy(studi.sex,女); else strcpy(studi.sex,男);2. 查询学生记录查询学生记录按学号,姓名,名次进行查询如何根据学号输出其相应的成绩,性别等例: 按学号查找: if(str0=1) printf(请输入学号:); fflush(stdin); 亮点:清除数据缓冲区间 gets(str); for(i=0;i=numstus;i+) if(strcmp(str,studi.number)=0) 亮点:利用该函数将结构体

8、数组中相应相同项联系在一起,确定其相应位置,便于输出。 display(stud,i,i); 子函数又调用了其他子函数 break; else continue;3修改学生记录 例:int i=-1,j; if(numstus=0) /*没有记录返回*/ printf(没有可供修改的记录!); while(i=0) printf(要删除这个学生的信息吗?(y/n); 此处有一个难点就是while函数和调用其他子函数findrecord,以及解释为什么一开始要定义i为-1 4.学生纪录排序按学号:按学号降序排序模块.按学号升序排序模块.按姓名:按姓名降序排序模块. 按姓名升序排序模块. 按名次:

9、按名次降序排序模块. 按名次升序排序模块.在排序过程中比较名次,成绩大小是不难的事情,名字通过STRCMPY函数来解决排序问题,但排序中的难点在于指针,结构体变量,结构体数组的综合应用,通过比较你的一组数据要输出所有该成员相应的信息,几个排序中指针既指明了变量的地址,也指明了结构体数组的地址。此处感觉很棘手详细如下一条典型的例子:(其余的大致相同) student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; 5打开文件和保存文件fg

10、etc(fp); while(inumstus) fscanf(fp,%s,stui.number); fscanf(fp,%s,); fscanf(fp,%s,stui.sex); for(j=0;jnumsubs;j+) fscanf(fp,%f,&stui.subjectj); fscanf(fp,%f,&stui.score); fscanf(fp,%f,&stui.average); fscanf(fp,%d,&stui.index); i+; 打开文件用函数fopen,fclose实现文件的打开,文件的关闭。其中按格式将内存中的数据转换成对应的ASCII字符,并以

11、码形式输出到文本文件中保存文件先给所要保存的文件一个内存地址fp,然后将数据输入,数据存储过程中所用到的 fscanf将数据通过一个文件指针指向一个已打开的文本文件。此处的难点见函数的整体规划的详细说明。三、部分运行的图像主界面:纪录排序:信息查找和修改文件保存和显示数据统计四程序主要代码include stdio.h#include string.h#include malloc.h#define H_STUDENT_HH#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/#define numsubs 4 /*学科数目*/t

12、ypedef struct message_student /*结构体定义*/ char number6; char name20; char sex4; float subjectnumsubs; float score; float average; int index;student;int numstus; /*学生数目*/student *pointer; /*指向结构体数组*/int lens;int menu_select(); /*函数声明*/int openfile(student stu);int findrecord(student stud);int writetote

13、xt(student stud);void display1();void showtable();void sort(student stu); void deleterecord(student stu,int i);void addrecord(student stud);void display(student stud,int n1,int n2);void amendrecord(student stud);void count(student stud);void sortnum(student stud);void sortnum2(student stud);void sor

14、tname(student stud);void sortname2(student stud);void sortcount(student stud);void sortcount2(student stud);void statistic(student stud);void display1();int menu_select() char c; int num;printf( nn 中南大学电气信息类学生信息管理系统 );printf( nn);printf( * 制作人:陈光尧 电气0916班 学号0909091611 n n);printf( nn); printf( *系统功能

15、菜单*n n);printf( - - n);printf( n);printf( n); printf( 1. 增加学生记录 5.统计信息 n);printf( * n); printf( 2. 查询学生记录 6.打开文件 n);printf( * n);printf( 3. 修改学生记录 7.保存文件 n);printf( * n);printf( 4. 学生纪录排序 n);printf( * n);printf( n);printf( n); printf(请选择1-8:); fflush(stdin); c=getchar(); return (c);/*-查询模块-*/ int fi

16、ndrecord(student stud) /*查找信息*/ system(cls); char str20; int i,num; if(numstus=0) printf(没有可被查找的记录n); printf(按回车键退出); fflush(stdin); getchar(); return -1; else printf(以何种方式查找?n1.学号t2.姓名t3.名次n); fflush(stdin); gets(str); if(str0=1) /*按学号查找*/ printf(请输入学号:); fflush(stdin); gets(str); for(i=0;i=numstus

17、;i+) if(strcmp(str,studi.number)=0) display(stud,i,i); break; else continue; else if(str0=2) /*按姓名查找*/ printf(请输入姓名:); gets(str); for(i=0;i=numstus;i+) if(strcmp(str,)=0) display(stud,i,i); break; else continue; else if(str0=3) /*按名次查找*/ printf(请输入名次:); fflush(stdin); scanf(%d,&num); for(i

18、=0;inumstus) printf(没有查找所要的信息。n); printf(按回车键退出); fflush(stdin); getchar(); return -1; return i; int openfile(student stu) int i=0,j; FILE *fp; char filename20,str2; if(numstus!=0) printf(已经有记录存在,是否保存?(y/n); fflush(stdin); gets(str); if(str0=y|str0=Y) writetotext(stu); printf(请输入文件名:); fflush(stdin)

19、; gets(filename); numstus=0; if(fp=fopen(filename,rb+)=NULL) printf(无法打开该文件n); return(-1); fscanf(fp,%d,&numstus); fgetc(fp); while(inumstus) fscanf(fp,%s,stui.number); fscanf(fp,%s,); fscanf(fp,%s,stui.sex); for(j=0;jnumsubs;j+) fscanf(fp,%f,&stui.subjectj); fscanf(fp,%f,&stui.score); fsca

20、nf(fp,%f,&stui.average); fscanf(fp,%d,&stui.index); i+; fclose(fp); printf(文件读取成功n); printf(是否显示纪录?(y/n); fflush(stdin); gets(str); if(str0=y|str0=Y) display(stu,0,numstus-1); if(str0!=y&str0!=Y&str0!=n&str0!=N) printf(请输入n或者y!); gets(str); if(str0=y|str0=Y) display(stu,0,numstus-1); return(0);/*-排序

21、模块-*/ void sort(student stud) int i,j=0; char str5; student *p; p=stud; if(numstus=0) printf(没有可供查询的记录!); while(1) for(i=0;i+) printf( 请输入查询方式:); printf((直接输入回车则结束查询操作)n); printf(1.按照学号t); printf(2.按照姓名t); printf(3.按照名次n); fflush(stdin); gets(str); if(strlen(str)=0) break; if(str0=1) printf(请输入排序次序:

22、n); printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortnum2(p); else sortnum(p); display(stud,0,numstus-1); else if(str0=2) printf(请输入排序次序:n); printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortname2(p); else sortname(p); display(stud,0,numstus-1); else if(str0=3) printf(请输入排序次序:n)

23、; printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortcount2(p); else sortcount(p); display(stud,0,numstus-1); else printf(请输入13); printf(是否退出排序?(y/n); gets(str); if(str0=y|str0=Y) break; return; /*-按学号降序排序模块-*/ void sortnum(student stud) int i,j; student temp; student *p; p=stud; for(i=0;in

24、umstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按学号升序排序模块-*/ void sortnum2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按姓名降序排序模块-*/ void sortname(student stud) int i,j; student temp;

25、student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按姓名升序排序模块-*/ void sortname2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;j0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按名次降序排序模块-*/ void sortcount(stude

26、nt stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;jstudj.index) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /*-按名次升序排序-*/ void sortcount2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;inumstus;i+) for(j=0;jstudj+1.index) temp=*(p+j); *(p+j)=*(p+j+1)

27、; *(p+j+1)=temp; void statistic(student stud) /*新增功能,输出统计信息*/ int i,j=0,k=0; char c1,str2; float averagenumsubs,sum=0; if(numstus=0) printf(没有可被查找的记录n); else while(1) printf(下面将统计考试成绩n); printf(请选择你要统计哪科的成绩 1.At2.Bt3.Ct4.Dtn); fflush(stdin); c1=getchar(); printf(t一共有个%d记录n,numstus); /*总共记录数*/ switch

28、(c1) case 1: for(i=0;istudi.subject0) k=i; if(studj.subject0studi.subject0) j=i; average0=sum/numstus; printf(t科目A的最高分:n); /*最高分*/ printf(tt学号:%s 姓名:%s 分数:%.2fn,studj.number,,studj.subject0); printf(t科目A的最低分是:n); /*最低分*/ printf(tt学号:%s 姓名:%s 分数:%.2fn,studk.number,,studk.subject0)

29、; printf(t科目A的平均分是 %5.2fn,average0); /*平均分*/ break; case 2: for(i=0;istudi.subject1) k=i; if(studj.subject1studi.subject1) j=i; average1=sum/numstus; printf(t科目B的最高分:n); /*最高分*/ printf(tt学号:%s 姓名:%s 分 printf(t科目B的最低分是:n); /*最低分*/ printf(tt学号:%s 姓名:%s 分数:%.2fn,studk.number,,studk.subject1);

30、 printf(t科目B的平均分是 %5.2fn,average1); /*平均分*/ break; case 3: for(i=0;istudi.subject2) k=i; if(studj.subject2studi.subject2) j=i; average2=sum/numstus; printf(t科目C的最高分:n); /*最高分*/ printf(tt学号:%s 姓名:%s 分数:%.2fn,studj.number,,studj.subject2); printf(t科目C的最低分是:n); /*最低分*/ printf(tt学号:%s 姓名:%s 分数

31、:%.2fn,studk.number,,studk.subject2); printf(t科目C的平均分是 %5.2fn,average2); /*平均分*/ break; case 4: for(i=0;istudi.subject3) k=i; if(studj.subject3studi.subject3) j=i; average3=sum/numstus; printf(t科目D的最高分:n); /*最高分*/ printf(tt学号:%s 姓名:%s 分数:%.2fn,studj.number,,studj.subject3); print

32、f(t科目D的最低分是:n); /*最低分*/ printf(tt学号:%s 姓名:%s 分数:%.2fn,studk.number,,studk.subject3); printf(t科目D的平均分是 %5.2fn,average3); /*平均分*/ break; default:printf(输入错误!请输入14之间的数n); sum=0; getchar(); printf(是否继续进行统计?(y/n); gets(str); if(str0=y|str0=Y) ; else break; /*-将所有记录写入文件-*/ int writetotext(studen

33、t stud) /*将所有记录写入文件*/ int i=0,j; FILE *fp; char filename20; printf(输入文件名称:); gets(filename); fp=fopen(filename,w); fprintf(fp,%dn,numstus); while(inumstus) fprintf(fp,%s %s %s ,studi.number,,studi.sex); for(j=0;jnumsubs;j+) fprintf(fp,%f ,studi.subjectj); fprintf(fp,%f %f %d ,studi.score,s

34、tudi.average,studi.index); i+; fclose(fp); printf(已成功存储!n); display(stud,0,numstus-1); numstus=0; return 0;void showtable() printf(-n); printf(学号t姓名t性别tAtBtCtDt总分t平均分t名次n); printf(-n); /*-输出模块-*/ void display(student stud,int n1,int n2) int i; showtable(); /*显示表头*/ for(i=n1;i=n2;i+) printf(%st%st%st

35、%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%dtn,studi.number,,studi.sex,studi.subject0,studi.subject1,studi.subject2,studi.subject3,studi.score,studi.average,studi.index); /*通过循环输出数据*/ printf(按回车键退出); getchar(); /*-修改信息模块-*/ void amendrecord(student stud) char str5; /*供用户输入*/ int i=-1,j; if(numstus=0) /*没有记录返回*/ printf(没有可供修改的记录!); while(i=0) printf(要删除这个学生的信息吗?(y/n); gets(str); if(str0=y|str0=Y) deleterecor

温馨提示

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

评论

0/150

提交评论