目录
前言
一、结构体的定义和使用
1、在定义结构体结束后创建变量
2、使用“=”赋值
3、直接赋值
二、结构体嵌套结构体
1、创建老师包含学生的结构体
2、嵌套结构体的赋值方法
三、结构体结合数组
1、普通结构体数组
2、构造方法数组
四、活学活用
1、案例说明
2、代码实现
系统讲解C中结构体的知识,从定义到嵌套、结合数组、函数、指针、const 以及具体案例,让你本质上了解结构体,轻松入门数据结构,由于内容较大,分为两篇来写,毕竟心急吃不了热豆腐,哈哈,期待大家阅读评论指教
struct Student {
//成员列表
string Name;
int Age;
int Score;
Student(string name="/0", int age=0, int score=0) {//在Student类型进行初始化
Name = name; Age = age; Score = score;
}
}s1;//顺便创建结构体变量
代码末尾我定义了s1结构体变量,s1具有Student结构体的所有内容。
使用方法:
示例:s1.Name = "老王", s1.Age = 21, s1.Score = 88;
使用方法:
示例:struct Student s2 = { "李四",20,100 };
struct 可以省略
使用方法:
示例:struct Student s3;
s3.Name = "张三";
s3.Age = 18;
s3.Score = 99;
同上,struct 也可以省略
代码如下:
//1、学生结构体
struct student
{
string name="0";
int age = 0; int score = 0;
};
//2、教师结构体
struct teacher
{
string name;
int id;int age;
struct student stu;//老师辅导的学生
};
这里我们要注意student结构体要放在teacher结构体前面,这是因为如果先写teacher结构体,编译器找到struct student stu;这个语句时,无法识别stu变量,这个值得注意。
struct teacher t1;
t1.name = "老王";
t1.age = 50;
t1.id = 888;
t1.stu.name = "小王";
t1.stu.age = 19;
t1.stu.score = 95;
教师结构体中我们定义了 student stu 变量 因此赋值只需要加.stu.属性 就行了,struct 可省略
代码如下:
Student stuArray[5] = { {"张三",18,88},{"李四",20,99},{"王五",21,100},
{"赵云",16,66},{"韩信",22,89} };
stuArray[4].Name = "露娜";//可以赋值操作
结构体数组和普通数组形式一致,只是数组成员包含一个结构的所有公共属性。
代码如下:
struct Student {
//成员列表
string Name;
int Age;
int Score;
Student(string name="/0", int age=0, int score=0) {
Name = name; Age = age; Score = score;
}
}
Student A[5] = { Student("张三",18,88),Student("李四",20,99),
Student("王五",21,100),Student("赵云",16,66),Student("韩信",22,89)};
这里的数组明显不同于普通结构体数组,每一个数组成员前面都有Student,这样数组成员看起来很清晰而且我们想用几个属性就可以在构造方法里面传入对应参数,是不是很方便呢。
基于上面学习的内容我做一个小案例:老师结构体嵌套学生结构体,一个老师管理五个学生,每个学生有姓名和成绩属性,要求可以赋值,可以打印输出,话不多说,开始操作!
#include
using namespace std;
struct Student {
string name;
int score;
};
struct Teacher
{
string name;
struct Student s[5];
};
//给老师名字赋值
void allocateSpace(Teacher t[],int len,int L)
{
string nameSeed1 = "ABCDE";
string nameSeed2 = "FGHIJ";
string nameSeed3 = "KLMNO";
for (int i = 0; i < len; i++)
{
t[i].name = "Teacher_";
t[i].name +=nameSeed1[i];
for (int j = 0; j < L; j++)
{
int random1 = rand() % 3 + 1;
t[i].s[j].name = "Student_";
if (random1 == 1) t[i].s[j].name += nameSeed1[j];
else if((random1 == 2)) t[i].s[j].name += nameSeed2[j];
else t[i].s[j].name += nameSeed3[j];
int random = rand() % 61 + 40;
t[i].s[j].score = random;
}
}
}
void printTSInfo(Teacher T[],int len,int L)
{
for (int i = 0; i < len; i++)
{
cout << "第" << i + 1 << "个老师的名字为:\t" << T[i].name << endl;
for (int j = 0; j < L; j++)
{
cout << "\t其辅导学生的名字和成绩为:" << T[i].s[j].name << " " << T[i].s[j].score << endl;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
Teacher t[3];
int len = sizeof(t) / sizeof(t[0]);
int l = sizeof(t->s) / sizeof(t->s[0]);
allocateSpace(t, len,l);
printTSInfo(t,len,l);
}
在这里对某些代码解释:main函数里的 srand((unsigned int)time(NULL));是为了得到不同的随机数,基于计算机时间的随机数种子,然后利用rand()就可以得到各种各样的范围的随机数。sizeof可以计算字节大小,结合数组名和首地址的意义可以得到数组的大小及数组含有的元素个数,传参的时候非常实用。
运行效果:
案例的代码虽然长了点,但绝对非常实在,没有什么花哨,静下心来都可以做到,期待你我长此以往,顶峰相见!