首页 新闻 会员 周边

for循环输入,中间如果不加输出(什么输出都行),程序错误

-2
悬赏园豆:50 [已解决问题] 解决于 2020-03-01 09:59
# include<stdio.h>
# include<math.h>
# include<stdlib.h>
# include<stdbool.h>           
#define SAFE 50
struct
{
    int N;              //鳄鱼数量
    float D;            //能跳的最远距离
    struct crocodile *C;
}Lake;      //因为只用到一个此结构体,所以直接声明并定义
struct crocodile
{
    float x, y;         //横纵坐标
    int v;          //是否遍历过(鳄鱼是否被踩过), 0代表否,1代表是
};
float land = 15.0/2;

void CreateLake();
bool DFS(struct crocodile *S);
bool IsSafe(struct crocodile S);
float Distance (struct crocodile a1, struct crocodile a2);

int main()
{
    int i;
    scanf("%d %f", &Lake.N, &Lake.D);
    CreateLake();               //建图
    //for(i=0; i<=Lake.N; ++i)       //检查图创建是否正确
       // printf("%f, %f, %d\n", Lake.C[i].x, Lake.C[i].y, Lake.C[i].v);
    if(DFS(&(Lake.C[0])))  printf("Yes\n");
    else  printf("No\n");
    free(Lake.C);               //一定要释放
    return 0;
}

void CreateLake()
{
    int i;
    Lake.C = malloc(Lake.N +1 * sizeof(struct crocodile));        //N+1方便运算
    Lake.C[0].x = Lake.C[0].y = Lake.C[0].v = 0;            //C[0]当做小岛的中心
    for(i=1; i<=Lake.N; ++i){
        //printf("a\n");                    //这出的问题---------------------------------------------
        Lake.C[i].v = 0;
        scanf("%f %f", &(Lake.C[i].x), &(Lake.C[i].y));
    }
}
bool DFS(struct crocodile *S)
{
    int i;
    if(0==S->x && 0==S->y)          //因为小岛有直径,所以第一次跳,要加上半径,不能和其他一块进行
        for(i=1; i<=Lake.N; ++i){
            if(Lake.D >= (Distance(*S, Lake.C[i]) - land))
                DFS(&(Lake.C[i]));            
        }
    else{
        S->v = 1;                   //遍历(跳)即标记
        if(IsSafe(*S))  return true;        
        else{
            for(i=1; i<=Lake.N; ++i){
                if(!(Lake.C[i].v) && Lake.D >= Distance(*S, Lake.C[i]))
                     DFS(&(Lake.C[i]));        
            }
            return false;
        }

    }
}
bool IsSafe(struct crocodile S)         
{
    if(SAFE <= fabs(S.x)+Lake.D || SAFE <= fabs(S.y)+Lake.D)
        return true;
    else  return false;
}
float Distance (struct crocodile a1, struct crocodile a2)       
{
    return sqrt(pow((a1.x-a2.x), 2) + pow((a1.y-a2.y), 2));
}

在函数CreateLake里的for循环里,如果不加上printf程序运行不正确,这是为什么?求大佬解答

这是MOOC浙江大学数据结构的一道题


第二张图没输出就是没加printf的,跑到那里就卡住了

り罐罐。的主页 り罐罐。 | 初学一级 | 园豆:46
提问于:2019-12-08 16:08

麻烦好好整理一下格式

不如隐茶去 4年前
< >
分享
最佳答案
0

haoba

り罐罐。 | 初学一级 |园豆:46 | 2020-02-22 16:14
其他回答(2)
0

麻烦先把代码格式处理好再发出来

收获园豆:25
Adming | 园豆:119 (初学一级) | 2019-12-09 14:13

刚刚弄懂Markdown格式,已改

支持(0) 反对(0) り罐罐。 | 园豆:46 (初学一级) | 2019-12-10 14:53

@り罐罐。: 问题出在scanf函数上,百度一个 scanf for 就知道了。 加 printf 可以运行,相当于强制线程切换了。

支持(0) 反对(0) Adming | 园豆:119 (初学一级) | 2019-12-10 15:11

@Adming: 我百度了一下,那是输入字符型的时候会遇到问题,但我是float类型的,为啥还是不行

支持(0) 反对(0) り罐罐。 | 园豆:46 (初学一级) | 2019-12-10 15:53

@り罐罐。: 建议不要用一个scanf接收多个输入,在循环中记得用fflush(stdin);或getchar()来吸收回车

支持(0) 反对(0) Adming | 园豆:119 (初学一级) | 2019-12-10 16:22

@Adming: 可以把那一段的代码打一下吗,因为我实在搞不懂,你说的那两个我也都用了,不行。

支持(0) 反对(0) り罐罐。 | 园豆:46 (初学一级) | 2019-12-10 20:23
0

首先你要学会看程序的返回值, 在看你两个运行情况的截图, 返回值都不是0, 而你的代码在main函数中应该是返回0的, 说明你的代码都没有正常结束, 也就是都崩了! 最常见的是发生了断错误

即使加了printf, 仅你的第一张图的结果上来看 也是出错的

但实际上, 在我的系统上, 你的代码正常运行

考虑你出现那个问题的原因是编译环境的问题, 重新编译或者换个编译环境试试

另外, 建议做题尽量用double以提高精度, 而且很多函数的返回值都是double的, 比如sqrt

收获园豆:25
KimBing_Ng | 园豆:352 (菜鸟二级) | 2020-02-23 08:57

嗯,这是几个月前的问题了。我当时问老师了,她当时的说法和你是差不多的,就是即使有时候代码对了,但是还会出错。然后我又看了《C Primer Plus》这本书上面有说到输入/输出缓冲区的概念,我的理解就是这一块的问题,再后来也没有深究了。还是谢谢你

支持(0) 反对(0) り罐罐。 | 园豆:46 (初学一级) | 2020-02-23 14:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册