C++零基础入门------------结构体、结构体案例

目录

1.结构体 

1.结构体基本概念

2.结构体定义和使用

3.结构体数组 

4.结构体指针 

5.结构体嵌套结构体 

6.结构体做函数参数 

7.结构体中const使用场景 

2.结构体案例


1.结构体 

1.结构体基本概念

结构体属于用户自定义的数据类型 ,允许用户存储不同的数据类型

2.结构体定义和使用

语法:struct 结构体名 {结构体成员列表} ;

通过结构体创建变量的方式有三种:

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值,成员2值... }
  • 定义结构体是顺便创建变量

示例:

#include <iostream>
using namespace std;

//1.创建学生数据类型:学生包括(姓名,年龄,分数)
//自定义数据类型,一些类型集合组成的一个类型
//语法 struct 类型名称{ 成员列表 }
//struct 关键字不可以省略
struct Student {
	//成员列表

	//姓名
	string name;
	//年龄
	int age;
	// 分数
	int score;

}s3;//顺便创建结构体变量

//2.通过学生类型创建具体学生
int main() {
	//2.1 struct Student s1
	//struct 关键字可以省略 
	Student s1;
	//给s1属性赋值,通过 “. ”访问结构体变量中的属性
	s1.name = "张三";
	s1.age=18;
	s1.score=100; 
	cout<<"姓名:"<<s1.name<<" 年龄:"<<s1.age<<" 分数:"<<s1.score<<endl; 

	//2.2 struct Student s2 ={ ... }
	struct Student s2={"李四",19,80 };
	cout<<"姓名: "<<s2.name<<" 年龄:"<<s2.age<<" 分数:"<<s2.score<<endl; 
	
	//2.3 在定义结构体时顺便创建结构体变量
	s3.name="王五";
	s3.age=20;
	s3.score=60;
	cout<<"姓名:"<<s3.name<<" 年龄:"<<s3.age<<" 分数:"<<s3.score<<endl; 	
	
	system("pause");
	return 0;
}

3.结构体数组 

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

语法:struct 结构体名 数组名 [元素个数]={ {},{},...{} }

示例:

#include <iostream>
using namespace std;

struct Student {
	//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

int main() {
	//2.创建结构体数组
	struct Student arr[3]=
	{
		{"张三",18,100},
		{"李四",19,80},
		{"王五",20,60}
	}; 
	
	//3.给结构体数组中的元素赋值
	arr[2].name="赵六";
	arr[2].age=80;
	arr[2].score=60;
	
	//4.遍历结构体数组
	for(int i=0;i<3;i++) 
	{
		cout<<"姓名:"<<arr[i].name
		    <<" 年龄:"<<arr[i].age
		    <<" 分数:"<<arr[i].score<<endl; 
	}
	 
	system("pause");
	return 0;
}

4.结构体指针 

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

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

示例: 

#include <iostream>
using namespace std;

struct Student {
	//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

int main() {
	//1.创建学生结构体变量 
	struct Student s={"张三",18,100};
	
	
	//2.通过指针指向结构体变量 
    struct Student *p=&s;
	
	//3.通过指针访问结构体变量中的数据 
	//通过结构体指针 访问结构体的属性,需要使用 “-> ” 
	cout<<"姓名:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<<p->score<<endl;
	
	system("pause");
	return 0;
}

5.结构体嵌套结构体 

作用:结构体中的成员可以是另一个结构体

例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

示例: 

#include <iostream>
using namespace std;

//学生结构体定义 
struct Student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//老师结构体定义 
struct teacher {
	//编号 
	int id; 
	//姓名
	string name;
	//年龄
	int age;
	//辅导的学生
	struct Student stu; 
};

int main() {
	teacher t;
	t.id=10000;
	t.name="老王";
	t.age=50;
	t.stu.name="张三";
	t.stu.age=20;
	t.stu.score=60;
	cout<<"老师姓名:"<<t.name<<" 老师编号:"<<t.id<<" 老师年龄:"<<t.age<<endl;
	cout<<"老师辅导的学生姓名:"<<t.stu.name<<" 学生年龄:"<<t.stu.age<<" 学生分数:"<<t.stu.score<<endl; 
	
	system("pause");
	return 0;
}

6.结构体做函数参数 

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

传递的方式有两种:

