语言跟文字是人类文明的象征。而数字的发明则意味着人类逻辑与理性思维的一面。从文艺复兴到电气时代,艺术和科学似乎交替地发展。在上世纪,人类发明出了计算机,从此加快了科学的发展,改变了我们的世界。计算机的核心是以数学的基础的计算科学,计算科学着眼于什么问题是可以计算的,什么是不可计算的,可以计算的问题又如何更加高效地进行计算。经过了几十年的发展,计算机领域已经积累了其特有的技术,有些算法也让人深感思想的力量之大。计算就是对数据进行处理。数据类型是针对一个数据而言的,而数据结构则探讨数据与数据之间的关系,算法则是解决问题的步骤,它着重于如何用简洁正确的方法对数据进行处理,来得到我们想要的结果。那么,这篇博客我们就从一个实际问题出发,讲讲计算科学是如何解决问题的。
背景
小明学习非常勤奋,通过自学就搞定了C++的语法,于是他想用C++来解决一些问题。于是她的女朋友就给了他一个问题:
在第一象限输入N个点,组成N凸多边形(任意两点的连线都在多边形里面),给定N个点的坐标,求N边形的面积。
比如下图给定5个点的坐标,求这个五边形的面积:
小明看着小丽的微笑,呆住了。
小明陷入了沉思。
C++基础
C++是一门高级语言,理由是C++语言跟我们人类的思维和语言比较相似。这种语言可以用来跟计算机下达命令,完成计算。当然了,这个过程需要一个翻译者的存在。
你也可以先学一下C++基础在往下看。
总的来说,C++包含了一定的语法、数据类型、变量、循环、函数、输入输出等。
在这里我讲讲什么是数据类型、循环、以及函数。其他自己学。
(1)数据类型:在现实生活中,有整数、小数,在C++里面,整形对应整数,浮点型对应小数,而且由于计算机包含很多逻辑,需要用到命题,命题就只有真假,于是C++有布尔型,用来表示真假。
(2)循环:循环顾名思义就是一直重复一系列的事情,但是计算机不能够一直循环下去,这样无休止的运算计算机受不了,因此循环需要跳出循环的条件。每一次循环的时候都检查是否满足这个条件,如果不满足就跳出循环不再执行了。
(3)函数:函数可以理解为具有某种特定功能的方法。它包含一系列的动作,只为完成一个功能。比如计算一个四边形的面积就是一个方法,做饭是一个方法等。
有了上述基础就可以往下看了。
多边形面积求解
对于上述的多边形到底该怎么做呢?
回忆一下我们高中所学的知识好像没有直接计算多边形的公式啊?
那有什么图形的计算公式?
有三角形、平行四边形的。
噢,可以让上述多边形转化成一个个三角形,然后加起来就可以了。
嗯这是一个方法。(其实还有其他方法)
那具体一点呢?
(1)任选多边形的一个点为中心,将多边形划分成N-2个三角形;
(2)分别计算这N-2个三角形的面积;
(3)将他们的面积加起来即为多边形的面积。
上述过程就是计算多边形的一种方法,也可以称为一种算法。
不难证明,上述算法的第一点和第三点都是正确而且是能够计算的。至于第二点,该怎么做?
知道三角形的三个点,如何求三角形的面积?
小明又回想起他高中知识。
可是他还给老师了。
于是他翻开高中的数学书。
看了一遍,他胸有成竹。
打算跟小丽长篇大论。
小明的做法是这样的:
先求三角形三条边的长度,再用余弦定理来计算三角形的面积。
讲完以后小明就等待小丽的夸奖。
没想到小丽一脸嫌弃。
难道你有更好的办法?
小丽用自信的语气说道:“我当然有啊!”
小丽说:
你计算边长需要平方和开根号,不好计算。但是我使用向量叉乘的方法计算量就咩有那么大。
我们都知道三角形是底乘高除以2.
也就是
S=1/2*|AB|*h
而h=|AC|*sin(theta),于是式子就变成:
在回顾向量叉乘的公式,
如果A点坐标为(x1,y1),B点坐标为(x2,y2),C点坐标为(x3,y3),则
S=|( (x1-x2)(y1-y3) - (y1-y2)(x1-x3) )/2|
于是多边形的面积求解思路就出来了。
小明又一次痴痴地看着小丽。
用C++实现多边形面积求解算法
小明一边佩服小丽的聪敏,一般在想象如何用C++来实现这个算法。
首先是数据类型。
变量的类型应该是浮点型,因为输入的坐标有小数。
那么保存面积的变量也应该是浮点型,因为小数四则运算的结果还是小数。
然后是数据结构。
用什么来保存用户输入的顶点坐标呢?
因为输入的顶点坐标是顺时针的,因此可以用一个数组来保存用户输入的顶点坐标。
下面就开始编程吧。
#include <iostream>
using namespace std;
///顶点类 包含横坐标和纵坐标两个变量
class point {
public:
float x,y;
};
float calculate(point A,point B,point C){
float S;
S=( (A.x-B.x)*(A.y-C.y) - (A.x-C.x)*(A.y-B.y) )/2;
return S>0?S:-S;
}
int main()
{
point *points;
float sum;
int n,i;
cout<<"请输入N(2<N)表示N边形:"<<endl;
cin>>n;
if(n<3){
cout<<"n不能小于3!"<<endl;
return 1;
}
points = new point[n];
cout<<"请顺时针输入凸多边形的N个坐标:"<<endl;
///用户输入
for(i=0;i<n;i++){
cin>>points[i].x>>points[i].y;
}
///计算面积
for(i=1,sum=0;i<n-1;++i){
///这条语句把算法的三个步骤都实现了
sum += calculate(points[0],points[i],points[i+1]);
}
///输出面积
cout<<"此多边形面积为"<<sum<<endl;
return 0;
}
经过一番鼓捣,小明写出了上述代码。
运行上述代码,很快计算结果出来了,是2.75。
于是就喊小丽过来看。
小丽欣赏小明解题的高效,觉得他是靠得住的男人。
于是他们就过上了幸福的生活。
总结
好了,现在来总结一下。
本篇博客首先提出了一个多边形面积求解的问题,然后粗略讲了一下C++,最后通过小明和小丽的讨论得出求解算法。最后用C++实现了这个算法。我想,通过这篇博客,大家对算法、数据类型、数据结构应该会有一个初步的了解吧。
怎么样,你喜欢算法吗?