大学C语言课后题---对结构体进行随机排序操作

输入

输出

排序后的学生信息,及平均分,前三名

输出案例

由以上信息我们可以拿到题目的要求:三个函数,我们分别用func1, func2, func3表达。在main()函数中调用:

int main()
{
	func1();
	printf("\n");
	func2();
	printf("\n");
	func3();
	return 0;
}    

然后,我们需要写一个结构体数组来导入学生信息,实现如下:

struct students
{
	int num;
	char name[1][12];
	int age;
	double grade;

}stu[10] = {
	{20220001, "陈坚", 19, 421.0},

	{20220002, "郑倩", 18, 425.5},

	{20220003, "孙宸硕", 19, 450.0},

	{20220004, "韩浩宸", 19, 453.0},

	{20220005, "施子喻", 19, 450.0},

	{20220006, "蒋雪莹", 18, 508.0},

	{20220007, "秦婵", 18, 473.0},

	{20220008, "周政", 18, 499.0},

	{20220009, "朱嘉萱", 19, 510.0},

	{20220010, "郑壮", 18, 492.5}
};

在func1中,我们需要顺序输出学号,让姓名,年龄,成绩均随机排布,因此我们需要使用随机函数rand()和时间函数搭配使用。需要注意的是,我们要随机生成1~9之间的所有数字,且不能重复。因此,我们使用了一个tmp来进行缓冲,比较a[i]和tmp的大小,如果有重复的,就i = 0;重新生成数组a。虽然耗时较长,但却是程序最不容易出bug的办法。

void rand1(int a[10] = { })
{
	
	srand((unsigned)time(NULL));
	for (int i = 0; i <= 10; ++i)
	{
		int tmp = rand() % 10;
		if (a[i - 1] == tmp || a[i - 2] == tmp || a[i - 3] == tmp || a[i - 4] == tmp || a[i - 5] == tmp || a[i - 6] == tmp || a[i - 7] == tmp || a[i - 8] == tmp || a[i - 9] == tmp)
		{
			i = 0;
		}
		else {
			a[i] = tmp;
		}
	}

}
void func1()
{
	int a[11] = { };
	int b[11] = { };
	int c[11] = { };
	rand1(a);
	rand1(b);
	rand1(c);
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[a[i]].name, stu[a[i]].age, stu[a[i]].grade);
	}
}

在func2中,我们需要顺序输出所有学生的信息,因此,我们使用一个for循环遍历一下我们的结构体数组即可:

void func2()
{
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
	}
}

在func3中,我们需要拿到平均分和前三名的成绩,所以我们需要写一个排序的函数,这里使用了冒泡排序:

void max_to_min()
{
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 0; j < 10; ++j)
		{
			if (s[i] > s[j])
			{
				int c = s[i];
					s[i] = s[j];
					s[j] = c;
			}
		}
	}
}

下一步,执行题目要求的步骤:

void func3()
{
	
	for (int i = 0; i < 10; ++i)
	{
		s[i] = (int)stu[i].grade;
	}
	max_to_min();
	int sum = 0;
	for (int i = 0; i <= 9; ++i)
	{
		sum += s[i];
	}
	double averange = sum / 10.0;
	printf("平均分为:%.1lf\t前三甲为:\n",averange);
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[0])
		{
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[1])
		{
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[2])
		{
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
}

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int s[10];

struct students
{
	int num;
	char name[1][12];
	int age;
	double grade;

}stu[10] = {
	{20220001, "陈坚", 19, 421.0},

	{20220002, "郑倩", 18, 425.5},

	{20220003, "孙宸硕", 19, 450.0},

	{20220004, "韩浩宸", 19, 453.0},

	{20220005, "施子喻", 19, 450.0},

	{20220006, "蒋雪莹", 18, 508.0},

	{20220007, "秦婵", 18, 473.0},

	{20220008, "周政", 18, 499.0},

	{20220009, "朱嘉萱", 19, 510.0},

	{20220010, "郑壮", 18, 492.5}
};

void rand1(int a[10] = { })
{
	
	srand((unsigned)time(NULL));
	for (int i = 0; i <= 10; ++i)
	{
		int tmp = rand() % 10;
		if (a[i - 1] == tmp || a[i - 2] == tmp || a[i - 3] == tmp || a[i - 4] == tmp || a[i - 5] == tmp || a[i - 6] == tmp || a[i - 7] == tmp || a[i - 8] == tmp || a[i - 9] == tmp)
		{
			i = 0;
		}
		else {
			a[i] = tmp;
		}
	}

}

void max_to_min()
{
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 0; j < 10; ++j)
		{
			if (s[i] > s[j])
			{
				int c = s[i];
					s[i] = s[j];
					s[j] = c;
			}
		}
	}
}
void func1()
{
	int a[11] = { };
	int b[11] = { };
	int c[11] = { };
	rand1(a);
	rand1(b);
	rand1(c);
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[a[i]].name, stu[a[i]].age, stu[a[i]].grade);
	}
}
void func2()
{
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
	}
}
void func3()
{
	
	for (int i = 0; i < 10; ++i)
	{
		s[i] = (int)stu[i].grade;
	}
	max_to_min();
	int sum = 0;
	for (int i = 0; i <= 9; ++i)
	{
		sum += s[i];
	}
	double averange = sum / 10.0;
	printf("平均分为:%.1lf\t前三甲为:\n",averange);
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[0])
		{
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[1])
		{
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[2])
		{
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
}
int main()
{
	func1();
	printf("\n");
	func2();
	printf("\n");
	func3();
	return 0;
}           

注意:这里的数组s是全局变量,这样就避免了函数间相互传值的麻烦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一种聪明的缘猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值