C语言搭建项目-学生管理系统(非链表)

news2024/11/27 17:56:04

目录

搭建offer.h文件

搭建offer.c中的main函数

密码登入系统

搭建my_oferr.c中的接口函数 

使用帮助菜单接口函数

增加学生信息接口函数 

查询学生信息接口函数

删除学生信息接口函数 

保存学生信息接口 

打开文件fopen

关闭文件fclose

 判断是否保存文件fwrite

退出执行文件exit

显示学生信息接口函数

 修改学生信息接口函数

 学生排名信息接口函数

--------------------------------------

---------------- 

每次归程,都是为了更好出发;

每次停歇,都是为了积攒力量 。

最近大家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,用于存储每个学生的信息

#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"

#include"offer.h"

 整体的框架如下:

#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;
}

接下来我将带领大家解读以上代码

密码登入系统

在进入学生管理系统之前,我设置了一个小型的系统密码登入界面来判断是进入还是退出

	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()的作用就是选择继续操作还是退出系统

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中的全局变量

#include"offer.h"
int m = 0;              //记录录入学生的人数

由于是显示一个管理系统

所以我们设计一个主菜单

通过定义一个函数menu2()来实现这个功能:

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 TiShi()
{
	printf("欢迎来到学生管理系统:\n");
	printf("在这个管理系统中,教师和学生都不需要去了解自己的信息,只需通过网络就能实现自己的信息管理。\n");
	printf("教师可以轻松便捷地掌握学生相关情况、姓名、学号以及考试成绩等基本信息。\n");
	printf("它还提供一个搜索功能和设置权限,可以将学生的信息进行搜索,\n也可根据关键字或其他方式对其进行定位,并且还能显示出该人的相关基本资料。\n");
	printf("如果由技术上的缺陷还请联系项目负责人:\n17817473648\n");
	system("pause");
	system("cls");
}

 system("pause")是暂停函数,按任意键重新启动,被#include<stdlib.h>包含

本函数接口主要起到提示作用,小伙伴们可以自行添加自己的管理需求 


 增加学生信息接口函数 

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就好了


查询学生信息接口函数

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++) //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 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

FILE *fopen( const char *filename, const char *mode );

在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

关闭文件fclose

为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:

 int fclose( FILE *fp );

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 #include<stdio.h> 中的常量。

 判断是否保存文件fwrite

fwrite(file,string,length)
file必需。规定要写入的打开文件。
string必需。规定要写入打开文件的字符串。
length可选。规定要写入的最大字节数。

fwrite() 函数将内容写入一个打开的文件中。

函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行

如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE

退出执行文件exit

void exit(int status) 

立即终止调用进程。任何属于该进程的打开的文件描述符都会被关闭,该进程的子进程由进程 1 继承,初始化,且会向父进程发送一个 SIGCHLD 信号。 

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);   //关闭文件
	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");
}

char* strcpy(char * destination, const char * source ); 

strcpy:拷贝函数,将括号右边的值拷贝到左边,详细可看我之前的博客

 学生排名信息接口函数

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排序法:

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*))比较大小的函数指针 

以下是整个代码的实现:

#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);
	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;
		}
	}
}
#include"offer.h"
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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1296013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP传输层详解(计算机网络复习)

介绍&#xff1a;TCP/IP包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff0c;简称TCP/IP。该协议族提供了点对点的连接机制&#xff0c;并将传输数据帧的封装、寻址、传输、路由以及接收方式都予以标准化 TCP/IP的分层模型 在讲TCP/IP协议之前&#xff0c;首先介绍一…

【MATLAB】tvfEMD信号分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 TVFEMDFFTHHT组合算法是一种结合了总体变分模态分解&#xff08;TVFEMD&#xff09;、傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的信号分解方…

配置Smart Link负载分担示例

Smart Link和Monitor Link简介 定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#…

<习题集><LeetCode><链表><2/19/21/23/24>

目录 2. 两数相加 19. 删除链表的倒数第 N 个结点 21. 合并两个有序链表 23. 合并 K 个升序链表 24. 两两交换链表中的节点 2. 两数相加 https://leetcode.cn/problems/add-two-numbers/ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//head是cur链表头节点…

拼多多选品大作战:通过热词选利润赛道

相信很多人都听过一句话&#xff1a;找对了风口&#xff0c;猪都能飞起来。 我们电商人也应如此&#xff0c;从行业分析到选品都应快速跟上市场节奏。 今天就给大家分享一下如何通过热词来进行一个行业类目的分析与选择。 01 热词是什么 热词通常指的是热搜词和飙升词&#…

大华DSS S2-045 OGNL表达式注入漏洞复现

0x01 产品简介 大华DSS安防监控系统平台是一款集视频、报警、存储、管理于一体的综合安防解决方案。该平台支持多种接入方式,包括网络视频、模拟视频、数字视频、IP电话、对讲机等。此外,该平台还支持多种报警方式,包括移动侦测、区域入侵、越线报警、人员聚集等。 0x02 漏…

天津大数据培训机构品牌 数据分析师的发展方向

