从熟练Python到入门学习C++(record 6)

news2024/11/25 0:21:08

基础之基础之最后一节-结构体

1.结构体的定义

结构体相对于自定义的一种新的变量类型。

四种定义方式,推荐第一种;第四种适合大量定义,也适合查找;

#include <iostream>
using namespace std;
#include <string.h>

struct Student
{
	string name;
	int age;
	float score;
}s3;

void prinf(Student s)
{
	cout << s.name << " | " << s.age << " | " << s.score << endl;
}

int main()
{
	Student s1;
	s1.name = "niuniu";
	s1.age = 18;
	s1.score = 96;
	prinf(s1);

	Student s2 = { "zhangsan", 92, 30 };
	prinf(s2);

	s3.name = "lisi";
	s3.age = 13;
	s3.score = 31;
	prinf(s3);

	//shuzu
	Student arr[3] = {
		{"zhangsan", 31,55},
		{"lisi", 41, 42},
		{"wangwu", 32,44}
	};
	for (int i = 0; i < 3; ++i)
	{
		prinf(arr[i]);
	};
	return 0;

}

2.结构体指针

和其他类型的指针一致;需要注意的是,如果s是结构体的指针,不仅可以使用(*s).name还可以使用s->name访问结构体的属性;

#include <iostream>
using namespace std;
#include <string.h>

struct Student
{
	string name;
	int age;
	float score;
}s3;

void prinf(Student* s)
{
	cout << s->name << " | " << s->age << " | " << s->score << endl;
}

int main()
{
	Student s1;
	s1.name = "niuniu";
	s1.age = 18;
	s1.score = 96;
	prinf(&s1);

	Student s2 = { "zhangsan", 92, 30 };
	prinf(&s2);

	s3.name = "lisi";
	s3.age = 13;
	s3.score = 31;
	prinf(&s3);

	//shuzu
	Student arr[3] = {
		{"zhangsan", 31,55},
		{"lisi", 41, 42},
		{"wangwu", 32,44}
	};
	for (int i = 0; i < 3; ++i)
	{
		prinf(&arr[i]);
	};
	return 0;

}

3.结构体嵌套结构体

类似于函数中包含函数;

#include <iostream>
using namespace std;
#include <string.h>

struct teacher
{
	int id;
	string name;
	int age;
	student std;
};

struct student
{
	string name;
	int age;
	int score;
};

结果报错,因为需要把student放在前面!!!

4.案例

4.1给三国英雄排序;使用结构体,指针

#include <iostream>
#include <string.h>
using namespace std;

struct hero
{
	string name;
	int age;
	string gender;
};

void prf(hero arr[5])
{
	for (int i = 0; i < 5; i++)
	{
		cout << arr[i].name << " | " << arr[i].age << " | " << arr[i].gender << endl;
	}
}

void sort(hero arr[5], const int nums)
{
	for (int i = 0; i < nums; i++)
	{
		int counts = nums;
		for (int j = 0; j < nums - i - 1; j++)
		{
			if (arr[j].age > arr[j + 1].age)
			{
				hero tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				counts--;
			}
		}
	}
}

int main()
{
	hero arr[5] = {
		{"liubei",22,"nan"},
		{"guanyu", 22, "nan"},
		{"zhangfei", 20, "nan"},
		{"zhaoyun", 21, "nan"},
		{"diaochan", 19, "nv"}
	};
	sort(arr, 5);
	prf(arr);
	return 0;

}

4.2通讯录案例

#include <iostream>
#include <string.h>
#define MAX 1000
using namespace std;

struct People
{
	string name;
	int gender;
	int age;
	long phone;
	string address;
};

struct AddressBook
{
	People addressbook[MAX];
	int nums;
};

void init()
{
	cout << "*****************" << endl;
	cout << "please choice one" << endl;
	cout << "1. add contact" << endl;
	cout << "2. display contact" << endl;
	cout << "3. delete contact" << endl;
	cout << "4. search contact" << endl;
	cout << "5. revise contact" << endl;
	cout << "6. delete all contact" << endl;
	cout << "7. out system" << endl;
	cout << "*****************" << endl;
}

