第6回レポート課題の解答例 課題 6-1 の解答例 演習のアルゴリズム「番兵」テクニック使用 #include<stdio.h> /* 無条件に入れる */ #include<math.h> /* 無条件に入れる */ #define N 100 /* 無条件に入れる */ main(){ /* 無条件に入れる */ int i,n; /* 整数変数の宣言 (以下で i と n を使う) */ int data,result; /* 整数変数の宣言 ( data と result も使う) */ int table[N]; /* N までの添字が使える配列 */ table[1]=82; /* 「あらかじめ」格納する */ table[2]=45; /* 「あらかじめ」格納する */ table[3]=61; /* 「あらかじめ」格納する */ table[4]=38; /* 「あらかじめ」格納する */ table[5]=50; /* 「あらかじめ」格納する */ table[6]=29; /* 「あらかじめ」格納する */ table[7]=40; /* 「あらかじめ」格納する */ table[8]=76; /* 「あらかじめ」格納する */ table[9]=89; /* 「あらかじめ」格納する */ table[10]=99; /* 「あらかじめ」格納する */ n=10; /* データ数は 10 */ data=100; /* 探すデータ */ /* データの表示(なくてもよい。) */ printf(" 以下のデータから %d 点の学生を探します。\n", data ); for(i=1;i<=n;i=i+1){ printf(" %2d:%5d\n",i,table[i]); } /*ここからアルゴリズムの本体 */ table[n+1]=data; /* これが番兵。この文のない人が多い。 */ /* 重要な意味をもつ文です。 */ i=1; while(table[i]!=data){ i=i+1; } if( i<=n ){ result=i; }else{ result=0; } /* ここまでアルゴリズムの本体 */ /* 結果の表示(ないとうまくいったかどうかわからない。) */ /* もっと簡単でもよい。例えば printf("%d\n",result); */ if(result==0){ printf(" 100点の学生はいません。\n"); }else{ printf(" 100点の学生の学籍番号は %d 番です。\n",result); } exit(0); /* 無条件に入れる */ } /* } のあとの改行がないとだめ */ okada@happy[1]_% gcc -o test test.c -lm okada@hazel[2]_% ./test 以下のデータから 100 点の学生を探します。 1: 82 2: 45 3: 61 4: 38 5: 50 6: 29 7: 40 8: 76 9: 89 10: 99 100点の学生はいません。 参考:goto 使用 #include<stdio.h> /* 無条件に入れる */ #include<math.h> /* 無条件に入れる */ #define N 100 /* 無条件に入れる */ main(){ /* 無条件に入れる */ int i,n; /* 整数変数の宣言 (以下で i と n を使う) */ int data,result; /* 整数変数の宣言 ( data と result も使う) */ int table[N]; /* N までの添字が使える配列 */ table[1]=82; /* 「あらかじめ」格納する */ table[2]=45; /* 「あらかじめ」格納する */ table[3]=61; /* 「あらかじめ」格納する */ table[4]=38; /* 「あらかじめ」格納する */ table[5]=100; /* 「あらかじめ」格納する */ table[6]=29; /* 「あらかじめ」格納する */ table[7]=40; /* 「あらかじめ」格納する */ table[8]=76; /* 「あらかじめ」格納する */ table[9]=89; /* 「あらかじめ」格納する */ table[10]=100; /* 「あらかじめ」格納する */ n=10; /* データ数は 10 */ data=100; /* 探すデータ */ /* データの表示(なくてもよい。) */ printf(" 以下のデータから %d を探します。\n", data ); for(i=1;i<=n;i=i+1){ printf(" %2d:%5d\n",i,table[i]); } /*ここからアルゴリズムの本体 */ result=0; i=1; while(i<=n){ if(table[i]==data){ result=i; goto found; } i=i+1; } found: /* ここまでアルゴリズムの本体 */ /* 結果の表示(ないとうまくいったかどうかわからない。) */ /* もっと簡単でもよい。例えば printf("%d\n",result); */ if(result==0){ printf(" 100点の学生はいません。\n"); }else{ printf(" 100点の学生の学籍番号は %d 番です。\n",result); } exit(0); /* 無条件に入れる */ } /* } のあとの改行がないとだめ */ okada@happy[24]_% gcc -o test test.c -lm okada@happy[25]_% ./test 以下のデータから 100 点の学生を探します。 1: 82 2: 45 3: 61 4: 38 5: 100 6: 29 7: 40 8: 76 9: 89 10: 100 100点の学生の学籍番号は 5 番です。 課題 6-2 の解答例 A. p=0; B. break; C. 割り切れない 課題 6-3 の解答例 教科書「3.6 go to 文と go to なしプログラミング」参照。 「段階的詳細化では、アルゴリズムの大局構造から順次細かい部分へと階層的に 考察を進めるため、良いプログラムを得る可能性が高い。しかしgo to文は、 任意の文から他の任意の文へ自由に制御を移すことができるため、段階的詳細化 によって立てられたプログラムの流れを壊してしまう可能性がある。 そのため、 go to文の使用は必要最低限に押さえ、特に反復構造から抜け出す 場合にのみ限定的に使用することが望ましいとされている。」 課題 6-4 の解答例 #include<stdio.h> #define NN 10 main() { int i,j,n,m,flag,result[NN]; char table[NN],pattern[NN]; /* 語群をtable[NN]に入れる */ table[0]='d'; table[1]='h'; table[2]='l'; table[3]='o'; table[4]='w'; table[5]='y'; /* "hollywood"をpattern[NN]に入れる */ pattern[0]='h'; pattern[1]='o'; pattern[2]='l'; pattern[3]='l'; pattern[4]='y'; pattern[5]='w'; pattern[6]='o'; pattern[7]='o'; pattern[8]='d'; n=6;/* table[NN]の数 */ m=9;/* pattern[NN]の数 */ for(i=0;i<m;i++){ j=0; flag=0;/* whileの繰り返しを途中で止めるためのスイッチ */ while(j < 6 && flag == 0){ if(table[j] == pattern[i]){ result[i]=j; flag=1; } j=j+1; } } /* 結果の表示 */ for(i=0;i<m;i++)printf("%d",result[i]); printf("\n"); exit(0); }