【C++】结构体应用案例 1

news2024/11/17 23:35:52

目录

1、缘起

2、案例描述

3、案例分析

 4、代码清单 1

5、代码清单 2 

6、总结


1、缘起

        最近学习完了 C++ 语言的结构体相关知识点,如 结构体数组结构体指针结构体嵌套结构体 结构体做函数参数。本篇博客围绕着这些知识点,编写了一个这些知识点的综合应用案例,希望能够对这些知识点加深印象和灵活运用。

2、案例描述

学校正在做毕设项目,每名老师带领 5 个学生,总共有 3 名老师,需求如下:

设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放 5 名学生的数组作为其成员。学生的成员有姓名和考试分数,创建数组存放 3 名老师,通过函数给每个老师及所带的学生赋值。最终打印出老师数据以及老师所带的学生数据。

3、案例分析

        老师的结构体中,包含了学生的结构体,这里涉及了 结构体嵌套结构体 的相关知识点。每名老师名下都有 5 名学生,把这 5 名学生都放在存放在一个数组中,这里是涉及了 结构体数组 的相关知识点。 

 4、代码清单 1

#include<iostream>
#include<string>
#include<ctime>

using namespace std;

//函数声明
void AllocateSpace(struct Teacher t_arr[], int len);
void PrintInfo(struct Teacher t_arr[], int len);

//定义一个学生的结构体
struct Student
{
	string name;
	int score = 0;
};

//定义一个老师的结构体
struct Teacher
{
	string name;
	struct Student stu_arr[5];
};

int main()
{
	//1、定义一个老师的结构体数组
	struct Teacher t_arr[5];

	//2、通过函数给 3 名老师的信息赋值,并给老师带的学生信息赋值
	int len = sizeof(t_arr) / sizeof(t_arr[0]);
	AllocateSpace(t_arr,len);

	//3、打印所有老师及所带的学生的信息
	PrintInfo(t_arr,len);
	
	system("pause");
	return 0;
}	

//给老师和学生赋值的函数
void AllocateSpace(struct Teacher t_arr[],int len)
{
	//随机数种子
	srand((unsigned int)time(NULL));

	//将学生的分数设为随机值
	int x1 = rand() % 61 + 40;
	int x2 = rand() % 61 + 40;
	int x3 = rand() % 61 + 40;
	int x4 = rand() % 61 + 40;
	int x5 = rand() % 61 + 40;
	int x6 = rand() % 61 + 40;
	int x7 = rand() % 61 + 40;
	int x8 = rand() % 61 + 40;
	int x9 = rand() % 61 + 40;
	int x10 = rand() % 61 + 40;
	int x11 = rand() % 61 + 40;
	int x12 = rand() % 61 + 40;
	int x13 = rand() % 61 + 40;
	int x14 = rand() % 61 + 40;
	int x15 = rand() % 61 + 40;

	//给老师开始赋值
	t_arr[0].name = "张老师";
	t_arr[1].name = "薛老师";
	t_arr[2].name = "李老师";

	//张老师的学生信息
	t_arr[0].stu_arr[0].name = "张三";
	t_arr[0].stu_arr[0].score = x1;
	t_arr[0].stu_arr[1].name = "李四";
	t_arr[0].stu_arr[1].score = x2;
	t_arr[0].stu_arr[2].name = "王五";
	t_arr[0].stu_arr[2].score = x3;
	t_arr[0].stu_arr[3].name = "赵六";
	t_arr[0].stu_arr[3].score = x4;
	t_arr[0].stu_arr[4].name = "吴七";
	t_arr[0].stu_arr[4].score = x5;

	//薛老师的学生信息
	t_arr[1].stu_arr[0].name = "张三";
	t_arr[1].stu_arr[0].score = x6;
	t_arr[1].stu_arr[1].name = "李四";
	t_arr[1].stu_arr[1].score = x7;
	t_arr[1].stu_arr[2].name = "王五";
	t_arr[1].stu_arr[2].score = x8;
	t_arr[1].stu_arr[3].name = "赵六";
	t_arr[1].stu_arr[3].score = x9;
	t_arr[1].stu_arr[4].name = "吴七";
	t_arr[1].stu_arr[4].score = x10;

	//李老师的学生信息
	t_arr[2].stu_arr[0].name = "张三";
	t_arr[2].stu_arr[0].score = x11;
	t_arr[2].stu_arr[1].name = "李四";
	t_arr[2].stu_arr[1].score = x12;
	t_arr[2].stu_arr[2].name = "王五";
	t_arr[2].stu_arr[2].score = x13;
	t_arr[2].stu_arr[3].name = "赵六";
	t_arr[2].stu_arr[3].score = x14;
	t_arr[2].stu_arr[4].name = "吴七";
	t_arr[2].stu_arr[4].score = x15;
}


