第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=50; /* 探すデータ */ /* データの表示(なくてもよい。) */ 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(" 50点の学生はいません。\n"); }else{ printf(" 50点の学生の学籍番号は %d 番です。\n",result); } exit(0); /* 無条件に入れる */ } /* } のあとの改行がないとだめ */ okada@happy[1]_% gcc -o test test.c -lm okada@hazel[2]_% ./test 以下のデータから 50 点の学生を探します。 1: 82 2: 45 3: 61 4: 38 5: 50 6: 29 7: 40 8: 76 9: 89 10: 99 50点の学生の学籍番号は 5番です。 参考: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]=50; /* 「あらかじめ」格納する */ table[6]=29; /* 「あらかじめ」格納する */ table[7]=40; /* 「あらかじめ」格納する */ table[8]=76; /* 「あらかじめ」格納する */ table[9]=89; /* 「あらかじめ」格納する */ table[10]=50; /* 「あらかじめ」格納する */ n=10; /* データ数は 10 */ data=50; /* 探すデータ */ /* データの表示(なくてもよい。) */ 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(" 50点の学生はいません。\n"); }else{ printf(" 50点の学生の学籍番号は %d 番です。\n",result); } exit(0); /* 無条件に入れる */ } /* } のあとの改行がないとだめ */ okada@happy[24]_% gcc -o test test.c -lm okada@happy[25]_% ./test 以下のデータから 50 点の学生を探します。 1: 82 2: 45 3: 61 4: 38 5: 50 6: 29 7: 40 8: 76 9: 89 10: 50 50点の学生の学籍番号は 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> #include<math.h> #define N 100 main() { int i,n; int data, result; int ID[N]; /* データのクリア*/ for(i=1; i<=N; i=i+1) ID[i]=0; /* データの入力 */ ID[1]=112005; /* 「あらかじめ」格納する */ ID[2]=112020; ID[3]=112057; ID[4]=112032; ID[5]=112044; ID[6]=112001; ID[7]=112028; ID[8]=112068; ID[9]=112155; ID[10]=112011; n=78; /* 端末の台数 */ data=112155; /* 探すデータ */ printf("以下の学生がログインしています。\n"); i=1; while(ID[i]!=0){ printf("%2d:%7d\n",i,ID[i]); /* intのiとID[i]を10進数表示*/ i=i+1; } printf("出席人数は %d人です。\n",i-1); /* intのiを10進数表示*/ ID[n+1]=data; i=1; while(ID[i]!=data){ i=i+1; } if( i<=n ){ result=i; }else{ result=0; } /* 結果の表示 */ if( result==0 ){ printf("ID番号 %d の学生はいません。\n",data); }else{ printf("ID番号 %d の学生は%2d番目にログインしました。\n",data,result); } exit(0); } okada@hazel[28]_% gcc -o sol6-4 sol6-4.c -lm okada@hazel[29]_% sol6-4 以下の学生がログインしています。 1:112005 2:112020 3:112057 4:112032 5:112044 6:112001 7:112028 8:112068 9:112155 10:112011 出席人数は 10人です。 ID番号 112155 の学生は 9番目にログインしました。