用C语言设计管理学生的成绩.docx
《用C语言设计管理学生的成绩.docx》由会员分享,可在线阅读,更多相关《用C语言设计管理学生的成绩.docx(18页珍藏版)》请在冰豆网上搜索。
用C语言设计管理学生的成绩
C语言程序设计流程
一、题目内容的描述
全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数、指针和文件的操作,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。
二、应用程序功能的详细说明
设计一个程序名为:
学生成绩管理
程序的功能:
1、成绩的录入。
录入学生的姓名,学号,C语言成绩,高数成绩,英语成绩。
当录入完毕的时候在输入姓名的地方输入ps结束录入。
2、成绩的查询。
选择查询的方式:
姓名和学号,按1的时候选择以姓名的方式查询,输入学生的姓名,回车键。
如果名字正确的话会出现学生的信息,名字输入出错会出现查询失败。
以学号的方式查询同理。
3、信息的修改。
首先输入要修改的学生的姓名,然后会出现修改前学生的信息。
然后依次出现请输入该生的C语言成绩,高数成绩,英语成绩,然后就会出现修改后学生的信息。
如果输入的姓名有误的话,会出现修改失败。
4、插入学生信息。
请输入插入的学生的姓名,学号,C语言成绩,高数成绩,英语成绩,插入的位置。
5、显示已输入的学生的信息。
包括学生的姓名,学号,C语言的成绩,高数,英语,还有平均分,总分。
6、统计出学生成绩的排档情况。
按平均分的情况,分为不及格的人,60-79分的,80-89分的,90分以上的学生。
7、删除单个学生的信息。
直接输入学生的姓名,然后就会出现删除后学生信息的显示。
当输入的学生的姓名错误的时候,显示输入失败。
0退出功能。
当选择0的时候出现欢迎使用,然后按任意键退出程序。
三、输入数据类型、格式和内容限制;
本题运用
#define宏定义命令,在题目中,#define命令行定义N代表常数量20。
姓名是用char字符型定义。
学号是用int整数型。
C语言成绩、高数的成绩、英语的成绩、平均分、总分用float浮点型定义。
system("cls");清屏
FILE*fp;
studentxs;/*定义一个结构体变量来装从文件中读出来的数据*/
fwrite(&xs,sizeof(stu),1,fp);//将成绩信息写入文件
fclose(fp);关闭文件
feof(fp)若到文件末尾。
函数值为“真”(非0)
fread()从指定中读取数据项
getch();/*让屏幕停留同时按任意键返回*/
if语句判断给定的条件是否满足
switch多分支选择语句
for循环语句
四、主要模块的算法描述
五、结束语
通过这次实训,我们分小组做题目,再次全面熟悉、掌握C语言基本知识,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,培养逻辑思维能力,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。
附录:
程序代码:
#include
#include
#include
#include
#defineN20
structstudent
{
charname[10];
intnum;
floatc;
floatmath;
floatenglish;
floataver;
floatsum;
}stu;
//菜单
voidmenu()/*便于操作员使用*/
{/*清屏*/
system("cls");
printf("*学生平时成绩管理*\n");
printf("*=======================*\n");
printf("*1.成绩录入*\n");
printf("*2.查询*\n");
printf("*3.修改*\n");
printf("*4.插入*\n");
printf("*5.显示*\n");
printf("*6.统计*\n");
printf("*7.删除*\n");
printf("*0.退出*\n");
printf("*=======================*\n");
printf("*请选择相应的功能:
*\n");
}
//成绩录入
voidinput()
{
system("cls");
FILE*fp;
studentxs;/*定义一个结构体变量来装从文件中读出来的数据*/
if((fp=fopen("student.dat","ab"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
printf("\n成绩录入");
printf("\n****************************************************");
printf("\n当输入姓名为ps结束录入\n");
while
(1)/*中间加油break,可使循环中断*/
{printf("\n请输入您的姓名:
");
scanf("%s",xs.name);
if(strcmp(xs.name,"ps")==0)break;/*判断姓名是否为ps,用字符串判断*/
printf("\n请输入学号:
");
scanf("%d",&xs.num);
printf("\n请输入c语言的成绩:
");
scanf("%f",&xs.c);
printf("\n请输入高数的成绩:
");
scanf("%f",&xs.math);
printf("\n请输入英语的成绩:
");
scanf("%f",&xs.english);
xs.aver=0;/*给平均分变量赋初值*/
xs.aver=(xs.c+xs.math+xs.english)/3;
xs.sum=0;
xs.sum=xs.c+xs.math+xs.english;
fwrite(&xs,sizeof(stu),1,fp);//将成绩信息写入文件
system("cls");
}
fclose(fp);
}
voidxingming()
{
FILE*fp;
studentxs;
charname[10];
printf("\n输入要查学生的姓名:
");scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*按姓名查询时判断输入的姓名是否存在,会循环从数据中找取*/
{
printf("\n学生的信息如下:
\n");
printf("\n%10s%6s%6s%6s%6s%6s%6s\n","姓名","学号","C语言","高数","英语","平均成绩","总分");
printf("\n%10%6d%6.2f%6.2f%6.2f%6.2f%6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver,xs.sum);
break;
}
}
if(feof(fp))
printf("\n查找失败!
!
!
");/*学生不存在*/
fclose(fp);
}
voidxuehao()
{
FILE*fp;
studentxs;
intnum;
printf("\n输入要查学生的学号:
");scanf("%d",&num);
if((fp=fopen("student.dat","rb"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*按学号查询时判断输入的学号是否存在,会循环从数据中找取*/
{
printf("\n学生的信息如下:
\n");
printf("\n%10s%6s%6s%6s%6s%6s%6s\n","姓名","学号","C语言","高数","英语","平均成绩","总分");
printf("\n%10s%6d%6.2f%6.2f%6.2f%6.2f%6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver,xs.sum);
break;
}
}
if(feof(fp))printf("\n查找失败!
!
!
");
fclose(fp);
}
//查询
voidsearch()
{
charch1;
system("cls");
printf("请输入按何种方式查询:
\n");
printf("\n1-姓名,2-学号:
");
ch1=getchar();/*用字符接收*/
switch(ch1)/*判断*/
{
case'1':
xingming();break;
case'2':
xuehao();break;
}
printf("\n按任意键返回主菜单");
getch();/*让屏幕停留同时按任意键返回*/
}
//修改:
输入学生的姓名,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;
voidmodi()
{
studentxs;
FILE*fp;
charname[10];
system("cls");
printf("\n输入要修改的学生的姓名:
");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*判断输入要修改的姓名是否存在*/
{
printf("修改前学生的信息如下:
\n");
printf("\n%10s%6s%6s%6s%6s%6s%6s\n","姓名","学号","C语言","高数","英语","平均成绩","总分");
printf("\n%10s%6d%6.2f%6.2f%6.2f%6.2f%6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver,xs.sum);
printf("\n请输入该生的C语言成绩:
");scanf("%f",&xs.c);
printf("\n高数成绩:
");scanf("%f",&xs.math);
printf("\n英语成绩:
");scanf("%f",&xs.english);
xs.aver=(xs.c+xs.math+xs.english)/3;
xs.sum=xs.c+xs.math+xs.english;
break;
}
}
if(!
feof(fp))
{
printf("\n修改后的学生的信息如下:
\n");
printf("\n%10s%6s%6s%6s%6s%6s%6s\n","姓名","学号","C语言","高数","英语","平均成绩","总分");
printf("\n%10s%6d%6.2f%6.2f%6.2f%6.2f%6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver,xs.sum);
fseek(fp,sizeof(stu),1);/*负号表示后退,1表示文件当前位置*/
fwrite(&xs,sizeof(stu),1,fp);/*再写入,同时把要修改的那个覆盖掉*/
}
else
printf("\n学生不存在,修改失败!
!
");
fclose(fp);
printf("\n按任意键返回主菜单");
getch();
}
//插入:
输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果。
voidinsert()
{
inti=0,j,k,lenth;
FILE*fp;
students,xs[N];
system("cls");
printf("\n请输入插入的学生的姓名:
");scanf("%s",&s.name);
printf("\n学生的学号:
");scanf("%d",&s.num);
printf("\n学生的C成绩:
");scanf("%f",&s.c);
printf("\n高数成绩:
");scanf("%f",&s.math);
printf("\n英语成绩:
");scanf("%f",&s.english);
s.aver=(s.c+s.math+s.english)/3;
s.sum=s.c+s.math+s.english;
printf("\n插入位置:
");scanf("%d",&k);
//i=0;
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("can'topenfile!
\n");exit(0);
}
while(!
feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/
if(feof(fp))break;
i++;
}
fclose(fp);
lenth=i;
if(k=0)/*k的位置要位于数组范围之内*/
{//插入
for(j=lenth-1;j>=k;j--)
xs[j+1]=xs[j];/*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/
/*循环是只循环这一句的*/
xs[k]=s;/*将输入的学生信息加入这个k位置*/
lenth++;/*长度+1*/
//写回
if((fp=fopen("student.dat","wb"))==NULL)
{
printf("不能建立文件!
!
\n");exit(0);
}
for(i=0;ifwrite(&xs[i],sizeof(stu),1,fp);
}
else/*不再数组范围之内*/
{
if((fp=fopen("student.dat","ab"))==NULL)
{
printf("不能建立文件!
!
\n");exit(0);
}
fwrite(&s,sizeof(stu),1,fp);
}
printf("\n按任意键返回主菜单");
fclose(fp);
}
//显示
voidprint()
{
FILE*fp;
students;
system("cls");
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("can'topenfile!
\n");exit(0);
}
printf("学生成绩表");
printf("\n*****************************************************");
printf("\n%10s%s%6s%6s%6s%6s%6s\n","姓名","学号","C语言","高数","英语","平均成绩","总分");
while(!
feof(fp))
{
fread(&s,sizeof(stu),1,fp);//从文件中读取成绩信息
if(feof(fp))break;//判断是否文件尾
printf("\n%10s%6d%6.2f%6.2f%6.2f%6.2f%6.2f\n",s.name,s.num,s.c,s.math,s.english,s.aver,s.sum);
}
fclose(fp);
printf("\n按任意键返回主菜单");
getch();
}
//统计
voidtongji()
{
inti=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;
FILE*fp;
students[N],*p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL){printf("cant'topenfile!
\n");exit(0);}
while(!
feof(fp))
{
fread(&s[i++],sizeof(stu),1,fp);/*读入数据*/
if(feof(fp))break;
}
t=i;i=0;
for(u=0;u{
if(s[i].aver<60){p1[j++]=&s[i++];continue;}/*每个学生信息只能位于一个分数段*/
if(s[i].aver>=60&&s[i].aver<80){p2[k++]=&s[i++];continue;}
if(s[i].aver>=80&&s[i].aver<90){p3[l++]=&s[i++];continue;}
if(s[i].aver>=90){p4[m++]=&s[i++];continue;}
}
printf("学生成绩单");
printf("************************************************");
printf("\n不及格的人有:
姓名学号平均分\n");
for(n=0;n{
printf("\n%10s%6d%6.2f\n",p1[n]->name,p1[n]->num,p1[n]->aver);
}
printf("\n60-79分的人有:
姓名学号平均分\n");
for(p=0;p{
printf("\n%10%6d%6.2f\n",p2[p]->name,p2[p]->num,p2[p]->aver);
}
printf("\n80-89分的人有:
姓名学号平均分\n");
for(q=0;q{
printf("\n%10s%6d%6.2f\n",p3[q]->name,p3[q]->num,p3[q]->aver);
}
printf("\n90以上的人有:
姓名学号平均分\n");
for(r=0;r{
printf("\n%10s%6d%6.2f\n",p4[r]->name,p4[r]->num,p4[r]->aver);
}
fclose(fp);
printf("\n按任意键返回主菜单");
getch();
}
//删除:
输入学生姓名,若该学生存在,则删除,并显示删除后余下的学生成绩信息
voiddele()
{
studentxs[N];
FILE*fp;
charname[10];
inti=0,len,k=-1/*k<0是为后面if判断用的*/;
system("cls");
printf("\n输入要删除的学生姓名:
");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);
if(feof(fp))break;
if(strcmp(xs[i].name,name)==0)k=i;
i++;
}
fclose(fp);
//以下是删除后重新写文件
len=i;/*结构体数组上限*/
if(k>=0)/*k>0说明找到删除学生位置*/
{
if((fp=fopen("student.dat","wb+"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
for(i=0;i{
if(i==k)continue;/*从这个位置开始写入*/
fwrite(&xs[i],sizeof(stu),1,fp);
}
fclose(fp);
}
else{printf("\n删除失败!
!
!
\n");getch();}/*失败后重新返回菜单*/
printf("\n按任意键返回主菜单");
print();
}
//菜单选择
voidmain()
{
charch;
while
(1)
{
menu();//显示菜单
ch=getch();//选择菜单
if(ch=='0')break;
switch(ch)//判断功能项
{
case'1':
input();break;
case'2':
search();break;
case'3':
modi();break;
case'4':
insert();break;
case'5':
print();break;
case'6':
tongji();break;
case'7':
dele();break;
}
}
printf("\n谢谢使用!
!
!
\n");
}