涉及结构体的排序问题

news/2024/7/5 3:07:46

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

小明 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);
}

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


http://lihuaxi.xjx100.cn/news/1494462.html

相关文章

C# List与HashSet的contains()方法查询速度比较

List 和HashSet同时查询40万条数据&#xff0c;谁的效率更高&#xff1f; //**1.下面是List底层源码**public boolean contains(Object o) {//如果查到我们想要查询的值则返回一个true&#xff0c;否则返回false&#xff0c;return indexOf(o) > 0;//这里是调用了indexOf方…

为何我要写Qt入门教程

C的就业市场 C的就业市场有如下的典型特征&#xff0c;尤其是一些有价值的岗位。 行业众多难以培训 C的就业市场很难通过标准化的培训来实现&#xff0c;往往隔行如隔山。 不同的行业&#xff0c;虽然都用C&#xff0c;但是他们的业务确是完全不相关。 使用的技术点&#…

JSX基础

1. JSX介绍 概念&#xff1a;JSX是 JavaScript XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在 JS 代码中书写 HTML 结构 作用&#xff1a;在React中创建HTML结构&#xff08;页面UI结构&#xff09; 优势&#xff1a; 采用类似于HTML的语法&#xff0c;降低学习成…

Ant Design组件动态嵌套表单制作

使用Ant Design组件我们需要使用Form.List对表单进行操作 1.首先将Form.List放入form组件中&#xff0c;并name命名&#xff0c; 2.设置一个命名为数组&#xff0c;添加编辑和删除事件 3.以刚刚设置的数组设置map循环&#xff0c;可以在循环的的括号可以设置对嵌套表单控制 4.…

PCIE WIFI与金手指转接设计

PCIE转接口设计&#xff1a; 金手指转接设计 类似的芯片的框图&#xff1a;

Python-matplotlib画图时标题中的指数表示

1.示例 2.核心代码 # 修改横轴的刻度 # 生成刻度的位置和标签 total_steps 1000000 # 总共100万步 num_segments 10 # 分成10段 segment_length total_steps // num_segments # 每段的步数# 生成刻度的位置 custom_ticks np.arange(0, total_steps 1, segment_length…

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例&#xff0c;因为它具有以下优点&#xff1a; 1. 数据量小&#xff0c;计算速度快。MNIST数据集包含60000个训练样本和1000…

项目进度与实施计划汇报实践样例模板

一、IT项目实施步骤 项目启动 项目启动 项目启动 项 项目启动 | 需求调研 | 解决方案设计与系统实现 | UAT测试与培训 | 上线与运维支持