void add(AddressBook* abs)
{
	string name;
	int gender;
	int age;
	long phone;
	string address;
	cout << "please input contact name" << endl;
	cin >> name;
	cout << "please input contact gender (1: nan; 2: nv" << endl;
	cin >> gender;
	cout << "please input contact age" << endl;
	cin >> age;
	cout << "please input contact phone" << endl;
	cin >> phone;
	cout << "please input contact address" << endl;
	cin >> address;
	abs->addressbook[abs->nums].name = name;
	abs->addressbook[abs->nums].age = age;
	abs->addressbook[abs->nums].gender = gender;
	abs->addressbook[abs->nums].phone = phone;
	abs->addressbook[abs->nums].address = address;
	abs->nums++;
}

void display(AddressBook* abs)
{
	for (int i = 0; i < abs->nums; i++)
	{
		cout << "name : " << abs->addressbook[i].name << "\t";
		cout << "gender : " << abs->addressbook[i].gender << "\t";
		cout << "age : " << abs->addressbook[i].age << "\t";
		cout << "phone : " << abs->addressbook[i].phone << "\t";
		cout << "address : " << abs->addressbook[i].address << "\t";
		cout << endl;
	};
}

int Search(AddressBook* abs, int* p_c)
{
	string name;
	int idx = 0;
	cout << "please input contact name" << endl;
	cin >> name;
	for (int i = 0; i < abs->nums; i++)
	{
		if (abs->addressbook[i].name == name)
		{
			if (*p_c != 4)
			{
				return i;
			}
			cout << "name : " << abs->addressbook[i].name << "\t";
			cout << "gender : " << abs->addressbook[i].gender << "\t";
			cout << "age : " << abs->addressbook[i].age << "\t";
			cout << "phone : " << abs->addressbook[i].phone << "\t";
			cout << "address : " << abs->addressbook[i].address << "\t";
			cout << endl;
		}
	}
}

void Delete(AddressBook* abs, int* p_c)
{
	int idx = Search(abs, p_c);
	for (int i = idx; i < abs->nums; i++)
	{
		abs->addressbook[i] = abs->addressbook[i + 1];
	}
	abs->nums--;
}

void Revise(AddressBook* abs, int* p_c)
{
	Delete(abs, p_c);
	add(abs);
}

void DelAll(AddressBook* abs)
{
	abs->nums = 0;
}

int main()
{
	int choice = 0;
	AddressBook book;
	book.nums = 0;
	// init 
	book.addressbook[book.nums].name = "aaa";
	book.addressbook[book.nums].age = 13;
	book.addressbook[book.nums].gender = 1;
	book.addressbook[book.nums].phone = 10010;
	book.addressbook[book.nums].address = "dalian";
	book.nums++;
	book.addressbook[book.nums].name = "ooo";
	book.addressbook[book.nums].age = 52;
	book.addressbook[book.nums].gender = 2;
	book.addressbook[book.nums].phone = 10086;
	book.addressbook[book.nums].address = "suzhou";
	book.nums++;
	// end
	while (1)
	{
		init();
		cin >> choice;
		// add, display, delete, search, revise, delete all, out
		switch (choice)
		{
		case(1):
		{
			add(&book);
			break;
		};
		case(2):
		{
			display(&book);
			break;
		};
		case(3):
		{
			Delete(&book, &choice);
			break;
		};
		case(4):
		{
			Search(&book, &choice);
			break;
		};
		case(5):
		{
			Revise(&book, &choice);
			break;
		};
		case(6):
		{
			DelAll(&book);
			break;
		};
		default:
			break;
		}
		if (choice == 7)
		{
			break;
		};
		system("pause");
		system("cls");
	}
}

总结一下:

1.对于python来说,数组传入函数时,相当于传入c++指针,因为函数中改变数组中的值,外部的数组也会改变;所以不想改变的时候,需要使用deep.copy。

2.对于c++来说,不仅数组传入相对于指针,对于整型、实型及结构体,只要使用&a,把a的指针传入函数,在函数中修改后,外部的值也会改变。

3.对于c++的数组来说,就算不使用*p,arr本身也是地址。所以在函数中对于传入的arr来说,不需要使用指针,也能干指针的活;

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

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

相关文章

tongweb安全整改

一 禁止以root账号运行tongweb服务 1 如果是首次安装须创建普通用户安装tongweb 2 如果已经使用root账号安装了tongweb 2.1 创建普通用户 2.2 使用root账号授予tongweb安装目录宿主权限为普通用户 2.3赋权成功后&#xff0c;后续启动tongweb服务必须为普通用户 二 tongRDS隐…

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…

tcpdump抓包 wireShark

TCPdump抓包工具介绍 TCPdump&#xff0c;全称dump the traffic on anetwork&#xff0c;是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 2、支持网络层…

HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…

