注册 登录
编程论坛 C++教室

计算圆周长,面积的程序,我的结果是错的 请各位亲们帮我看下可好?

晓小晓小 发布于 2014-06-04 13:00, 1077 次点击
#include <iostream.h>
class Box
{public:
double girth();  
double area();
private:
    int r;
};
double Box::girth()
{double girth=0;
girth=2*3.14*r;
return girth;
}
double Box::area()
{double area=0;
    area=3.14*r*r;
return area;

}
int main()
{int r;
double girth,area;
Box box1;
cin>>r;
cout<<"girth="<<box1.girth()<<endl;
cout<<"area="<<box1.area()<<endl;
return 0;
}    为什么结果不对啊   亲们帮我看下,顺便解释下为什么 好么?
15 回复
#2
Susake2014-06-04 13:18
....

[ 本帖最后由 Susake 于 2014-6-4 15:38 编辑 ]
#3
gobraves2014-06-04 14:40
1.应该是#include<iostream>,并且加上using namespace std
2.一个类的私有变量r,你赋值了吗,你main函数中的r和box类中的r完全不是同一个量,所以你运行时半径r实际上是一个随机值
#4
靠谱的白蓝2014-06-04 20:38
回复 3 楼 gobraves
在类里面是不能赋初值的!
#5
TonyDeng2014-06-04 20:42
結果不對是肯定的。你爲什麽不嘗試在類的girth()方法中測試一下對象的半徑是不是cin輸入的那個?查到後告訴我你的思考結論是什麽。
#6
TonyDeng2014-06-04 20:55
仔細翻翻書,看類的私有變量聲明起什麽作用、在外部如何讀寫私有變量。看文字,不要總看代碼,不管是書上的還是什麽高手的!
#7
靠谱的白蓝2014-06-04 22:34
添加一个输入函数,cin>>r,box1.r=r;将主函数和类中r赋值。
#include <iostream.h>
class Box
{
public:
    double girth();
    double area();
    int r;
};
double Box::girth()
{
    double girth=0;
    girth=2*3.14*r;
    return girth;
}
double Box::area()
{
    double area=0;
    area=3.14*r*r;
    return area;
}
int main()
{
    int r;
    Box box1;
    cout<<"请输入半径:"<<endl;
    cin>>r;
    box1.r=r;
    cout<<"girth="<<box1.girth()<<endl;
    cout<<"area="<<box1.area()<<endl;
    return 0;
}
#8
TonyDeng2014-06-04 22:38
回复 7 楼 靠谱的白蓝
你編譯過了嗎?
#9
TonyDeng2014-06-04 23:18
程序代码:
#include <iostream>
#include <cstdlib>
#include <conio.h>

class Circle
{
public:

    Circle() : radius(0.0) {}    // 默认构造函数,圆的半径为零
    Circle(double r);            // 带参构造函数

   
// 周长
    double girth(void);

    // 面积
    double area(void);

private:

    static const double pi;        // 专属于类的静态常量

    double radius;                // 半径字段
};

// 静态常量的初始化
const double Circle::pi = 3.14;

Circle::Circle(double radius)
{
    // 把参数传递给对象内私有字段
    this->radius = radius;
}

double Circle::girth(void)
{
    return 2 * pi * radius;
}

double Circle::area(void)
{
    return pi * radius * radius;

}

int main(void)
{
    int r;
    std::cout << "Please input the radius: ";
    std::cin >> r;

    Circle Circle1(r);            // 用输入的半径值创建一个圆对象实例
    std::cout << "Circle1" << std::endl;
    std::cout << "girth = " << Circle1.girth() << std::endl;
    std::cout << "area = " << Circle1.area() << std::endl << std::endl;

    Circle Circle2(10.0);        // 用直接指定半径值创建一个圆对象实例
    std::cout << "Circle2" << std::endl;
    std::cout << "girth = " << Circle2.girth() << std::endl;
    std::cout << "area = " << Circle2.area() << std::endl << std::endl;

    _getch();
    return EXIT_SUCCESS;
}


[ 本帖最后由 TonyDeng 于 2014-6-4 23:34 编辑 ]
#10
靠谱的白蓝2014-06-04 23:42
回复 8 楼 TonyDeng
嗯,编译通过的。
#11
TonyDeng2014-06-04 23:46
以下是引用靠谱的白蓝在2014-6-4 23:42:10的发言:

嗯,编译通过的。

你把半径字段提到public区中,当然通过了,但这合适吗?如果公开了r字段,那么实际上你在main()中不需要借用外部变量r,直接cin >> box1.r就可以了。再翻翻书,看书上是否鼓励公开类的字段。

[ 本帖最后由 TonyDeng 于 2014-6-4 23:49 编辑 ]
#12
TonyDeng2014-06-04 23:57
另外,要注意3.14的魔数,它在代码中出现了两次,这应该引起警惕了,当你要提升圆周率的精度时,要作多处修改,而C++是不推荐用宏常数的。
#13
TonyDeng2014-06-05 00:20
为什么尽量不公开类字段呢?可以考虑一下,作为“圆”这个类,除了直接用半径定义之外,其实还可以用周长和面积来定义,反求半径,当我们写出这样两个构造函数的时候(现在不需要这样的构造函数不等于将来永远不需要),就反过来在这两个函数中设定半径,这样若你公开了半径可被外部任意读写,就可能在设定了周长的前提下把半径改了导致与原先的周长不符。无论如何,一个具体的圆对象一旦创建,它就是稳定的,半径不需要公开(宁可写一个公开的返回半径方法获取私有变量的值也不要随意公开类内字段),改变半径的圆就另外创建一个圆对象实例,如果真要改当前对象的参数,就用公开的设置半径方法,而把是在外部直接读写对象字段——这是为了保持类行为和对外接口不变而应该遵守的原则,在内部怎么修改代码都不至于影响使用类的程序员的感觉。

举个例子,我上面的代码,带参构造函数就是需要修改的,因为它没有判断非法的半径值(比如负数),而要追加这个需求,不需要在min()函数作判断,交给构造函数就可以了,否则要在外部调用处增加大量的判断代码,那是重复且无趣的劳动,可维护性也差,逻辑不清晰。
#14
yangfrancis2014-06-05 10:49
girth(), area()两个运行时未载入参数r
试增加一下:
class Box
{
public:
  SetRadius(radius){r=radius;}
}
...
void main(){
cin>>r;
Box box1;
box1.SetRadius(r);//楼主先前的代码应该是由于缺少了这一步从而无法将半径值传递到函数里。
...
}
#15
gobraves2014-06-05 12:35
回复 4 楼 靠谱的白蓝
构造一个类的函数,对r进行赋值
#16
kindboy182014-06-05 22:23
版主说的是对的,私有成员必须本类的成员函数才可以访问,这样外部函数都是无法访问的,这样提高了安全性,楼主,你还要好好看书,多练手啊。。。这都是很基础的东西啊
1