当前位置: 首页 > news >正文

三维点通用排序

前言

NWAFU 2021阶段二 C


一、题目描述

题目描述

在三维笛卡尔坐标系中,可以用X,Y,Z三个坐标分量表示三维空间中的一个点。现有一系列用X,Y,Z表示的三维点,需要对其按指定的X、Y或Z分量进行升序或降序排序。请用C语言实现这一排序过程,程序主体框架已完成。
其中,排序函数selection_sort()原型规定为:
    void selection_sort(Point *a, int n, char mode, AXIS ch);
用于对长度为n的Point类型结构体数组a,按指定的模式mode(字符A或D,D表示升序,A表示降序),根据指定的坐标分量ch(枚举值0、1或2,分别表示X轴、Y轴和Z轴)实现排序。
在程序主体框架中,已给出了三维点结构体的定义、AXIS坐标分量枚举类型定义、排序方式回调函数类型CallBack定义,及所有需要的函数原型。
请用wget命令从此处下载程序主体框架后,设计selection_sort()函数的实现以完成该通用排序功能,并在本地完成测试和调试工作。
注意:不能改变代码框架中所有的函数原型,只需提交要求的selection_sort()函数及其调用的没有列出的自定义函数的实现代码,禁止提交其他代码,否则会造成编译错误。

#include <stdlib.h>
#include <stdio.h>typedef struct {int x, y, z;
} Point;typedef enum { XAXIS, YAXIS, ZAXIS } AXIS;
typedef int (*CallBack)(int, int);  /* 定义一个函数指针类型CallBack,该类型的指针对应的函数要求返回值是一个整型数据,且含有两个整型形参。 */
int compareA(int, int);
int compareD(int, int);
Point *input(int n);
void selection_sort(Point * a, int n, char mode, AXIS ch);
CallBack setmode(char mode);         /* 返回一个CallBack类型的函数指针 */int main()
{int i, ch, n;char k;scanf("%d%c%d", &n, &k, &ch);Point *pt = input(n);selection_sort(pt, n, k, ch);for (i = 0; i < n; i++)printf("%d %d %d\n", pt[i].x, pt[i].y, pt[i].z);free(pt);return 0;
}Point *input(int n)
{int i;Point *a;a = (Point *) malloc(n * sizeof(Point));for (i = 0; i < n; i++)scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);return a;
}int compareA(int x, int y)
{return x > y;
}int compareD(int x, int y)
{return x < y;
}CallBack setmode(char mode)
{if (mode == 'D')return compareD;elsereturn compareA;
}
输入 

三维点的个数n、排序方式mode、排序分量ch及n个三维点的X、Y、Z坐标,其中mode为字符D或A,分别表示升序和降序,ch为枚举值0、1、2,分别表示X轴、Y轴和Z轴坐标分量

输出

升序或降序排列的结果

样例输入
3A1
2 1 0 1 2 4 6 5 -2
样例输出
6 5 -2
1 2 4
2 1 0
提示

回调函数CallBack定义了一种函数指针类型,本题目中,要求在函数selection_sort()里调用其所定义的函数setmode()返回指向比较函数的指针,调用形式参考compareD()和compareA()。

二、设计步骤

理解题意后,这道题的重点在于理解已有的程序结构,对于不熟悉函数指针的初学者有一定难度。setmode()函数的实质是通过参数mode调用对应的compare函数,从而实现对两个数的判断功能,因此在调用时应当写为:

setmode(mode)(a,b)   //根据mode参数对a和b进行比较

同时还要注意该函数的返回值。程序的核心结构可以通过冒泡排序实现。 

代码实现:

