Problemas relacionados con el ordenamiento de estructuras.

Un ejemplo sencillo para introducir el problema de clasificación que involucra estructuras.
Ejemplo: ingrese una cantidad de nombres de estudiantes, puntajes en chino, puntajes en matemáticas y puntajes en inglés, y ordénelos según los puntajes totales de las tres materias de mayor a menor.
Datos de entrada:

Xiao Ming 78 89 90
Xiao Hong 87 88 77
Xiao Hua 91 92 96

Salida de muestra:

Xiaohua 91 92 96 279
Xiaoming 78 89 90 257
Xiaohong 87 88 77 252

Este problema requiere el uso de una estructura para almacenar los puntajes de cada materia y sus puntajes totales, y luego ordenarlos según los puntajes totales.
El número de estudiantes ingresados ​​se puede obtener a través de la entrada del usuario, y luego el espacio de memoria se asigna dinámicamente de acuerdo con el valor ingresado por el usuario. Por supuesto, también puede definir directamente una matriz de un tipo de estructura conocido sin hacer esto.
El código para este ejemplo es el siguiente.

#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);
}

El código anterior accede directamente a los miembros de la matriz de estructura en la función, y el siguiente código accede a los miembros de la estructura a través de punteros.

#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);
}

Una vez que se ejecuta el programa, los resultados de entrada y salida se muestran en la siguiente figura.
Insertar descripción de la imagen aquí
Los resultados de salida anteriores se organizan de acuerdo con la puntuación total de mayor a menor, que cumple con los requisitos del tema.

Supongo que te gusta

Origin blog.csdn.net/weixin_42570192/article/details/132562436
Recomendado
Clasificación