C语言课程设计设计报告制作人:学号:指导老师:时间:一、设计内容和设计要求1、设计内容题目:学生成绩管理系统设计该系统包含20个学生姓名和成绩信息,可对成绩进行排序,并实现由姓名查找成绩及由成绩查找姓名。2、设计要求1)由键盘输入20个学生(姓名)的某门课程的学习成绩60~99分。2)将分数由低到高排序(用直接排序法和冒泡法),并显示学生姓名和对应的分数。3)用线性搜索法检索某个学生的成绩(输入姓名,显示成绩)。4)*对分搜索法检索某个学生的成绩(输入成绩,显示姓名)。二、设计思路首先是要建立20个学生信息,即学生姓名和学生成绩,使用子函数input输入,学生成绩使用一维数组,学生姓名使用二维数组。然后分别定义四个子函数,即直接排序法、冒泡排序法和线性查找法、对分查找法。在两个排序法中,用字符串拷贝函数来实现姓名的交换,另外,在用成绩查找姓名时,可以用直接查找,也可以用对分查找法,在这里我两种方法都使用了。最后在主函数中来设计人机界面,用switch函数来实现操作选择,对应的情况中就调用之前定义的子函数来完成排序或查找。三、程序设计流程图1、程序总体流程开始输入学生姓名和成绩主菜单排序退出查找直接排序冒泡排序查找成绩查找姓名对分查找2、直接排序法流程图子程序入口将i赋给min将i+1赋给j判断score[j]score[min]?score[j]与score[min]交换同时strcp实现name[j]与name[min]交换判断是否交换全部比较完毕,子程序结束YNYN,继续执行3、冒泡排序法流程图子程序入口外层i从0开始内层j从0开始判断score[j]score[j+1]?score[j]与score[j+1]交换同时strcp实现name[j]与name[j+1]交换判断是否交换全部比较完毕,子程序结束YNYN,继续执行4、线性搜索法子程序入口输入姓名字符chFor循环检索name[i]判断name[i]==ch?输出学生姓名和成绩不存在此学生子程序结束YN5、对分搜索法子程序入口n赋0值,m赋下标最大值输入成绩k判断k与score[i]的大小关系i+1赋给ni-1赋给m找到,输出学生成绩和姓名子程序结束(n+m)/2赋给ikscore[i]kscore[i]k=score[i]四、程序设计中遇到的问题和解决方案最开始编程时,直接排序和冒泡排序法中都是通过swap函数来实现成绩交换和姓名交换,以达到排序目的,但在主函数中调用时却调用不了,程序在排序时就不能正常运行,我的解决方案就是去掉swap函数,因为有可能有些函数的调用有限制条件,这样改变之后,就不存在限制问题,可以正常排序。另外一个问题就是姓名数组的交换问题,这个之前是用中间变量的方式实现交换,结果调试时显示非法,于是经过多次改变和尝试,发现姓名用二维数组更不容易出现问题,于是就将姓名设置为二维数组,然后用字符串拷贝函数来实现交换,以达到最终排序的目的。这样解决之后,一方面可以使姓名不至于限制在一个字符内,另外一个好处就是解决了排序过程中姓名交换的问题。五、源程序(含注释)及运行界面1、源程序#includestdio.h#includestring.h#includestdlib.h#defineNUM20voidinput(inta[],charb[][30])/*子函数input输入20个学生姓名*/{inti;for(i=0;iNUM;i++){printf(请输入第%d个学生的姓名:,i+1);scanf(%s,b[i]);printf(请输入第%d个学生的成绩:,i+1);scanf(%d,&a[i]);if(a[i]99||a[i]60){printf(error!\n);/*成绩大于99或小于60则显示错误*/i=i-1;}}}voidzhijie(inta[],charb[][30])/*直接排序法*/{inti,j,min,temp;chartemp1[30];for(i=0;iNUM-1;i++){min=i;for(j=i+1;jNUM;j++)if(a[j]a[min]){temp=a[j];a[j]=a[min];a[min]=temp;strcpy(temp1,b[j]);/*字符串拷贝函数进行字符数组交换*/strcpy(b[j],b[min]);strcpy(b[min],temp1);}}printf(排序后的学生姓名和成绩为:\n);for(i=0;iNUM;i++)printf(%s,%d\n,b[i],a[i]);}voidmaopao(inta[],charb[][30])/*冒泡排序法*/{inti,j,temp;chartemp1[30];for(i=0;iNUM-1;i++)for(j=0;jNUM-i-1;j++)if(a[j]a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;strcpy(temp1,b[j]);strcpy(b[j],b[j+1]);strcpy(b[j+1],temp1);}printf(排序后的学生姓名和成绩为:\n);for(i=0;i=NUM-1;i++)printf(%s,%d\n,b[i],a[i]);}voidxian1(inta[],charb[][30])/*线性查找,由姓名查找成绩*/{charch[30];inti,flag=0;scanf(%s,ch);for(i=0;iNUM;i++)if(strcmp(ch,b[i])==0){printf(该学生成绩为%d\n,a[i]);flag=1;break;}if(flag==0){printf(Nofound!\n);}}voidxian2(inta[],charb[][30])/*由成绩查找姓名*/{inti,flag=0;intk;printf(请输入成绩:);scanf(%d,&k);for(i=0;iNUM;i++)if(k==a[i]){printf(该学生姓名为%s,成绩为%d\n,b[i],a[i]);flag=1;break;}if(flag==0){printf(NOfound!\n);}}voidduifen(inta[],charb[][30])/*对分查找,由成绩查找姓名(排序后)*/{inti,n,m,k;printf(对分查找,请输入成绩:);scanf(%d,&k);n=0;m=NUM-1;if((ka[0])||(ka[NUM-1]))printf(error!\n);while(n=m){i=(n+m)/2;if(k==a[i]){printf(学生姓名为:%s,成绩为:%d\n,b[i],a[i]);break;}elseif(ka[i])n=i+1;elsem=i-1;}if((a[i]!=k)||(nm))printf(NOfound!\n);}voidmain()/*主函数及界面*/{intx,t,score[NUM];charname[NUM][30];printf(***************************************************************\n);printf(欢迎来到学生成绩管理系统\n);printf(***************************************************************\n);printf(请输入20个学生的姓名和成绩\n);input(score,name);printf(输入的学生姓名和成绩分别为:\n);for(x=0;xNUM;x++){printf(%s,%d\t,name[x],score[x]);}printf(\n);printf(*****************学生成绩管理系统***************\n);printf(*********成绩排序直接法请按0成绩排序冒泡法请按1*******\n);printf(*********姓名查找方法一请按2成绩查找方法二请按3*******\n);printf(*********退出系统请按4*******\n);printf(请选择:\t);while(1){scanf(%d,&t);switch(t)/*操作选择*/{case0:zhijie(score,name);duifen(score,name);break;case1:maopao(score,name);duifen(score,name);break;case2:printf(请输入学生姓名:\n);xian1(score,name);break;case3:xian2(score,name);break;case4:exit(0);/*退出系统*/break;default:printf(请在0到4之间选择!\n);}}}2、运行界面输入学生信息主菜单直接排序冒泡排序线性查找对分查找六、体会及收获1、关于体会这次C语言课程设计给我最大的体会是充分调用了我们已有的C语言知识储备,我想,难度就在于这里,要求我们对每一个知识点,每一个内容板块都了如指掌。如果有哪里不清楚,编程时就会频繁出错,或者是达不到想要的结果,比如像循环语句、条件语句、选择语句这些常用的就必须烂熟于心。如遇到问题,尝试独立思考,若还没有解决就再翻书或找找资料,自行琢磨,不断尝试用新的方法解决问题也是给我的一个很深的体会。2、关于收获这次有以下几方面收获:1)再次温习了所学的C语言知识,加深了理解,同时之前没有注意的一些细节问题引起了重视;2)遇到瓶颈时,尽量独立思考,不断努力,自行解决;3)当程序没有出现语法错误但运行不正常时,就要用新的方式替换,不能一味地陷在死胡同里,用新的思维方式想问题或许会达到想要的效果;4)多花时间钻研问题,坚持不懈地努力,多掌握一些知识,今后解决学习问题才会得心应手。编程不仅只是考查知识是否掌握牢固,也不只是一个时间问题,更重要的是一种毅力,一种坚持,一种迎难而上的韧劲!