要实现的功能:录入学生的姓名,年龄,分数。并对学生的分数由低到高进行排序,最后输出。
那我们一步一步来,先写一个录入。
从这里就可以看出我们结构体的优点(面对一个复杂的集合,有时只需要一个变量来存储,不需要多个变量)
声明:这里为了讲解方便,写成伪代码的形式,完整代码我会放在最后
struct student //定义一个类型
{
char name[100]; //注意:一定要定义为数组
int age;
double score;
};
//输入学生信息
int num;
printf("学生人数:");
scanf("%d", &num);
struct student* p = (struct student*)malloc(num*sizeof(struct student)); //确定数组
int i;
for (i = 0; i < num; i++)
{
printf("输入第%d个学生信息\n", i + 1);
printf("name=");
scanf("%s", p[i].name); //这里不用加取地址符,因为由第六行可知,name是数组名,是数组的首个元素的地址
printf("age=");
scanf("%d", &p[i].age);
printf("score=");
scanf("%lf",&p[i].score);
}
接下来开始第二个阶段--------排序
这里我们就用最简单方便的冒泡排序
//排序(冒泡排序,降序,score)
int j;
for (i = 0; i < num-1; i++)
{
for (j = 0; j < num - 1 - i; j++)
{
struct student t; //注意:这里的类型一定要一致
if (p[j].score < p[j + 1].score)
{
t = p[j]; //注意:这里交换的是结构体而不是结构体内的成员,否则就张冠李戴了
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
这里有一个注意点,交换时是整个结构体进行交换,而不是结构体成员交换。这里我在注释里也写明了。
最后第三阶段-----输出
//输出学生信息
for (i = 0; i < num; i++)
{
printf("第%d个学生信息是:\n", i + 1);
printf("name=%s\n", p[i].name);
printf("age=%d\n", p[i].age);
printf("score=%.2lf\n", p[i].score);
printf("\n");
}
如果一开始上来就写代码,可能会写出很多不必要的bug和错误的思路。但是如果我们把问题拆成几段,就会容易许多,步步为营。
把大象装进冰箱分三步:第一步,打开冰箱;第二步,把大象装进去;第三步,把冰箱门关上。
最后我把完整的代码放在下面,给大家参考
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
struct student //定义一个类型
{
char name[100]; //注意:一定要定义为数组
int age;
double score;
};
int main()
{
int num;
printf("学生人数:");
scanf("%d", &num);
struct student* p = (struct student*)malloc(num*sizeof(struct student)); //确定数组
//输入学生信息
int i;
for (i = 0; i < num; i++)
{
printf("输入第%d个学生信息\n", i + 1);
printf("name=");
scanf("%s", p[i].name); //这里不用加取地址符,因为由第六行可知,name是数组名,是数组的首个元素的地址
printf("age=");
scanf("%d", &p[i].age);
printf("score=");
scanf("%lf",&p[i].score);
}
//排序(冒泡排序,降序,score)
int j;
for (i = 0; i < num-1; i++)
{
for (j = 0; j < num - 1 - i; j++)
{
struct student t; //注意:这里的类型一定要一致
if (p[j].score < p[j + 1].score)
{
t = p[j]; //注意:这里交换的是结构体而不是结构体内的成员,否则就张冠李戴了
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
//输出学生信息
for (i = 0; i < num; i++)
{
printf("第%d个学生信息是:\n", i + 1);
printf("name=%s\n", p[i].name);
printf("age=%d\n", p[i].age);
printf("score=%.2lf\n", p[i].score);
printf("\n");
}
return 0;
}