【14天阅读挑战赛】打卡day3——平面点排序

14天阅读挑战赛
努力是为了不平庸 ~


算法题目来源

PDSUACM算法公关部


算法题目描述

题目概述:
       平面上有n个点,坐标均为整数。请按与坐标原点(0,0)距离的远近将所有点排序输出。可以自己写排序函数,也可以用qsort库函数排序。

输入

输入有两行,第一行是整数n(1<=n<=10),接下来有n行,每行一对整数(每对整数对应一个点)。

输出

输出排序后的所有点,格式为(u,v),每个点后有一个空格。测试数据保证每个点到原点的距离都不同。

样例输入

4
1 3 
2 5 
1 4 
4 2

样例输出

(1,3) (1,4) (4,2) (2,5) 

提示

要求:定义点结构体 struct point


问题分析

1.问题中的数据有:点的个数n;点的坐标x,y;点到原点的距离d;定义一个中间变量k;
2.问题中的功能及数据处理流程(用户角度的操作过程)的分析:
平面点排序具体操作流程为:
(1)定义一个结构体。
(2)输入n,运用循环控制平面点的个数,同时计算每个点到原点的距离。
(3)进行排序操作,和数组的冒泡排序一样。
(4)运用循环将排序好的坐标输出。


解题思路

描述该题目的解题思路和步骤(文字+流程图)。
平面点排序的设计思路和实现步骤如下:
(1)首先引用相关文件头名(#include<stdio.h>、#include<math.h>),变量(n,i,j,k,x,y,d);
(2)定义一个结构体;
(3)运用for循环,输入n个点的坐标并计算出每个点到原点的距离d;
(4)运用两个for循环,实现讲点到原点的距离从小到大排序(冒泡排序);
(5)再次运用for循环输出已经从小到大排序好的点的坐标;
(6)注意x,y,d应用double,且输出应为printf(“(%.0lf,%.0lf)”,a[i].x,a[i].y);


流程图

在这里插入图片描述


编程解决

#include<stdio.h>
#include<math.h>
struct point  //这是定义一个结构体
{
    double x,y,d;
};
int main()
{
    int i,j,n;
    struct point a[11],t;  //这里的t也是个结构体,到时候交换俩坐标时你就会发现特方便
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%lf%lf",&a[i].x,&a[i].y);
        a[i].d=sqrt(a[i].x*a[i].x+a[i].y*a[i].y);  //这是计算每个点到原点的距离
    }
    for(i=1;i<n;i++)  //这是进行排序的操作,和数组排序一样一样的
    {
        for(j=0;j<n-i;j++)
        {
            if(a[j].d>a[j+1].d)  //比较每个点到原点的距离来判断是否交换坐标
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for(i=0;i<n;i++)
        printf("(%.0lf,%.0lf) ",a[i].x,a[i].y);  //输出排序后的坐标,注意每个坐标后都有空格
    return 0;
}


编程过程中遇到的问题以及解决办法

问题一:怎样求点到原点距离

解决方法:
(1)在代码中加上头文件#include <math.h>
(2)引用sqrt函数
a[i].d=sqrt(a[i].xa[i].x+a[i].ya[i].y)


总结

1.结构体
资料内容:结构体
获取途径:CSDN
资料来源:https://marketing.csdn.net/p/bb9f9e25975dba9f9b87f5272afded16
学习和应用过程(
(1)学习语法和使用实例
       在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。
       结构声明(也见有称做定义一个结构体)是描述结构如何组合的主要方法。
一般形式是:

struct 结构名{
			成员列表
		};
关键词:struct

实例:声明一个学生的信息结构体

struct Student{ //声明结构体 
char name[20]; //姓名
 int num; //学号
 float score; //成绩
 };

(2)通过实例总结使用方法和步骤
注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的。

struct Student stu1;
 stu1[3]={ {"zhaozixuan",'M',12345}, 
{"houxiaohong",'M',12306}, 
{"qxiaoxin",'W',12546}
 };

这是错误的

struct Student
{ 
	char name[20];
	char sex;
	int number;
}stu1[5]={
	 {"zhaozixuan",'M',12345},
	 {"houxiaohong",'M',12306},
	 {"qxiaoxin",'W',12546},
	 {"wangwei",'M',14679},
	 {"yulongjiao",'W',17857}
};
stu1[3].name[3]

这才是正确步骤
(3)将使用方法和步骤用于计算题目的生成
举例 (输出个人的基本信息)

#include<stdio.h>
struct student
{
	char name[20];
	char sex[10];
	int old;
	float weigh;
} ;
int main()
{
	struct student a;
    scanf("%s%s%d%f",&a.name,&a.sex,&a.old,&a.weigh);
	printf("%s %s %d %.1f\n",a.name,a.sex,a.old,a.weigh);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢热型网友.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值