我花了3个小时来获得解决问题和代码的逻辑。但现在我
收到此运行时错误。谁能帮助我知道我在做什么错误? 编辑:它现在正在运行,但没有打印任何东西。
#include <stdio.h>
#include<math.h>
float distance(float n1,float m1,float n2,float m2){
float d=0;float sum=0;
d =sqrt(pow(m2-m1,2)+pow(n2-n1,2));
sum+=d;
printf("%.2f",sum);
return sum;
}
int main(void) {
int t,n,i,j;float sum=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int r=0,s=0,a=0,b=0;
int x[n],y[n],p[n],q[n],min[n],max[n];
for(i=0;i<n;i++){
scanf("%d %d",&x[i],&y[i]);}
for(j=0;j<10001;j++){
for(i=0;i<n;i++){
if(j==x[i]){
p[r++]=x[i];q[s++]=y[i];
}
}}
for(i=0,j=i+1;i<n,j<n;i++,j++){
if(p[i]==p[j]){
if(q[i]>q[j]){min[a++]=p[i]; max[b++]=q[i];}
else{min[a++]=p[i]; max[b++]=q[j];}
}
else{min[a++]=p[i]; max[b++]=q[i];}
}
for(i=0;i<n;i++){
distance(min[i],max[i],min[i+1],max[i+1]);
}
}
}
答案 0 :(得分:1)
正如@YePhicK所说,我强调, 学会使用调试器 。 不要依赖猜测或只是眼球。
那就是说,我看到的东西,除非你真的知道你在做什么,否则肯定要打破。
你有一个使用j
作为索引变量的循环。
然后在其中,你有另一个循环,它也使用j
作为索引变量。
for(j=0;j<10001;j++){ // <----- j used here
for(i=0;i<n;i++){
if(j==x[i]){
p[r++]=x[i];q[s++]=y[i];
}
}
for(i=0,j=i+1;i<n,j<n;i++,j++){ // <----- j used here
if(p[i]==p[j]){
if(q[i]>q[j]){min[a++]=p[i]; max[a++]=q[i];}
else{min[a++]=p[i]; max[a++]=q[j];}
}
else{min[a++]=p[i]; max[a++]=q[i];}
}
}
此外,您使用的是名为min
和max
的数组。
有一些普遍接受的宏称为min
和max
,所以如果你重新定义那些你会冒名字冲突的风险。
此外,在像这样的代码中
{
min[a++]=p[i];
max[a++]=q[i];
}
通过两次递增min
,您似乎将空格放入数组max
和a
。
答案 1 :(得分:0)
这一行:
int x[n],y[n],p[n],q[n],min[n],max[n];
不正确。在C / C ++中,您不能声明可变大小的普通数组(不像在Basic中)。在编译时必须知道这样一个数组的大小。
可能的解决方案是:
malloc()
/ free()
)std::vector<int>
答案 2 :(得分:0)
for(i=0,j=i+1;i<n,j<n;i++,j++)
上面的for()语句包含以下(无意义的)条件表达式:
i<n,j<n
将此更改为以下之一:
i<n || j<n
或:
i<n && j<n
此外,变量'float sum = 0;'在'main()'中未使用;和main()最后应该包括'return(0);'或类似的东西。