我想使用以下代码计算rects的面积和周长:
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;
}
以下是我的问题:
可以在3D案例中推广吗? I.e:
cuboid b;
b = ( ---------
/ /!
! -------! !
! ! !
! ! !
! !/
---------b );
std::cout << b.volume() << std::endl;
答案 0 :(得分: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
编辑:你不需要++运算符,因为彼此不应该有两个+。 Woops。
答案 1 :(得分: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);
}
未经测试,未经验证,我甚至没有编译它。天哪,我们称之为伪代码。