学生成绩管理系统(摘自C语言程序设计与实践)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 50
struct inf
{
char name[10]; //名字 
char id[10]; //学号 
double Basic_Courses1; //主干课程1 
double Basic_Courses2; //主干课程2 
double Basic_Courses3; //主干课程3 
double Major_Courses1; //专业课程1 
double Major_Courses2; //专业课程2 
}person[N]; //存储所有学生的信息


void menu(); //菜单函数 
void display1(); //打印‘*’符号 
void display2(); //打印‘正菱形’符号 
void reserve(); //保存到数组 
void read(); //读取学生信息 
void delay(); //提供开关的延迟效果 
void choose(); //提供开关选择功能 
void input(); //学生信息的输入 
void printfinformation(); //学生信息的打印 
void sum_average(); //学生的成绩汇总、平均分等 
void statistics(); //学生信息的统计 
void alter(); //学生信息的修改 
void search(); //学生信息的查找 
void del(); //学生信息的删除 
void save(); //文件数据的输出 
void back(); //返回主菜单 
char ch; //储存主菜单的调用选项信息 
double ave[N],sum[N],sum1[N],sum2[N];//定义全局变量,方便直接引用 
int number=0,temp1,temp2=0;//记录每次输入的人数 

main()
{
char ch; 
system("color 0e"); //程序界面、字体颜色选择 
menu();
do
{
scanf("%c",&ch);
system("cls"); //清屏功能 
choose();
}while(ch!='8'); //循环条件的判断 
}


//提供主菜单的选择功能
void choose()
{

switch(ch)
{
case '1':input();
break;
case '2':printfinformation();
back();
break;
case '3':alter();
back();
break;
case '4':search();
break;
case '5':del();
break;
case '6':statistics();
back();
break;
case '7':save();
break;
case '8':printf("感谢您的使用!\n");
break;
default:menu();
printf("\n\t\t请重新选择:");
}
}


//数据写入文件
void reserve()
{
FILE *fp=NULL;
int i;
if((fp=fopen("student.txt","w"))==NULL)
{
printf("不能打开文件");
exit(0);
}
for(i=temp2;i<number;i++)
{
fprintf(fp,"%4d%7s%6s%10.01f%10.01f%10.01f%10.01f%8.01f\n",number,
person[i].name,person[i].id,person[i].Basic_Courses1,person[i].Basic_Courses2,
person[i].Basic_Courses3,person[i].Major_Courses1,person[i].Major_Courses2);
} //写入文件 
fclose(fp); //关闭文件 
}