YOLOV5 /onnx模型转换成rknn

上两篇文章讲述了pytorch模型下best.pt转换成onnx模型&#xff0c;以及将onnx进行简化成为best-sim.onnx, 接下来这篇文章讲述如何将onnx模型转换成rknn模型&#xff0c;转换成该模型是为了在rk3568上运行 1.创建share文件夹 文件夹包含以下文件best-sim.onnx,rknn-tookit2-…

【51单片机】LCD1602液晶显示屏

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是…

如何使用AWS Lambda构建一个云端工具(超详细)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;如何使用AWS Lambda构建一个云端工具&#xff08;超详细&#xff09; 1 前言 1.1 无服务器架构 无服务器架构&#xff08;Serverless Computing&#xff09;是一种云计算服务模型&#xff0c;它允许开发者构建和运行…

【Isaac Sim】相关问题汇总

目录 一、安装点击Install时报错二、启动时报 Failed to create any GPU devices三、加载Isaac Sim自带模型或示例时报 Isaac Sim is not responding 一、安装点击Install时报错 报错&#xff1a; request to https://asset.launcher.omniverse.nvidia.com/… failed, reason:…

Spring-02-springmvc

2. 什么是SpringMVC 2.1. 概述 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架。 为什么要学习SpringMVC呢? Spring MVC的特点&#xff1a; 轻量级&#xff0c;简单易学高效 , 基于请求响应的MVC框架与Spring兼容性好&#xff0c;无缝…

深度学习之目标检测的技巧汇总

1 Data Augmentation 介绍一篇发表在Big Data上的数据增强相关的文献综述。 Introduction 数据增强与过拟合 验证是否过拟合的方法&#xff1a;画出loss曲线&#xff0c;如果训练集loss持续减小但是验证集loss增大&#xff0c;就说明是过拟合了。 数据增强目的 通过数据增强…

qt添加模块

以QtNetwork模块为例 方式一 扩展-qt vs tools-qt project settings 方式二 右键选中项目-属性-qt project settings 方法三 在此界面选择select modules,即可进行相应模块添加

【信息系统项目管理师】第2章:信息技术发展 考点梳理

文章目录 2.1 信息技术及其发展2.1.1 计算机软硬件2.1.2 计算机网络2.1.3 存储和数据库2.1.4 信息安全2.1.5 信息技术的发展 2.2 新一代信息技术及应用2.2.1 物联网2.2.2 云计算2.2.3 大数据2.2.4 区块链2.2.5 人工智能2.2.6 虚拟现实 2.1 信息技术及其发展 2.1.1 计算机软硬件…

【线程】Java多线程编程

【线程】Java多线程编程 一、前言一个最简单的多线程编程示例可以使用的工具 二、创建线程的方式三、Thread类中重要的属性和方法3.1 构造方法3.2 常见属性 一、前言 当有多个线程的时候&#xff0c;这些线程的执行顺序是不确定的。这一点&#xff0c;是我们之前提到的操作系统…

unsloth vlm模型Qwen2-VL、Llama 3.2 Vision微调案例

T4卡15G显卡训练 参考: https://github.com/unslothai/unsloth 按自己显卡cuda版本安装 免费colab微调代码: Qwen2-VL: https://colab.research.google.com/drive/1whHb54GNZMrNxIsi2wm2EY_-Pvo2QyKh?usp=sharing from unsloth import FastVisionModel # NEW instead …

window11编译pycdc.exe

一、代码库和参考链接 在对python打包的exe文件进行反编译时&#xff0c;会使用到uncompyle6工具&#xff0c;但是这个工具只支持python3.8及以下&#xff0c;针对更高的版本的python则不能反编译。 关于反编译参考几个文章&#xff1a; Python3.9及以上Pyinstaller 反编译教…

oracle如何配置第二个监听优化数据传输

oracle如何配置第二个监听优化数据传输 服务器两个网卡&#xff0c;配置两个不同IP和端口的监听。 归档日志量每天很大&#xff0c;为了不影响业务&#xff0c;需要配置一个单独的万兆网络来专门的传输归档日志到DG库&#xff0c;这里就涉及到在19c中增加一个监听用来使用专门…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 引言1. 分类交叉熵损失导数&#xff08;Categorical Cross-Entropy loss derivative&#xff09;2. 分类交叉熵损失导数 - 代码实现3. Softmax激活函数导数&#xff08;Softmax activation derivative&#xff09;4. Softmax激…

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…

06、Spring AOP

在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…