//打印老师和学生的信息的函数
void PrintInfo(struct Teacher t_arr[], int len)
{
	//第一个老师的信息
	cout << "老师姓名:" << t_arr[0].name << endl;
	cout << "\t学生姓名:" << t_arr[0].stu_arr[0].name << "  ";
	cout << "考试分数:" << t_arr[0].stu_arr[0].score << endl;
	cout << "\t学生姓名:" << t_arr[0].stu_arr[1].name << "  ";
	cout << "考试分数:" << t_arr[0].stu_arr[1].score << endl;
	cout << "\t学生姓名:" << t_arr[0].stu_arr[2].name << "  ";
	cout << "考试分数:" << t_arr[0].stu_arr[2].score << endl;
	cout << "\t学生姓名:" << t_arr[0].stu_arr[3].name << "  ";
	cout << "考试分数:" << t_arr[0].stu_arr[3].score << endl;
	cout << "\t学生姓名:" << t_arr[0].stu_arr[4].name << "  ";
	cout << "考试分数:" << t_arr[0].stu_arr[4].score << endl;
	
	//第二个老师的信息
	cout << "老师姓名:" << t_arr[1].name << endl;
	cout << "\t学生姓名:" << t_arr[1].stu_arr[0].name << "  ";
	cout << "考试分数:" << t_arr[1].stu_arr[0].score << endl;
	cout << "\t学生姓名:" << t_arr[1].stu_arr[1].name << "  ";
	cout << "考试分数:" << t_arr[1].stu_arr[1].score << endl;
	cout << "\t学生姓名:" << t_arr[1].stu_arr[2].name << "  ";
	cout << "考试分数:" << t_arr[1].stu_arr[2].score << endl;
	cout << "\t学生姓名:" << t_arr[1].stu_arr[3].name << "  ";
	cout << "考试分数:" << t_arr[1].stu_arr[3].score << endl;
	cout << "\t学生姓名:" << t_arr[1].stu_arr[4].name << "  ";
	cout << "考试分数:" << t_arr[1].stu_arr[4].score << endl;

	//第三个老师的信息
	cout << "老师姓名:" << t_arr[2].name << endl;
	cout << "\t学生姓名:" << t_arr[2].stu_arr[0].name << "  ";
	cout << "考试分数:" << t_arr[2].stu_arr[0].score << endl;
	cout << "\t学生姓名:" << t_arr[2].stu_arr[1].name << "  ";
	cout << "考试分数:" << t_arr[2].stu_arr[1].score << endl;
	cout << "\t学生姓名:" << t_arr[2].stu_arr[2].name << "  ";
	cout << "考试分数:" << t_arr[2].stu_arr[2].score << endl;
	cout << "\t学生姓名:" << t_arr[2].stu_arr[3].name << "  ";
	cout << "考试分数:" << t_arr[2].stu_arr[3].score << endl;
	cout << "\t学生姓名:" << t_arr[2].stu_arr[4].name << "  ";
	cout << "考试分数:" << t_arr[2].stu_arr[4].score << endl;
}

5、代码清单 2 

         上文代码实在是太暴力了,接下来对上述代码进行优化。但不可否认的是,暴力解决法确实很实用。

#include<iostream>
using namespace std;

void AllocateSpace(struct Teacher t_arr[], int len);
void PrintInfo(struct Teacher t_arr[], int len);

//定义一个学生的结构体类型
struct Student
{
	string name;
	int score = 0;
};

//定义一个老师的结构体类型
struct Teacher
{
	string name;
	struct Student stu_arr[5];
};

