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

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

1.结构体的定义

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

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

cpp 复制代码
#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访问结构体的属性;

cpp 复制代码
#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.结构体嵌套结构体

类似于函数中包含函数;

cpp 复制代码
#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给三国英雄排序;使用结构体,指针

cpp 复制代码
#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通讯录案例

cpp 复制代码
#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来说,不需要使用指针,也能干指针的活;

相关推荐
沐怡旸39 分钟前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
数据智能老司机6 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机7 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机7 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机7 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i7 小时前
drf初步梳理
python·django
每日AI新事件7 小时前
python的异步函数
python
感哥7 小时前
C++ STL 常用算法
c++
这里有鱼汤8 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook17 小时前
Manim实现脉冲闪烁特效
后端·python·动效