《学生成绩管理系统C语言课程设计报告.doc》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言课程设计报告.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言课程设计 设 计 报 告 制作人: 学号: 指导教师: 时间:第 14 页一、设计内容与设计要求 1、设计内容 题目:学生成绩管理系统设计 该系统包含20个学生姓名与成绩信息,可对成绩进展排序, 并实现由姓名查找成绩及由成绩查找姓名。 2、设计要求 1由键盘输入20个学生姓名的某门课程的学习成 绩6099分。 2将分数由低到高排序用直接排序法与冒泡法,并显示学生姓名与对应的分数。 3) 用线性搜索法检索某个学生的成绩输入姓名,显示成绩。 4 )*对分搜索法检索某个学生的成绩输入成绩,显示姓名。二、 设计思路 首先是要建立20个学生信息,即学生姓名与学生成绩,使用子函数input输入,学生
2、成绩使用一维数组,学生姓名使用二维数组。然后分别定义四个子函数,即直接排序法、冒泡排序法与线性查找法、对分查找法。在两个排序法中,用字符串拷贝函数来实现姓名的交换,另外,在用成绩查找姓名时,可以用直接查找,也可以用对分查找法,在这里我两种方法都使用了。最后在主函数中来设计人机界面,用switch函数来实现操作选择,对应的情况中就调用之前定义的子函数来完成排序或查找。三、 程序设计流程图 1、程序总体流程 开场 输入学生姓名与成绩 主菜单 排序 退出 查找直接排序 冒泡排序 查找成绩 查找姓名 对分查找 2、直接排序法流程图子程序入口将i赋给min将i+1赋给jscorej与scoremin交换
3、同时strcp实现namej与namemin交换全部比拟完毕,子程序完毕判断是否交换判断scorejscorej+1N,继续执行YNY4、 线性搜索法NY 子程序完毕 不存在此学生输出学生姓名与成绩 For循环检索namei 输入姓名字符ch 子程序入口判断namei=ch 5、对分搜索法k=scoreikscorei (n+m)/2赋给in赋0值,m赋下标最大值 子程序入口 输入成绩k判断k与scorei的大小关系子程序完毕 找到,输出学生成 绩与姓名i-1赋给mi+1赋给n 四、 程序设计中遇到的问题与解决方案最开场编程时,直接排序与冒泡排序法中都是通过swap函数来实现成绩交换与姓名交换
4、,以到达排序目的,但在主函数中调用时却调用不了,程序在排序时就不能正常运行,我的解决方案就是去掉swap函数,因为有可能有些函数的调用有限制条件,这样改变之后,就不存在限制问题,可以正常排序。另外一个问题就是姓名数组的交换问题,这个之前是用中间变量的方式实现交换,结果调试时显示非法,于是经过屡次改变与尝试,发现姓名用二维数组更不容易出现问题,于是就将姓名设置为二维数组,然后用字符串拷贝函数来实现交换,以到达最终排序的目的。这样解决之后,一方面可以使姓名不至于限制在一个字符内,另外一个好处就是解决了排序过程中姓名交换的问题。五、 源程序含注释及运行界面1、源程序#include#include#
5、include#define NUM 20void input(int a,char b30) /*子函数input输入20个学生姓名*/int i;for(i=0;i99|ai60)printf(error!n); /*成绩大于99或小于60那么显示错误*/i=i-1;void zhijie(int a,char b30) /*直接排序法*/int i,j,min,temp;char temp130;for(i=0;iNUM-1;i+)min=i; for(j=i+1;jNUM;j+)if(ajamin)temp=aj;aj=amin;amin=temp;strcpy(temp1,bj);
6、/*字符串拷贝函数进展字符数组交换*/strcpy(bj,bmin);strcpy(bmin,temp1);printf(排序后的学生姓名与成绩为:n);for(i=0;iNUM;i+)printf(%s,%dn,bi,ai);void maopao(int a,char b30) /*冒泡排序法*/int i,j,temp;char temp130;for(i=0;iNUM-1;i+)for(j=0;jaj+1)temp=aj;aj=aj+1;aj+1=temp;strcpy(temp1,bj);strcpy(bj,bj+1);strcpy(bj+1,temp1); printf(排序后的学
7、生姓名与成绩为:n); for(i=0;i=NUM-1;i+) printf(%s,%dn,bi,ai);void xian1(int a,char b30) /*线性查找,由姓名查找成绩*/char ch30;int i,flag=0;scanf(%s,ch);for(i=0;iNUM;i+)if(strcmp(ch,bi)=0)printf(该学生成绩为%dn,ai);flag=1;break;if(flag=0)printf(No found!n);void xian2(int a,char b30) /*由成绩查找姓名*/int i,flag=0;int k;printf(请输入成绩:
8、);scanf(%d,&k);for(i=0;iNUM;i+)if(k=ai)printf(该学生姓名为%s,成绩为%dn,bi,ai);flag=1;break;if(flag=0)printf(NO found!n);void duifen(int a,char b30) /*对分查找,由成绩查找姓名(排序后)*/ int i,n,m,k;printf(对分查找,请输入成绩:);scanf(%d,&k);n=0;m=NUM-1;if(kaNUM-1)printf(error!n);while(nai)n=i+1;elsem=i-1;if(ai!=k)|(nm)printf(NO found
9、!n);void main() /*主函数及界面*/int x,t,scoreNUM;char nameNUM30;printf(*n);printf( 欢送来到学生成绩管理系统 n);printf(*n);printf(请输入20个学生的姓名与成绩n);input(score,name);printf(输入的学生姓名与成绩分别为:n);for(x=0;xNUM;x+)printf(%s,%dt,namex,scorex);printf(n);printf( *学生成绩管理系统* n); printf(*成绩排序直接法请按0 成绩排序冒泡法请按1*n);printf(*姓名查找方法一请按2 成
10、绩查找方法二请按3*n);printf(* 退出系统请按4 *n);printf( 请选择:t);while(1)scanf(%d,&t);switch(t) /*操作选择*/ case 0: zhijie(score,name); duifen(score,name);break; case 1: maopao(score,name); duifen(score,name);break; case 2: printf(请输入学生姓名:n); xian1(score,name);break; case 3: xian2(score,name);break; case 4: exit(0); /
11、*退出系统*/ break; default: printf(请在0到4之间选择!n);2、 运行界面 输入学生信息 主菜单 直接排序 冒泡排序 线性查找 对分查找六、 体会及收获 1、关于体会这次C语言课程设计给我最大的体会是充分调用了 我们已有的C语言知识储藏,我想,难度就在于这里,要求我们对每一个知识点,每一个内容板块都了如指掌。如果有哪里不清楚,编程时就会频繁出错,或者是达不到想要的结果,比方像循环语句、条件语句、选择语句这些常用的就必须烂熟于心。如遇到问题,尝试独立思考,假设还没有解决就再翻书或找找资料,自行琢磨,不断尝试用新的方法解决问题也是给我的一个很深的体会。2、 关于收获 这次有以下几方面收获: 1再次温习了所学的C语言知识,加深了理解,同时之前没有注意的一些细节问题引起了重视;2遇到瓶颈时,尽量独立思考,不断努力,自行解决;3当程序没有出现语法错误但运行不正常时,就要用新的方式替换,不能一味地陷在死胡同里,用新的思维方式想问题或许会到达想要的效果;4多花时间钻研问题,坚持不懈地努力,多掌握一些知识,今后解决学习问题才会得心应手。 编程不仅只是考察知识是否掌握结实,也不只是一个时间问题,更重要的是一种毅力,一种坚持,一种迎难而上的韧劲!