#include<cstdio>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;

int main()
{
	//结构体是一种自定义数据类型。它像是一个“套餐”,
	//把各种数据类型变量捆成一个包,构成一个新的数据类型。
	//结构体让一些数据处理的编程更高效,更自然。CSP、NOI中也会经常用到。 
	//本次讲解的是结构体的定义,使用和特性。 

	//1.定义结构体类型 
	//格式 1 ,使用struct关键字定义结构体类型: 
	
	//struct 结构类型名{
	//	变量类型 成员变量 1 ;
	//	变量类型 成员变量 2 ;
	//	...... 
	//};(要有分号) 
	
	//例:
	
	struct stru{
		int i;			// 定义一个名字为stru的结构类型,有一个int类型的成员变量i , char类型的成员变量ch, double类型的成员变量dou
		char ch;
		double dou;
	}; 
	//格式 2 ,使用typedef为将定义的struct类型取多个别名: 
	
	//typedef struct{
	//	变量类型 成员变量1;
	//	变量类型 成员变量2;
	//	...... 
	//}结构类型名 1 ,结构类型名 2 ......;
	
	//例:
	
	typedef struct{
		int i;			// 定义一个有 一个int类型的成员变量i , char类型的成员变量ch, double类型的成员变量dou 的结构类型,并赋予其 2 个名字 :stru1 和 stru2 
		char ch;
		double dou;
	}stru1,stru2;
	
	//(Note)结构体成员可以是任意类型,甚至可以是结构
	
	//例:
	struct taowa{
		int num;
		stru s;
	};
	//2.定义结构体变量
	
	//光有类型还不够,定义了变量才能真正使用结构变量
	
	//格式 1 ,定义结构体类型时直接声明(typedef不行,它是取别名用的):
	
	//struct 结构类型名{
	//	变量类型 成员变量 1 ;
	//	变量类型 成员变量 2 ;
	//	...... 
	//}结构变量 1 ,结构变量 2 ......; 
	
	//例:
	
	struct OIer{
		string name;	// 定义一个名字为OIer的结构类型,在定义的同时声明结构变量 chaye 
		char grade;
		int score;
	}chaye;
	
	//格式 2 ,使用结构体类型定义变量 :
	
	//已定义的结构类型名 结构变量名
	
	//例: 
	
	OIer zhouyanchen;	 // 使用OIer结构类型定义结构变量 zhouyanchen
	
	//格式 3 ,直接定义结构体变量 :
	
	//struct{
	//	变量类型 成员变量 1 ;
	//	变量类型 成员变量 2 ;
	//	...... 
	//}结构变量 1 ,结构变量 2 ......; 
	
	//例:
	
	struct{
		string name;	// 定义一个结构变量 npr 
		char grade;
		int score;
	}npr;
	
	//3.初始化结构变量(只能在定义时进行)
	
	// 结构变量={值 1 ,值 2 ......};
	
	//大括号中的值会按成员定义的顺序赋值 
	//例:
	
	OIer liuyunze={"liuyunze",'C',300}; //将结构变量liuyunze的成员分别赋值为 "liuyunze",'C',300
	cout<<liuyunze.name<<' '<<liuyunze.grade<<' '<<liuyunze.score<<endl;
	system("pause");
	//4.访问结构变量的成员变量
	
	// 结构变量名.成员变量名
	
	//结构变量的成员变量可以当普通变量使用
	
	//例:
	
	chaye.name="kongxiangtai";	//将结构变量chaye的name成员分别赋值为 "kongxiangtai"
	chaye.grade='C';			//将结构变量chaye的grade成员分别赋值为 'C'
	chaye.score=500; 			//将结构变量chaye的score成员分别赋值为 500
	cout<<chaye.name<<' '<<chaye.grade<<' '<<chaye.score<<endl;
	system("pause");
	//对于“套娃型” 结构变量,访问“层层嵌套的”成员,需要连续使用 . 运算符
	
	//例:
	
	taowa t;			//定义前面的“套娃型 ”结构变量
	t.s.ch='H';			//访问“层层嵌套的”成员c
	cout<<t.s.ch<<endl;
	system("pause");
	
	//对于结构指针变量,访问指向的成员,需要使用 -> 运算符
	
	//例:
	
	stru *p=new stru;	 //定义结构指针变量并申请动态内存
	p->ch='P';
	cout<<p->ch<<endl;
	system("pause");
	
	return 0;
}