c++ day4 两个结构体案例

题目:三名老师带三名学生,学生有姓名和分数,老师只有姓名,通过函数给学生分数赋值,冰最后打印出来

我的方法(手输名字和成绩)

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;
            }
        }
    }    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值