【C语言】结构体数组练习(经典编程题,建议收藏!!!)


💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

前言

在我们实际应用中,每一种类(可认为是物体)都有多种属性。列如一位学生,他的属性有,性别 ,姓名,学号,成绩等多种。假设一个班级有30位学生,如果把这些学生分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把30个学生组合起来,以一个集合形式对30个学生进行描述,因此就用到了结构体类型的数组,该数组里的元素都是学生类型的结构体。下面将会讲解3道结构体数组编程题,这3三道编程题很经典,其解法也很相识似。同时又与现实问题很吻合。希望看完对你有所帮助!

点击即可查看:结构体数组知识

题目1:输出朋友信息

描述:创建一结构类型描述朋友信息,包括姓名、生日,电话号码(字符串)。输入n(n<10)个朋友的信息存放到结构数组中,再按他们的年龄从大到小的顺序依次输出其信息。

朋友信息:
张三 18 4月12日 13435789087
李四 26 4月23日 13435781234
小夏 23 4月04日 13435785678
小和 35 5月04日 13435744567

代码如下

//声明Firend类型的结构体
struct Friend
{
	char name[20];	//名字
	int age;		//年龄
	char bir[20];	//生日日期
	char num[20];	//电话号码
};

int main()
{
	struct Friend friend[4];
	//输入朋友信息
	for (int i = 0; i < 4; i++)
	{
		scanf("%s%d%s%s", &friend[i].name, &friend[i].age, &friend[i].bir, &friend[i].num);
	}
	//排序
	for (int i = 0; i < 4 - 1; i++)
	{
		for (int j = 0; j < 4 - i - 1; j++)
		{
			if (friend[j].age < friend[j + 1].age)
			{
				int temp = friend[j].age;
				friend[j].age = friend[j + 1].age;
				friend[j].age = temp;
			}
		}
	}
	//输出
	printf("%s	%s	%s	%s\n", "姓名", "年龄", "生日日期", "电话号码");
	for (int i = 0; i < 4; i++)
	{
		printf("%s	%d	%s		%s\n", friend[i].name, friend[i].age, friend[i].bir, friend[i].num);
	}
	return 0;
}

输出结果:
在这里插入图片描述
解析:解决这道题关键是将他们的年龄从大到小的排序。这就需要使用冒泡排序了。

题目2:输出员工薪资信息

描述:创建一结构类型描述员工薪资信息,包括编号,薪资情况。输入5个员工的信息存放到结构数组中,再按他们的工资从高到低的顺序排序。最后输出员工薪资信息和最低工资。

员工信息:
编号 薪资
01 8888.65
02 8893.78
03 7799.78
04 8881.22
05 6699.89
代码如下:

struct Stuff
{
	int stuffid;	//编号
	float bonus;	//薪资
};

int main()
{
	struct Stuff stuff[5];	//定义一个Stuff结构体类型的数组
	float minBonus;	//存放最低薪资
	//输入员工数据
	for (int i = 0; i < 5; i++)
	{
		scanf("%d %f", &stuff[i].stuffid, &stuff[i].bonus);
	}
	minBonus = stuff[0].bonus;	//假设最低薪资为第一位员工
	//找出最低薪资
	for (int i = 0; i < 5; i++)
	{
		
		if (minBonus > stuff[i].bonus)
		{
			minBonus = stuff[i].bonus;
		}
	}
	//打印
	printf("%s	%s\n", "编号", "工资");
	for (int j = 0; j < 5; j++)
	{
		printf("%02d	%.2f\n", stuff[j].stuffid, stuff[j].bonus);
	}
	printf("最低工资:%.2f", minBonus);
	return 0;
}

输出结果:
在这里插入图片描述

题目3:输出学生成绩信息

创建一结构类型描述学生综合成绩信息,包括学号,姓名,综合得分。输入4个学生的信息存放到结构数组中,再按他们的成绩从高到低的顺序依次输出其信息,并输出平均分。
学生成绩信息:
2023123 小夏 78.75
2023111 小溪 87.68
2023233 笑笑 82.98
2023456 小猪 69.55
代码如下:

struct Student
{
	int id;
	char name[20];
	float score;
};

int main()
{
	struct Student stu[4];
	float avg = 0;

	for (int i = 0; i < 4; i++)
	{
		scanf("%d %s %f", &stu[i].id, & stu[i].name, &stu[i].score);
		avg += stu[i].score / 4;
	}
	//冒泡排序
	//趟数
	for (int i = 0; i < 4 - 1; i++)
	{
		//比较次数
		for (int j = 0; j < 4 - i - 1; j++)
		{
			if (stu[j].score < stu[j + 1].score)
			{
				float temp = stu[j].score;
				stu[j].score = stu[j + 1].score;
				stu[j + 1].score = temp;
			}
		}
	}
	//输出
	printf("%s	%s	%s\n", "学号", "姓名", "成绩");
	for (int j = 0; j < 4; j++)
	{
		printf("%d	%s	%.2f\n", stu[j].id, stu[j].name, stu[j].score);
	}
	printf("平均分:%.2f", avg);
	return 0;
}

在这里插入图片描述

题目4:输出购物者小票

有一位顾客想在幸运小猫平台的线下商店购买三种猫粮中的一种,三种猫粮分别为:roy-幼猫粮-109.5,now-幼猫粮-89.5,go-成猫粮-180。输出顾客所购买猫粮的金额。

代码如下:

typedef struct Shop
{
	char brand[10];	//品牌
	char var[10];	//类型
	float price;	//价格
}Shop;

void Print(struct Shop shop[])
{
	printf("%s	%s	%s\n", "品牌", "类型", "价格");
	for (int i = 0; i < 3; i++)
	{
		printf("%s	%s	%.2f\n", shop[i].brand, shop[i].var, shop[i].price);
	}
}

int main()
{
	Shop shop[3] = { {"now", "幼猫粮", 89.5f},{"roy", "幼猫粮", 109.8f},{"go", "幼猫粮", 180.5f} };
	int count = 0;			//购买个数
	float money = 0;		//购买金额
	char temp[10] = { 0 };	//购买猫粮品种
	//打印
	Print(shop);
	scanf("%s %d", temp, &count);
	//计算金额
	for (int i = 0; i < 3; i++)
	{
		if (0 == strcmp(shop[i].brand, temp))
		{
			money = shop[i].price * count;
		}
	}
	printf("合计:	%.2f", money);
	return 0;
}

输出结果:
在这里插入图片描述
思路:

  1. 声明Shop结构体类型。
  2. 实现Print打印三种品牌猫粮的信息。
  3. 实现金额计算。

总结: 通过这篇文章,我相信你对处理类似这种类型的编程题应该是游刃有余了,一定更加了解结构体数组的应用了,也对自定义类型结构体有更深的了解。
这类题的基本思路:

  1. 定义一个结构体类型的数组。
  2. 根据题目要求去逐步实现。
  3. 题目要求排序一般用冒泡排序,这种算法较简单。

那么写到这里,本节内容就结束了,这篇博客花费了很长时间,但写完有满满的成就感,希望能帮助到大家,如果文章有不足的地方,欢迎在评论区留言指正,我们一起学习交流!
希望能得到大家的关注、点赞、评论、收藏! 你的支持是我最大的动力!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值