大数据专业还是有一定难度的&#xff0c;毕竟大数据开发技术所包含的编程技术知识是比较杂且多的如果是计算机专业的学生或者自身有一定基础的人学&#xff0c;相对来说会比较容易&#xff0c;但对于零基础小伙伴学习来说&#xff0c;想要学习大数据&#xff0c;难度还是很高的…

C# 编程新手必看,一站式学习网站,让你轻松掌握 C# 技能!

介绍&#xff1a;实际上&#xff0c;您可能弄错了&#xff0c;C#并不是一种独立的编程语言&#xff0c;而是一种由微软公司开发的面向对象的、运行于.NET Framework之上的高级程序设计语言。C#看起来与Java十分相似&#xff0c;但两者并不兼容。 C#的设计目标是简单、强大、类型…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 1.3 缺失值分析 2 VMD经验模态分解 3 构造训练数据 4 LSTM模型训练 5 预测 1 数据处理 1.1 导入库文件 import time import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt f…

系列八、SpringBoot中自定义SpringMVC配置

一、概述 作为Spring家族的明星产品&#xff0c;SpringBoot极大地简化了程序员的日常开发&#xff0c;提高了开发效率。我们很容易得借助于SpringBoot就可以快速开发业务代码。一般情况下&#xff0c;公司的日常开发都是基于web服务的&#xff0c;我们在使用idea等工具初始化一…

SecureCRT9汉化版安装详解

CRT中文版安装说明 一、安装步骤1. 安装注意&#xff1a;2. 右键压缩包&#xff0c;解压到本地文件夹内3. 解压后进入目录&#xff0c;双击CRT_SFX_91_Run_Script激活脚本 3 如果运行结果是下图&#xff0c;就激活成功了&#xff1a;4. 双击桌面的CRT和FX图标5. 如果提示下图&a…

Qt简介、工程文件分离、创建Qt工程、Qt的帮助文档

QT 简介 core&#xff1a;核心模块&#xff0c;非图形的接口类&#xff0c;为其它模块提供支持 gui&#xff1a;图形用户接口&#xff0c;qt5之前 widgets&#xff1a;图形界面相关的类模块 qt5之后的 database&#xff1a;数据库模块 network&#xff1a;网络模块 QT 特性 开…

VisualStudio反汇编功能使用

VisualStudio反汇编功能使用 使用方法 到达断点时&#xff1a;CtrlK&#xff08;松开&#xff09;G&#xff08;后按&#xff09;唤出反汇编界面&#xff0c;就可以看到当前代码对应的汇编语言了 注意&#xff1a;进入反汇编窗口后可以F10单次调试一条汇编指令 其他&#…

3.添加与删除字段

添加字段与删除字段 1.添加字段 因为甲方的业务需求是不停变化的&#xff0c;所以在数据库操作中&#xff0c;添加字段可是常有的事。一个完整的字段包括&#xff1a;字段名、数据类型和完整性约束。 语法规则为&#xff1a; ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条…

SPECPOWER2008

一、前言# 1、软件说明# 官网&#xff1a;SERT套件用户指南2.0.5SPECpower介绍SPEC基准及工具SPECpower_ssj2008测试结果SPECpower_ssj2008-Design_ccs - SPEC# SPEC&#xff08;the Standard Performance Evaluation Corporation&#xff09;是一个由计算机硬件厂商、软件公…

JPA对数据库修改注意点

同一事务中获取不到修改数据 spring-boot-starter-parent版本2.7.12 Dao Query(value "select * from inventory_list where id in (?1) order by id desc",nativeQuery true) List<InventoryListEntity> getByIds(List<Integer> idList);Modifyin…

openharmony 开发环境搭建和系统应用编译傻瓜教程

一、DevEco Studio 安装 当前下载版本有两个&#xff0c;由于低版本配置会有各种问题&#xff0c;我选择高版本安装 低版本下载链接 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 高版本下载链接 OpenAtom OpenHarmony 解压后安装 双击安装 安装配置 二、创建测…

字符串指令集

字符串指令的格式 例子1就成功发送了指令 例子2就是发送的字符串有误 查询当前位置就会在附加信息中返回当前座位的坐标 第一个指令的参数就是闪灯的两个参数 如第一个示例就是10ms On Time 第二个就是Off Time 使用标准库来接收字符串命令 字符串指令的接收 因为一个指令就是…

vue实现可拖拽列表

直接上代码 <!-- vue实现可拖拽列表 --> <template><div><button click"logcolig">打印数据</button><TransitionGroup name"list" tag"div" class"container"><divclass"item"v-f…

『PyTorch学习笔记』如何快速下载huggingface模型/数据—全方法总结

如何快速下载huggingface模型/数据—全方法总结 文章目录 一. 如何快速下载huggingface大模型1.1. IDM(Windows)下载安装连接1.2. 推荐 huggingface 镜像站1.3. 管理huggingface_hub cache-system(缓存系统) 二. 参考文献 一. 如何快速下载huggingface大模型 推荐 huggingface…