目录

实现学生管理系统

第一步:结构体声明

第二步:重命名结构体

第三步:限定可以存储的最大学生数目

第四步:定义结构体指针数组和定义一个整型变量存放当前的人数

第五步:设计欢迎界面

第六步:设计菜单界面

第七步:获取用户的选择

第八步:根据用户的选择实现对应的功能,分支语句

第一个功能:添加信息

第二个功能:显示信息

第三个功能:修改信息

第四个功能:删除信息

第五个功能:查找信息

第六个功能:退出系统

完整参考代码


今天是C语言笔试复习的最后一篇了!主要是实现学生管理系统!坚持就是胜利!

下一个阶段是数据结构!敬请期待!

实现学生管理系统

用结构体指针数组来写,数组中的每个元素都是指针,每个指针指向的对象是结构体

一般来说,管理系统都包含学生信息,和“增删改查”这些管理操作。

整体参考代码会放在文章最后。

以下是步骤分解:

第一步:结构体声明

第二步:重命名结构体

第三步:限定可以存储的最大学生数目

第四步:定义结构体指针数组和定义一个整型变量存放当前的人数

#include <stdio.h>
#include <stdlib.h>//system/exit/malloc的头文件
#include <unistd.h>//sleep的头文件
#include <string.h>//strlen的头文件

//结构体声明
struct Student
{
	int id;
	char name[32];
	int age;
	char tel[12];
};
//注意:结构体的声明不能直接在结构体当中初始化

typedef struct Student stu;//重命名结构体为stu
//限定可以储存的最大学生数目
#define MAX 1024
//定义结构体指针数组
stu* g_info[MAX]={0};//数组用来存放学生信息(的地址)
int g_count=0;//表示当前的的人数

第五步:设计欢迎界面

void welcome()
{
	system("clear");//清屏
	printf("---------------------------------------------------------\n\n");
	printf("\t\t欢迎使用学生管理系统\n\n");
	printf("---------------------------------------------------------\n\n");
	sleep(2);//睡眠2s
}

第六步:设计菜单界面

void menu()
{
	
	system("clear");//清屏
	printf("---------------------------------------------------------\n\n");
	printf("\t\t1.添加信息 2.显示信息\n\n");
	printf("\t\t3.修改信息 4.删除信息\n\n");
	printf("\t\t5.查找信息 6.退出系统\n\n");
	printf("---------------------------------------------------------\n\n");
}

第七步:获取用户的选择

menu();
scanf("%d",&choice);

第八步:根据用户的选择实现对应的功能,分支语句

switch(choice)
{
	case 1://添加信息
		add_info();
	break;
	case 2://显示信息
		show_info();
	break;
	case 3://修改信息
		modify_info();
	break;
	case 4://删除信息
		delete_info();
	break;
	case 5://查找信息
		find_info();
	break;
	case 6://退出系统
		exit(0);
	break;
	default:
		printf("输入有误\n");
}

第一个功能:添加信息

void add_info()
{
	printf("请输入 学号 姓名 年龄 电话\n");
	g_info[g_count]=(stu*)malloc(sizeof(stu)*1);//申请空间
	if(NULL==g_info[g_count])
	{
		printf("申请失败\n");
		exit(1);
	}

	int flag=1;
	while(flag)
	{
		//获取信息
		scanf("%d%s%d%s",&g_info[g_count]->id,g_info[g_count]->name,&g_info[g_count]->age,g_info[g_count]->tel);
		//判断电话的长度
		if(strlen(g_info[g_count]->tel)!=11)
		{
			printf("输入的电话信息有误,请重新输入...\n");
			continue;//重新开始scanf环节
		}
		//判断电话是否重复
		int i;
		for(i=0;i<g_count;i++)
		{
			if(strcmp(g_info[i]->tel,g_info[g_count]->tel)==0)
			{
				printf("电话重复,请重新输入...\n");
				flag=1;
				break;//退出for循环
			}
		}
		//电话没有重复且是11位
		if(i==g_count)
		{
			flag=0;//退出while循环
		}
	}
	g_count++;
	printf("添加信息成功\n");
	sleep(2);
}

第二个功能:显示信息

