【问题标题】:while loop condition not fullfiledwhile 循环条件未满足
【发布时间】:2021-04-05 16:53:07
【问题描述】:
double randomx,randomy,randomz,dia;
#define DROP_RAD 60
#define particleradi 3

for (i = 0; i<30; i++) 
{
    {
        randomx=2*((float)rand()/RAND_MAX)-1;
        randomy=2*((float)rand()/RAND_MAX)-1;
        randomz=2*((float)rand()/RAND_MAX)-1;
        randomx=randomx*(DROP_RAD -2*particleradi);
        randomy=randomy*(DROP_RAD -2*particleradi);
        randomz=randomz*(DROP_RAD -2*particleradi);
        
        dia=randomx*randomx+randomy*randomy+randomz*randomz;
        dia=sqrt(dia);
    
    } while(dia>DROP_RAD);

    
    printf(" id=%d, x=%lf, y=%lf, z=%lf , dia=%lf\n ",i,randomx,randomy,randomz,dia);

我得到的 dia 值大于 DROP_RAD,即使 while 条件应该是这样。请帮忙。

【问题讨论】:

  • 你的while 循环,就目前而言,是一个空循环。您是否忘记了开头的do
  • 请注意,当缩进正确时,您的 for 循环永远不会关闭,并且您的 do 循环缺少 do - 甚至无法编译。剩下的要发吗?

标签: c loops while-loop do-while


【解决方案1】:

我认为您在这里需要do-while-loop。它将至少执行该代码块一次,然后根据块末尾的布尔条件,重复执行该块或停止执行它。

do {
    /* here goes your code */
} while (dia > DROP_RAD);

如果在条件为false 时根本不希望执行该块,则必须将条件移动到该块的开头。

while (dia > DROP_RAD) {
    /* here goes your code */
}

【讨论】:

    【解决方案2】:

    你的代码 sn-p 相当于下面的

    for (i = 0; i<30; i++) 
    {
    
        {
            randomx=2*((float)rand()/RAND_MAX)-1;
            randomy=2*((float)rand()/RAND_MAX)-1;
            randomz=2*((float)rand()/RAND_MAX)-1;
            randomx=randomx*(DROP_RAD -2*particleradi);
            randomy=randomy*(DROP_RAD -2*particleradi);
            randomz=randomz*(DROP_RAD -2*particleradi);
      
            dia=randomx*randomx+randomy*randomy+randomz*randomz;
            dia=sqrt(dia);
        }
    
        while(dia>DROP_RAD);
    
    
        printf(" id=%d, x=%lf, y=%lf, z=%lf , dia=%lf\n ",i,randomx,randomy,randomz,dia);
    
        //...
    

    那是你有一个复合语句

        {
            randomx=2*((float)rand()/RAND_MAX)-1;
            // ...
        }
    

    后跟单独的 while 语句

    while(dia>DROP_RAD);
    

    所以要么你有一个无限的while 循环

    while(dia>DROP_RAD);
    

    如果dia大于DROP_RAD或者如果条件不满足则立即中断循环。

    看来你的意思是像这样的 do-while 循环

    do {
        randomx=2*((float)rand()/RAND_MAX)-1;
        randomy=2*((float)rand()/RAND_MAX)-1;
        randomz=2*((float)rand()/RAND_MAX)-1;
        randomx=randomx*(DROP_RAD -2*particleradi);
        randomy=randomy*(DROP_RAD -2*particleradi);
        randomz=randomz*(DROP_RAD -2*particleradi);
    
        dia=randomx*randomx+randomy*randomy+randomz*randomz;
        dia=sqrt(dia);
    } while(dia>DROP_RAD);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-18
      • 2014-12-12
      • 2017-03-04
      • 2023-01-12
      • 1970-01-01
      • 2019-01-29
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多