12

我想使用以下代码计算矩形的面积和周长:

    rect a;
    a = ( -----
          !   !
          -----a );
std::cout << a.area() << std::endl;
std::cout << a.perimeter() << std::endl;

为此,我制作了以下课程:

class rect
{
public:
    rect():w(0), h(2) {}
    rect& operator - () { w += 0.5f; return *this; }
    rect& operator - (rect&) { w += 0.5f; return *this; }
    rect& operator -- (int a) { w += a; return *this; }
    rect& operator -- () { w += 1; return *this; }
    rect& operator ! () { h += 0.5f; return *this; }
    void clear() { w = 0; h = 2; }
    int area() { return w * h; }
    int perimeter() { return 2 * w + 2 * h; }
    int width() { return w; }
    int height() { return h; }
private:
    float w;
    float h;
};

以下是一些使用示例:

#include <iostream>

int main()
{
    rect a;

    a = ( -----
          !   !
          -----a );

    std::cout << a.area() << std::endl;
    std::cout << a.perimeter() << std::endl;
    std::cout << a.width()  << std::endl;
    std::cout << a.height() << std::endl;

    std::cout << std::endl;

    a.clear();

    a = ( ----------
          !        !
          !        !
          !        !
          !        !
          ---------a );

    std::cout << a.area() << std::endl;
    std::cout << a.perimeter() << std::endl;
    std::cout << a.width()  << std::endl;
    std::cout << a.height() << std::endl;

    return 0;
}

以下是我的问题:

  1. 可以在不涉及任何浮点运算的情况下完成吗? (确实是整数网格)
  2. 可以在 3D 案例上推广吗?IE:

    cuboid b;
    b = (  ---------
          /        /!
         ! -------! !
         !        ! !
         !        ! !
         !        !/
         ---------b );
    
    std::cout << b.volume() << std::endl;
    
4

2 回答 2

8

我不得不将“/”运算符更改为“+”,因为没有前缀“/”运算符。+ 虽然效果很好。哦,它使用整数。我只用您提供的案例对其进行了一次测试,但据我所知它应该可以工作。

class cuboid
{
        int w,h,l;
public:
        cuboid () : w(2), h(3), l(6) {}
        cuboid& operator - () { w += 1; return *this; }
        cuboid& operator - (cuboid&) { w += 1; return *this; }
        cuboid& operator -- (int) { w += 2; return *this; }
        cuboid& operator -- () { w += 2; return *this; }
        cuboid& operator ! () { h += 1; return *this; }
        cuboid& operator + () { l += 1; return *this; }
        cuboid& operator + (cuboid&) { l += 1; return *this; }
        cuboid& operator ++ () { l += 2; return *this; }
        cuboid& operator ++ (int) { l += 2; return *this; }

        void clear () { w = 2; h = 3; l = 6; }
        int width () const { return w / 3; }
        int height () const { return h / 3; }
        int length () const { return l / 3; }
        int volume () const { return width() * height () * length (); }
        int surface_area() const { return width() * height () * 2 +
                                          width() * length () * 2 +
                                          length() * height () * 2; }
};

在行动中看到它。 http://ideone.com/vDqEm

编辑:您不需要 ++ 运算符,因为不应该有两个 + 彼此相邻。哎呀。

于 2012-07-27T15:30:32.857 回答
2

有点。只要您假设任何字符集具有相等的高度和宽度,或者您的单位只是字符而不是像素,就可以轻松地将数组验证为矩形并在没有浮点数学的情况下计算有关它的内容。所以矩形的实际形状会根据字符集而改变,但逻辑上它仍然是 3 个字符乘 2 个字符。

但是,您遇到了 3D 案例的一些问题。首先,您实际上不能使用基于网格的布局使用数组来表示它。再看看你的ASCII艺术。正面的角度是多少?它不为零,因为您可以观察到侧边。如果那是 90 度角,如果你能看到侧面,那么正面也需要倾斜。因此,您的表示方法根本无法胜任表示 3d 长方体的任务。

不过还有一个选择。3D ascii 艺术可以是您正在谈论的 3D 目标的抽象。斜杠/反斜杠字符现在正好是一个单位,与字符“-”和“!”相同 人物。有了这个假设,3D 版本也很简单,尽管当你显示它时它看起来很奇怪。

我的意思是,来吧,看看这些立方体,它们不是欧几里得友好的:

  ---
 / /!
--- !
! !/
---

   ----
  /  /|
 /  / |
----  |
|  | /
|  |/
----

所以无论如何,假设这些东西是代表 2D 或 3D 形状的 ascii-art 字符串,你可以这样:

//Skipping the validation step, assuming well formed ascii rectangles.
int height2D(char* rect, int size)
{
    int ret=0;
    int i=0;
    while(i++ < size) 
        if(rect[i] == '\n')
            ret++;
    return ret;
}

int width2D(char* rect, int size)
{
    int ret=0;
    while(rect[ret] == '-' && ret < size)
        ret++;
    return ret;
}

int area2D(char* rect, int size)
{
    //return height2D(rect, size) * width2D(rect, size);
    //ppfffft!
    return size;
}

int perimiter2D(char* rect, int size)
{
    return 2 * height2D(rect, size) + 2 * width2D(rect, size);
}



//Skipping the validation step, assuming well formed ascii cuboids
int height3D(char* rect, int size)
{
    int ret=0;
    int i=0;
    int depth;

    while(i++ < size) 
        if(rect[i] == '\n')
            ret++;
    depth = depth3D(rect, size);
    return ret - depth + 2;
}

int width3D(char* rect, int size)
{
    int ret=0;
    int i=0;
    while(rect[i] != '-' && ret < size)
        i++;
    while(rect[i++] == '-' && ret < size)
        ret++;

    return ret;
}

int depth3D(char* rect, int size)
{
    int ret=0;
    while(rect[ret] == ' ' && ret < size)
        ret++;
    return ret+1;
}

int volume3D(char* rect, int size)
{
    return height3D(rect, size) * width3D(rect, size) * depth3D(rect, size);
}

int area3D(char* rect, int size)
{
    return 2 * heigh3D(rect, size) * width3D(rect, size) + 
           2 * heigh3D(rect, sise) * depth3D(rect, size) + 
           2 * width3D(rect, size) * depth3D(rect, size);
}

未经测试,未经验证,我什至没有编译这个。地狱,让我们称之为伪代码。

于 2012-07-23T16:00:42.357 回答