在这里我实现的功能为:输入三个人的信息,每个人的信息分别为姓名和三个成绩,我分别计算三个人的成绩和,并通过经典的三杯水案例完成对三个人的成绩从小到大的排列打印。
重点:
我这里使用的为堆空间申请内存的形式
第一步:
定义一个结构体,其中包含姓名和三个人成绩的数组;
struct struct1
{
char *name; //姓名
float scores[3]; //成绩数组
};
当中,结构体名: struct struct1太长,我们可以使用typedef命别名,如下:
typedef struct struct1 sss; //命别名为sss
命别名为sss;
整体代码如下:
#include <Windows.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
struct struct1
{
char *name; // 姓名
float scores[3]; // 成绩数组
};
typedef struct struct1 sss; // 命别名为sss
int main()
{
sss num1[3]; //声明3个人的结构体数组
sss *num2 = (sss *)malloc(sizeof(num1) * 10); //申请结构体堆空间申请内存
//遍历输入
for (int i = 0; i < 3; i++)
{
(num2 + i)->name = (char *)malloc(sizeof(char) * 10);
printf("请输入姓名:");
scanf("%s", (num2 + i)->name);
printf("请输入成绩1:");
scanf("%f", &(num2 + i)->scores[0]);
printf("请输入成绩1:");
scanf("%f", &(num2 + i)->scores[1]);
printf("请输入成绩1:");
scanf("%f", &(num2 + i)->scores[2]);
}
//遍历循环判断,从小到大排列
for (int i = 0; i < 3 - 1; i++)
{
for (int j = 0; j < 3 - 1 - i; j++)
{
float x = (num2 + j)->scores[0] + (num2 + j)->scores[1] + (num2 + j)->scores[2];
float y = (num2 + j + 1)->scores[0] + (num2 + j + 1)->scores[1] + (num2 + j + 1)->scores[2];
if (x > y)
{
sss num;
num = num2[j];
num2[j] = num2[j + 1];
num2[j + 1] = num;
}
}
}
for (int i = 0; i < 3; i++)
{
printf("姓名为:%s 成绩为:%.2f %.2f %.2f \n\n", (num2 + i)->name, (num2 + i)->scores[0], (num2 + i)->scores[1], (num2 + i)->scores[2]);
}
for (int i = 0; i < 3; i++)
{
free((num2 + i)->name);
(num2 + i)->name = NULL;
}
free(num2);
num2 = NULL;
system("pause");
return 0;
}
首先:定义了一个结构体struct1,其中包含学生的姓名(name)和三门课程的成绩数组(scores)。
然后:通过typedef将struct1命名为sss以简化代码。在main函数中,声明了一个包含3个sss结构体的数组num1,并使用malloc函数动态分配了一个大小为3的sss结构体数组num2。
接下来:通过for循环遍历输入学生的姓名和成绩,并将其存储在num2数组中。然后,使用嵌套的for循环对学生按照总成绩从小到大进行排序。
最后:使用另一个for循环打印出排序后的学生姓名和成绩,并使用free函数释放动态分配的内存,防止内存泄漏。整个程序实现了学生信息的输入、排序和输出功能。
标签:变量,num2,struct1,sss,改写,内存,scores,成绩,name From: https://blog.csdn.net/weixin_47378530/article/details/139421195