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

news2024/12/23 21:20:23

目录

实现学生管理系统

第一步:结构体声明

第二步:重命名结构体

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

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

第五步:设计欢迎界面

第六步:设计菜单界面

第七步:获取用户的选择

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

第一个功能:添加信息

第二个功能:显示信息

第三个功能:修改信息

第四个功能:删除信息

第五个功能:查找信息

第六个功能:退出系统

完整参考代码


今天是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

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

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

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

相关文章

【设计模式】JAVA Design Patterns——Command(事务模式)

&#x1f50d;目的 将请求封装为对象&#xff0c;从而使你可以将具有不同请求的客户端参数化&#xff0c;队列或记录请求&#xff0c;并且支持可撤销操作。 &#x1f50d;解释 真实世界例子 有一个巫师在地精上施放咒语。咒语在地精上一一执行。第一个咒语使地精缩小&#xff0…

从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

C++之std::is_trivially_copyable(平凡可复制类型检测)

目录 1.C基础回顾 1.1.平凡类型 1.2.平凡可复制类型 1.3.标准布局类型 2.std::is_trivially_copyable 2.1.定义 2.2.使用 2.3.总结 1.C基础回顾 在C11中&#xff0c;平凡类型&#xff08;Trivial Type&#xff09;、平凡可复制类型&#xff08;TrivialCopyable&#x…

深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程

跨站脚本攻击&#xff08;XSS&#xff09;是一种常见的网络攻击手段&#xff0c;它允许攻击者在受害者的浏览器中执行恶意脚本。以下是一个XSS攻击的实操教程&#xff0c;包括搭建实验环境、编写测试程序代码、挖掘和攻击XSS漏洞的步骤。 搭建实验环境 1. 安装DVWA&#xff…

8.什么是HOOK

程序编译的本质是&#xff0c;首先计算机它只能看得懂机器码也就是只能看得懂数字&#xff0c;机器码学起来很费劲然后就创造了编译器这个东西&#xff0c;编译器它懂机器语言所以它可以跟机器沟通&#xff0c;而我们人可以跟编译器沟通&#xff0c;人跟编译器的语言就是各种各…

GBDT、XGBoost、LightGBM算法详解

文章目录 一、GBDT (Gradient Boosting Decision Tree) 梯度提升决策树1.1 回归树1.2 梯度提升树1.3 Shrinkage1.4 调参1.5 GBDT的适用范围1.6 优缺点 二、XGBoost (eXtreme Gradient Boosting)2.1 损失函数2.2 正则项2.3 打分函数计算2.4 分裂节点2.5 算法过程2.6 参数详解2.7…

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!

大家好&#xff0c;我是电商糖果 视频号这两年看着抖音卖货的热度越来越高&#xff0c;也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店&#xff0c;就可以在视频号售卖商品。 具体怎么操作呢&#xff0c;需要拍视频&#xf…

leedcode【142】. 环形链表 II——Java解法

Problem: 142. 环形链表 II 思路解题方法复杂度Code性能 思路 1.用快慢指针找到相遇的点&#xff08;快指针一次走一步&#xff0c;慢指针一次走两步&#xff09; 2.一个指针从head开始&#xff0c;一个指针从相遇点开始&#xff0c;一次一步&#xff0c;相遇处即为环入口 解题…

Vmware 17安装 CentOS9

前言 1、提前下载好需要的CentOS9镜像&#xff0c;下载地址&#xff0c;这里下载的是x86_64 2、提前安装好vmware 17&#xff0c;下载地址 &#xff0c;需要登录才能下载 安装 1、创建新的虚拟机 2、在弹出的界面中选择对应的类型&#xff0c;我这里选择自定义&#xff0c;点…

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

【大数据面试题】32 Flink 怎么重复读 Kafka?

一步一个脚印&#xff0c;一天一道面试题 首先&#xff0c;为什么要读过的 Kafka 数据重写读一次呢&#xff1f;什么场景下要怎么做呢&#xff1f; 答&#xff1a;当任务失败&#xff0c;从检查点Checkpoint 开始重启时&#xff0c;检查点的数据是之前的了&#xff0c;就需要…

从 0 开始实现一个网页聊天室 (小型项目)

实现功能 用户注册和登录好友列表展示会话列表展示: 显示当前正在进行哪些会话 (单聊 / 群聊) , 选中好友列表中的某个好友, 会生成对应的会话实时通信, A给B发送消息, B的聊天界面 / 会话界面能立刻显示新的消息 TODO: 添加好友功能用户头像显示传输图片 / 表情包历史消息搜…

CTF之Web_python_block_chain

这种题对于我来说只能看大佬的wp&#xff08;但是这一题是wp都看不懂&#xff0c;只能表达一下我的理解了&#xff09; &#xff08;最后有简单方法&#xff0c;前面一种没看懂没关系&#xff09; 下面这一部分是首页的有用部分 访问/source_code,得到源码&#xff1a; # -*-…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发&#xff0c;以后也会记录一些关于鸿蒙相关的问题和解决方法&#xff0c;希望能帮助到大家。 总的来说一般有下面这样的报错 报错一&#xff1a; Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

AIGC 005-Dreambooth定制化生成,微调文本到图像的扩散模型!

AIGC 005-Dreambooth定制化生成&#xff0c;微调文本到图像的扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamBooth 论文 (DreamBooth: Fine-Tuning Text-to-Image Diffusion Models for Subject-Driven Generation) 提出了一种新颖的技术&#x…

2024GDCPC广东省赛记录

比赛流程体验&#xff0c;依托&#xff0c;开赛几分钟了&#xff0c;选手还卡在门外无法入场&#xff0c;也没给延时&#xff0c;说好的桌上会发三支笔&#xff0c;于是我们就没准备&#xff0c;要了三次笔&#xff0c;终于在一小时后拿到了&#x1f605; 比赛题目体验&#xf…

近期阅读论文

Exploring Hybrid Active-Passive RIS-Aided MEC Systems: From the Mode-Switching Perspective abstract 移动边缘计算&#xff08;MEC&#xff09;被认为是支持延迟敏感和计算密集型服务的有前途的技术。 然而&#xff0c;随机信道衰落特性导致的低卸载率成为制约MEC性能的…

数据结构篇之二叉树(binary tree)的介绍和应用

欢迎光临&#xff1a; 男神 目录 一树的介绍和表示&#xff1a; 二二叉树的介绍及性质&#xff1a; 三堆的介绍及创建&#xff1a; 1堆的创建&#xff1a; 2堆的应用&#xff1a; 四二叉树的创建&#xff1a; ①// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二…

Qt 对话框或者QMainWindow等类中调用自定义QWidget继承组件

简单的方法如下所示 1、创建一个ui文件&#xff0c;界面布局放入QVBoxLayout或者QHBoxLayout 使用他来放入自定义组件&#xff0c;类似如下 2、代码如下&#xff1a; ui.setupUi(this); { //自定义组价如下 KwTable *Table new KwTable(this); ui.vertical…