void selection_sort(Point * a, int n, char mode, AXIS ch);
void Swap(Point *,Point *);         //Point交换函数void selection_sort(Point * a, int n, char mode, AXIS ch)
{int i,j,temp;int *p;        //定义一个长度为n的整形数组,存储用于比较的坐标值p = (int *)malloc(n * sizeof(int));if(ch == XAXIS)    //根据ch给数组p赋值(也可以用switch){for(i = 0;i < n;i++){p[i] = a[i].x;}}else if(ch == YAXIS){for(i = 0;i < n;i++){p[i] = a[i].y;}}else{for(i = 0;i < n;i++){p[i] = a[i].z;}}//冒泡排序for(i = 0;i < n - 1;i++){for(j = n - 2 - i;j >= 0;j--){if(!setmode(mode)(p[j],p[j+1])){Swap(&a[j],&a[j+1]);       //交换坐标位置temp = p[j];               //交换p位置p[j] = p[j+1];p[j+1] = temp;}}}
}void Swap(Point *x,Point *y)
{Point temp = *x;*x = *y;*y = temp;
}

三、补充

然鹅,当你经过上面的思考过程,信心满满地提交代码时,却被91%伤害得猝不及防:

Expected:
-2 0 0
0 1 2
3 2 1
1 2 3
4 6 5
------------------------------
Yours:
-2 0 0
0 1 2
1 2 3
3 2 1
4 6 5

 这个测试点为:

5D1
1 2 3
3 2 1
0 1 2
4 6 5
-2 0 0

这是此题的一个小bug,在这个样例中,它对{1,2,3}和{3,2,1}进行了交换,而在我们的程序中显然不需要这样的操作。本着顾客就是上帝的原则,我们添加一个判断条件,使得当mode判断y值相等时,按照x进行排序,即可通过。

在冒泡中添加以下代码:

if(ch == YAXIS && p[j] == p[j+1])     //补充部分
{if(!setmode('A')(a[j].x,a[j+1].x)){Swap(&a[j],&a[j+1]);temp = p[j];p[j] = p[j+1];p[j+1] = temp;}
}

总结

NWAFU 2021阶段二 C

相关文章:

三维点通用排序

前言 NWAFU 2021阶段二 C 一、题目描述 题目描述 在三维笛卡尔坐标系中&#xff0c;可以用X,Y,Z三个坐标分量表示三维空间中的一个点。现有一系列用X,Y,Z表示的三维点&#xff0c;需要对其按指定的X、Y或Z分量进行升序或降序排序。请用C语言实现这一排序过程&#xff0c;程序…...

[架构之路-265]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 如何做好详细设计

目录 一、详细设计概述 1.1 什么是详细设计 1.2 软件概要设计、软件架构、软件详细设计比较 二、软件详细设计说明书 2.1 概述 2.2 撰写步骤 2.3 主要内容 三、详细设计详解 3.1 引言 3.2 系统架构设计 3.3 模块设计 3.3.1 模块描述 3.3.2 模块间接口设计与UML图 …...

java设计模式学习之【模板方法模式】

文章目录 引言模板方法模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用游戏设计示例代码地址 引言 设想你正在准备一顿晚餐&#xff0c;无论你想做意大利面、披萨还是沙拉&#xff0c;制作过程中都有一些共同的步骤&#xff1a;准备原料、加工食物、摆盘。…...

篇章二 | Python 入门指南:深入理解基础数据类型

Python 是一门强大而易学的编程语言&#xff0c;而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型&#xff0c;包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等&#xff0c;同时提供注意事项和与 C 语言的区…...

循环冗余效验码的计算方法

循环冗余效验码的计算方法 G&#xff08;x&#xff09;&#xff1a; 在了解计算方法之前我们首先要明白G&#xff08;x&#xff09;表明的意思&#xff0c;这一步非常重要&#xff01; 例如&#xff0c;G&#xff08;x&#xff09; x^3 x^2 1 &#xff0c;该式子表明的编…...

第P8周:YOLOv5-C3模块实现

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、 前期准备 1. 设…...

Java中常见的日志包分析(Log4j、Logback、SLF4J等)

Java中常见的日志jar包包括Log4j、Logback、SLF4J、java.util.logging等。它们各自的作用和应用场景如下&#xff1a; 1. Log4j 作用&#xff1a;Log4j是Apache的一个开源项目&#xff0c;提供日志记录的功能&#xff0c;支持多种输出目的地&#xff0c;如控制台、文件、GUI组…...

C++系列-第1章顺序结构-3-输出类cout

