嵌入式全栈开发学习笔记---C语言笔试复习大全25(实现学生管理系统)

目录

实现学生管理系统

第一步:结构体声明

第二步:重命名结构体

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

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

第五步:设计欢迎界面

第六步:设计菜单界面

第七步:获取用户的选择

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

第一个功能:添加信息

第二个功能:显示信息

第三个功能:修改信息

第四个功能:删除信息

第五个功能:查找信息

第六个功能:退出系统

完整参考代码


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

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

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

实现学生管理系统

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

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

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

以下是步骤分解:

第一步:结构体声明

第二步:重命名结构体

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

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

#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语言笔试复习就结束了,下一个阶段是学习数据结构,敬请期待!

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

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

如果想要进微信交流群可添加微信,备注“进群”!

QQ交流群群号:963138186

欢迎点击下方,订阅本栏目↓↓↓

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值