输入
无
输出
排序后的学生信息,及平均分,前三名
输出案例
由以上信息我们可以拿到题目的要求:三个函数,我们分别用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是全局变量,这样就避免了函数间相互传值的麻烦。