嵌入式全栈开发学习笔记---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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境下TensorFlow安装教程

TensorFlow是学习深度学习时常用的Python神经网络框 下面以Mask R-CNN 的环境配置为例&#xff1a; 首先进入官网&#xff1a;www.tensorflow.org TensorFlow安装的总界面&#xff1a; 新建anaconda虚拟环境&#xff1a; conda create -n envtf2 python3.8 &#xff08;Pyth…

Linux系统编程(三)进程间通信(IPC)

本文目录 一、linux 进程之间的通信种类二、管道1. 管道的概述2. 什么是管道文件&#xff1f;3. 管道的特点4. 管道类型&#xff08;1&#xff09;无名管道&#xff08;pipe&#xff09;&#xff08;2&#xff09;有名(命名)管道&#xff08;fifo&#xff09; 三、信号&#xf…

【JVM】内存区域划分 | 类加载的过程 | 双亲委派机制 | 垃圾回收机制

文章目录 JVM一、内存区域划分1.方法区&#xff08;1.7之前&#xff09;/ 元数据区&#xff08;1.8开始&#xff09;2.堆3.栈4.程序计数器常见面试题&#xff1a; 二、类加载的过程1.类加载的基本流程1.加载2.验证3.准备4.解析5.初始化 2.双亲委派模型类加载器找.class文件的过…

wetool企业版使用教程及下载方式 微兔该如何使用 wetool还能用吗 wetool扳手工具wetool操作方法难吗 wetool有哪些功能

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 掘金小蜜&#xff08;只支持Win7及以上操作系统&#xff0c;没有推Mac版和手机客户…

晶圆厂的PE转客户工程师前景怎么样?

知识星球&#xff08;星球名&#xff1a; 芯片制造与封测技术社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; 目前在晶圆厂做PE&#xff0c;倒班oncall压力太大把身体搞坏了&#xff0c;现在有一个design house的CE客户工程师的offer&…

【class15】人工智能初步----语音识别(2)

【class15】 本节课&#xff0c;我们将学习以下三个知识点&#xff1a;1. wav文件2. 从视频中获取音频文件3. 对音频文件进行参数设置接下来&#xff0c;我们一起学习吧&#xff5e; 声音是一种波&#xff0c;电脑只能对采样后所得的数字进行处理。常见的音频格式有很多&…

UCOSII_STM32F1移植详细过程(一)

UCOSII_STM32F1移植详细过程&#xff08;一&#xff09; 1、概述2、关于C/OS3、移植过程&#xff08;文件描述与提取&#xff09;1.软件工程文件夹描述2.提取工程中有用的文件3.提取ST标准外设库有用的文件2.新建、修改文件 1、概述 该文写针对初学C/OS的朋友&#xff0c;基于…

数据集001:安全帽检测数据集 (Helmet Detection) (含数据集下载链接)

安全帽检测 安全帽识别是一个目标检测任务&#xff0c;及时排查安全帽佩戴的规范性并给予提醒&#xff0c;可以大大降低施工安全隐患。这是CV领域入门级的项目&#xff0c;能快速了解从数据预处理、模型构建、训练到部署的整体流程。 数据集格式 数据集中包含了5000张已经标注…

从垃圾识别到收集器:详细聊聊Java的GC

个人博客 从垃圾识别到收集器:详细聊聊Java的GC | iwts’s blog 前言 聊GC&#xff0c;自然离不开JVM内存模型&#xff0c;建议先了解JVM内存模型相关内容&#xff0c;或者最起码了解堆相关的内容&#xff0c;GC主要处理的就是堆。 这里会从垃圾识别算法->GC算法->JV…

工具使用-网络性能测试工具(iperf)-TCP 和 UDP 的吞吐量-包转发率参数的理解

时间戳&#xff1a;2024年5月26日15:18:39 iperf 和 netperf 都是最常用的网络性能测试工具&#xff0c;测试 TCP 和 UDP 的吞吐量。它们都以客户端和服务器通信的方式&#xff0c;测试一段时间内的平均吞吐量。 接下来&#xff0c;我们就以 iperf 为例&#xff0c;看一下 TC…

Linux防火墙之iptables

一. iptables防火墙的相关知识 1.1 防火墙的概念 防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信…

复习java5.26

面向对象和面向过程 面向过程&#xff1a;把一个任务分成一个个的步骤&#xff0c;当要执行这个任务的时候&#xff0c;只需要依次调用就行了 面向对象&#xff1a;把构成任务的事件构成一个个的对象&#xff0c;分别设计这些对象&#xff08;属性和方法&#xff09;、然后把…

【数据结构课程学习】二叉树_堆:Lesson2

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 1.二插树的概念和结构 &#x1f697;二叉树的概念&#xff1a; &#x1f697;特殊的二叉树&am…

JVM学习-Class文件结构①

字节码文件的跨平台性 Java语言&#xff1a;跨平台的语言(Write Once,Run Anywhere) 当Java源代码编译成字节码后&#xff0c;如果想在不同平台上运行&#xff0c;则无须再次编译这上优势不再那么吸引人&#xff0c;Python,PHP,Ruby,Lisp等有强大的解释器跨平台似乎已经成为一…

【iOS开发】—— KVC

【iOS开发】—— KVC 一. KVC的定义key和keyPath的区别用法&#xff1a; 批量复制操作字典模型相互转化KVC的其他方法 KVC原理赋值原理取值原理 一. KVC的定义 KVC&#xff08;Key-value coding&#xff09;键值编码&#xff0c;就是指iOS的开发中&#xff0c;可以允许开发者通…

C#--SVG矢量图画法示例

1.代码示例 <Viewbox Grid.Column"1" Grid.ColumnSpan"1" Grid.RowSpan"1" ><Path Name"ValveShape" Stroke"Black" Data"M 50,0 L 150,200 L 50,200 L 150,0 Z" Width"200" Height"…

文件系统--inode

文章目录 概述认识磁盘了解磁盘的存储结构对磁盘的存储结构进行逻辑抽象 操作系统对磁盘的使用宏观认识细节认识再谈目录再谈文件的增删 概述 文件有很多&#xff0c;但是被打开的文件很少&#xff0c;这些没有被打开的文件在磁盘中&#xff0c;这就叫做磁盘文件。每次先打开一…

【JavaEE初阶】网络初识|局域网和广域网|交换机和路由器|IP地址|端口号

&#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 关键概念 1.局域网LAN和广域网WAN &#xff08;1&#xff09;局域⽹&#xff0c;即Local Area Network&#xff0…

一文扫尽Nas常用Docker软件

NAS&#xff08;Network Attached Storage&#xff0c;网络附加存储&#xff09;设备上的Docker软件选择取决于您的具体需求和用途。以下是一些NAS上常用的Docker软件推荐&#xff1a; Docker管理工具&#xff1a; Watchtower&#xff1a;它可以自动更新Docker容器中的镜像&…