.................. program 9 .................. /* ifの使い方を知るためだけの、殆ど無意味なプログラム (何をやってるか、考えてみてください) */ #include main() { int i; double x; for(i=1; i<=10; ++i){ scanf("%lf",&x); if( x > 10 ){ printf("%f > 10\n",x); } else if( x > 5 ){ printf("10 >= %f > 5\n",x); } else if( x > 0 ){ printf("5 >= %f > 0\n",x); } else { printf("%f <= 0\n",x); return; } } } .................. program 10 .................. /* if文の利用例として2分法で非線形方程式の解を求める。 下の例題では x^3 + 5x^2 - 3x -5 = 0 の解を求めている(^はべき乗を表す)。 */ #include #include #define NMAX 50 main() { double x1,x2,x3; double f1,f2,f3; int irepeat; /* 解探索の範囲を指定 */ scanf("%lf%lf",&x1,&x2); /* 2分法を最大NMAX回くりかえす */ for(irepeat=1; irepeat<=NMAX; ++irepeat){ f1 = pow(x1,3.) + 5*x1*x1 - 3*x1 -5; f2 = pow(x2,3.) + 5*x2*x2 - 3*x2 -5; /* x1とx2の差が与えた精度以内なら終了 */ if( fabs((x1-x2)/x1) <= 1e-10){ printf("convergence\n"); printf("x=%17.12f f=%17.12f\n",x1,f1); printf("x=%17.12f f=%17.12f\n",x2,f2); return; } /* 収束してないと判断されたとき。 f1とf2の符号が逆なら範囲を二分する */ else if(f1*f2 < 0){ x3 = (x1+x2)/2; f3 = pow(x3,3.) + 5*x3*x3 - 3*x3 -5; if(f1*f3 < 0){ x2=x3; } else{ x1=x3; } printf("%d step x1= %17.12f f1= %17.12f x2= %17.12f f2= %17.12f\n",irepeat,x1,f1,x2,f2); } /* f1とf2の積が正なら、この範囲に解がないと判断して終了 */ else{ printf("no solution is found between %17.12f and %17.12f\n",x1,x2); return; } } /* NMAX回のくりかえしで解に収束しなかったときは終了 */ printf("no convergence after %d steps\n",NMAX); }