、
目录
每次归程,都是为了更好出发;
每次停歇,都是为了积攒力量 。
最近大家C语言是不是都进入了实训阶段呢?
还在为写不出代码而苦恼吗?
接下来我将带领大家一起完成!
C语言的一个简单项目-学生管理系统!
主要运用了数组和指针函数
关于链表的搭建后续会更新
题目:学生管理系统
学生数据由学号、姓名、性别、年龄、三门课(C语言、高数、大物)的成绩构成
实现功能包括:
(1)密码登入
(2)使用提示
(3)信息录入
(4)查询信息
(5)删除信息
(6)保存信息
(7)显示信息(8)修改信息
(9)成绩排名
对于这种代码量超百位数的,大家最好养成分模块写代码的习惯:
我创建了一个.h文件和两个.c 文件,.h一般放头文件和结构体类型,.c文件一个设置主函数main,一个完善相应的函数接口。这样分工明确,不会混乱,可以提高敲代码的效率哦~
首先明白我们要实现的项目功能:密码登入系统、使用帮助菜单、增加学生信息、查询学生信息、删除学生信息、保存当前信息、显示当前信息、修改学生信息、学生成绩排名
搭建offer.h文件
因为学生有以下几个基本信息:姓名、年龄、学号、性别,依次由name、age、id和sex来表示,所以可以通过结构体实现,struct语句定义存储不同类型的数据项,定义一个结构体数组Stu,用于存储每个学生的信息
cpp
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void TiShi(); //提示功能
void StuXinXi(); //增加信息
void ChaZhao(); //查找信息
void ShanGai(); //删改信息
void BaoCun(); //保存信息
void XianShi(); //显示信息
void XiuGai(); //修改信息
void PaiMing(); //学生排名
#define N 20
#define Number sizeof(struct Student)//求结构体的大小
//创建结构体包含学生信息
struct Student
{
char Stuid[N]; //学号
char Stuname[N]; //名字
int Stuage; //年龄
char Stusex[N]; //性别
double score[3]; //成绩
}Stu[Number];
//枚举体美化选项
enum menu2
{
Quit = 0,
Resume = 1
};
enum ChaZhao
{
CaoZuo1 = 1,
CaoZuo2 = 2,
CaoZuo3 = 3
};
1.这里最好定义一个宏#define不然以后修改将会很麻烦
2.枚举体美化选项在我之前的博客讲过,提高代码的可读性
3.剩下的就是头文件的引入和函数的声明以及结构体的创建
搭建offer.c中的main函数
要使用我们在offer.h中设置的头文件要在offer.c中加上#include"offer.h"
cpp
#include"offer.h"
整体的框架如下:
cpp
#include"offer.h"
int sum = 1;
int main()
{
int i = 0;
int input = 0, count = 0;
char mima[20] = "123";//登入的密码
char shuru[20];
system("color F4");
printf("\t\t\t **************************************\n");
printf("\t\t\t | *欢迎使用学生管理系统* |\n");
printf("\t\t\t | *管理员: 小唐* |\n");
printf("\t\t\t ------------------------------------\n");
printf("请输入管理员密码:\n");
while ((count = _getch()) != '\r')
{
if (count == '\b')
{
i--;
printf("\b \b");
}
else
{
shuru[i++] = count;
printf("*");
}
}
shuru[i++] = '\0'; //getch赋值的是单个字符,所以为了比较两个字符串的大小要给shuru数组后面添加'\0'
if (strcmp(mima, shuru) == 0)
{
printf("\n密码正确,您已进入系统!\n");
}
else
{
printf("\n密码错误,请重新输入!\n");
return 0;
}
system("pause");
system("cls");
do
{
menu2();
printf("请选择继续还是结束操作:\n");
scanf("%d", &sum);
switch (sum)
{
case Quit:
system("cls");//清除屏幕
printf("您已退出学生管理系统!\n");
break;
case Resume:
menu1();
void(*p[9])() = { NULL,TiShi,StuXinXi,ChaZhao,ShanGai,BaoCun,XianShi,XiuGai,PaiMing };//指针数组函数
printf("请输入你要进行的操作\n");
scanf("%d", &input);
system("cls");
(*p[input])();
break;
default:
printf("输入错误,重新输入!\n");
break;
}
} while (sum);
return 0;
}
接下来我将带领大家解读以上代码
密码登入系统
在进入学生管理系统之前,我设置了一个小型的系统密码登入界面来判断是进入还是退出
cpp
int count = 0;
char mima[20] = "123";//登入的密码
char shuru[20];
system("color F4");
printf("\t\t\t **************************************\n");
printf("\t\t\t | *欢迎使用学生管理系统* |\n");
printf("\t\t\t | *管理员: 小唐* |\n");
printf("\t\t\t ------------------------------------\n");
printf("请输入管理员密码:\n");
while ((count = _getch()) != '\r')
{
if (count == '\b')
{
i--;
printf("\b \b");
}
else
{
shuru[i++] = count;
printf("*");
}
}
shuru[i++] = '\0'; //getch赋值的是单个字符,所以为了比较两个字符串的大小要给shuru数组后面添加'\0'
if (strcmp(mima, shuru) == 0)
{
printf("\n密码正确,您已进入系统!\n");
}
else
{
printf("\n密码错误,请重新输入!\n");
return 0;
}
1.我们这里利用了while去进行getch输入,getch输入单个字符是不会显示信息的,但我们按下回车键输入结束,循环停止
2.' \r '就是回车键的意思,而' \b '就是删除键的意思
3.每循环一次就输入一个字符count赋值给数组shuru,并打印" * "
4.getch赋值的是单个字符,所以为了比较两个字符串的大小要给shuru数组后面添加' \0 '
5.strcmp是比较两个字符串的大小 ,详细可以看我之前的博客
以上就是我们密码登入系统的全部内容
接下来我将讲解接下来的代码实现
menu2()的作用就是选择继续操作还是退出系统
cpp
void menu2()
{
system("color F4");
printf("\t\t\t*********************\n");
printf("\t\t\t*********************\n");
printf("\t\t\t-------1.Resume------\n");
printf("\t\t\t-------0.Quit--------\n");
printf("\t\t\t*********************\n");
}
1.system("cls")-清屏函数,会将显示过的内容清空,被#include<stdlib.h>包含
2.system("color F4");是改变背景颜色的函数,被#include<stdlib>包含
3.我们用枚举类型美化选项Quit就是0,Resume就是1
4.我们采用了指针数组函数可以直接调用接口函数,因为没有返回值函数类型就是void,这样减少了重复代码的编写,如果大家不适应也可以用switch
搭建my_oferr.c中的接口函数
首先定义我们my_oferr.c中的全局变量
cpp
#include"offer.h"
int m = 0; //记录录入学生的人数
由于是显示一个管理系统
所以我们设计一个主菜单
通过定义一个函数menu1()来实现这个功能:
cpp
void menu1()
{
printf("\n");
system("color F4");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t*---------------------------------------------------*\n");
printf("\t\t\t* 学生管理系统 *\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t********************系统功能菜单*********************\n");
printf("\t\t\t---------------------- --------------------------\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 1、使用帮助菜单 * 2、增加学生信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 3、查询学生信息 * 4、删除学生信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 5、保存当前信息 * 6、显示当前信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 7、修改学生信息 * 8、学生成绩排名 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t---------------------- --------------------------\n");
}
这个大家可以自己随喜好设置~
使用帮助菜单接口函数
cpp
void TiShi()
{
printf("欢迎来到学生管理系统:\n");
printf("在这个管理系统中,教师和学生都不需要去了解自己的信息,只需通过网络就能实现自己的信息管理。\n");
printf("教师可以轻松便捷地掌握学生相关情况、姓名、学号以及考试成绩等基本信息。\n");
printf("它还提供一个搜索功能和设置权限,可以将学生的信息进行搜索,\n也可根据关键字或其他方式对其进行定位,并且还能显示出该人的相关基本资料。\n");
printf("如果由技术上的缺陷还请联系项目负责人:\n17817473648\n");
system("pause");
system("cls");
}
system("pause")是暂停函数,按任意键重新启动,被#include<stdlib.h>包含
本函数接口主要起到提示作用,小伙伴们可以自行添加自己的管理需求
增加学生信息接口函数
cpp
void StuXinXi()
{
int i = m,flag,n = 0;
printf("请输入你要添加的学生人数:\n");
scanf("%d", &n);
printf("--------------------------*学生信息录入系统*--------------------------------\n");
if (n > 0)
{
do {
flag = 1;
while (flag)
{
flag = 0;
printf("请输入第%d位学生的学号:\n", i + 1);
scanf("%s", Stu[i].Stuid);
for (int 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);
printf("请输入第%d学生的性别:\n", i + 1);
scanf("%s", &Stu[i].Stusex);
printf("请输入第%d学生的C语言成绩:\n", i + 1);
scanf("%lf", &Stu[i].score[0]);
printf("请输入第%d学生的高数成绩:\n", i + 1);
scanf("%lf", &Stu[i].score[1]);
printf("请输入第%d学生的大物成绩:\n", i + 1);
scanf("%lf", &Stu[i].score[2]);
i++;
} while (i < n + m);
m += n;
if (flag == 0)
{
printf("添加完成!请进行下一步操作:\n");
}
system("pause");
system("cls");
}
}
1.flag用来判断最后输出的提示语句,提示录入成功与否
2.然后就是whie循环给结构体成员赋初值
3.在将人数累加给全局变量m就好了
查询学生信息接口函数
cpp
void ChaZhao()
{
int flag, input;
char Stu1[Number];
printf("\t\t\t----------*学生信息查找系统*----------\n");
printf("\t\t\t**************************************\n");
printf("\t\t\t******1.请输入你要查找的学生名字******\n");
printf("\t\t\t******2.请输入你要查找的学生学号******\n");
printf("\t\t\t******------3.退出本次操作------******\n");
printf("\t\t\t**************************************\n");
while (1)
{
flag = 0;
printf("请输入你要进行的查询操作:\n");
scanf("%d", &input);
switch (input)
{
case CaoZuo1:
printf("请输入你要查找的学生名字:\n");
scanf("%s", Stu1);
for (int i = 0; i < m; i++)
{
if (strcmp(Stu[i].Stuname, Stu1) == 0)
{
flag = 1;
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}break;
case CaoZuo2:
printf("请输入你要查找的学生学号:\n");
scanf("%s", Stu1);
for (int i = 0; i < m; i++)
{
if (strcmp(Stu[i].Stuid, Stu1) == 0)
{
flag = 1;
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}break;
case CaoZuo3:
return;
default:
printf("输入错误,重新选择!\n");
}
if (flag == 0)
{
printf("该学生没有录入系统,请重新查找!\n");
}
}
system("pause");
}
删除学生信息接口函数
cpp
void ShanGai()
{
int flag = 0;
char arr[Number]; //定义一个数组
printf("----------------------------------*学生名单*----------------------------------------------------------\n");
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
for (int i = 0; i < m; i++)
{
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
printf("请输入你要删除学生的学号:\n");
scanf("%s", arr);
for (int i = 0; i < m; i++)
{
if (strcmp(Stu[i].Stuid, arr) == 0) //查找对应的学号
{
flag = 1;
for (int j = i; j < m - 1; j++) //m-1防止越界访问
{
Stu[j] = Stu[j + 1]; //整个结构体后一个覆盖前一个
}
}
}
if (flag == 0)
{
printf("无法查找该学生信息!\n");
}
else
{
printf("删除成功,请查询系统!\n");
m--; //删除成功总人数减一
printf("----------------------------------*学生名单*----------------------------------------------------------\n");
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
for (int i = 0; i < m; i++)
{
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}
system("pause");
}
保存学生信息接口
这里穿插一下文件的保存的函数内容:
打开文件fopen
可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:
cpp
FILE *fopen( const char *filename, const char *mode );
在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:
关闭文件fclose
为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:
cpp
int fclose( FILE *fp );
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 #include<stdio.h> 中的常量。
判断是否保存文件fwrite
cpp
fwrite(file,string,length)
|--------|-------------------|
| file | 必需。规定要写入的打开文件。 |
| string | 必需。规定要写入打开文件的字符串。 |
| length | 可选。规定要写入的最大字节数。 |
fwrite() 函数将内容写入一个打开的文件中,并以二进制的形式进行输出
函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行。
如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE。
退出执行文件exit
cpp
void exit(int status)
立即终止调用进程。任何属于该进程的打开的文件描述符都会被关闭,该进程的子进程由进程 1 继承,初始化,且会向父进程发送一个 SIGCHLD 信号。
cpp
void BaoCun()
{
FILE* fp; //文件指针
char filename[Number];
printf("------------------------------\n");
printf("---*请输入你要保存的文件名*---\n");
printf("------------------------------\n");
scanf("%s", filename);
if (fp = fopen("filename.txt", "a")== NULL)//fopen以.txt的形式打开文件函数
{
printf("打开文件失败!\n");
exit(0);
}
for (int i = 0; i < m; i++)
{
if (fwrite(&Stu[i], sizeof(struct Student), 1, fp) != 1)
{
printf("保存失败!\n");
}
else
{
printf("保存成功!\n"); //返回字节数,则成功保存
}
}
fclose(fp); //关闭文件
fp = NULL; //防止fp变为野指针
system("pause");
}
我们保存之后在这里查看保存过的文件:
显示学生信息接口函数
cpp
void XianShi()
{
if (m == 0)
{
printf("您好!现在还暂未录入学生信息,请稍后重试");
}
else
{
printf("现在有%d名学生:\n", m);
printf("-------------------------------------*成绩显示*----------------------------------------------\n");
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
for (int i = 0; i < m; i++)
{
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}
system("pause");
}
修改学生信息接口函数
cpp
void XiuGai()
{
int input = 0;
int flag;
char id[Number], name[Number], sex[Number];
int age;
double score;
printf("请输入要修改的学生学号:\n");
scanf("%s", &id);
while (1)
{
flag = 0;
for (int i = 0; i < m; i++)
{
if (strcmp(id, Stu[i].Stuid) == 0)
{
flag = 1;
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
printf("**************************************************\n");
printf("----1.修改学生性别 2.修改学生姓名-----\n");
printf("----3.修改学生年龄 4.修改C语言成绩----\n");
printf("----5.修改高数成绩 6.修改大物成绩-----\n");
printf("********************7.退出本菜单******************\n");
printf("请输入你要修改的选项:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入要修改的性别:\n");
scanf("%s", sex);
strcpy(Stu[i].Stusex, sex);
break;
case 2:
printf("请输入要修改的姓名:\n");
scanf("%s",name);
strcpy(Stu[i].Stuname, name);
break;
case 3:
printf("请输入要修改的年龄:\n");
scanf("%d", &age);
Stu[i].Stuage = age;
break;
case 4:
printf("请输入要修改的C语言成绩:\n");
scanf("%lf", &score);
Stu[i].score[0] = score;
break;
case 5:
printf("请输入要修改的高数成绩:\n");
scanf("%lf", &score);
Stu[i].score[1] = score;
break;
case 6:
printf("请输入要修改的大物成绩:\n");
scanf("%lf", &score);
Stu[i].score[2] = score;
break;
case 7:
return;
default:
printf("选择错误,请重新选择!\n");
break;
}
}
if (1 <= input && input <= 6)
{
printf("恭喜你修改成功!\n");
break;
}
if (flag == 0)
{
printf("没有找到该学生信息,请重新输入学生学号:\n");
gets(name);
}
}
}
system("pause");
}
char* strcpy(char * destination, const char * source );
strcpy:拷贝函数,将括号右边的值拷贝到左边,详细可看我之前的博客
学生排名信息接口函数
cpp
int PaiXu(const void* e1, const void* e2)
{
return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu1(const void* e1, const void* e2)
{
return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu2(const void* e1, const void* e2)
{
return ((struct Student*)e2)->score[2] - ((struct Student*)e1)->score[2];
}
void PaiMing()
{
int input = 0;
while (1)
{
printf("\t\t**************************************************\n");
printf("\t\t---------------------***光荣榜***-----------------\n");
printf("\t\t**************************************************\n");
printf("\t\t********1.C语言-------------------2.高数**********\n");
printf("\t\t********3.大物--------------------4.退出系统******\n");
printf("\t\t**************************************************\n");
printf("请输入你要查询的排名:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("\t学号:\t\t名字:\tC语言成绩:\n");
int rs = sizeof(Stu) / sizeof(Stu[0]);
qsort(Stu, rs, sizeof(Stu[0]), PaiXu);//排序
for (int i = 0; i < m; i++)
{
printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);
printf("\n");
}
break;
case 2:
printf("\t学号:\t\t名字:\t高数成绩:\n");
int rs1 = sizeof(Stu) / sizeof(Stu[0]);
qsort(Stu, rs1, sizeof(Stu[0]), PaiXu1);
for (int i = 0; i < m; i++)
{
printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);
printf("\n");
}
break;
case 3:
printf("\t学号:\t\t名字:\t大物成绩:\n");
int rs2 = sizeof(Stu) / sizeof(Stu[0]);
qsort(Stu, rs, sizeof(Stu[0]), PaiXu2);
for (int i = 0; i < m; i++)
{
printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);
printf("\n");
}
break;
case 4:
return;
default:
printf("选择错误,重新选择!\n");
break;
}
}
}
我们采用qsort排序法:
cpp
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
base首元素地址-数组名
num元素个数
size数据类型的大小
int (*compar)(const void*,const void*))比较大小的函数指针
以下是整个代码的实现:
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 20
#define Number sizeof(struct Student)
struct Student
{
char Stuid[N];
char Stuname[N];
int Stuage;
char Stusex[N];
double score[3];
}Stu[Number];
enum menu2
{
Quit = 0,
Resume = 1
};
enum ChaZhao
{
CaoZuo1 = 1,
CaoZuo2 = 2,
CaoZuo3 = 3
};
int m = 0;
void menu1()
{
printf("\n");
system("color F4");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t*---------------------------------------------------*\n");
printf("\t\t\t* 学生管理系统 *\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t********************系统功能菜单*********************\n");
printf("\t\t\t---------------------- --------------------------\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 1、使用帮助菜单 * 2、增加学生信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 3、查询学生信息 * 4、删除学生信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 5、保存当前信息 * 6、显示当前信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 7、修改学生信息 * 8、学生成绩排名 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t---------------------- --------------------------\n");
}
void menu2()
{
system("color F4");
printf("*********************\n");
printf("*********************\n");
printf("-------1.Resume------\n");
printf("-------0.Quit--------\n");
printf("*********************\n");
}
void TiShi()
{
printf("欢迎来到学生管理系统:\n");
printf("在这个管理系统中,教师和学生都不需要去了解自己的信息,只需通过网络就能实现自己的信息管理。\n");
printf("教师可以轻松便捷地掌握学生相关情况、姓名、学号以及考试成绩等基本信息。\n");
printf("它还提供一个搜索功能和设置权限,可以将学生的信息进行搜索,\n也可根据关键字或其他方式对其进行定位,并且还能显示出该人的相关基本资料。\n");
printf("如果由技术上的缺陷还请联系项目负责人:\n唐工:2172227341@qq.com\n");
system("pause");
system("cls");
}
void StuXinXi()
{
int i = m,flag,n = 0;
printf("请输入你要添加的学生人数:\n");
scanf("%d", &n);
printf("--------------------------*学生信息录入系统*--------------------------------\n");
if (n > 0)
{
do {
flag = 1;
while (flag)
{
flag = 0;
printf("请输入第%d位学生的学号:\n", i + 1);
scanf("%s", Stu[i].Stuid);
for (int 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);
printf("请输入第%d学生的性别:\n", i + 1);
scanf("%s", &Stu[i].Stusex);
printf("请输入第%d学生的C语言成绩:\n", i + 1);
scanf("%lf", &Stu[i].score[0]);
printf("请输入第%d学生的高数成绩:\n", i + 1);
scanf("%lf", &Stu[i].score[1]);
printf("请输入第%d学生的大物成绩:\n", i + 1);
scanf("%lf", &Stu[i].score[2]);
i++;
} while (i < n + m);
m += n;
if (flag == 0)
{
printf("添加完成!请进行下一步操作:\n");
}
system("pause");
system("cls");
}
}
void ChaZhao()
{
int flag, input;
char Stu1[Number];
printf("\t\t\t----------*学生信息查找系统*----------\n");
printf("\t\t\t**************************************\n");
printf("\t\t\t******1.请输入你要查找的学生名字******\n");
printf("\t\t\t******2.请输入你要查找的学生学号******\n");
printf("\t\t\t******------3.退出本次操作------******\n");
printf("\t\t\t**************************************\n");
while (1)
{
flag = 0;
printf("请输入你要进行的查询操作:\n");
scanf("%d", &input);
switch (input)
{
case CaoZuo1:
printf("请输入你要查找的学生名字:\n");
scanf("%s", Stu1);
for (int i = 0; i < m; i++)
{
if (strcmp(Stu[i].Stuname, Stu1) == 0)
{
flag = 1;
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}break;
case CaoZuo2:
printf("请输入你要查找的学生学号:\n");
scanf("%s", Stu1);
for (int i = 0; i < m; i++)
{
if (strcmp(Stu[i].Stuid, Stu1) == 0)
{
flag = 1;
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}break;
case CaoZuo3:
return;
default:
printf("输入错误,重新选择!\n");
}
if (flag == 0)
{
printf("该学生没有录入系统,请重新查找!\n");
}
}
system("pause");
}
void ShanGai()
{
int flag = 0;
char arr[Number];
printf("----------------------------------*学生名单*----------------------------------------------------------\n");
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
for (int i = 0; i < m; i++)
{
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
printf("请输入你要删除学生的学号:\n");
scanf("%s", arr);
for (int i = 0; i < m; i++)
{
if (strcmp(Stu[i].Stuid, arr) == 0)
{
flag = 1;
for (int j = i; j < m - 1; j++)
{
Stu[j] = Stu[j + 1];
}
}
}
if (flag == 0)
{
printf("无法查找该学生信息!\n");
}
else
{
printf("删除成功,请查询系统!\n");
m--;
printf("----------------------------------*学生名单*----------------------------------------------------------\n");
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
for (int i = 0; i < m; i++)
{
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}
system("pause");
}
void BaoCun()
{
FILE* fp;
char filename[Number];
printf("------------------------------\n");
printf("---*请输入你要保存的文件名*---\n");
printf("------------------------------\n");
scanf("%s", filename);
if (fp = fopen("filename.txt", "a")== NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for (int i = 0; i < m; i++)
{
if (fwrite(&Stu[i], sizeof(struct Student), 1, fp) != 1)
{
printf("保存失败!\n");
}
else
{
printf("保存成功!\n");
}
}
fclose(fp);
fp = NULL;
system("pause");
}
void XianShi()
{
if (m == 0)
{
printf("您好!现在还暂未录入学生信息,请稍后重试");
}
else
{
printf("现在有%d名学生:\n", m);
printf("-------------------------------------*成绩显示*----------------------------------------------\n");
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
for (int i = 0; i < m; i++)
{
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
}
}
system("pause");
}
void XiuGai()
{
int input = 0;
int flag;
char id[Number], name[Number], sex[Number];
int age;
double score;
printf("请输入要修改的学生学号:\n");
scanf("%s", &id);
while (1)
{
flag = 0;
for (int i = 0; i < m; i++)
{
if (strcmp(id, Stu[i].Stuid) == 0)
{
flag = 1;
printf("学号:\t\t名字:\t年龄:\t性别:\tC语言成绩:\t高数成绩:\t大物成绩:\n");
printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);
printf("**************************************************\n");
printf("----1.修改学生性别 2.修改学生姓名-----\n");
printf("----3.修改学生年龄 4.修改C语言成绩----\n");
printf("----5.修改高数成绩 6.修改大物成绩-----\n");
printf("********************7.退出本菜单******************\n");
printf("请输入你要修改的选项:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入要修改的性别:\n");
scanf("%s", sex);
strcpy(Stu[i].Stusex, sex);
break;
case 2:
printf("请输入要修改的姓名:\n");
scanf("%s",name);
strcpy(Stu[i].Stuname, name);
break;
case 3:
printf("请输入要修改的年龄:\n");
scanf("%d", &age);
Stu[i].Stuage = age;
break;
case 4:
printf("请输入要修改的C语言成绩:\n");
scanf("%lf", &score);
Stu[i].score[0] = score;
break;
case 5:
printf("请输入要修改的高数成绩:\n");
scanf("%lf", &score);
Stu[i].score[1] = score;
break;
case 6:
printf("请输入要修改的大物成绩:\n");
scanf("%lf", &score);
Stu[i].score[2] = score;
break;
case 7:
return;
default:
printf("选择错误,请重新选择!\n");
break;
}
}
if (1 <= input && input <= 6)
{
printf("恭喜你修改成功!\n");
break;
}
if (flag == 0)
{
printf("没有找到该学生信息,请重新输入学生学号:\n");
gets(name);
}
}
}
system("pause");
}
int PaiXu(const void* e1, const void* e2)
{
return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu1(const void* e1, const void* e2)
{
return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu2(const void* e1, const void* e2)
{
return ((struct Student*)e2)->score[2] - ((struct Student*)e1)->score[2];
}
void PaiMing()
{
int input = 0;
while (1)
{
printf("\t\t**************************************************\n");
printf("\t\t---------------------***光荣榜***-----------------\n");
printf("\t\t**************************************************\n");
printf("\t\t********1.C语言-------------------2.高数**********\n");
printf("\t\t********3.大物--------------------4.退出系统******\n");
printf("\t\t**************************************************\n");
printf("请输入你要查询的排名:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("\t学号:\t\t名字:\tC语言成绩:\n");
int rs = sizeof(Stu) / sizeof(Stu[0]);
qsort(Stu, rs, sizeof(Stu[0]), PaiXu);//排序
for (int i = 0; i < m; i++)
{
printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);
printf("\n");
}
break;
case 2:
printf("\t学号:\t\t名字:\t高数成绩:\n");
int rs1 = sizeof(Stu) / sizeof(Stu[0]);
qsort(Stu, rs1, sizeof(Stu[0]), PaiXu1);
for (int i = 0; i < m; i++)
{
printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);
printf("\n");
}
break;
case 3:
printf("\t学号:\t\t名字:\t大物成绩:\n");
int rs2 = sizeof(Stu) / sizeof(Stu[0]);
qsort(Stu, rs, sizeof(Stu[0]), PaiXu2);
for (int i = 0; i < m; i++)
{
printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);
printf("\n");
}
break;
case 4:
return;
default:
printf("选择错误,重新选择!\n");
break;
}
}
}
int sum = 1;
int main()
{
int i = 0;
int input = 0, count = 0;
char mima[20] = "123";//登入的密码
char shuru[20];
char mingzi[20];
system("color F4");
printf("\t\t\t **************************************\n");
printf("\t\t\t | *欢迎使用学生管理系统* |\n");
printf("\t\t\t | *管理员: 小唐* |\n");
printf("\t\t\t ------------------------------------\n");
printf("请输入管理员密码:\n");
while ((count = _getch()) != '\r')
{
if (count == '\b')
{
i--;
printf("\b \b");
}
else
{
shuru[i++] = count;
printf("*");
}
}
shuru[i++] = '\0';
if (strcmp(mima, shuru) == 0)
{
printf("\n密码正确,您已进入系统!\n");
}
else
{
printf("\n密码错误,请重新输入!\n");
return 0;
}
system("pause");
system("cls");
do
{
menu2();
printf("请选择继续还是结束操作:\n");
scanf("%d", &sum);
switch (sum)
{
case Quit:
system("cls");
printf("您已退出学生管理系统!\n");
break;
case Resume:
menu1();
void(*p[9])() = { NULL,TiShi,StuXinXi,ChaZhao,ShanGai,BaoCun,XianShi,XiuGai,PaiMing };//指针数组函数
printf("请输入你要进行的操作\n");
scanf("%d", &input);
system("cls");
(*p[input])();
break;
default:
printf("输入错误,重新输入!\n");
break;
}
} while (sum);
return 0;
}