涉及结构体的排序问题

简单举一个例子来介绍涉及结构体的排序问题。
例:输入若干学生姓名、语文成绩、数学成绩、英语成绩,根据三科成绩总分由高到低进行排序。
输入数据:

小明 78 89 90
小红 87 88 77
小华 91 92 96

输出样例:

小华 91 92 96 279
小明 78 89 90 257
小红 87 88 77 252

这个问题就需要用到结构体来存放各科成绩及其总分,然后根据总分进行排序。
输入学生的数量可以通过用户输入得到,然后根据用户输入的值动态分配内存空间,当然也可以不用这样,直接定义一个已知的结构体类型的数组。
本例的代码如下。

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

typedef struct{
    
    
	char name[20];
	int score_1;
	int score_2;
	int score_3;
	int sum_score;
}Stu;

void input_info(Stu stu_stru[],int n)
{
    
    
	for(int i=0;i<n;i++)
	{
    
    
		printf("学生%d姓名:",i+1);
		scanf("%s", &stu_stru[i].name);
		printf("语文成绩:");
		scanf("%d", &stu_stru[i].score_1);
		printf("数学成绩:");
		scanf("%d", &stu_stru[i].score_2);
		printf("英语成绩:");
		scanf("%d", &stu_stru[i].score_3);
		stu_stru[i].sum_score = stu_stru[i].score_1 + stu_stru[i].score_2 + stu_stru[i].score_3;
	}
}

void print_info(Stu stu_stru[],int n)
{
    
    
	printf("姓名  语文  数学  英语  总分\n");
	for(int i=0;i<n;i++)
	{
    
    
		printf("%4s ",stu_stru[i].name);
		printf("%4d ",stu_stru[i].score_1);
		printf("%4d ",stu_stru[i].score_2);
		printf("%4d ",stu_stru[i].score_3);
		printf("%4d\n",stu_stru[i].sum_score);
	}
}

void sort_score(Stu stu_stru[],int n)
{
    
    
	for(int i=0;i<n;i++)
	{
    
    
		for(int j=0;j<n-i-1;j++)
		{
    
    
			if(stu_stru[j].sum_score < stu_stru[j+1].sum_score)
			{
    
    
				Stu temp;
				temp = stu_stru[j];
				stu_stru[j] = stu_stru[j+1];
				stu_stru[j+1] = temp;
			}
		}
	}
}

void main()
{
    
    
	int n;
	Stu *stu_info;   //这里也可以直接定义为  Stu stu_info[50];
    printf("输入学生数量:");
    scanf("%d",&n);
    stu_info = (Stu *)malloc(n*sizeof(Stu));  //动态分配内存
    input_info(stu_info,n);
	printf("\n输入序列:\n");
	printf("----------------------------------\n");
    print_info(stu_info,n);
	sort_score(stu_info,n);
	printf("----------------------------------\n");
	printf("\n按总分排序后:\n");
	printf("----------------------------------\n");
	print_info(stu_info,n);
	printf("----------------------------------\n");
	free(stu_info);
}

上面的代码在函数中是以结构体数组直接访问各成员的,下面的代码通过指针来访问结构体中的各成员。

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

typedef struct{
    
    
	char name[20];
	int score_1;
	int score_2;
	int score_3;
	int sum_score;
}Stu;

void input_info(Stu *p,int n)
{
    
    
	for(int i=0;i<n;i++)
	{
    
    
		printf("学生%d姓名:",i+1);
		scanf("%s", &(p+i)->name);
		printf("语文成绩:");
		scanf("%d", &(p+i)->score_1);
		printf("数学成绩:");
		scanf("%d", &(p+i)->score_2);
		printf("英语成绩:");
		scanf("%d", &(p+i)->score_3);
		(p+i)->sum_score = (p+i)->score_1 + (p+i)->score_2 + (p+i)->score_3;
	}
}

void print_info(Stu *p,int n)
{
    
    
	printf("姓名  语文  数学  英语  总分\n");
	for(int i=0;i<n;i++)
	{
    
    
		printf("%4s ",(p+i)->name);
		printf("%4d ",(p+i)->score_1);
		printf("%4d ",(p+i)->score_2);
		printf("%4d ",(p+i)->score_3);
		printf("%4d\n",(p+i)->sum_score);
	}
}

void sort_score(Stu *p,int n)
{
    
    
	for(int i=0;i<n;i++)
	{
    
    
		for(int j=0;j<n-i-1;j++)
		{
    
    
			if((p+j)->sum_score < (p+j+1)->sum_score)
			{
    
    
				Stu temp;
				temp = *(p+j);
				*(p+j) = *(p+j+1);
				*(p+j+1) = temp;
			}
		}
	}
}

void main()
{
    
    
	int n;
	Stu *stu_info;
    printf("输入学生数量:");
    scanf("%d",&n);
    stu_info = (Stu *)malloc(n*sizeof(Stu)); 
    input_info(stu_info,n);
	printf("\n输入序列:\n");
	printf("----------------------------------\n");
    print_info(stu_info,n);
	sort_score(stu_info,n);
	printf("----------------------------------\n");
	printf("\n按总分排序后:\n");
	printf("----------------------------------\n");
	print_info(stu_info,n);
	printf("----------------------------------\n");
	free(stu_info);
}

程序运行后输入及输出结果如下图所示。
在这里插入图片描述
上面的输出结果是根据总分由高到低排列的,符合题目要求。

猜你喜欢

转载自blog.csdn.net/weixin_42570192/article/details/132562436