C语言课程设计学生成绩管理系统.doc
中 国 地 质 大 学本科生课程论文封面课程名称 C语言课程设计 教师姓名 本科生姓名 本科生学号 本科生专业 072114 (机械) 所在院系 机电学院 类别: 日期: 2012年6月25日 目录课程论文题目程序设计思路功能模块图数据结构设计算法设计程序代码程序运行结果编程中遇到的困难及解决方法总结心得及良好建议致谢一、课程论文题目:学生成绩管理系统1:题目要求请设计学生成绩管理系统,实现学生信息的录入,显示,查找,添加,保存,删除,插入等功能模块。要求功能选择用菜单实现,数据输入和结果输出要求有文件存放。原始数据文件格式:学号 姓名 英语 C语言 高等数学 平均成绩01 张三 75 85 80 8002 李四 2:需求分析根据题目要求,由于学生信息总是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择。3:总体设计根据上面的需求分析,可以将这个系统的设计分为:数据输入模块、数据显示模块、数据查找模块、数据插入模块、成绩排序模块和成绩保存模块等。二、程序设计思路1、 用户输入模块在此模块中用户根据自己的需求输入数字17中的任意一个数字,实现相应的功能。2、 信息录入功能模块此模块可以让用户输入每个学生的信息:学号、姓名、英语成绩、C语言成绩、高等数学成绩、平均成绩。用户可以连续输入学生的信息,或者删除或者查询,也可以保存当前已录入的信息。3、 修改学生成绩模块用户可以根据实际情况的变化修改已录入的学生成绩的信息,跟实际同步。4、 文件保存模块用户可以在确定已录入的信息无误之后将学生的信息存为一个数据文件。已保存的信息可以再文件中查看也可以在程序中进行查看。用户输入的学生信息可以随时保存。5、 查询功能模块在此模块里,用户可以根据提示输入所想要查询的学生的学号以查询学生的信息。6、 删除功能模块、在此模块里,用户可以根据自己的需求选择想要删除的学生信息,选择之后程序会再次确认,以防误删。 7、排序功能模块 在此模块中,程序会将用户已录入的信息按平均成绩由低到高进行排序。 三、功能模块图开始x值 1值 2值 7值 6值 5值 4值 3查询模块修改退出排序模块保存模块删除模块添加模块用户输入并将值保存至xx结束四、数据结构设计struct xueshengchengji /*声明学生成绩数据结构体*/char xuehao10; /*学生学号*/char name10; /*学生姓名*/float cyuyan; /*c语言成绩*/float math; /*高数成绩*/float english; /*英语成绩*/ float average; /*平均成绩*/;struct xueshengchengji chengji100,*p=chengji; /*声明记录学生成绩情况的100个元素的结构体数组*/五、算法设计开始选择需要的功能输入学生信息结束1、添加模块void add() printf ("t请输入学生学号:");fflush(stdin); /*清除键盘缓冲区*/gets(chengji+n.xuehao);printf("tttt请输入学生姓名:");gets(chengjin.name);printf("tttt请输入该学生的英语成绩:");scanf("%f",&chengjin.cyuyan);printf("tttt请输入该学生的C语言成绩:");scanf("%f",&chengjin.math);printf("tttt请输入该学生的高等数学成绩:");scanf("%f",&chengjin.english); /*计算总成绩*/chengjin.average=(chengjin.cyuyan+chengjin.math+chengjin.english)/3; /*输出内容*/printf("ntttt该学生成绩为:%f",chengjin.average);printf("nntttt按任意键返回.");getch();2、修改模式开始输入要修改的学生学号输入新的学生信息结束void modify ( )char xuehao10; /*接收学生学号字符数组*/int i; /*循环变量*/if (n=-1) /*人数为0说明成绩记录尚未添加*/printf("nntt当前还没有学生成绩记录,按任意键返回主菜单.");getch( );return;printf("t请输入学生学号:"); /*提示信息*/gets(xuehao); /*从键盘读取字符串*/for (i=0;i<=n;i+) /*在学生总数范围内循环查找*/if(strcmp(chengjii.xuehao,xuehao)=0) /*比较并找到*/*显示该学生成绩情况*/printf("nttt 该学生成绩情况如下: ");printf("nttt=nn"); printf("%-6s%-6s%-9s","学号","姓名","平均成绩"); printf("%-12s%-6s%12s","英语","C语言","高等数学"); printf("%-6s%-6s",chengjii.xuehao,chengjii.name); printf("%9.2f%9.2f%9.2f%9.2f",chengjii.cyuyan,chengjii.math,chengjii.english,chengjii.average);/*接受该学生新的成绩情况*/ printf("ntt 请输入该学生新的英语成绩: ");scanf ("%f",&chengjii.cyuyan); printf("ntt 请输入该学生新的C语言成绩: ");scanf ("%f",&chengjii.math); printf("ntt 请输入该学生新的高等数学成绩: ");scanf ("%f",&chengjii.english);3、查询模块开始输入要查询的学生学号输出学生信息结束/*查询学生成绩(依据学号)*/void find()char xuehao10; /*接收学生学号字符数组*/ int i; /*循环变量*/ if(n=-1) /*人数为0说明成绩记录尚未添加*/printf("nntt当前还没有学生成绩,按任意键返回主菜单.");getch();return;printf("t请输入学生学号:"); /*提示信息*/gets(xuehao); /*从键盘读取字符串*/for(i=0;i<=n;i+) /*在职工总数范围内循环查找*/if(strcmp(chengjii.xuehao,xuehao)=0) /*比较并找到*/printf("n 该学生成绩情况如下:"); printf("n=nn");printf("%-6s%-6s%","学号","姓名");printf("%-12s%-6s%12s%9sn","英语","C语言","高等数学","平均成绩");printf("%-6s%-6s%",chengjii.xuehao,chengjii.name);printf("%9.2f%9.2f%9.2f%9.2f",chengjii.cyuyan,chengjii.math,chengjii.english,chengjii.average);printf("n 按任意键返回主菜单.");getch();break;if(i=n+1)printf("ntt您所输入的学生学号有误或不存在!");printf("按任意键返回主菜单.");getch();return;4、删除模块输入要删除学生学号开始判断是否要删除删除学生记录结束语NYvoid del()char xuehao10; int i,j; char d; printf("t请输入待删除学生学号:");gets(xuehao);for(i=0;i<=n;i+) if(strcmp(chengjii.xuehao,xuehao)=0)printf("ntt你确认要删除%s号学生成绩信息么(y/n)?",chengjii.xuehao );d=getche();if(d='y'|d='Y') if(i=n) n-;else for(j=i;j<=n;j+) strcpy(chengjij.xuehao,chengjij+1.xuehao);strcpy(chengjij.name,chengjij+1.name);chengjij.english=chengjij+1.english;chengjij.math=chengjij+1.math; chengjij.cyuyan=chengjij+1.cyuyan; n-;printf("nntt该学生记录成功删除,按任意键返回主菜单.");getch();break; else printf("nntt你选择了不删除该学生记录,按任意键返回主菜单.");getch();return;if(i = n+1) printf("ntt本班级无此学号,按任意键返回主菜单.");getch();5、排序模块开始选择需要的功能按成绩低到高排序结束void rank() int i,j; printf("t按平均成绩排序如下n");for (i=0;i<n;i+)for(j=i+1;j<n;j+)if (chengjii.average>chengji j.average)*p=chengjij;chengjij=chengjii;chengjii=*p;printf("%-6s%-6s","学号","姓名"); printf("%-12s%-6s%12s%-9sn","英语","C语言","高等数学","平均成绩");for(i=0;i<=n;i+) printf("%-6s%-6s",chengjii.xuehao,chengjii.name); printf("%9.2f%9.2f%9.2f%9.2fn",chengjii.cyuyan,chengjii.math,chengjii.english,chengjii.average); printf("nntttt按任意键返回."); getch();六、程序代码个#include <stdio.h> /*基本的输入输出函数*/#include <conio.h> /*getch()及getche()函数包含在此*/#include <string.h> /*字符串相关函数*/#include <windows.h> /*sleep()函数包含在此*/#define TRUE 1/*以下函数为自定义函数声明语句*/void read(); /*从数据文件中读取学生成绩数据*/void write(); /*想学生成绩数据文件写入记录*/void find(); /*查询学生成绩数据记录*/void modify(); /*修改学生成绩数据记录*/void add(); /*向学生成绩数据文件中增加记录*/void del(); /*从学生成绩数据文件中删除记录*/void rank(); /*排列学生成绩*/struct xueshengchengji /*声明学生成绩数据结构体*/char xuehao10; /*学生学号*/char name10; /*学生姓名*/float cyuyan; /*c语言成绩*/float math; /*高数成绩*/float english; /*英语成绩*/ float average; /*平均成绩*/;struct xueshengchengji chengji100,*p=chengji; /*声明记录学生成绩情况的100个元素的结构体数组*/int n = -1; /*声明统计学生人数的变量(全局)*/void main() char ch; read(); /*从数据文件中读取学生成绩数据并初始化学生成绩结构体数组*/ while(TRUE) system("cls"); /*清屏命令*/ printf("nntt 欢迎使用学生成绩管理系统 nnn"); printf("tt请选择(1-7):n"); printf("tt=n"); printf("ttt 1.查询学生成绩记录n"); printf("ttt 2.修改学生成绩记录n"); printf("ttt 3.添加学生成绩记录n"); printf("ttt 4.删除学生成绩记录n"); printf("ttt 5.保存学生成绩记录n"); printf("ttt 6.成绩排序n"); printf("ttt 7.退出n"); printf("tt=n"); printf("ntt"); ch=getch(); switch(ch) case '1': find(); break; /*查询*/ case '2': modify(); break; /*修改*/ case '3': add(); break; /*添加*/ case '4': del(); break; /*删除*/ case '5': write(); break; /*保存*/ case '6': rank(); break; /*排序*/ case '7': return; /*退出*/ default: printf("tt n"); getch(); return; /*从数据文件cj.dat中读取学生成绩数据到数据组chengji中*/void read()FILE * file; /*声明文件指针*/if(file=fopen("cj.dat","rb")=NULL) /*以二进制方式打开学生成绩数据文件,并判断是否失败*/printf("nnt 学生成绩数据文件无法打开,或为空!");printf("nnt 按任意键进入主菜单.");getch();return;else /*文件打开成功时*/n+; /*计算结构体数组下标*/while(fread(&chengjin,sizeof(chengjin),1,file) = 1)n+;fclose(file); /*关闭文件指针*/printf("nnt学生成绩数据读取完毕,共有%d人! n",n);printf("nt5秒后继续. n",n);n-; /*计算学生记录总数*/Sleep(5000); /*延时5分钟*/ /*向学生成绩数据文件中写入记录*/void write()FILE *file; /*声明文件指针*/if(n = -1) /*学生人数为 0 时*/printf(" 没有数据可存!按任意键返回主菜单 n");getch();return;if(file=fopen("cj.dat","wb")!=NULL) /*以二进制方式打开学生成绩数据文件,并判断是否失败*/fwrite(&chengji0,sizeof(chengji0),n+1,file); /*所有记录一次写入文件*/fclose(file); /*关闭文件指针*/printf("nntt%d条学生记录保存完毕!n",n+1); else /*文件打开不成功时*/printf("tt无法打开学生成绩数据文件!n");printf("ntt按任意键返回主菜单. ");getch();/*查询学生成绩(依据学号)*/void find()char xuehao10; /*接收学生学号字符数组*/ int i; /*循环变量*/ if(n=-1) /*人数为0说明成绩记录尚未添加*/printf("nntt当前还没有学生成绩,按任意键返回主菜单.");getch();return;printf("t请输入学生学号:"); /*提示信息*/gets(xuehao); /*从键盘读取字符串*/for(i=0;i<=n;i+) /*在职工总数范围内循环查找*/if(strcmp(chengjii.xuehao,xuehao)=0) /*比较并找到*/printf("n 该学生成绩情况如下:"); printf("n=nn");printf("%-6s%-6s%","学号","姓名");printf("%-12s%-6s%12s%9sn","英语","C语言","高等数学","平均成绩");printf("%-6s%-6s%",chengjii.xuehao,chengjii.name);printf("%9.2f%9.2f%9.2f%9.2f",chengjii.cyuyan,chengjii.math,chengjii.english,chengjii.average);printf("n 按任意键返回主菜单.");getch();break;if(i=n+1)printf("ntt您所输入的学生学号有误或不存在!");printf("按任意键返回主菜单.");getch();return;void list()int i;system("cls");printf("nnttt 全体学生成绩情况如下n");printf("ttt=nn");printf("%-6s%-6s%-9s","学号","姓名","平均成绩");printf("%-12s%-6s%12sn","英语","C语言","高等数学"); for(i=0;i<=n;i+)printf("%-6s%-6s%8.2f",chengjii.xuehao,chengjii.name,chengjii.average); printf("%9.2f%9.2f%9.2f",chengjii.english,chengjii.math);void modify ( )char xuehao10; /*接收学生学号字符数组*/int i; /*循环变量*/if (n=-1) /*人数为0说明成绩记录尚未添加*/printf("nntt当前还没有学生成绩记录,按任意键返回主菜单.");getch( );return;printf("t请输入学生学号:"); /*提示信息*/gets(xuehao); /*从键盘读取字符串*/for (i=0;i<=n;i+) /*在学生总数范围内循环查找*/if(strcmp(chengjii.xuehao,xuehao)=0) /*比较并找到*/*显示该学生成绩情况*/printf("nttt 该学生成绩情况如下: ");printf("nttt=nn"); printf("%-6s%-6s%-9s","学号","姓名","平均成绩"); printf("%-12s%-6s%12s","英语","C语言","高等数学"); printf("%-6s%-6s",chengjii.xuehao,chengjii.name); printf("%9.2f%9.2f%9.2f%9.2f",chengjii.cyuyan,chengjii.math,chengjii.english,chengjii.average);/*接受该学生新的成绩情况*/ printf("ntt 请输入该学生新的英语成绩: ");scanf ("%f",&chengjii.cyuyan); printf("ntt 请输入该学生新的C语言成绩: ");scanf ("%f",&chengjii.math); printf("ntt 请输入该学生新的高等数学成绩: ");scanf ("%f",&chengjii.english);/*计算总成绩*/chengjii.average=(chengjii.cyuyan+chengjii.math+chengjii.english)/3;/*同屏显示计算结果*/ printf("nttt 该学生成绩是: %f",chengjii.average);printf("nntt 该学生成绩数据修改成功! 按任意键返回主菜单.");getch();return ;printf("ntt 您所输入的学生学号有误或不存在! ");printf("按任意键返回主菜单.");getch();return;/*向学生管理系统中则增加记录*/void add()printf ("t请输入学生学号:");fflush(stdin); /*清除键盘缓冲区*/gets(chengji+n.xuehao);printf("tttt请输入学生姓名:");gets(chengjin.name);printf("tttt请输入该学生的英语成绩:");scanf("%f",&chengjin.cyuyan);printf("tttt请输入该学生的C语言成绩:");scanf("%f",&chengjin.math);printf("tttt请输入该学生的高等数学成绩:");scanf("%f",&chengjin.english); /*计算总成绩*/chengjin.average=(chengjin.cyuyan+chengjin.math+chengjin.english)/3; /*输出内容*/printf("ntttt该学生成绩为:%f",chengjin.average);printf("nntttt按任意键返回.");getch();/*从学生成绩数据文件中删除记录*/void del()char xuehao10; /*接收学生学号字符数组*/int i,j; /*循环变量*/char d; /*接收确认删除字符:y/n*/ printf("t请输入待删除学生学号:");gets(xuehao);for(i=0;i<=n;i+) /*在学生总数范围内循环查找*/if(strcmp(chengjii.xuehao,xuehao)=0) /*比较并找到*/printf("ntt你确认要删除%s号学生成绩信息么(y/n)?",chengjii.xuehao );d=getche();if(d='y'|d='Y') /*确认删除*/if(i=n) /*如果是最后一条记录*/n-;else /*不是最后一条记录*/for(j=i;j<=n;j+) /*从该记录开始后续记录更新前一条记录*/strcpy(chengjij.xuehao,chengjij+1.xuehao);strcpy(chengjij.name,chengjij+1.name);chengjij.english=chengjij+1.english;chengjij.math=chengjij+1.math; chengjij.cyuyan=chengjij+1.cyuyan; n-;printf("nntt该学生记录成功删除,按任意键返回主菜单.");getch();break; else /*未确认删除记录*/printf("nntt你选择了不删除该学生记录,按任意键返回主菜单.");getch();return;if(i = n+1) /*未找到指定学号或未删除记录*/printf("ntt本班级无此学号,按任意键返回主菜单.");getch();/*排列学生的成绩*/void rank() int i,j; /*循环变量*/ printf("t按平均成绩排序如下n");for (i=0;i<n;i+)for(j=i+1;j<n;j+)if (chengjii.average>chengji j.average)*p=chengjij;chengjij=chengjii;chengjii=*p;printf("%-6s%-6s","学号","姓名"); printf("%-12s%-6s%12s%-9sn","英语","C语言","高等数学","平均成绩");for(i=0;i<=n;i+) printf("%-6s%-6s",chengjii.xuehao,chengjii.name); printf("%9.2f%9.2f%9.2f%9.2fn",chengjii.cyuyan,chengjii.math,chengjii.english,chengjii.average); printf("nntttt按任意键返回."); getch();七、程序运行结果1、主菜单 2、添加学生成绩记录3、删除学生成绩记录4、修改学生成绩记录5、成绩排序7、 查询学生成绩记录八、编程中遇到的困难及解决方法这一次的C语言课程设计报告是我第一次将C语言运用于实际,在这次