第4回レポート課題の解答例

課題 4-1 の解答例

入力する数値により i は 3,4,5,6,7 の五つのいずれかになる。
よって while /* c1 */ は i+1 回の判定を行ない、ループは i 回の
反復をする。次に、そのループのなかでは /* c2 */ の if 文により
c2,p3,p5, 或は c2,p4,p5 のどちらかのルートを通過して i 回の
反復後 c1,p6 で終わる。

例として i が 3 の場合は
 p1 p2   c1 c2 p4 p5   c1 c2 p3 p5   c1 c2 p4 p5   c1 p6

課題 4-2 の解答例

{
i=1;
while(i<=n-1){
    maxj=i;
    max=a[maxj];
    j=i+1;
    while(j<=n){  
        if(a[j]>max){    <-- 必要な不等号を入れる。
            max=a[j];
            maxj = j ;    <-- 適切な代入にする。
            }
        j=j+1;
        }
    a[maxj]=a[i];
    a[i]=max;
    i=i+1    <-- 適切な代入にする。
    }
}

課題 4-3 の解答例

(A) b-a > ε ( >= でも可)
(B) (a+b)/2
(C) a

理由
(A) 区間の幅b-aが、目的の精度εより大きい間は区間の更新を繰り返す。
(B) 中点を求める式。
(C) 現在の区間(a,b)を新しい区間(c,d)に更新する。

課題 4-4 の解答例

{
    a,b,c,の値を読む;

    if(a==0.0){
         「2次方程式ではありません」と表示;
    }else{
          det=b*b-4.0*a*c;          /* 掛け算を*で表す */
                                    /* 判別式をdetとする */
          if(det>0.0){
              x1=(-b+sqrt(det))/(2.0*a);  /* sqrtは平方根 */
              x2=(-b-sqrt(det))/(2.0*a);
              2実解 x1,x2を表示する;

          }else if(det==0.0){
              x1=-b/(2.0*a);
              重解 x1を表示する;

          }else{
              re=-b/(2.0*a);         /* 実際に計算できるのはre,im */
              im=sqrt(-det)/(2.0*a); /* reとimを使って表示するだけ */
              2虚数解を re + im i, re - im yi のように表示する; 
          }
    }
}


*注意
  分岐にpad2psの多分岐命令である
       switch{
           case D>0:
               処理;
           case D=0:
               処理;
           case D<0:
               処理;
       }
  を使用している人が多数見られたが、これはあくまでPADを
  書くための命令である。  C言語擬似コードのswitch case文は、  
       switch(式){             /*式が必要*/
          case 定数値:         /*定数値には数値しかいれられない*/
                処理;          /*つまり不等式は入れられない!*/
          case 定数値:
                処理;
          case 定数値:
                処理;
       }
  である。

 "擬似コード"とは、C言語の制御文(if文、switch文、while文、do文、for文)
  を借用し、その中に用いる条件や処理の部分を自然言語で表した
  "擬似プログラム"である。制御文は正しく使用しなければならない。