C系列-第1章顺序结构-3-输出类cout 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客&#xff0c;主要讲述输出类cout的用法 cout介绍与基本用法 在C中&#xff0c;cout 是用于输出&#xff08;打印&#xff09;数据的工具&…...

对于智能设备的一些设想1

最近发现脑子里经常会出现一些能够偷懒的想法&#xff0c;希望这些点子能一点点保存下来&#xff0c;希望有需要的人拿走点子&#xff0c;不用谢 1.泡脚桶 2023年12月28日 近两年泡脚桶的风着实很大&#xff0c;我差点也就入坑了&#xff0c;于是有了一种设想&#xff0c;为什么…...

Large-Precision Sign using PBS

参考文献&#xff1a; [CLOT21] Chillotti I, Ligier D, Orfila J B, et al. Improved programmable bootstrapping with larger precision and efficient arithmetic circuits for TFHE[C]//Advances in Cryptology–ASIACRYPT 2021: 27th International Conference on the T…...

【电商项目实战】MD5登录加密及JSR303自定义注解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…...

2014,TEVC,A competitive swarm optimizer for large scale optimization(CSO)

PSO 分析&#xff08;从而引入 CSO&#xff09; CSO (competitive swarm optimizer) 算法是在PSO (particle swarm optimization) 算法的基础上改进而来的。PSO算法是一种功能强大、应用广泛的群体智能算法&#xff0c;主要用来解决优化问题。PSO算法包含一个粒子群&#xff0…...

【机器学习】【线性回归】梯度下降

文章目录 [toc]数据集实际值估计值估计误差代价函数学习率参数更新Python实现导包数据预处理迭代过程数据可视化完整代码 线性拟合结果代价结果 个人主页&#xff1a;丷从心 系列专栏&#xff1a;机器学习 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , …...

JMeter逻辑控制器之While控制器

JMeter逻辑控制器之While控制器 1. 背景2.目的3. 介绍4.While示例4.1 添加While控制器4.2 While控制器面板4.3 While控制器添加请求4.3 While控制器应用场景 1. 背景 存在一些使用场景&#xff0c;比如&#xff1a;某个请求必须等待上一个请求正确响应后才能开始执行。或者&…...

记录 Docker 外部访问的基本操作

目录 1. 启动 docker 时挂载本地目录2. 外部访问 docker 容器 (-p/-P)3. 无法连接 docker 内 SSH 解决方案 1. 启动 docker 时挂载本地目录 # 将本地 D:/SDK 目录 挂载到 容器里的 /mnt/host 目录中 # 注意&#xff1a;-v /d/SDK:/mnt/host/ 必须放到 IMAGE_ID 前面才行 # …...

【Android 13】使用Android Studio调试系统应用之Settings移植(六):BannerMessagePreference

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、BannerMessagePreference的移植3.1 新的问题:找不到 R.dimen.settingslib_preferred_minimum_touch_target3.2 问题分析(一)3.2.1 资源定义的位置3.2.2 检查依赖3.2…...

Python 变量

打印输出内容 print(‘rumenle’) print(‘haode’) 缩进需要tab 注释将需要注释的部分开头用# 多行注释 1、用你也可以左键选中我们需要注释的代码&#xff0c;松开&#xff0c;按&#xff1a;Ctrl/&#xff0c;就完成相同效果注释 2、把要注释的内容放到三个引号对里面 …...

ComfyUI如何中文汉化

comfyui中文地址如下&#xff1a; https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translationhttps://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation如何安装&#xff1f; 1. git安装 进入项目目录下的custom_nodes目录下&#xff0c;然后进入控制台&#xff0c;运…...

Glary Utilities Pro - 电脑系统优化全面指南:详尽使用教程

软件简介&#xff1a; Glary Utilities Pro 是一款全面的电脑优化工具&#xff0c;它旨在帮助用户提升计算机的性能和稳定性。这款软件提供了多种功能&#xff0c;包括系统清理、优化、修复以及保护。通过一键扫描&#xff0c;它可以识别并清除无用文件、临时数据、注册表错误等…...

1.4分页和排序