int main()
{
	//设置随机数种子
	srand((unsigned int)time(NULL));

	//1、定义一个 3 名老师的结构体数组
	struct Teacher t_arr[3];

	//2、定义一个给老师和学生的信息赋值的函数
	int len = sizeof(t_arr) / sizeof(t_arr[0]);
	AllocateSpace(t_arr,len);

	//3、定义一个打印老师和学生的信息的函数
	PrintInfo(t_arr,len);



	system("pause");
	return 0;
}	

//打印老师和学生的信息
void PrintInfo(struct Teacher t_arr[],int len)
{
	//输出老师的相关信息
	for (int i = 0; i < len; i++)
	{
		cout << "老师姓名:" << t_arr[i].name << endl;

		//输出学生的相关信息
		for (int j = 0; j < 5; j++)
		{
			cout << "\t学生姓名:" << t_arr[i].stu_arr[j].name << "   ";
			cout << "学生分数:" << t_arr[i].stu_arr[j].score << endl;
		}
	}
}

//给老师和学生的信息赋值
void AllocateSpace(struct Teacher t_arr[],int len)
{
	string name_seed = "ABCDE";

	//给老师开始赋值
	for (int i = 0; i < len; i++)
	{
		t_arr[i].name = "Teacher_";
		t_arr[i].name += name_seed[i];

		//通过循环给每名老师所带的学生赋值
		for (int j = 0; j < 5; j++)
		{
			//设置一个随机数,使得学生的分数随机
			int random = rand() % 61 + 40;

			t_arr[i].stu_arr[j].name = "Student_";
			t_arr[i].stu_arr[j].name += name_seed[j];

			t_arr[i].stu_arr[j].score = random;
		}
	}
}

6、总结

        对于一个任务需求,最重要的是先把它的功能实现,然后在对其代码进行优化。暴力解决方案确实是有点不优雅,但确实是很实用。

        本期的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷,笔者必回,我们下期再见啦 !

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

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

相关文章

【华为机试真题详解JAVA实现】—Sudoku

目录 一、题目描述 二、解题代码 一、题目描述 问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。 例如: 输入 输出

SpringCloud学习-实用篇02

以下内容的代码可见&#xff1a;SpringCloud_learn/day02 1.Nacos配置管理 之前提到的Nacos是作为注册中心&#xff0c;除此之外它还有配置管理功能 统一配置管理 假设有多个微服务之间有关联&#xff0c;此时修改了某个微服务的配置后其他相关的微服务也需要重启&#xff0c;十…

Javaweb | 过滤器、配置、过滤器链、优先级

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 过滤器 概念 过滤器&#xff08;Filter&#xff09;是处于客户端与服务器目标资源之间的一道过滤技术 用户的请求和响应都需要经过过滤器 过滤器作用 执行地位在Servl…

C++初阶 -1- C++入门part2

文章目录6.引用什么是引用&#xff1f;引用的使用引用的应用传值、传引用效率比较权限引用和指针的区别⭐7.内联函数8.auto关键字9.基于范围的for循环10.指针空值——nullptr6.引用 什么是引用&#xff1f; “别名” int a 0; int& b 0;&#x1f446;即 地址为0x00000…

【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习

文章目录 前言一、模拟C库文件操作二、磁盘文件总结前言 经过我们上一篇对linux系统文件操作的学习想必我们已经会使用系统文件接口了&#xff0c;今天我们就用系统文件接口来封装一个像C语言库那样的文件操作函数的函数来加深我们对文件操作的学习。 一、模拟C库文件操作 首…

通过Milo实现的OPC UA客户端连接并订阅Prosys OPC UA Simulation Server模拟服务器

背景 前面我们搭建了一个本地的 PLC 仿真环境&#xff0c;并通过 KEPServerEX6 读取 PLC 上的数据&#xff0c;最后还使用 UAExpert 作为 OPC 客户端完成从 KEPServerEX6 这个OPC服务器的数据读取与订阅功能&#xff1a;SpringBoot集成Milo库实现OPC UA客户端&#xff1a;连接…

新一代信息技术赋能,安科瑞搭建智慧水务体系的新思路

随着新时期治水方针的逐步落实&#xff0c;水利现代化、智能化建设已开启&#xff0c;物联网、图像识别、数字孪生等新技术的成熟&#xff0c;也为智慧水务体系的搭建提供了技术保障&#xff0c;新时代治水新思路正逐步得到落实。本文对智慧水务的总体架构与包含的建设内容进行…

