注册 登录
编程论坛 C语言论坛

oj平台显示运行错误,但我用Dev却没问题,求求大神帮我看看,C语言初学者

Tingsu 发布于 2020-10-24 09:13, 2849 次点击
#include<stdio.h>
#define PI 3.14159
int main(){
    float r;
    scanf("%f",&r);
    float c=2*PI*r,s=PI*r*r;
    printf("%.2f %.2f",c,s);
    return 0;
}
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
12 回复
#2
Tingsu2020-10-24 09:16
嗷,题目
输入圆的半径,求圆的周长和面积。
要求定义圆周率为如下宏常量
#define PI 3.14159
输入
输入半径r的值,为一实数。
输出
输出一行,包括周长和面积。数据之间用一个空格隔开,数据保留小数后面两位。
#3
风过无痕19892020-10-24 09:32
回复 2楼 Tingsu
两个语句用逗号隔开写在同一行,是C99允许的,DEV部份支持C99,而你的OJ以及VC++6.0或其他的编译器却不一定能支持C99,所以,不能在这些平台上编译运行

程序代码:

#include<stdio.h>
#define PI 3.14159
int main(){
    float r,c,s;              // c,s 没有定义
    scanf("%f",&r);
    c = 2 * PI * r;           // 两个语句不能用逗号隔开写在同一行,可以用分号隔开写在同一行
    s = PI * r * r;
    printf("%.2f %.2f",c,s);
    return 0;
}


[此贴子已经被作者于2020-10-24 09:48编辑过]

#4
Tingsu2020-10-24 09:52
回复 3楼 风过无痕1989
好的,我再试一次
#5
Tingsu2020-10-24 09:58
回复 3楼 风过无痕1989
还是错的呜呜
只有本站会员才能查看附件,请 登录

#6
Tingsu2020-10-24 10:27
回复 4楼 Tingsu
大佬,我同学用的double,然后把float换成double这个程序就过了
#7
rjsp2020-10-24 11:17
以下是引用Tingsu在2020-10-24 10:27:22的发言:

大佬,我同学用的double,然后把float换成double这个程序就过了

很显然呀,你贴的那个图片上不是写了嘛!(因为你贴的是图片,我没法选择文字,你自己找吧)
此外,为什么要用 float,目的何在?
#8
风过无痕19892020-10-24 13:03
回复 7楼 rjsp
息工程院OJ平台
====[test3.out]=========
Expected                                                                Yours
46847.39 174647070.22                                                   46847.39 174647872.00
======================
time_space_table:
/1010/test1. in :  AC mem-1152k time=4ms
/1010/sample . in : AC mem=1152k time=3ms
/1010/testo . in : AC mem=1152k time=5ms
/1010/test3 . in : WA mem-1152k time=5ms
/1010/test2 . in : AC mem-1152k time=5ms
/1010/test4 . in : AC mem=1152k time=5ms
#9
风过无痕19892020-10-24 13:14
回复 7楼 rjsp
我试过:PI 只要是带小数,比如 3.1,它就是 double 型,所以用 double 型肯定没有问题。然而,用 float 型也只是出现两条警告而不是语法错误呀:conversion from 'double ' to 'float ', possible loss of data (从 double 型转换为 float 型,可能造成数据丢失)。我用 DEV_C++5.11 与 VC++6.0 都运行了,程序却是可以正常运行的,没有任何的问题(在这里,我不懂怎么贴图出来)

我刚看到,本论坛的顶上有一个在线编程,我将我3楼的程序复制去那里,运行也是正常的

[此贴子已经被作者于2020-10-24 13:20编辑过]

#10
rjsp2020-10-24 20:33
程序却是可以正常运行的,没有任何的问题

那你输入 46847.39 后输出是正确的 174647070.22   还是错误的 174647872.00 ?
上面这组数据是oj平台告诉你通不过的数据。

关于double/float的选择,
你就一个数据,根本节约不了内存,为什么选用float?
选之前你测算过float的精度足够了吗?
啥都没考虑,就给自己一个陷进。
#11
风过无痕19892020-10-24 23:23
回复 10楼 rjsp
我用电脑系统配置的计算器算:3.14159 * 46847.39 * 46847.39 = 6894778300.350195239
                            2 * 3.14159 * 46847.39 = 294350。5839002

用 float 型计算             3.14159 * 46847.39 * 46847.39 = 6894778368.00
                            2 * 3.14159 * 46847.39 = 294350.59

用 double 型计算            3.14159 * 46847.39 * 46847.39 = 6894778300.35
                            2 * 3.14159 * 46847.39 = 294350.58

改为 int 型计算             3 * 46847 * 46847 = -2006010365 (显然是溢出了)
                            2 * 3 * 46847 = 281082

[此贴子已经被作者于2020-10-25 00:18编辑过]

#12
rjsp2020-10-24 23:30
回复 11楼 风过无痕1989
我看错了,你输入 7456 试试
7456*7456*3.14159=174647070.21824
#13
风过无痕19892020-10-25 00:40
回复 10楼 rjsp
用 double 型 输入 7456 就能对上他的答案了

另,不是我要用 float 型的,是他给出的程序用的就是就用 float 型

我刚才又反复看了他的题目,也没说过输入多少,然后要对答案。而程序本身也确实是没有问题,只是精度差些。好了,现在明朗了,他的程序就应该是如下的了:

程序代码:

#include<stdio.h>
#define PI 3.14159
int main(){
    double r,c,s;              // c,s 没有定义
    scanf("%lf",&r);
    c = 2 * PI * r;           // 两个语句不能用逗号隔开写在同一行,可以用分号隔开写在同一行
    s = PI * r * r;
    printf("%.2lf %.2lf",c,s);
    return 0;
}
1