开发一个班级成绩管理系统,其中学生记录有:学号,姓名,性别,班级人数,三门课的成绩,程序运行时显示一个简单的菜单。程序实现以下功能:
1.信息输入 (必做)。
2.显示班级学生的信息(必做)。
3.按照姓名查找学生记录(必做)。按照学号、成绩查找 (选做)。
4.按照性别求每门课程男女同学的平均成绩(必做)。
5.计算每门课的最高成绩和最低成绩(必做)。
6.增加学生信息(6和7可以二选一,也可以全做)。
7.删除学生信息。
8.退出系统(必做)。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要用到strcmp函数
#define LEN 15//姓名和学号的最大字符数
#define N 50//最大学生人数
int n = 0, t = 1;//n代表当前学生人数,t用来控制整个程序的执行,以及程序的退出;
//函数声明
void menu();//主菜单函数
void help();//使用帮助
void increase();//增加学生信息
void seek();//查找学生信息
void de();//删除学生信息
void save();//保存文件
void present();//显示当前信息
void brave();//显示各科最高最低分
void averclass();//按照性别求各科的平均分
void tuichu();//退出函数
struct student
{
char StuID[LEN];//学生学号
char Stuname[LEN];
int Stuage;
int Stusex;
float score0; //各科成绩
float score1;
float score2;
}stu[N];
int main()
{
int num;//num是菜单选项
while (t)//t是全局变量,用tuichu函数来控制循环是否继续
{
menu();//输出主菜单界面
printf("您好,请输入菜单编号:");
scanf("%d", &num);
switch (num)
{
// case 1: help(); break;
case 2: increase(); break;
case 3: seek(); break;
case 4: de(); break;
case 5: save(); break;
case 6: present(); break;
case 7: brave(); break;
case 8: averclass(); break;
case 9: tuichu(); break;
default:printf("输入有误,请重新输入!");
}
}
system("pause");
return 0;
}
void menu()
{
printf("\n\n");
printf("*****************************************************\n");
printf("*----------------------duoduo------------------------\n");
printf("* 学生信息管理系统 *\n");
printf("*****************************************************\n");
printf("********************系统功能菜单*********************\n");
printf("---------------------- --------------------------\n");
printf("*****************************************************\n");
printf("** 1、使用帮助 * 2、增加学生信息 **\n");
printf("*****************************************************\n");
printf("** 3、查询学生信息 * 4、删除学生信息 **\n");
printf("*****************************************************\n");
printf("** 5、保存当前信息 * 6、显示当前信息 **\n");
printf("*****************************************************\n");
printf("** 7、显示最高最低分 * 8、显示男女生课程平均分*\n");
printf("*****************************************************\n");
printf("** 9、退出系统 * **\n");
printf("************************* \n");
printf("---------------------- --------------------------\n");
}
void help()
{
printf("\n这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
printf("\n 注意事项: \n ");
printf("\n 1、请根据提示进行操作!\n");
printf("\n 2、初次使用请先选择增加学生信息!\n");
printf("\n 3、修改或者增加学生信息后切记保存!\n");
printf("\n 4、如果数据有错误,请先修改再保存!\n");
printf("\n 5、若您之前使用过,下次进入系统请先刷新学生信息!\n");
printf("\n 6、在添加学生时,用两个字符代表不同的性别,比如男用‘M’代替,女用‘W’代替!\n");
printf("\n 7、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt,系统会在源程序\n");
printf("\n “学生管理系统.exe”的相同目录建立一个.txt文件来保存学生信息,您可以查看\n");
printf("\n 该文件,但非专业人员不要轻易改动,否则会造成刷新数据异常或刷新失败!\n");
printf("\n 8、学生信息包括:姓名、学号、性别、年龄、C语言成绩、高数成绩、英语成绩等!\n");
printf("\n 9、使用遇到任何问题请与我们联系,邮箱:ouyang_na_na@163.com\n");
printf("\n 10、最后感谢您的使用!\n");
system("pause");
}
void increase()
{
int i = n, j, flag, m = 0;//i代表增加学生信息过程中任意时刻的学生人数
printf("\n请输入待增加的学生人数:\n");
scanf("%d", &m);
if (m > 0) {
do {
flag = 1;
while (flag)
{
flag = 0;
printf("请输入第%d位学生的学号:\n", i + 1);//第几位学生从1开始计数,而stu[]从零开始,需要加1
scanf("%s", stu[i].StuID);
//判断学号是否重复
for (j = 0; j < i; j++) {
if (strcmp(stu[i].StuID, stu[j].StuID) == 0) {
printf("该学号已经存在,请重新输入!\n");
flag = 1;
break;
}
}
}
printf("请输入第%d位学生姓名:\n", i + 1);
scanf("%s", stu[i].Stuname);
printf("请输入第%d位学生班级人数:\n", i + 1);
scanf("%d", &stu[i].Stuage);
getchar();//处理上面输入的换行符,不然系统会把换行符当做一个字符赋值给性别
printf("请输入第%d位学生性别(女生请输入1,男生请输入0):\n", i + 1);
scanf("%d", &stu[i].Stusex);
getchar();
printf("请输入第%d位学生的C语言成绩:\n", i + 1);
scanf("%f", &stu[i].score0);
getchar();
printf("请输入第%d位学生的高数成绩:\n", i + 1);
scanf("%f", &stu[i].score1);
getchar();
printf("请输入第%d位学生的大学英语成绩:\n", i + 1);
scanf("%f", &stu[i].score2);
i++;
} while (i < n + m);//只要当前学生人数还没到达添加后的总人数,就得继续添加
}
n += m;// 添加完成,系统人数n的值也要增加
printf("添加完成!!!\n");
system("pause");
}
void seek()
{
int i, num, flag;
char s1[LEN + 1];
printf("*****************************\n");
printf("**-------1.按学号查询------**\n");
printf("**-------2.按姓名查询------**\n");
printf("**-------3.退出本菜单------**\n");
printf("*****************************\n");
while (1)
{
flag = 0;
printf("请输入子菜单:");
scanf("%d", &num);
switch (num)
{
case 1:
printf("请输入需要查找学生的学号:\n");
scanf("%s", s1);
for (i = 0; i < n; i++)
{
if (strcmp(stu[i].StuID, s1) == 0)
{
flag = 1;
printf("学号\t\t姓名\t\t性别\t\t班级人数\t\tC语言\t\t高数\t\t英语\n");
printf("%s\t\t%s\t\t%d\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score0, stu[i].score1, stu[i].score2);
}
}break;
case 2:
printf("请输入需要查找学生的姓名:\n");
scanf("%s", s1);
for (i = 0; i < n; i++)
{
if (strcmp(stu[i].Stuname, s1) == 0)
{
flag = 1;
printf("学号\t\t姓名\t\t性别\t\t班级人数\t\tC语言\t\t高数\t\t英语\n");
printf("%s\t\t%s\t\t%d\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score0, stu[i].score1, stu[i].score2);
}
}break;
case 3: return;
default: printf("请在1--3之间输入\n");
}
if (flag == 0)
printf("找不到该学生!\n请重新输入!");
}
}
void de()
{
int i, j, flag;
char s1[LEN];
printf("请输入需要删除的学生学号:\n");
scanf("%s", s1);
flag = 0;
for (i = 0; i < n; i++)
{
if (strcmp(s1, stu[i].StuID) == 0)
{
flag = 1;
for (j = i; j < n - 1; j++)
{
stu[j] = stu[j + 1];//直接把后面的学生都往前移动一位
}
}
if (flag == 1) break;//说明已经找到了需要删除的学生,结束循环
}
if (0 == flag)
{
printf("该学号不存在!!!\n");
}
if (1 == flag)
{
printf("删除成功\n");
n--;
}
system("pause");
}
void save()//把学生信息保存到文件
{
int i;
FILE* fp;
char filename[LEN + 1];
printf("请输入要保存的文件名:\n");
scanf("%s", filename);
if ((fp = fopen(filename, "w")) == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < n; i++)
if (fwrite(&stu[i], sizeof(struct student), 1, fp) != 1)
printf("保存失败!!\n");
printf("保存成功!!!\n");
fclose(fp);
system("pause");
}
void present()
{
int i;
if (n == 0)
{
printf("您好,现在没有学生信息,请先增加学生信息或者刷新再来试试!\n");
}
else
{
printf("现在共有%d名学生:\n", n);
printf("学号\t\t姓名\t\t性别\t\t班级人数\t\tC语言\t\t高数\t\t英语\n");
for (i = 0; i < n; i++)
{
printf("%s\t\t%s\t\t%d\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score0, stu[i].score1, stu[i].score2);
}
}
system("pause");
}
void averclass(){
int i;
float mathsum1=0.0,englishsum1=0.0,csum1=0.0;
int num1=0;
float mathsum2=0.0,englishsum2=0.0,csum2=0.0;
int num2=0;
for(i=0;i<=n;i++){
if(stu[i].Stusex==1){
mathsum1+=stu[i].score0;
num1++;
englishsum1+=stu[i].score1;
csum1+=stu[i].score2;
// printf("%f",mathsum1);
// printf("%f",stu[i].score0);
// printf("%d",num1);
}
else if(stu[i].Stusex==0){
mathsum2+=stu[i].score0;
num2++;
englishsum2+=stu[i].score1;
csum2+=stu[i].score2;
}
}
float aver1=mathsum1/num1;
float aver2=englishsum1/num1;
float aver3=csum1/num1;
float aver4=mathsum2/num2;
float aver5=englishsum2/num2;
float aver6=csum2/num2;
printf("女生:");
printf("C语言平均成绩:%f",aver1);
printf("高数平均成绩:%f",aver2);
printf("英语平均成绩:%f",aver3);
printf("男生:");
printf("C语言平均成绩:%f",aver4);
printf("高数平均成绩:%f",aver5);
printf("英语平均成绩:%f",aver6);
system("pause");
}
void brave(){
float mathmax,englishmax,cmax;
mathmax=stu[0].score0 ;
englishmax=stu[0].score1 ;
cmax=stu[0].score2 ;
int i;
for(i=0; i<n; i++)
{
if(stu[i].Stuage !=0)
{
if(mathmax<stu[i].score0)
mathmax=stu[i].score0 ;
if(englishmax<stu[i].score1 )
englishmax=stu[i].score1;
if(cmax<stu[i].score2 )
cmax=stu[i].score2 ;
}
}
printf("C语言最高分学生的成绩:%.2f \n",mathmax);
printf("高数最高分学生的成绩:%.2f \n",englishmax);
printf("英语最高分学生的成绩:%.2f\n",cmax);
float mathmin,englishmin,cmin;
mathmin=stu[0].score0;
englishmin=stu[0].score1 ;
cmin=stu[0].score2 ;
for(i=0; i<n; i++)
{
if(stu[i].Stuage !=0)
{
if(mathmin>stu[i].score0)
// mathmin=stu[i].score0 ;
mathmin=stu[i].score0;
if(englishmin>stu[i].score1 )
englishmin=stu[i].score1 ;
if(cmin>stu[i].score2 )
cmin=stu[i].score2 ;
}
}
printf("C语言最低分学生的成绩:%.2f \n",mathmin);
printf("高数最低分学生的成绩:%.2f \n",englishmin);
printf("英语最低分学生的成绩:%.2f\n",cmin);
}
void tuichu()
{
int h;//控制是否确认退出
printf("即将退出,确认请按1,取消请按0\n");
scanf("%d", &h);
if (h == 1)
{
t = 0;//t是main函数中while函数是否继续执行的控制条件,是一个全局变量,程序开头已经定义并且赋值位 1
printf("成功退出,感谢使用!\n");
}
if (h == 0)
{
printf("退出已取消!\n");
system("pause");
}
}