资源描述
目录
学生成绩管理程序 2
题目要求 2
设计目的 3
总体设计 3
详细设计 4
1、宏定义,进行预处理。 4
2、主菜单函数 4
3、输入函数 6
4、查询函数 8
5、修改函数 9
6、插入函数 11
7、显示函数 13
8、统计函数 14
9、删除函数 17
10、菜单选择函数 19
11、退出系统 20
心得体验 21
程序清单: 21
学生成绩管理程序
题目要求
1. 问题描述:
对在校学生几门课程的考试成绩进行统一管理.每个学生记录包括学号,姓名,性别,数学,英语,程序,语文成绩,默认以学号为序存放.
2. 要求:
(1)一个文件按以班为单位存储学生记录.
(2)将允许的操作分为四种,以A,B ,C,D,E,F为标志:
A:插入一个学生记录;
B:修改学生记录;
C:删除一个学生记录;
D:查找一个学生记录;
E:浏览学生成绩:
F:退出
3. 计算学生的总成绩.
4. 按学号排序输出全班学生成绩表
.
设计目的
根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择.
总体设计
根据上面的需求分析,可以将这个系统分为以下模块:输入模块,修改模块,删除模块,查找模块,显示模块.排序模块。其中嵌入相关函数
以下为大概模块框架:
详细设计
1、宏定义,进行预处理。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 100
struct student
{
char name[10];
int num;
char sex[10];
float math;
float yingyu;
float proj;
float ywen;
float aver;
float sum;
}stu;
2、主菜单函数
//菜单
void menu()
{
system("cls"); /*清屏*/
printf("======================================================================\n");
printf(" * 欢迎使用学生成绩管理系统 * \n");
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");
printf(" \n\n\n\n\n\n\n * * 电子14-1,潘才身(14034520123)制作 * * \n");
}
3、输入函数
//成绩录入函数
void input()
{
system("cls");
FILE *fp;
student xs;/*定义一个结构体变量来装从文件中读出来的数据*/
int c=1;
if((fp=fopen("student.dat","ab"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
printf("\n 成绩录入 ");
printf("\n****************************************************");
while(c++)
{
printf("\n 请输入您的姓名(结束请输入姓名为ok):");
scanf("%s",xs.name);
if(strcmp(xs.name,"ok")==0) break;/*判断姓名是否为ok,用字符串判断*/
printf("\n 请输入学号:");
scanf("%d",&xs.num);
printf("\n 性别:");
scanf("%s",&xs.sex);
printf("\n 请输入高数的成绩:");
scanf("%f",&xs.math);
printf("\n 请输入英语的成绩:");
scanf("%f",&xs.yingyu);
printf("\n 请输入程序的成绩:");
scanf("%f",&xs.proj);
printf("\n 请输入语文的成绩:");
scanf("%f",&xs.ywen);
xs.aver=0;/*给平均分变量赋初值*/
xs.aver=(xs.math+xs.yingyu+xs.proj+xs.ywen)/4;
xs.sum=0;
xs.sum=xs.math+xs.yingyu+xs.proj+xs.ywen;
fwrite(&xs,sizeof(stu),1,fp); //将成绩信息写入文件
system("cls");
}
fclose(fp);
}
//姓名查找函数
void xingming()
{
FILE *fp;
student xs;
char name[10];
printf("\n 输入要查学生的姓名: ");
scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL)//读取存放好的数据
{
printf("can't open file!\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 %6s %6s\n","姓名","学号","性别","高数","英语","程序","语文","平均成绩","总成绩");
printf("\n %10s %6d%6s %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.sex,xs.math,xs.yingyu,xs.proj,xs.ywen,xs.aver,xs.sum);
break;
}
}
if(feof(fp))
printf("\n 查找失败!!!"); /*学生不存在*/
fclose(fp);
}
//学号查询函数
void xuehao()
{
FILE *fp;
student xs;
int num;
printf("\n 输入要查学生的学号: ");
scanf("%d",&num);
if((fp=fopen("student.dat","rb"))==NULL)//读取数据
{
printf("can't open file!\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 %6s %6s\n","姓名","学号","性别","高数","英语","程序 ","语文","平均成绩","总成绩");
printf("\n %10s %6d%6s %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.sex,xs.math,xs.yingyu,xs.proj,xs.ywen,xs.aver,xs.sum);
break;
}
}
if(feof(fp)) printf("\n 查找失败!!!");
fclose(fp);
}
4、查询函数
//查询函数
void search()
{
char ch1;
system("cls");
printf(" 请输入按何种方式查询:\n");
printf("\n 1-姓名,2-学号:");
ch1=getchar();/*用字符接收*/
switch(ch1)/*判断*/
{
case '1':xingming();break;//姓名查询
case '2':xuehao();break;//学号查询
}
printf("\n 按任意键返回主菜单 ");
getch();/*让屏幕停留同时按任意键返回*/
}
5、修改函数
//修改:输入学生的姓名,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;
void modi()
{
student xs;
FILE *fp;
char name[10];
system("cls");
printf("\n 输入要修改的学生的姓名: ");
scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf("can't open file!\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 %6s %6s\n","姓名","学号","性别","高数","英语","程序 ","语文","平均成绩","总成绩");
printf("\n %10s %6d %6s %6.2f %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.sex,xs.math,xs.yingyu,xs.proj,xs.ywen,xs.aver,xs.sum);
printf("\n 请输入该生的高数成绩:");scanf("%f",&xs.math);
printf("\n 英语成绩:");scanf("%f",&xs.yingyu);
printf("\n 程序成绩:");scanf("%f",&xs.proj);
printf("\n 语文成绩:");scanf("%f",&xs.ywen);
xs.aver=(xs.math +xs.yingyu +xs.proj +xs.ywen)/4;
xs.sum=xs.math +xs.yingyu +xs.proj +xs.ywen;
break;
}
}
if(!feof(fp))
{
printf(" \n 修改后的学生的信息如下:\n");
printf("\n %10s %6s %6s %6s %6s %6s %6s %6s %6s\n","姓名","学号","性别","高数","英语","程序 ","语文","平均成绩","总成绩");
printf("\n %10s %6d %6s %6.2f %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.sex,xs.math,xs.yingyu,xs.proj,xs.ywen,xs.aver,xs.sum);
fseek(fp,sizeof(stu),1);/*负号表示后退,1表示文件当前位置*/
fwrite(&xs,sizeof(stu),1,fp);/*再写入,同时把要修改的那个覆盖掉*/
}
else
printf("\n 学生不存在,修改失败!!");
fclose(fp);
printf("\n 按任意键返回主菜单 ");
getch();
}
6、插入函数
//插入:输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果。
void insert()
{
int i=0,j,k,lenth;
FILE *fp;
student s,xs[N];
system("cls");
printf("\n 请输入插入的学生的姓名:");
scanf("%s",&s.name);
printf("\n 学生的学号:");scanf("%d",&s.num);
printf("\n 学生的性别:");scanf("%s",&s.sex);
printf("\n 高数成绩:");scanf("%f",&s.math);
printf("\n 英语成绩:");scanf("%f",&s.yingyu);
printf("\n 程序成绩:");scanf("%f",&s.proj);
printf("\n 语文成绩:");scanf("%f",&s.ywen);
s.aver=(s.math+s.yingyu+s.proj+s.ywen)/4;
s.sum= s.math+s.yingyu+s.proj+s.ywen;
printf("\n 插入位置:");
scanf("%d",&k);
if((fp=fopen("student.dat","rb"))==NULL)
{
printf(" can't open file!\n");
exit(0);
}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/
if(feof(fp)) break;
i++;
}
fclose(fp);
lenth=i;
if(k<lenth && 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;i<lenth;i++)
fwrite(&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);
}
7、显示函数
//显示函数
void print()
{
FILE *fp;
student s;
system("cls");
if((fp=fopen("student.dat","rb"))==NULL)
{
printf(" can't open file!\n");
exit(0);
}
printf(" 学生成绩表 ");
printf("\n *****************************************************");
printf("\n %10s %10s%6s %6s %6s %6s %6s %6s %6s \n","姓名","学号","性别","高数","英语"," 程序"," 语文"," 平均成绩","总成绩");
while(!feof(fp))
{
fread(&s,sizeof(stu),1,fp);//从文件中读取成绩信息
if(feof(fp)) break;//判断是否文件尾
printf("\n %10s %6d %6s %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n",s.name,s.num,s.sex,s.math,s.yingyu,s.proj,s.ywen,s.aver,s.sum);
}
fclose(fp);
printf("\n 按任意键返回主菜单 ");
getch();
}
8、统计函数
//统计函数
void tongji()
{
int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;
FILE *fp;
student s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("cant't open file!\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<t;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("\n 90以上的人有: 姓名 学号 平均分\n");
for(r=0;r<m;r++)
{
printf("\n %10s %6d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->aver);
}
printf("\n 80-89分的人有: 姓名 学号 平均分\n");
for(q=0;q<l;q++)
{
printf("\n %10s %6d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->aver);
}
printf("\n 60-79分的人有: 姓名 学号 平均分\n");
for(p=0;p<k;p++)
{
printf("\n %10s %6d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->aver);
}
printf("\n 不及格的人有: 姓名 学号 平均分\n");
for(n=0;n<j-1;n++)
{
printf("\n %10s %6d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->aver);
}
fclose(fp);
printf("\n 按任意键返回主菜单 ");
getch();
}
9、删除函数
//删除:输入学生姓名,若该学生存在,则删除,并显示删除后余下的学生成绩信息
void dele()
{
student xs[N];
FILE *fp;
char name[10];
int i=0,len,k=-1/*k<0是为后面if判断用的*/;
system("cls");
printf("\n 输入要删除的学生姓名: ");
scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf(" can't open file!\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't open file!\n");
exit(0);
}
for(i=0;i<len;i++)
{
if(i==k) continue;/*从这个位置开始写入*/
fwrite(&xs[i],sizeof(stu),1,fp);
}
fclose(fp);
}
else
{
printf("\n 删除失败!!!\n");
getch();
} /*失败后重新返回菜单*/
printf("\n 按任意键返回主菜单 ");
print();
}
10、菜单选择函数
//菜单选择
void main()
{
char ch;
system("color 3f");
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;
}
}
}
11、退出系统
在主函数中,加一个if函数,判断功能选择项是否为“0”,如果为“0”,则中断整个主函数,否则继续主函数:
if(ch=='0') break;
心得体验
C语言,个人认为是一门很有趣的科目,就像人和机器对话,这次做作业也得心应手,除了文件处理这个模块没有细学,感到吃紧之外,其余的都还可以。
这次的课程设计总体来说,比前段时期的C语言综合实验难度大了,而且综合性更强,少了综合实验是老师给我们提供的那些函数,所有的函数都要自己去想,自己去找,翻阅好多的书,上机自己动手体验,极大的促进了自己的动手能力及独立思考能力,总体上完成了老师要求的基本功能,没有完成其他的扩展功能,有待改进的地方就是未能设置很好的界面,以及没有细学的文件处理模块的知识。
不管怎样,这次作业让我对c语言的操作更加深刻了解,更加熟悉如何运用函数的调用和嵌套,还有对指针,for语句,switch语句的理解和使用。同时自己对程序的条理整洁,注释清楚,可读性等的要求更加高了。
程序清单:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 100
struct student
{
char name[10];
int num;
char sex[10];
float math;
float yingyu;
float proj;
float ywen;
float aver;
float sum;
}stu;
//菜单
void menu()
{
system("cls"); /*清屏*/
printf("======================================================================\n");
printf(" * 欢迎使用学生成绩管理系统 * \n");
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");
printf(" \n\n\n\n\n\n\n * * 电子14-1,潘才身(14034520123)制作 * * \n");
}
//成绩录入函数
void input()
{
system("cls");
FILE *fp;
student xs;/*定义一个结构体变量来装从文件中读出来的数据*/
int c=1;
if((fp=fopen("student.dat","ab"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
printf("\n 成绩录入 ");
printf("\n****************************************************");
while(c++)
{
printf("\n 请输入您的姓名(结束请输入姓名为ok):");
scanf("%s",xs.name);
if(strcmp(xs.name,"ok")==0) break;/*判断姓名是否为ok,用字符串判断*/
printf("\n 请输入学号:");
scanf("%d",&xs.num);
printf("\n 性别:");
scanf("%s",&xs.sex);
printf("\n 请输入高数的成绩:");
scanf("%f",&xs.math);
printf("\n 请输入英语的成绩:");
scanf("%f",&xs.yingyu);
printf("\n 请输入程序的成绩:");
scanf("%f",&xs.proj);
printf("\n 请输入语文的成绩:");
scanf("%f",&xs.ywen);
xs.aver=0;/*给平均分变量赋初值*/
xs.aver=(xs.math+xs.yingyu+xs.proj+xs.ywen)/4;
xs.sum=0;
xs.sum=xs.math+xs.yingyu+xs.proj+xs.ywen;
fwrite(&xs,sizeof(stu),1,fp); //将成绩信息写入文件
system("cls");
}
fclose(fp);
}
//姓名查找函数
void xingming()
{
FILE *fp;
student xs;
char name[10];
printf("\n 输入要查学生的姓名: ");
scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL)//读取存放好的数据
{
printf("can't open file!\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 %
展开阅读全文