三维点通用排序
前言
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 一、题目描述 题目描述 在三维笛卡尔坐标系中,可以用X,Y,Z三个坐标分量表示三维空间中的一个点。现有一系列用X,Y,Z表示的三维点,需要对其按指定的X、Y或Z分量进行升序或降序排序。请用C语言实现这一排序过程,程序…...
[架构之路-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框架中的应用游戏设计示例代码地址 引言 设想你正在准备一顿晚餐,无论你想做意大利面、披萨还是沙拉,制作过程中都有一些共同的步骤:准备原料、加工食物、摆盘。…...
篇章二 | Python 入门指南:深入理解基础数据类型
Python 是一门强大而易学的编程语言,而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型,包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等,同时提供注意事项和与 C 语言的区…...
循环冗余效验码的计算方法
循环冗余效验码的计算方法 G(x): 在了解计算方法之前我们首先要明白G(x)表明的意思,这一步非常重要! 例如,G(x) x^3 x^2 1 ,该式子表明的编…...
第P8周:YOLOv5-C3模块实现
>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、 前期准备 1. 设…...
Java中常见的日志包分析(Log4j、Logback、SLF4J等)
Java中常见的日志jar包包括Log4j、Logback、SLF4J、java.util.logging等。它们各自的作用和应用场景如下: 1. Log4j 作用:Log4j是Apache的一个开源项目,提供日志记录的功能,支持多种输出目的地,如控制台、文件、GUI组…...
C++系列-第1章顺序结构-3-输出类cout
C系列-第1章顺序结构-3-输出类cout 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客,主要讲述输出类cout的用法 cout介绍与基本用法 在C中,cout 是用于输出(打印)数据的工具&…...
对于智能设备的一些设想1
最近发现脑子里经常会出现一些能够偷懒的想法,希望这些点子能一点点保存下来,希望有需要的人拿走点子,不用谢 1.泡脚桶 2023年12月28日 近两年泡脚桶的风着实很大,我差点也就入坑了,于是有了一种设想,为什么…...
Large-Precision Sign using PBS
参考文献: [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自定义注解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《电商项目实战》。🎯🎯 &am…...
2014,TEVC,A competitive swarm optimizer for large scale optimization(CSO)
PSO 分析(从而引入 CSO) CSO (competitive swarm optimizer) 算法是在PSO (particle swarm optimization) 算法的基础上改进而来的。PSO算法是一种功能强大、应用广泛的群体智能算法,主要用来解决优化问题。PSO算法包含一个粒子群࿰…...
【机器学习】【线性回归】梯度下降
文章目录 [toc]数据集实际值估计值估计误差代价函数学习率参数更新Python实现导包数据预处理迭代过程数据可视化完整代码 线性拟合结果代价结果 个人主页:丷从心 系列专栏:机器学习 数据集 ( 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. 背景 存在一些使用场景,比如:某个请求必须等待上一个请求正确响应后才能开始执行。或者&…...
记录 Docker 外部访问的基本操作
目录 1. 启动 docker 时挂载本地目录2. 外部访问 docker 容器 (-p/-P)3. 无法连接 docker 内 SSH 解决方案 1. 启动 docker 时挂载本地目录 # 将本地 D:/SDK 目录 挂载到 容器里的 /mnt/host 目录中 # 注意:-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、用你也可以左键选中我们需要注释的代码,松开,按:Ctrl/,就完成相同效果注释 2、把要注释的内容放到三个引号对里面 …...
ComfyUI如何中文汉化
comfyui中文地址如下: https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translationhttps://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation如何安装? 1. git安装 进入项目目录下的custom_nodes目录下,然后进入控制台,运…...
Glary Utilities Pro - 电脑系统优化全面指南:详尽使用教程
软件简介: Glary Utilities Pro 是一款全面的电脑优化工具,它旨在帮助用户提升计算机的性能和稳定性。这款软件提供了多种功能,包括系统清理、优化、修复以及保护。通过一键扫描,它可以识别并清除无用文件、临时数据、注册表错误等…...
1.4分页和排序
排序: -- 分页(limit)和排序(order by) -- 排序:升序ASC,降序DESC -- ORDER BY 通过字段排序,怎么排 -- 查询的结果根据成绩降序,升序 SELECT s.studentno,studentname,sub.subjectname,studentresult FROM student s RIGHT JO…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