//数据文件的读取
void read()
{
FILE *fp=NULL;
int i=0;
if((fp=fopen("student.txt","r"))==NULL)//以文本只读方式重新打开文件 
{
printf("不能打开文件");
exit(0);
}
fscanf(fp,"%4d\n",&number);
for(i=0;i<number;i++)
{
fscanf(fp,"%7s%6s%10.01f%10.01f%10.01f%10.01f%8.01f\n",&person[i].name,&person[i].id,
&person[i].Basic_Courses1,&person[i].Basic_Courses2,&person[i].Basic_Courses3,
&person[i].Major_Courses1,&person[i].Major_Courses2);//读文件 
printf("%7s%6s%10.01f%10.01f%10.01f%10.01f%8.01f\n",person[i].name,person[i].id,
person[i].Basic_Courses1,person[i].Basic_Courses2,person[i].Basic_Courses3,
person[i].Major_Courses1,person[i].Major_Courses2);//输出文件数据 
}
fclose(fp); //关闭文件  



//主菜单的打印
void menu()
{
char *s[9]={"【1】输入学生信息","【2】查看学生信息","【3】修改学生信息","【4】查找学生信息","【5】删除学生信息","【6】统计学生成绩","【7】保存学生信息","【8】退出管理系统","请选择:"};
int i;
printf("\n");
printf("\t\t");
display1();
printf("学生成绩管理系统");
display1();
printf("\n\n");
printf("\t\t");
display2();
printf("\n\n");
printf("\t\t");
for(i=0;i<9;i++)
{
display1();
printf("%s",s[i]);
display1();
printf("\n");
printf("\t\t");

}
//打印'*'
void display1()
{
int i;
for(i=0;i<=16;i++)
{
printf("*");
delay();
}
}
//打印'-'
void display2()
{
int i;
for(i=0;i<=24;i++)
{
printf("-");
delay();
}
}
//提供开关的延迟效果
void delay()
{
long i,n=4000000;
for(i=0;i<n;i++)
{
if(ch!='\0')
i=n; //当主菜单运行过一次后,消除延迟效果 
}
}         
//学生信息的输入
void input()
{
int i;
printf("请输入学生的人数:");
scanf("%d",&temp1);
number+=temp1;
for(i=temp2;i<number;i++) //引用中间变量temp2,记录每次输入的人数 
{
printf("请输入第%d个学生的名字:",i+1);
fflush(stdin);
scanf("%s",person[i].name);
printf("请输入第%d个学生的学号:",i+1);
fflush(stdin);
scanf("%s",person[i].id);
printf("请输入第%d个学生的主干课程1、主干课程2、主干课程3、专业课程1、专业课程2:\n",i+1);
fflush(stdin);
scanf("%lf%lf%lf%lf%lf",&person[i].Basic_Courses1,&person[i].Basic_Courses2,&person[i].Basic_Courses3,
&person[i].Major_Courses1,&person[i].Major_Courses2);
}
reserve();
temp2+=temp1;
//数据写入 文件
sum_average(); //学生平均成绩、总成绩的计算 
back(); //返回主菜单 
}
//学生信息的打印    
void printfinformation()
{
int i;
if(number==0)
{
printf("\t没有学生信息");
}
else
{
printf("\n\t\t----------------------------学生信息----------------------------\n");
printf("-------------------------------------------------------------------------------------\n");
printf(" 姓名 学号 主干课程1 主干课程2 主干课程3 专业课程1 专业课程2 总成绩\n");
printf("-------------------------------------------------------------------------------------\n");
for (i=0;i<number;i++)
{
printf("%10s%6s%8.01f%10.01f%10.01f%10.01f%10.01f%12.01f\n",person[i].name,person[i].id,
person[i].Basic_Courses1,person[i].Basic_Courses2,person[i].Basic_Courses3,
person[i].Major_Courses1,person[i].Major_Courses2,sum[i]);
printf("-------------------------------------------------------------------------------------\n");
 } 
printf("各课平均分");
printf("%14.01f%10.01f%10.01f%10.01f%10.01f\n",ave[0],ave[1],ave[2],ave[3],ave[4]);
printf("-------------------------------------------------------------------------------------\n");
}
  }       
//学生平均成绩、总成绩的计算
void sum_average()
{
int i,k;
for(i=0;i<5;i++)
{
sum1[i]=0;
}
for(i=0;i<5;i++)
{
for(k=0;k<number;k++)
{
if(i==0)
{
sum1[i]+=person[k].Basic_Courses1;
//i=0,1,2,3,4分别计算每个人同项成绩的总和,分别存储在sum[i]中 
}
if(i==1)
{
sum1[i]+=person[k].Basic_Courses2;
}
if(i==2)
{
sum1[i]+=person[k].Basic_Courses3;
}
if(i==3)
{
sum1[i]+=person[k].Major_Courses1;
}
if(i==4)
{
sum1[i]+=person[k].Major_Courses2;
}
}
}
for(i=0;i<5;i++)
{
ave[i]=sum1[i]/number;
//求前5项平均成绩,数据分别存储在ave[i]中 
}
for(i=0;i<number;i++)
{
sum[i]=person[i].Basic_Courses1+person[i].Basic_Courses2+person[i].Basic_Courses3+
person[i].Major_Courses1+person[i].Major_Courses2;
//分别计算每个学生的总成绩,分别存储在sun[i]中 

}
//学生信息的统计 
void statistics()
{
int i,count1=0,count2=0,count3=0;
double percent1=0,percent2=0,percent3=0;
if(number==0)
{
printf("\t没有学生信息");
}
else
{
printfinformation();
for(i=0;i<number;i++)
{
sum2[i]=person[i].Basic_Courses1+person[i].Basic_Courses2+person[i].Basic_Courses3;
//
}
for(i=0;i<number;i++)
{
if(sum2[i]>=300)
count1++;
if((sum2[i]<300)&&(sum2[i]>=200))
count2++;
if((sum2[i]<200)&&(sum2[i]>=100))
count3++;
}
percent1=(double) count1/(double) number;
percent2=(double) count2/(double) number;
percent3=(double) count3/(double) number;
printf("\n\t\t---------------------信息统计表----------------------\n");
printf("-----------------------------------------------------------------\n");
printf("前三项成绩和\t  300分\t  299-200分\t  199-100分\n");
printf("-----------------------------------------------------------------\n");
printf("人数\t%10d\t%lld\t%10d\n",count1,count2,count3);
printf("-----------------------------------------------------------------\n");
printf(" 比例\t");
printf("%10.31f\t%11.31f\t%11.31f\n",percent1,percent2,percent3);
printf("-----------------------------------------------------------------\n"); 
}
 } 
//学生信息的修改 
void alter()
{
int i,k,flag;
char temp[10],temp1;
if(number==0)
{
printf("\t没有学生信息");
}
else
{
printfinformation();
do
{
printf("请输入你要修改信息的学生的姓名或学号:");
scanf("%s",temp);
for(i=0;i<number;i++)
{
if(strcmp(temp,person[i].name)==0||strcmp(temp,person[i].id)==0)
{
k=i;
flag=1;
break;
}
if(i==(number-1)&&(strcmp(temp,person[i].name)!=0)&&(strcmp(temp,person[i].id)!=0))
{
printf("不存在该学生\n");
flag=0;
}
}
if(flag==1)
{
printf("该学生的原信息如下:\n");
printf("-----------------------------------------------------------------\n");
printf(" 姓名 学号 主干课程1 主干课程2 主干课程3 专业课程1 专业课程2 总成绩\n");
printf("-------------------------------------------------------------------------------------\n");
printf("%7s%6s%10.01f%10.01f%10.01f%10.01f%8.01f\n",person[k].name,person[k].id,
person[k].Basic_Courses1,person[k].Basic_Courses2,person[k].Basic_Courses3,
person[k].Major_Courses1,person[k].Major_Courses2);
printf("-------------------------------------------------------------------------------------\n");
getch();
system("cls");
printf("\n请重新输入该学生的所有信息\n");
printf("请重新输入姓名:");
fflush(stdin);
scanf("%s",&person[k].name);
printf("请重新输入学号:");
fflush(stdin);
scanf("%s",&person[k].id);
printf("请重新输入学生的主干课程1、主干课程2、主干课程3、专业课程1、专业课程2:\n");
fflush(stdin);
scanf("%lf%lf%lf%lf%lf",&person[k].Basic_Courses1,&person[k].Basic_Courses2,&person[k].Basic_Courses3,
&person[k].Major_Courses1,&person[k].Major_Courses2);
sum_average();
}
printf("继续修改?Y/N: ");
fflush(stdin);
scanf("%c",&temp1);
}while(temp1=='y'||temp1=='Y');
printf("是否显示修改后全部学生的信息?Y/N:");
scanf("%c",&temp1);
if(temp1=='y'||temp1=='Y');
{
system("cls");
printfinformation();
}
reserve();
}

//学生信息的查找  
void search()
{
int i,k,flag;
char temp[10],temp1;
//
if(number==0)
{
printf("\t没有学生信息");
}
else
{
do
{
printf("请输入你要查找的学生姓名或学号:");
scanf("%s",temp);
for(i=0;i<number;i++)
{
if(strcmp(temp,person[i].name)==0||strcmp(temp,person[i].id)==0)
{
k=i;
flag=1;
break;
}
if(i==(number-1)&&(strcmp(temp,person[i].name)!=0)&&(strcmp(temp,person[i].id)!=0))
{
printf("不存在该学生\n");
flag=0;
}
}
if(flag==1)
{
printf("该学生的信息如下:\n");
printf("-----------------------------------------------------------------\n");
printf(" 姓名 学号 主干课程1 主干课程2 主干课程3 专业课程1 专业课程2 总成绩\n");
printf("-------------------------------------------------------------------------------------\n");
printf("%7s%6s%10.01f%10.01f%10.01f%10.01f%8.01f\n",person[k].name,person[k].id,
person[k].Basic_Courses1,person[k].Basic_Courses2,person[k].Basic_Courses3,
person[k].Major_Courses1,person[k].Major_Courses2);
printf("-------------------------------------------------------------------------------------\n");
}
printf("\n继续查找?Y/N:");
scanf("%c",&temp1);
}while (temp1=='y'||temp1=='Y');
}
back();
}         
//学生信息的删除 
void del()
{
int i,k,flag;
char temp[10],temp1;
if(number==0)
{
printf("\t没有学生信息"); 
}
else
{
printfinformation();
do
{
printf("请输入要删除的学生信息的姓名或学号:");
scanf("%s",temp);
for(i=0;i<number;i++)
{
if(strcmp(temp,person[i].name)==0||strcmp(temp,person[i].id)==0)
{
k=i;
flag=1;
break;
}
if(i==(number-1)&&(strcmp(temp,person[i].name)!=0)&&(strcmp(temp,person[i].id)!=0))
{
printf("不存在该学生\n");
flag=0;
}
}
if((flag==1)&&(number==1))
{
number--;
temp2--;
printf("该学生信息已经成功删除\n\n");
}
if((flag==1)&&(number<=1))
{
printf("已经没有学生信息,请重新输入!\n\n");
}
if((flag==1)&&(number>1))
{
for(i=k;i<(number-1);i++)
{
strcpy(person[i].name,person[i+1].name);
strcpy(person[i].id,person[i+1].id);
person[i].Basic_Courses1=person[i+1].Basic_Courses1;
person[i].Basic_Courses2=person[i+1].Basic_Courses2;
person[i].Basic_Courses3=person[i+1].Basic_Courses3;
person[i].Major_Courses1=person[i+1].Basic_Courses1;
person[i].Major_Courses2=person[i+1].Basic_Courses2;
}
number--;
temp2--;
printf("该学生信息已经成功删除\n\n");
}
sum_average();//平均成绩,总成绩的重新求值 
printf("是否继续删除?Y/N:");
scanf("%c",&temp1);
}while (temp1=='y'||temp1=='Y');//循环进行的条件 
printf("是否显示删除操作后全部学生的信息?Y/N:");
scanf("%c",&temp1);
if(temp1=='y'||temp1=='Y')
{
sum_average();//删除后学生成绩信息的重新计算 
printfinformation();//学生信息的打印 
}
reserve();
}
back();
}


void save()
{
char temp;
printf("1、读取上次的记录:\n2、保存现在的记录:\n请选择:");
scanf("%c",&temp);
if(temp=='1')
{
printf("\n\t\t----------学生信息-----------\n");
printf("-----------------------------------------------------------------\n");
printf(" 姓名 学号 主干课程1 主干课程2 主干课程3 专业课程1 专业课程2 总成绩\n");
read();
back();
}
else
{
printf("\t程序已经保存\n");
back();
}
}      
          
//返回主菜单 
void back()
{
printf("\n\t\t输入任意键返回主菜单:");
getch();//提供任意键返回效果 
system("cls");//清屏功能 
menu();//打印主菜单 
}              
一、课程设计题目 ① 基本要求题目:矩阵乘法。 ② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能: (1)主菜单 (2)各菜单项功能 ① 成绩录入:输入学生的学号、姓名及三门课的成绩; ② 成绩查询:(至少一种查询方式)。  按学号查询学生记录。  查询不及格学生的记录。 ③成绩统计:  计算学生的平均分;  根据学生的平均分高低,对学生的数据进行排序后输出;  对学生单科成绩排序,输出学生姓名与该科成绩; ④退出系统:退出整个系统(即主菜单)。 (3)结构体数组: #define N 30struct student {int num; /* 定义学号*/ char name[20]; /* 定义姓名*/ float score[3]; /* 定义存贮三门课成绩的数组*/ float average; /* 定义平均成绩*/ };struct student stu[N];  /* 定义结构体数组,存贮多个学生的记录*/ 三、数据结构设计描述 系统功能描述 1能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。 2能够以表格的形式输出学生记录 3能够按照学生三科的平均成绩进行排序 4能够按照学生的单科成绩进行排序 5能够按照学号查询学生记录 6往表中插入学生记录 7从表中删除学生记录 8存储记录到文件中 9从文件中读取记录 10退出 数据字典 1数据流条目 数据流名称:全部记录 别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车; 按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。 4、回到主菜单,输入1,回车 每10个暂停显示数据 5、回到主菜单,输入2,回车 出现排序成功信息。 6、回到主菜单,输入3,回车 出现排序成功信息。 7、回到主菜单,输入5,回车 按提示插入一组数据 8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息 9、回到主菜单,输入4,回车 输入学号进行查询 10、回到主菜单,输入1,回车 出现统计信息 11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值