C/C++:矩形的周长和面积。长方体的体积
Posted
技术标签:
【中文标题】C/C++:矩形的周长和面积。长方体的体积【英文标题】:C/C++: Perimeter and area of rects. Volume of cuboids 【发布时间】:2012-07-21 20:53:18 【问题描述】:我想使用以下代码计算矩形的面积和周长:
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 案例上进行概括?即:
cuboid b;
b = ( ---------
/ /!
! -------! !
! ! !
! ! !
! !/
---------b );
std::cout << b.volume() << std::endl;
【问题讨论】:
它是 3D 制作的,但是当我寻找它时,主网站已经不存在了。 gist.github.com/297819 看看这个。 顺便说一句,***.com/questions/885819/… @ForEveR:很多代码,没有示例。但能给出好主意... 你可能想从事绘画事业... 【参考方案1】:有点。只要您假设任何字符集具有相等的高度和宽度,或者您的单位只是字符而不是像素,就可以轻松地将数组验证为矩形并计算有关它的内容而无需浮点数学。所以矩形的实际形状会根据字符集而改变,但逻辑上它仍然是 3 个字符 x 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);
未经测试,未经验证,我什至没有编译这个。见鬼,我们就叫它伪代码吧。
【讨论】:
哦,你会看那个。这些不是字符串,它们是重载的 C++ 恶作剧。嗯。 >:( 看看“假设一个格式良好的____”的力量【参考方案2】:我不得不将“/”运算符更改为“+”,因为没有前缀“/”运算符。 + 虽然效果很好。哦,它使用整数。我只用您提供的案例对其进行了一次测试,但据我所知它应该可以工作。
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
编辑:您不需要 ++ 运算符,因为不应该有两个 + 彼此相邻。哎呀。
【讨论】:
以上是关于C/C++:矩形的周长和面积。长方体的体积的主要内容,如果未能解决你的问题,请参考以下文章
按要求编写一个Java应用程序: 定义一个类,描述一个矩形,包含有长宽两种属性,和计算面积方法。 编写一个类,继承自矩形类,同时该类描述长方体,具有长宽高属性, 和计算体积的方法。