void show_info()
{
	//将学生信息按照学号排序,冒泡排序
	int i,j;
	stu*tmp;
	for(i=0;i<g_count-1;i++)
	{
		for(j=0;j<g_count-1-i;j++)
		{
			//通过结构体指针间接比较指针所指向的结构体的成员id
			if(g_info[j]->id>g_info[j+1]->id)
			{
				//交换地址
				tmp=g_info[j];
				g_info[j]= g_info[j+1];
				g_info[j+1]=tmp;
			}
		}
	}
	//设计表头
	printf("%5s %5s %5s %15s\n","学号","姓名","年龄","电话");
	//排序好之后打印出来
	for(i=0;i<g_count;i++)
	{
		printf("%5d %5s %5d %15s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
	}

	sleep(2);
}

第三个功能:修改信息

void modify_info()
{
	printf("请输入要修改人员的学号\n");
	int id;
flag:
	scanf("%d",&id);

	int i;
	//遍历所有结构体中的学号
	for(i=0;i<g_count;i++)
	{
		if(g_info[i]->id==id)
		{
			printf("当前信息如下:\n");
			printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
			printf("请输入新信息\n");
			int flag=1;
			while(flag)
			{		
				//获取信息
				scanf("%d%s%d%s",&g_info[i]->id,g_info[i]->name,&g_info[i]->age,g_info[i]->tel);
				//判断电话的长度
				if(strlen(g_info[i]->tel)!=11)
				{
					printf("输入的电话信息有误,请重新输入...\n");
					continue;//重新开始scanf环节
				}
				//判断和前面的人和后面的人的电话是否重复,跳过自己
				int j;
				for(j=0;j<g_count;j++)
				{
					if(i==j)//跳过自己
						continue;

					if(strcmp(g_info[i]->tel,g_info[j]->tel)==0)
					{
						printf("电话重复,请重新输入...\n");
						flag=1;
						break;//退出for循环
					}
				}
				//电话没有重复且是11位
				if(j==g_count)
				{
					flag=0;//退出while循环
				}
			}
			printf("修改成功\n");
			sleep(2);
			return;//结束函数	
		}
	}

	if(i==g_count)
	{
		printf("学号不存在\n");
		goto flag;
	}
}

第四个功能:删除信息

void delete_info()
{
	printf("请输入要删除的学生学号:\n");
	int id;
	scanf("%d",&id);

	int i,j;
	for(i=0;i<g_count;i++)
	{
		if(g_info[i]->id==id)
		{
			free(g_info[i]);//将g_info[i]指向的那块内存释放掉
			//后面的往前覆盖
			for(j=0;j<g_count-i-1;j++)
			{
				g_info[i+j]=g_info[i+1+j];
			}
			g_count--;//人数减1
			printf("删除成功\n");
			sleep(2);
			return;
		}
	}
	printf("学号不存在\n");
	sleep(2);
}

第五个功能:查找信息

void find_info()
{
	printf("根据学号查找(1)还是根据姓名查找(2)\n");
	int choice;
	scanf("%d",&choice);
	int i;
	if(1==choice)
	{
		printf("请输入查找人的学号:\n");
		int id;
		scanf("%d",&id);
		//遍历
		for(i=0;i<g_count;i++)
		{
			if(g_info[i]->id==id)
			{
				printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
				sleep(2);
				return;
			}
		}
		printf("学号不存在\n");
		sleep(2);
	}
	else if(2==choice)
	{
		printf("请输入学生的姓名\n");
		char name[32]={0};
		scanf("%s",name);
		for(i=0;i<g_count;i++)
		{
			if(!strcmp(name,g_info[i]->name))//如果相等,即0,取反即1,1即真
			{	
				printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
				sleep(2);
				return;
			}
		}
		printf("输入的姓名有误\n");
		sleep(2);
	}
}

第六个功能:退出系统

case 6://退出系统
	exit(0);

完整参考代码

#include <stdio.h>
#include <stdlib.h>//system/exit/malloc的头文件
#include <unistd.h>//sleep的头文件
#include <string.h>//strlen的头文件

//结构体声明
struct Student
{
	int id;
	char name[32];
	int age;
	char tel[12];
};
//注意:结构体的声明不能直接在结构体当中初始化

typedef struct Student stu;//重命名结构体为stu
//限定可以储存的最大学生数目
#define MAX 1024
//定义结构体指针数组
stu* g_info[MAX]={0};//数组用来存放学生信息(的地址)
int g_count=0;//表示当前的的人数


void welcome()
{
	system("clear");//清屏
	printf("---------------------------------------------------------\n\n");
	printf("\t\t欢迎使用学生管理系统\n\n");
	printf("---------------------------------------------------------\n\n");
	sleep(2);//睡眠2s
}

void menu()
{
	
	system("clear");//清屏
	printf("---------------------------------------------------------\n\n");
	printf("\t\t1.添加信息 2.显示信息\n\n");
	printf("\t\t3.修改信息 4.删除信息\n\n");
	printf("\t\t5.查找信息 6.退出系统\n\n");
	printf("---------------------------------------------------------\n\n");
}

void add_info()
{
	printf("请输入 学号 姓名 年龄 电话\n");
	g_info[g_count]=(stu*)malloc(sizeof(stu)*1);//申请空间
	if(NULL==g_info[g_count])
	{
		printf("申请失败\n");
		exit(1);
	}

	int flag=1;
	while(flag)
	{
		//获取信息
		scanf("%d%s%d%s",&g_info[g_count]->id,g_info[g_count]->name,&g_info[g_count]->age,g_info[g_count]->tel);
		//判断电话的长度
		if(strlen(g_info[g_count]->tel)!=11)
		{
			printf("输入的电话信息有误,请重新输入...\n");
			continue;//重新开始scanf环节
		}
		//判断电话是否重复
		int i;
		for(i=0;i<g_count;i++)
		{
			if(strcmp(g_info[i]->tel,g_info[g_count]->tel)==0)
			{
				printf("电话重复,请重新输入...\n");
				flag=1;
				break;//退出for循环
			}
		}
		//电话没有重复且是11位
		if(i==g_count)
		{
			flag=0;//退出while循环
		}
	}
	g_count++;
	printf("添加信息成功\n");
	sleep(2);
}

void show_info()
{
	//将学生信息按照学号排序,冒泡排序
	int i,j;
	stu*tmp;
	for(i=0;i<g_count-1;i++)
	{
		for(j=0;j<g_count-1-i;j++)
		{
			//通过结构体指针间接比较指针所指向的结构体的成员id
			if(g_info[j]->id>g_info[j+1]->id)
			{
				//交换地址
				tmp=g_info[j];
				g_info[j]= g_info[j+1];
				g_info[j+1]=tmp;
			}
		}
	}
	//设计表头
	printf("%5s %5s %5s %15s\n","学号","姓名","年龄","电话");
	//排序好之后打印出来
	for(i=0;i<g_count;i++)
	{
		printf("%5d %5s %5d %15s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
	}

	sleep(2);
}

void modify_info()
{
	printf("请输入要修改人员的学号\n");
	int id;
flag:
	scanf("%d",&id);

	int i;
	//遍历所有结构体中的学号
	for(i=0;i<g_count;i++)
	{
		if(g_info[i]->id==id)
		{
			printf("当前信息如下:\n");
			printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
			printf("请输入新信息\n");
			int flag=1;
			while(flag)
			{		
				//获取信息
				scanf("%d%s%d%s",&g_info[i]->id,g_info[i]->name,&g_info[i]->age,g_info[i]->tel);
				//判断电话的长度
				if(strlen(g_info[i]->tel)!=11)
				{
					printf("输入的电话信息有误,请重新输入...\n");
					continue;//重新开始scanf环节
				}
				//判断和前面的人和后面的人的电话是否重复,跳过自己
				int j;
				for(j=0;j<g_count;j++)
				{
					if(i==j)//跳过自己
						continue;

					if(strcmp(g_info[i]->tel,g_info[j]->tel)==0)
					{
						printf("电话重复,请重新输入...\n");
						flag=1;
						break;//退出for循环
					}
				}
				//电话没有重复且是11位
				if(j==g_count)
				{
					flag=0;//退出while循环
				}
			}
			printf("修改成功\n");
			sleep(2);
			return;//结束函数	
		}
	}

	if(i==g_count)
	{
		printf("学号不存在\n");
		goto flag;
	}
}

void delete_info()
{
	printf("请输入要删除的学生学号:\n");
	int id;
	scanf("%d",&id);

	int i,j;
	for(i=0;i<g_count;i++)
	{
		if(g_info[i]->id==id)
		{
			free(g_info[i]);//将g_info[i]指向的那块内存释放掉
			//后面的往前覆盖
			for(j=0;j<g_count-i-1;j++)
			{
				g_info[i+j]=g_info[i+1+j];
			}
			g_count--;//人数减1
			printf("删除成功\n");
			sleep(2);
			return;
		}
	}
	printf("学号不存在\n");
	sleep(2);
}

void find_info()
{
	printf("根据学号查找(1)还是根据姓名查找(2)\n");
	int choice;
	scanf("%d",&choice);
	int i;
	if(1==choice)
	{
		printf("请输入查找人的学号:\n");
		int id;
		scanf("%d",&id);
		//遍历
		for(i=0;i<g_count;i++)
		{
			if(g_info[i]->id==id)
			{
				printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
				sleep(2);
				return;
			}
		}
		printf("学号不存在\n");
		sleep(2);
	}
	else if(2==choice)
	{
		printf("请输入学生的姓名\n");
		char name[32]={0};
		scanf("%s",name);
		for(i=0;i<g_count;i++)
		{
			if(!strcmp(name,g_info[i]->name))//如果相等,即0,取反即1,1即真
			{	
				printf("%d %s %d %s\n",g_info[i]->id,g_info[i]->name,g_info[i]->age,g_info[i]->tel);
				sleep(2);
				return;
			}
		}
		printf("输入的姓名有误\n");
		sleep(2);
	}
}

int main()
{
	welcome();
	int choice;

	while(1)
	{
		menu();
		scanf("%d",&choice);

		switch(choice)
		{
			case 1://添加信息
				add_info();
			break;
			case 2://显示信息
				show_info();
			break;
			case 3://修改信息
				modify_info();
			break;
			case 4://删除信息
				delete_info();
			break;
			case 5://查找信息
				find_info();
			break;
			case 6://退出系统
				exit(0);
			break;
			default:
				printf("输入有误\n");
		}
	}

	return 0;
}

以上代码只是基础版本,有待更加完善,大家有时间可以自己发挥!

到此C语言笔试复习就结束了,下一个阶段是学习数据结构,敬请期待!

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