14天阅读挑战赛
努力是为了不平庸 ~
算法题目来源
算法题目描述
题目概述:
平面上有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);
}