  • 值传递
  • 地址传递

示例: 

源代码

#include <iostream>
using namespace std;

//学生结构体定义 
struct Student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//值传递
void printStudent1(struct Student i)
{
	cout<<"子函数1中的姓名:"<<i.name<<" 年龄:"<<i.age<<" 分数:"<<i.score<<endl; 
 } 
 
//地址传递
 void printStudent2(struct Student *p)
{
	cout<<"子函数2中的姓名:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<<p->score<<endl; 
 } 

int main() {
	struct Student s={"张三",18,80};
	printStudent1(s);
	printStudent2(&s);	
	cout<<"主函数中的姓名:  "<<s.name<<" 年龄:"<<s.age<<" 分数:"<<s.score<<endl;  
	
	system("pause");
	return 0;
}

修改1 

#include <iostream>
using namespace std;

//学生结构体定义 
struct Student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//值传递
void printStudent1(struct Student i)
{
	i.age=50;
	cout<<"子函数1中的姓名:"<<i.name<<" 年龄:"<<i.age<<" 分数:"<<i.score<<endl; 
 } 
 
//地址传递
 void printStudent2(struct Student *p)
{
	cout<<"子函数2中的姓名:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<<p->score<<endl; 
 } 

int main() {
	struct Student s={"张三",18,80};
	printStudent1(s);
	printStudent2(&s);	
	cout<<"主函数中的姓名:  "<<s.name<<" 年龄:"<<s.age<<" 分数:"<<s.score<<endl;  
	
	system("pause");
	return 0;
}

修改2

#include <iostream>
using namespace std;

//学生结构体定义 
struct Student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//值传递
void printStudent1(struct Student i)
{
	cout<<"子函数1中的姓名:"<<i.name<<" 年龄:"<<i.age<<" 分数:"<<i.score<<endl; 
 } 
 
//地址传递
 void printStudent2(struct Student *p)
{
	p->age=30;
	cout<<"子函数2中的姓名:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<<p->score<<endl; 
 } 

int main() {
	struct Student s={"张三",18,80};
	printStudent1(s);
	printStudent2(&s);	
	cout<<"主函数中的姓名:  "<<s.name<<" 年龄:"<<s.age<<" 分数:"<<s.score<<endl;  
	
	system("pause");
	return 0;
}

总结:如果不想修改主函中的数据,用值传递,反之用地址传递

7.结构体中const使用场景 

作用:用const来防止误操作

示例:

#include <iostream>
using namespace std;

//学生结构体定义 
struct Student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//将函数中的形参改为指针,可以减少内存看见,而且不会复制新的副本出来 
 void printStudent(const struct Student *p)
{
	//p->age=30;
	//加入const之后,一旦有修改的操作就会报错,可以防止我们误操作 
	cout<<"子函数中的姓名:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<<p->score<<endl; 
 } 

int main() {
	struct Student s={"张三",18,80};
	printStudent(&s);	
	cout<<"主函数中的姓名:  "<<s.name<<" 年龄:"<<s.age<<" 分数:"<<s.score<<endl;  
	
	system("pause");
	return 0;
}

2.结构体案例

案例描述:

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

设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员

学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值

最终打印出老师数据以及老师所带的学生数据

示例:

#include <iostream>
#include <stdlib.h> 
#include <ctime>
using namespace std;

//学生结构体定义
struct Student {
	//姓名
	string sname;
	//分数
	int score;
};

//老师结构体定义
struct Teacher {
	//姓名
	string tname;
	//辅导的学生
	struct Student sarr[5];
};

//给老师和学生赋值的函数
//allocate:分配
void allocateSpace(struct Teacher tarr[],int len) {
	string nameseed="ABCD";
	//给老师开始赋值
	for(int i=0; i<len; i++) {
		tarr[i].tname="Teacher_";
		tarr[i].tname+=nameseed[i];

		//通过循环给每名老师所带的学生赋值
		for(int j=0; i<5; j++) {
			tarr[i].sarr[j].sname="Student_";
			tarr[i].sarr[j].sname+=nameseed[j];

			int random=rand()%61+40;//0+40~60+40
			tarr[i].sarr[j].score=random;
		}
	}
}

//打印所有信息
void print(struct Teacher tarr[], int len)
{
	for (int i=0;i<len;i++){
		cout<<"老师姓名:"<<tarr[i].tname<<endl;
		for(int j=0;j<5;j++){
			cout<<"\t学生姓名:"<<tarr[i].sarr[j].sname
			    <<" 考试分数:"<<tarr[i].sarr[j].score<<endl;
		} 
	}
 } 

int main() {
	//随机数种子 
	srand((unsigned int)time(NULL));
	
	//1.创建3名老师的数组
	struct Teacher tarr[3];

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

	//3.打印所有老师及所带的学生信息
	print(tarr,len);

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值