结构体数组与指针与函数及应用案例

1、结构体数组

 作用:结构体数组的作用是将自定义的结构体放到数组中方便维护

​
//结构体定义
struct sanguo//三国
{
	string name;//姓名
	int age;    //年龄
	string sex; //性别
};
int main()
{
	//结构体数组
	struct sanguo hero[5] = {
		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},
	};//初始化
system("pause");
return 0;
}

​

2、结构体指针

作用:通过指针访问结构体中的成员

                 利用操作符->可以通过结构体指针访问结构体属性

​
#include<string>
#include<iostream>
using namespace std;
//结构体定义 
struct student
{
	string name;//姓名 
	int age;    //年龄 
	int score;  //分数 
};
int main()
{ 
//创建学生结构体变量 
	struct student stu={"宁子",20,100};
//通过指针指向结构体变量 
	struct student *p=&stu;
//通过指针访问结构体中的变量
    p->score=59;
//输出结构体
    cout<<"学生姓名:"<<stu.name <<"\n"<<"学生年龄:"<<stu.age <<"\n"<<"学生分数:"<<stu.score<<endl;
	system("pause");
	return 0;
 } 

​

我们通过结构体指针访问到了学生的成绩并作出修改

 可以看出通过指针访问我们将学生成绩从100改为了59(抱歉了宁子)

当然我们也可以通过结构体指针访问其他的变量

 cout<<"学生姓名:"<<p->name <<"\n"<<"学生年龄:"<<p->age <<"\n"<<"学生分数:"<<p->score<<endl;

 总结 结构体指针可以通过 '->' 访问结构体成员

结构体指针访问结构体数组

#include<string>
#include<iostream>
using namespace std;
//定义学生结构体 
struct student
{
	string name;//姓名 
	int age;    //年龄 
	int score;  //分数 
};
int main()
{ 
    int i;
    struct student stu[3];//创建结构体 
	struct student *p=stu;//数组本身就代表了地址 所以不用加&
    for(i=0;i<3;i++,*p++)
	{
		cin>>p->name>>p->age>>p->score;//循环输入结构体数组 
	 } 
    for(i=0;i<3;i++)
	{
		//循环输出 
		cout<<stu[i].name<<"\n"<<stu[i].age<<"\n"<<stu[i].score<<endl;
	 } 
	system("pause");
	return 0;
 } 

3、结构体嵌套结构体

结构体的成员可以是另一个结构体

例如一位老师带一名学生,一个老师的结构体中记录一个学生的结构体

//定义学生结构体 
struct student
{
	string name;//姓名 
	int score;  //分数 
};
//定义老师结构体 
struct teacher 
{ 
    string name;
    struct student stu;//老师带一位学生 
};

该怎么访问还怎么访问

struct teacher th;//创建结构体 
    th.name="李雷";
	th.stu.name="张三";
	th.stu.score=88; 

我们也可以使用结构体指针来访问

struct teacher *p=&th; 
    p->name="李雷";
	p->stu.name="张三";
	p->stu.score=88; 

4、结构体做函数参数(值传递)

作用:将结构体作为参数向函数中传递

#include<string>
#include<iostream>
using namespace std;
//定义学生结构体 
struct student
{
	string name;//姓名 
	int age;    //年龄 
	int score;  //分数 
};
void outstruct(struct student q);//结构体输出函数
int main()
{ 
    int i; 
    struct student stu={"张三",18,100};//创建结构体 //初始化 
    outstruct(stu); 
	return 0;
}
void outstruct(struct student q)
{
	cout<<q.name<<endl;
	cout<<q.age<<endl;
	cout<<q.score<<endl;
}

 

 要注意的是这种传递传递的仅仅是结构体的值 在函数中对参数作出修改不会影响主函数中的值

void outstruct(struct student q)
{
	q.age=55;//在函数中令age=55
	cout<<q.name<<endl;
	cout<<q.score<<endl;
    cout<<"in outstruct: age= "<<q.age<<endl;
}
//在main函数中做以下操作
    outstruct(stu); 
    cout<<"in main: age= "<<stu.age;

 可以看出main中的age并没有作出改变

5、结构体指针做函数参数(地址传递)

#include<string>
#include<iostream>
using namespace std;
//定义学生结构体 
struct student
{
	string name;//姓名 
	int age;    //年龄 
	int score;  //分数 
};
void getstruct(struct student *q);//输入结构体函数
int main()
{ 
    struct student stu;//创建结构体 
    getstruct(&stu); 
    cout<<stu.name<<"\n"<<stu.age<<"\n"<<stu.score<<endl;//输出
	return 0;
}
void getstruct(struct student *q)
{
	cin>>q->name;
	cin>>q->score;//输入
	cin>>q->age;
}

  要注意的是这种传递传递的是结构体的地址 在函数中对参数作出修改会影响主函数中的值

6、结构体案例1

案例描述:学校中一位老师带五个学生,总共有三名老师,设计学生和老师的结构体 在老师结构体中包括老师姓名和五位学生的结构体,学生结构体包括姓名和考试分数,创建数组保存三位老师,通过函数给老师和学生赋值,通过函数实现输出老师数据以及学生数据。

完整代码如下

#include<string>
#include<iostream>
using namespace std;
//定义学生结构体 
struct student
{
	string name;
	int score;
};
//定义老师结构体 
struct teacher
{
	string name;
	struct student xs[5];//包含学生结构体数组(5) 
}ls[3];//创建老师结构体数组 
void getstruct(struct teacher *tc);//结构体输入函数 
void outstruct(struct teacher *q);//结构体输出函数 
int main()
{
	getstruct(ls);
	outstruct(ls);
	return 0;
}
void getstruct(struct teacher* tc)
{
	int i,j;
	for (i = 0; i < 3; i++, *tc++)
	{
		cin >> tc->name;
		for (j = 0; j < 5; j++)
		{
			cin >> tc->xs[j].name;//循环 
			cin >> tc->xs[j].score;//输入 
		}
	}
}
void outstruct(struct teacher *q)
{
	int i, j;
	cout<<endl; 
	for (i = 0; i < 3; i++)
	{
       cout << q->name<<endl;
	   for (j = 0; j < 5; j++)
	   {
		   cout << q->xs[j].name<<" ";//循环 
		   cout << q->xs[j].score<<endl;//输出 
	   }
	}
}

 结构体案例2

案例描述:

设计一个英雄的结构体包括姓名 年龄 性别,创建结构体数组,数组中存放五位英雄,通过冒泡排序将数组中的英雄按照年龄进行升序排序,打印排序完成后的结构体数组。

五名英雄信息如下

        {"刘备",23,"男"},
        {"关羽",22,"男"},
        {"张飞",20,"男"},
        {"赵云",21,"男"},
        {"貂蝉",19,"女"},

完整代码如下:

#include<string>
#include<iostream>
using namespace std;
//定义英雄结构体 
struct sanguo
{
	string name;
	int age;
	string sex;
};
int main()
{
	int i,j;
	//创建英雄结构体数组 
	struct sanguo hero[5] = {
		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},
	};
	struct sanguo alg;//创建中间结构体变量 
	for (i = 0; i < 5; i++)
	{
	for(j=0;j<4;j++)
	{
		if (hero[j].age > hero[j + 1].age)
		{
			alg = hero[j];
			hero[j] = hero[j + 1];//冒泡排序 
			hero[j + 1] = alg;
		}
	}
}
	for(i=0;i<5;i++)
	{
		//输出结构体数组 
		cout << hero[i].name << hero[i].age << hero[i].sex << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_60055052/article/details/122730273