Qt第六十二章:图标库QtAwesome的使用

目录 一、安装依赖 二、主页 三、文档 四、案例 1、图标 2、样式 3、alpha 通道 4、 多图标堆叠 5、动画 6、字体 五、系列 1、msc系列 2、fa5系列&#xff08;选择free栏&#xff09; 3、fa5s系列&#xff08;选择free栏&#xff09; 4、fa5b系列&#xff08;选…

由libunifex来看Executor的任务构建

前言 之前的一篇文章讲述了future的优缺点&#xff0c;以及future的组合性&#xff0c;其中也讲述了构建任务DAG一些问题&#xff0c;同时给出了比较好的方案则是Executor。 Executor还未进入标准&#xff08;C23&#xff09;&#xff0c;Executor拥有惰性构建及良好的抽象模型…

尚硅谷大数据技术Zookeeper教程-笔记03【源码解析-算法基础】

视频地址&#xff1a;【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】尚硅谷大数据技术Zookeeper教程-笔记02【服务器动态上下线监听案例、ZooKeeper分布式锁案例、企业面试真…

多模态大模型的发展、挑战与应用

多模态大模型的发展、挑战与应用 2023/04/15 研究进展 随着 AlexNet [1] 的出现&#xff0c;过去十年里深度学习得到了快速的发展&#xff0c;而卷积神经网络也从 AlexNet 逐步发展到了 VGG [2]、ResNet [3]、DenseNet [4]、HRNet [5] 等更深的网络结构。研究者们发现&#…

用vscode运行Java程序初体验

最近开始学习Java编程了&#xff0c;以前学习过C、C 、Python&#xff0c;主要用微软的visual studio code来运行python程序&#xff0c;于是就尝试了用vscode来运行java代码&#xff0c;记录一下使用的经验&#xff0c;帮助大家少走弯路。 安装了Java的集成编辑器IDE "Ec…

c++STL之关联式容器

目录 set容器 set的默认构造 set的插入与迭代器 set集合的元素排序 set集合的初始化及遍历 从小到大(默认情况下) 从大到小 仿函数 set的查找 pair的使用 multiset容器 map和multimap容器 map的插入与迭代器 map的大小 map的删除 map的查找 关联式容器&#…

【LeetCode: 337. 打家劫舍 III | 暴力递归=>记忆化搜索=>动态规划 | 树形dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

整数二分从入门到精通

前言&#xff1a; 开个玩笑&#xff0c;我们写算法可不能这样哈~ 好了&#xff0c;正片开始&#xff1a; 你是否曾经也有过整数二分因为一直死循环而苦恼&#xff0c;你是否因为搞不清楚整数二分的边界处理而焦躁&#xff0c;明明很简单的一道二分&#xff0c;但是最后就是搞…

Python入门教程+项目实战-9.1节: 字符串的定义与编码

目录 9.1.1 理解字符串 9.1.2 字符串的类型名 9.1.3 字符的数字编码 9.1.4 常用的字符编码 9.1.5 字符串的默认编码 9.1.6 字符串的编码与解码 9.1.7 转义字符详解 9.1.8 对字符串进行遍历 9.1.9 知识要点 9.1.10 系统学习python 9.1.1 理解字符串 理解字符串&#…

005:Mapbox GL添加全屏显示功能

第005个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加全屏显示功能 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共60行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://…

还在因为写项目函数太多而烦恼?C++模板一文带你解决难题

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

轮廓查找与绘制

轮廓查找与绘制 1)什么是轮廓 轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具有相同的颜色或者灰度&#xff0c;提取轮廓就是提取 这些具有相同颜色或者灰度的曲线&#xff0c;或者说是连通域&#xff0c;轮廓在形状分析和物体…

学习系统编程No.20【进程间通信之命名管道】

引言&#xff1a; 北京时间&#xff1a;2023/4/15/10:34&#xff0c;今天起床时间9:25&#xff0c;睡了快8小时&#xff0c;昨天刷视屏刷了一个小时&#xff0c;本来12点的时候发完博客洗把脸就要睡了&#xff0c;可惜&#xff0c;看到了一个标题&#xff0c;说实话&#xff0…