题目:三名老师带三名学生,学生有姓名和分数,老师只有姓名,通过函数给学生分数赋值,冰最后打印出来
我的方法(手输名字和成绩)
1、如果结构体中的成员均为一般变量(包括结构体变量),则使用“.”,如果成员变量为指针(不管指向什么,包括结构体),则使用“->”。
2、如果定义了结构体数组指针,则可分别使用“.”和“->”,区别在于指针带下标时,以是数组形式访问,此时相当于对指针解引用,所以用“.”,如果不带下标(或使用偏移),此时用“->”。
struct student
{
string name;
int score;
};
struct teacher
{
string name;
struct student stu[2];
};
void address( struct teacher *p)
{
for (int i = 0; i < 3; i++)
{
if (i == 0) //这里是==,判断情况,不是=
{
cout << "输入第一位老师" << endl;
cin >> p[0].name;//这里p以数组形式,所以用.
//数组的地址传递到指针变量p后,想改变结构体数组中的值,
//此时用的是p[i].age,不是t[i].age,调用函数中没有t
cout << "输入第一学生姓名和成绩" << endl;
cin >> p->stu[0].name >> p->stu[0].score;//这里p以指针形式,所以用-> stu[0]以数组形式,所以用.
cout << "输入第二学生姓名和成绩" << endl;
cin >> p->stu[1].name >> p->stu[1].score;
}
}
}
int main()
{
struct teacher t[3];
t[0].name = "加大";
cout << t[0].name << endl;
address(t); //数组首地址就是t,不需要加&
cout << t[0].name << endl << t->stu[0].name << " " << t->stu[0].score << endl
<< t->stu[1].name << " " << t->stu[1].score << endl;
system("pause");
return 0;
}
2,一个结构五个人按年龄冒泡排序,打印
我的方法(也用了将数组首地址和数组长度传入后再冒泡的流程)
这里因为传输了数组首地址,所以就等于地址传递,可以修改原本的值
注意:传输了数组首地址后,调用函数中用p[i]来指向值并修改,
struct hero
{
string name;
string sex;
int age;
};
void bulble(struct hero mes[], int len) //创建数组变量[],因为传输了数组首地址,所以可以直接用数组
{
for (int i = 0; i < len; i++) //冒泡排序标准操作
{
for (int j = 0; j < len - i - 1; j++)
{
if (mes[j].age > mes[j + 1].age) //因为这是数组形式,所以用.指向
{
int temp = mes[j + 1].age; //这里是地址传递
mes[j + 1].age = mes[j].age;
mes[j].age = temp;
string temp1 = mes[j + 1].name; //name 和sex是字符串,所以temp1也必须是string
mes[j + 1].name = mes[j].name;
mes[j].name = temp1;
string temp2 = mes[j + 1].sex;
mes[j + 1].sex = mes[j].sex;
mes[j].sex = temp2;
}
}
}
}
int main()
{
struct hero mes[5] =
{
{"刘备","男",40},
{"关羽","男",36},
{"张飞","男",39},
{"貂蝉","女",20},
{"诸葛亮","男",30}
};
int len;
len = sizeof(mes) / sizeof(mes[0]);
bulble(mes,len); //冒泡排序数组,传输数组首地址和数组长度
for (int i = 0; i < 5; i++)
{
cout << mes[i].name << " " << mes[i].sex << " " << mes[i].age << endl;
}
system("pause");
return 0;
}
老师方法(创建一个hero型的temp,可以一次性改变结构体的所有值)
减少了代码量
void bulble(struct hero mes[], int len)
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (mes[j].age > mes[j + 1].age)
{
struct hero temp = mes[j + 1]; //创建一个hero型的temp,可以一次性改变结构体中所有数据
mes[j+1] = mes[j];
mes[j] = temp;
}
}
}
}