小明学C++第二篇:数据类型、数据结构、算法

语言跟文字是人类文明的象征。而数字的发明则意味着人类逻辑与理性思维的一面。从文艺复兴到电气时代,艺术和科学似乎交替地发展。在上世纪,人类发明出了计算机,从此加快了科学的发展,改变了我们的世界。计算机的核心是以数学的基础的计算科学,计算科学着眼于什么问题是可以计算的,什么是不可计算的,可以计算的问题又如何更加高效地进行计算。经过了几十年的发展,计算机领域已经积累了其特有的技术,有些算法也让人深感思想的力量之大。计算就是对数据进行处理。数据类型是针对一个数据而言的,而数据结构则探讨数据与数据之间的关系,算法则是解决问题的步骤,它着重于如何用简洁正确的方法对数据进行处理,来得到我们想要的结果。那么,这篇博客我们就从一个实际问题出发,讲讲计算科学是如何解决问题的。

背景

小明学习非常勤奋,通过自学就搞定了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++实现了这个算法。我想,通过这篇博客,大家对算法、数据类型、数据结构应该会有一个初步的了解吧。
怎么样,你喜欢算法吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值