-3

嘿,伙计们想知道您是否可以帮助我解决下面的代码。我的程序正在输出一些奇怪的计算。

#include <iostream>

using namespace std;

int main() 

{    

    int radius;
    const double PI = 3.14159265;
    float area;
    float circumference;


    cout << "Program to find the area and circumference of a circle\n\n\n";
    cout << "Please enter the radius: ";
    radius = cin.get();

    area = PI * (radius * radius);
    circumference = (2 * radius) * PI;

    cout << "The area of your circle is " << area << ", the circumference of your circle is "   << circumference <<"\n\n";
    system("PAUSE");

}
4

5 回答 5

5

那可能是因为您正在使用:cin.get()

cin.get()只从输入流中获取一个字符。

这在实践中意味着,如果您1在提示符下输入,该值将存储为字符而不是双精度值(这是您真正想要的)。

而且,鉴于字符的 ASCII 表示等于 1十进制表示法中的 49,这意味着您的输入将被解释49- 这在语法上是正确的,但在概念上是错误的 - 因此是您的结果。

您很可能会想要更多——您会希望正确存储所有输入。因此,在这种情况下,最好cin按如下方式使用:

cin >> radius;

另外,像这样使用的一个可能的警告cin是它会自动跳过空格——这可以说是好的,取决于它的用法。相对于您之前对cin( cin.get()) 的使用,有意或无意使用空格可能会导致比其价值更多的问题。因此,在这种情况下,可以说使用上面建议的流来解析输入会更好。

另一种选择是使用标准 C 库输入来获取输入(如果您不喜欢处理流 -并且存在关于 C++ 与 C 风格 IO 中的流使用的争论):

http://www.cplusplus.com/reference/cstdio/scanf/

于 2013-07-25T08:40:19.003 回答
0

cin.get() 返回一个字符,当它被转换为双精度时,半径将得到错误的值。您应该使用流转换,例如

cin >> radius;
于 2013-07-25T08:40:54.240 回答
0

在使用之前尝试打印您的半径值,您就会知道

cin.get(); 正如页面所说,

读取一个字符并在可用时返回它。否则,返回 Traits::eof() 并设置 failbit 和 eofbit。

您在控制台上键入的数字被视为一个字符,并使用其 ASCII 值。

您需要为此cin>>radius使用

于 2013-07-25T08:51:01.293 回答
0

istream::get函数提取字符而不是数字。对于大多数平台,这意味着如果您输入5,您将分配53radius as that is the [ASCII](http://www.asciitable.com/) value of“5”。

使用普通输入运算符>>读取数字,无论radius是整数还是浮点变量,它都会做正确的事情:

cin >> radius;
于 2013-07-25T08:41:59.920 回答
0

尝试打印每次计算后得到的结果,错误也可能是以下原因:

radius = cin.get();
//Use cin or scanf instead
cin >> radius;
scanf("%d",&radius);

或者因为 area 和circumflex 是(float)并且在行接收一个值类型(double):

area = PI * (radius * radius);
circumference = (2 * radius) * PI;

我建议要么强制转换,要么将每个变量类型设为浮动,因为 sizeof(float) = sizeof(int) = 4 字节。

于 2013-07-25T08:58:14.633 回答