结构体+函数
1、值传递
【改变分数】【无效】
2、地址传递
【改变年龄】【有效】
#include <iostream>
#include <string>
using namespace std;
//学生结构体
struct student
{
int age;//年龄
string name;//名字
int score;//分数
};
//值传递的函数【改变分数】【无效】
void printstudent1(struct student s)
{
cout << "值传递:" << endl;
cout << "年龄:" << s.age << "名字:" << s.name << "分数:" << s.score << endl;
s.score = 100;//改变分数(无效)
}
//地址传递的函数【改变年龄】【有效】
void printstudent2(struct student* p)
{
cout << "地址传递:" << endl;
cout << "年龄:" << p->age << "名字:" << p->name << "分数:" << p->score << endl;
p->age = 20;//改变年龄(有效)
}
int main()
{
//定义学生数据
struct student s;
s.age = 18;
s.name = "Amy";
s.score = 99;
cout <<"在没有调用函数之前的年龄:"
<< s.age << endl;
cout << "在没有调用函数之前的分数:"
<<s.score << endl;
//值传递打印学生数据
printstudent1(s);
//地址传递打印学生数据
printstudent2(&s);
cout << "在调用函数之后的年龄:"
<< s.age << endl;
cout << "在调用函数之后的分数:"
<< s.score << endl;
return 0;
}
结构体中const的使用
【使用 student * s,而不是student s 的理由】
如果是值传递:
会把结构体所有的数据类型的内存全部副本一遍
但是如果是地址传递:
所有的数据类型都是指针,都只有四个字节
所以:
地址传递会减少内存空间,并且不会复制副本
【在地址传递的时候】
如果改变了形参,会影响实参的数据
为了 不随意的改变 实参 的数据
则使用const student * s
#include <iostream>
#include <string>
using namespace std;
struct student
{
int age;//年龄
string name;//姓名
int score;//分数
};
/*使用 student *s,而不是student s 的理由:
如果是值传递:
会把结构体所有的数据类型的内存全部副本一遍
但是如果是地址传递:
所有的数据类型都是指针,都只有四个字节
所以:
地址传递会减少内存空间,并且不会复制副本
*/
/*在地址传递的时候
如果改变了形参,会影响实参的数据
为了不随意的改变实参的数据
则使用const student * s
*/
void printstudent(const student * s)
{
cout << "年龄:" << s->age<< " "
<< "姓名:" << s->name<< " "
<< "分数:" << s->score << endl;
}
int main()
{
student s;
s.age = 19;
s.name = "李华";
s.score = 93;
printstudent(&s);
return 0;
}
结构体案例
1、老师三人各管理五名学生
【新接触的赋值模式】
数组与数组累加
string nameseed = "ABCDE";
for (int i = 0; i < len; i++)
{
//老师赋值:
tArray[i].tname = "teacher_";
tArray[i].tname += nameseed[i];//在teacher_后面加上对应的ABCDE
//学生赋值:
for (int j = 0; j < 5; j++)
{
tArray[i].sAarry[j].sname = "student_";
tArray[i].sAarry[j].sname += nameseed[j];//同老师的赋值方法一样
【随机数vs随机数种子】
随机数:
int random = rand() % 61 + 40;//40 - 100(随机数分配)
rand() % 60 代表 0 - 59 (60-1)
若后面再加数字就代表在起始的位置加数字
随机数种子:
srand((unsigned int)time(NULL));
加一个头文件< ctime >
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
//学生结构体
struct student
{
string sname;//名字
int score;//分数
};
//老师结构体
struct teacher
{
string tname;//名字
struct student sAarry[5];
};
//给老师与学生赋值
void allocateSpace(struct teacher tArray[], int len)
{
string nameseed = "ABCDE";
for (int i = 0; i < len; i++)
{
//老师赋值:
tArray[i].tname = "teacher_";
tArray[i].tname += nameseed[i];//在teacher_后面加上对应的ABCDE
//学生赋值:
for (int j = 0; j < 5; j++)
{
tArray[i].sAarry[j].sname = "student_";
tArray[i].sAarry[j].sname += nameseed[j];//同老师的赋值方法一样
int random = rand() % 61 + 40;//40 - 100(随机数分配)
//rand() % 60 代表 0 - 59 (60-1) 若后面再加数字就代表在起始的位置加数字
tArray[i].sAarry[j].score = random;
}
}
}
//输出所有内容的函数
void printInfo(struct teacher tArray[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "老师的姓名:" << tArray[i].tname << endl;
for (int j = 0; j < 5; j++)
{
cout << "\t老师所带学生姓名:" << tArray[i].sAarry[j].sname << "\t"
<< "学生的成绩:" << tArray[i].sAarry[j].score << endl;
}
}
}
int main()
{
//随机数种子
srand((unsigned int)time(NULL));
//第一步:创建老师的数组
struct teacher tArray[3];
int len = sizeof(tArray) / sizeof(tArray[0]);
//第二步:给老师的信息赋值,并且老师所带学生赋值
allocateSpace(tArray, len);
//第三步:打印所有的信息
printInfo(tArray, len);
return 0;
}
2、五位英雄冒泡排序
void bubbleSort(struct hero Array[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if(Array[j].age > Array[j + 1].age)
{
struct hero temp = Array[j];//创建与Array相同的数据结构
Array[j] = Array[j + 1];
Array[j + 1] = temp; }
}
}
}
#include <iostream>
#include <string>
using namespace std;
//创建英雄结构体
struct hero
{
int age;//年龄
string name;//姓名
};
//冒泡法
void bubbleSort(struct hero Array[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (Array[j].age > Array[j + 1].age)
{
struct hero temp = Array[j];//创建与Array相同的数据结构
Array[j] = Array[j + 1];
Array[j + 1] = temp;
}
}
}
}
//打印英雄的所有信息
void printHero(struct hero Array[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "英雄的姓名:" << Array[i].name << "\t英雄的年龄:" << Array[i].age << endl;
}
}
int main()
{
//1、创建英雄结构体数组 //2、赋值
struct hero Array[5] =
{
{18, "张三"},
{20, "李四"},
{17, "王五"},
{23, "赵六"},
{21, "周二"}
};
int len = sizeof(Array) / sizeof(Array[0]);
//3、冒泡排序法
bubbleSort(Array, len);
//4、输出
printHero(Array, len);
return 0;
}