c语言大作业基于数组的学生信息管理系统.docx
- 文档编号:10181192
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:28
- 大小:76.44KB
c语言大作业基于数组的学生信息管理系统.docx
《c语言大作业基于数组的学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《c语言大作业基于数组的学生信息管理系统.docx(28页珍藏版)》请在冰点文库上搜索。
c语言大作业基于数组的学生信息管理系统
《C语言程序设计实训1》报告
设计题目:
基于数组的学生信息管理系统
学院名称:
科学技术学院
专业:
软件工程
班级:
108班
姓名:
大神学号******
提交日期:
2014年6月
一、实验内容
编写并调试程序,实现学校各专业班级学生信息的管理。
定义学生信息的结构体类型,包括:
学号、姓名、专业、班级、3门成绩。
N定义为符号常量(学生数)。
全局类型的定义如下:
#defineN10
structStudent{
intnum[15];//学号
charname[15];//姓名
charmajor[10];//专业(computer,software,network)
intclassNo;//班级(1-2)
intscore[3];//3门课的成绩(0-2)
};
typedefstructStudentSTU;
二、实验要求
(1)main函数:
以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
STUstudent[N];//保存输入的N名学生信息
(2)定义函数Input:
从键盘输入N个学生的信息。
(3)定义函数Save:
将学生信息存入文件。
(4)定义函数Output:
将某个学生信息表格化屏幕输出。
(5)定义函数Fetch:
从文件中随机读取第n个(0<=n<=N-1)学生的信息。
(6)定义函数Max:
求所有学生某门课程的最高分和分数最高的学生的姓名。
(7)定义函数Sort_select:
对所有学生,按平均成绩由低到高进行简单选择排序。
(8)定义函数Sort_buble:
对某个班级的学生,按平均成绩由高到低进行起泡排序。
并调用Output输出。
定义局部变量:
STUstu_class_ave[N];//按平均成绩排序后的某个班级的学生信息;
intcount;//实际元素个数
(9)定义函数Sort_insert:
对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。
并调用Output输出。
定义局部变量:
STUstu_class_subject[N];//按某门课程成绩排序后的某个专业的学生信息;
intcount;//实际元素个数
(10)定义函数Search:
实现班级和成绩的综合查找(如1班,总分240分以上同学)。
三、算法流程图
函数Sort_select的算法流程图
四、程序清单(关键语句和变量加注释)
#include
#include
#include
#defineN10//学生的总人数
#definepri(p)
printf("\n%d\t%s\t%8s\t%d\t%d\t%d\t%d\n",p->num,p->name,p->major,p->classNo,
p->score[0],p->score[1],p->score[2])
structStudent{
intnum;//学号
charname[15];//姓名
charmajor[10];//专业(computer,software,network)
intclassNo;//班级(1-2)
intscore[3];//3门课的成绩(0-2)
};
typedefstructStudentSTU;
//函数声明部分
voidInput(STU*p);
voidOutput(STU*p);
voidSave(STU*p);
intFetch(STU*st,intn,char*filename);
voidMax(STUstu[],intm);
doubleaverage_person(STU*p);
voidsort_select(STU*p);
voidSort_Buble(STU*p);
voidSort_insert(STU*p);
voidAsk();
voidSearch(STU*p);
voidLoad(STU*p);
//主函数开始
voidmain()
{
intchoose;//功能编号
inti,j,m,n;//控制循环的数字以及控制函数的数字
charfilename[10];//文件名称
STUstu[N];//定义长度为N的STU型的数组
STU*p;//定义STU型的指针
p=stu;//让其指向stu的数组,方便以后用指针p对数组stu直接操作
while
(1)
{
printf("\t\t*****欢迎使用学生信息管理系统*****\n");
printf("\t\t**********************************\n");
printf("\t1-输入学生信息;\n");
printf("\t2-学生信息存盘;\n");
printf("\t3-将某个学生信息表格化输出;\n");
printf("\t4-从文件中随机读取第n个学生的信息;\n");
printf("\t5-求所有学生某门课程的最高分和分数最高的学生的姓名;\n");
printf("\t6-对所有的学生,按总平均成绩由低到高进行简单选择排序;\n");
printf("\t7-对某个班级的学生,按总平均成绩由高到低进行起泡排序;\n");
printf("\t8-对某个专业的学生,按某门课程成绩由低到高进行直接插入排序;\n");
printf("\t9-班级和成绩的综合查找;\n");
printf("\t10-读取文件中的全部信息;\n");
printf("\t其他-退出。
\n");
printf("请输入您想选择的功能编号:
");
scanf("%d",&choose);
switch(choose)
{
case1:
{
for(i=0;i { Input(stu+i); } Ask(); break; } case2: { getchar(); Save(stu); printf("文件保存成功! \n"); Ask(); break; } case3: { printf("请输入想提取第几个学生的信息: \n"); scanf("%d",&n); if(n>=0&&n Output(stu+n-1); else printf("没有这名学生! 请重新输入! "); Ask(); break; } case4: //提取文件中的学生数据,放到内存中。 { printf("请输入读入的文件名: "); scanf("%s",filename); printf("请输入要提取信息的位置号: "); scanf("%d",&j); printf("请输入要存放信息的位置号: "); scanf("%d",&m); if(j>=0&&j<=N) { if(Fetch(stu+m,j,filename)==0) printf("提取失败! \n"); } Ask(); break; } case5: { printf("请输入想求最高分的科目: \n"); printf("如输入“0”为第0门成绩。 "); scanf("%d",&m); Max(p,m); Ask(); break; } case6: { printf("对所有的学生,按总平均成绩由低到高排序结果为: \n"); sort_select(stu); Ask(); break; } case7: { Sort_Buble(stu); Ask(); break; } case8: { Sort_insert(stu); Ask(); break; } case9: { getchar(); Search(stu); Ask(); break; } case10: { getchar(); Load(stu); } default: { break; } } if((choose<1)||(choose>10)) break;//breakwhile } } //函数部分 voidInput(STU*p) { intj; printf("请输入学生的学号,按Enter键结束: \n"); scanf("%d",&p->num); getchar(); printf("请输入学生的姓名字符串,按Enter键结束: \n"); gets(p->name); printf("请输入学生的专业字符串(computer,software,network),按Enter键结束: \n"); gets(p->major); printf("请输入学生的班级号(1-2),按Enter键结束: \n"); scanf("%d",&p->classNo); getchar(); printf("请输入学生的成绩(0-100): \n"); for(j=0;j<3;j++) { printf("请输入第%d门成绩: \n",j); scanf("%d",&p->score[j]); getchar(); } } voidOutput(STU*p) { printf("学号\t姓名\t专业\t\t班级\t成绩0\t成绩1\t成绩2\n"); pri(p); } doubleaverage_person(STU*p) { return(((p->score[0])+(p->score[1])+(p->score[2]))/3.0); } voidSave(STU*p) { FILE*fp; charfilename[20]; inti; printf("请输入要保存的文件名称: \n"); gets(filename); if((fp=fopen(filename,"wb"))==NULL) { printf("新建文件失败,请重试: \n"); return; } for(i=0;i { if(fwrite(p++,sizeof(STU),1,fp)! =1) printf("文件写入失败,请重试! \n"); } fclose(fp); } intFetch(STU*p,intn,char*filename) { FILE*fp; if((fp=fopen(filename,"rb"))==NULL) { fclose(fp); return0; } fseek(fp,(long)sizeof(STU)*n,0);//将位置指针从文件的开始往后移n个STU结构体的长度,n是提取的位置。 if((fread(p,sizeof(STU),1,fp))! =1) { printf("文件录入失败,请重试! "); fclose(fp); return0; } fclose(fp); return1; } voidMax(STUstu[],intm) { inti,index; inty[N]; STU*p; p=stu; for(i=1;i<=N;i++)//定义一个长度为N的数组,作为下标。 y[i-1]=i-1; switch(m) { case0: { for(i=1;i if((p+y[0])->score[0]<(p+y[i])->score[0])//让最高分的同学放到第一名的位置上来。 { index=y[0]; y[0]=y[i]; y[i]=index; } p=p+y[0]; printf("\t第0门最高分为: "); printf("%d\n",p->score[0]); printf("\t得最高分的同学名字是: "); puts(p->name); break; } case1: { for(i=1;i if((p+y[0])->score[1]<(p+y[i])->score[1]) { index=y[0]; y[0]=y[i]; y[i]=index; } p=p+y[0]; printf("\t第1门最高分为: "); printf("%d\n",p->score[1]); printf("\t得最高分的同学名字是: "); puts(p->name); break; } case2: { for(i=1;i if((p+y[0])->score[2]<(p+y[i])->score[2]) { index=y[0]; y[0]=y[i]; y[i]=index; } p=p+y[0]; printf("\t第2门最高分为: "); printf("%d\n",p->score[2]); printf("\t得最高分的同学名字是: "); puts(p->name); break; } default: break; } } //对所有学生,按总平均成绩由低到高进行简单选择排序。 voidsort_select(STU*p) { inti,j,k; doublet,aver[N]; STUa; for(i=0;i { aver[i]=average_person(p+i); //((*(p+i)).score[0]+(p+i)->score[1]+(p+i)->score[2])/3.0; } for(i=0;i { k=i;//确定要比较的数,先选择第一个数进行比较。 for(j=i+1;j if(aver[k]>aver[j]) k=j;//记下位置,继续让大的数和下一位进行比较。 t=aver[i];aver[i]=aver[k];aver[k]=t; //交换,把大的数向后移一位;如果if为假,k=i,相当于没交换。 a=*(p+i);*(p+i)=*(p+k);*(p+k)=a;//利用结构体指针变量交换结构体 } for(i=0;i printf("专业: %s\t班级: %d\t姓名: %s\t平均成绩: %5.3f\n",(p+i)->major,(p+i)->classNo,(p+i)->name,aver[i]); } //对某个班级的学生,按总平均成绩由高到低进行起泡排序。 voidSort_Buble(STU*p) { inti,j,b; doublet,aver[N]; STUa; printf("选择一个班级: \n"); scanf("%d",&b); for(i=0;i { aver[i]=average_person(p+i); } for(i=0;i for(j=0;j if(aver[j] { t=aver[j];aver[j]=aver[j+1];aver[j+1]=t; a=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=a; } for(i=0;i if((p+i)->classNo==b){ printf("姓名: %s\t平均分=%5.3f\n",(p+i)->name,aver[i]); } } //对某个专业的学生,按某门课程成绩由低到高进行直接插入排序 voidSort_insert(STU*p) { inti,j,id,tem; intscore[N]; charb[10]; intk=0;//用于计算学生数 STU*m; m=p; getchar();//吸收回车字符,避免让功能编号赋值到b printf("请输入你想查看成绩的专业: (c,n,s)\n"); gets(b); printf("请输入你要查看分数的课程(0,1,2)\n"); scanf("%d",&id); getchar(); for(i=0;i { if(strcmp(p->major,b)==0) { score[k]=p->score[id]; k++;//计算所选班级的学生数 } } for(i=1;i if(score[i] { tem=score[i];//等于小的那个数字 j=i-1;//记录大的数的位置 do { score[j+1]=score[j];//把大的数赋值给小的数,相当于把大的数字向后推了一位,但是原位置的数字不动 j--; } while(j>=0&&tem score[j+1]=tem;//把tem插入到j和j+1之间的位置。 } printf("--------------对该班级的学生,按课程%d成绩由低到高进行直接插入排序为: ------------\n",id); for(i=0;i { p=m; for(j=0;j { if(strcmp(p->major,b)==0&&(p->score[id]==score[i]))//并且该学生成绩的这门成绩=成绩数组的第一个数字 { Output(p); printf("\n"); } } } } //班级和成绩的综合查找 voidSearch(STU*head) { STU*p; intb,k,sum_scores; intlimit_score; k=0;//如果输入班级或总成绩有误,k的值不变。 与后面的if相关联。 printf("请输入班级号(1,2)\n"); scanf("%d",&b); getchar(); printf("请输入总成绩>=**的学生(**为分数)\n"); scanf("%d",&limit_score); printf("\t\t\t\t%d班总成绩>=%d的学生信息为: \t\t\t\t\n",b,limit_score); for(p=head;p { sum_scores=(p->score[0])+(p->score[1])+(p->score[2]); if((p->classNo)==b) { if(sum_scores>=limit_score)//满足班级号和成绩界限的才可以输出,不然k=0; { printf("该学生详细信息为: \n"); Output(p); printf("\n"); k++; } } } if(k==0) printf("您查找的数据不存在: \n"); } //询问是否返回的函数 voidAsk() { intc; printf("\n您所需要的功能已实现,是否继续进行? \n\"1\"继续;\"2\"退出系统\n"); scanf("%d",&c); if(c==2) exit(0); } //读取全部信息; voidLoad(STU*p) { charfilename[15]; FILE*fp; printf("要打开的文件名: \n"); gets(filename); if((fp=fopen(filename,"rb"))==NULL) { printf("文件打开失败! "); return; } if((fread(p++,sizeof(STU),N,fp))! =N) { printf("文件读取失败! 请重试! "); return; } else printf("文件读取成功! 请进行下一步操作! \n\n"); fclose(fp); } 五、程序测试(输入、输出的截图及文件的内容) 输入10个同学的信息: 保存文件: 打开文件,并且全部读取文件中的内容: 显示文件中的全部学生信息: (按照最初写入顺序(学号顺序)排列) 随机读取某个同学(第1-10个)的信息,并显示: 随机读取某个同学(第1-10个)的信息,并覆盖到存放位置号的学生信息中(不显示): 在全年级中求某门成绩的最高分,并输出了得最高分的同学的姓名: 按照平均成绩由低到高排列(选择法): 对某个班级的学生,按平均成绩由高到低进行排列(冒泡法): 对某个专业的学生,按某门课程成绩由低到高进行排序(插入法): 例如,software,课程2: 例如,computer,课程1: 班级和总成绩的综合查找: 例如,1班,总成绩大于240分以上的同学信息: 六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 作业 基于 数组 学生 信息管理 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)