排序&#xff1a; -- 分页(limit)和排序(order by) -- 排序&#xff1a;升序ASC,降序DESC -- ORDER BY 通过字段排序&#xff0c;怎么排 -- 查询的结果根据成绩降序&#xff0c;升序 SELECT s.studentno,studentname,sub.subjectname,studentresult FROM student s RIGHT JO…...

AI小剧场:OpenClaw+nanobot镜像多角色对话生成

AI小剧场&#xff1a;OpenClawnanobot镜像多角色对话生成 1. 为什么需要AI辅助剧本创作 作为一个业余编剧爱好者&#xff0c;我经常遇到创作瓶颈——当需要构建多角色对话场景时&#xff0c;很难同时兼顾不同角色的立场连贯性和语言风格差异。传统写作工具只能提供单向输出&a…...

论文省心了!盘点2026年全网爆红的的降AI率平台

轻松降低论文AI率在2026年已不再是天方夜谭。2026年降AI率平台横空出世&#xff0c;实测提速效果炸裂&#xff0c;覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景&#xff0c;高效搞定毕业论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路 这类…...

别再瞎画了!用嘉立创4层板+Si9000搞定50欧阻抗匹配的保姆级教程

从零掌握50Ω阻抗匹配&#xff1a;嘉立创4层板与Si9000实战指南 在2.4GHz无线通信项目中&#xff0c;许多工程师常陷入一个典型误区——试图用双层板实现精确的50Ω阻抗匹配。这种尝试往往事倍功半&#xff0c;就像用普通螺丝刀拆卸精密手表零件。本文将带您穿透表象&#xff…...

如何用Binance Trade Bot实现加密货币交易自动化?从配置到运行的完整路径

如何用Binance Trade Bot实现加密货币交易自动化&#xff1f;从配置到运行的完整路径 【免费下载链接】binance-trade-bot Automated cryptocurrency trading bot 项目地址: https://gitcode.com/gh_mirrors/bi/binance-trade-bot 在加密货币交易领域&#xff0c;手动操…...

别只背概念了!用这5个真实安全场景,带你重新理解CISSP核心模型(附实战案例)

别只背概念了&#xff01;用这5个真实安全场景&#xff0c;带你重新理解CISSP核心模型&#xff08;附实战案例&#xff09; 当安全团队复盘某跨国电商的数据泄露事件时&#xff0c;发现攻击者竟是通过供应链系统中的第三方插件漏洞&#xff0c;绕过了价值千万的防火墙体系。这个…...

告别样本不平衡噩梦:Focal Loss 让你的模型学会“划重点”

我说的不是 Python 那个 HTTPX 客户端&#xff0c;而是 ProjectDiscovery 出的 httpx。官方对它的定义很直接&#xff1a; 一个高性能、面向多探针的 HTTP 工具包支持高并发下对 URL、主机、CIDR 等 目标做 HTTP 层探测&#xff0c;并尽量保证结果稳定性。 它本质上不是漏洞扫描…...

OpCore-Simplify:如何用零代码工具在15分钟内完成黑苹果配置

OpCore-Simplify&#xff1a;如何用零代码工具在15分钟内完成黑苹果配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于想要在PC上安装macOS的用…...

解锁3大技术场景:PptxGenJS自动化演示文稿实战指南

解锁3大技术场景&#xff1a;PptxGenJS自动化演示文稿实战指南 【免费下载链接】PptxGenJS Create PowerPoint presentations with a powerful, concise JavaScript API. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS 在数字化办公与开发领域&#xff0c;演示…...

3分钟搞定Windows启动盘制作:WinDiskWriter让macOS用户告别复杂命令行

3分钟搞定Windows启动盘制作&#xff1a;WinDiskWriter让macOS用户告别复杂命令行 【免费下载链接】windiskwriter &#x1f5a5; A macOS app that creates bootable USB drives for Windows. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. …...

量化交易框架VectorBT:重新定义金融策略开发的高性能方法论

量化交易框架VectorBT&#xff1a;重新定义金融策略开发的高性能方法论 【免费下载链接】vectorbt Find your trading edge, using the fastest engine for backtesting, algorithmic trading, and research. 项目地址: https://gitcode.com/gh_mirrors/ve/vectorbt Ve…...