- 本日の作業内容
- 前回の宿題について
さて,今回も無限ループが出てきてしまいました.採点する上で非常に面倒なので,提出しないでください.提出されても,発見次第消去するだけですので.
無限ループ: b2110 b2117 b2135 b2153
コンパイルエラーもありました.こちらも採点しませんので,出すだけ無駄です.無限ループやコンパイルエラーは提出前に確認して,起らないようにしてください.
コンパイルエラー: b2105
相変わらず,解答用紙のプログラム中の学生番号例を自分のものに直していなかったり,名前が島根太郎だったりもありますので,こちらもチェックよろしくお願いします.
出力時番号間違い: b2128
学生番号と名前無修正: b2157
末尾のハイフンラインが無いものもありました.後程原因の方は説明していますが.
ハイフンライン無し: b2144
インデントの不備も相変わらずです.プログラムが見にくいので,こちらも注意してください.
インデントの不備: C003 b2111 b2112 b2134 b2157
さて,今回はまだ習っていない配列を使用したものや,教科書のp.40には出ているものの説明もしていないビット演算子を使用したものなど,いくつか興味深いプログラムが出てきました.自分で工夫するのはもちろん大歓迎ですが,どこかからソースをもらってきているだけならば,プログラミングの能力の向上はありませんので,中身を理解した上で使うようにしてください.
さて,以下は例によって問題のあるプログラムの例です.参考にしてください.ただし,今回は気になるものも挙げてあります.
decimal = rand() % 255 + 1;
|
今回は乱数の範囲を0から255としているのですが,ちょくちょく上のようなものが見られました.これでは0は出ないですね.
こういうよくわからない乱数もありました.
変数名は小文字で始めるように何度も注意しているはずですが.また,char型は今回不要なんですがね.
int Decimal = rand () %256;
int Binary = 0;
|
こちらも大文字で始まっていますねえ.
while(decimal>0)
{
binary = binary + ( decimal % 2 ) * base;
decimal = decimal / 2;
base = base * 10;
}
printf("Binary: %d\n", binary);
|
別に間違いではありませんが,わざわざ10進数に直す必要はありませんよね.
while(i<=8)
{
num2 = num / num3;
printf("%d",num2);
num %= num3;
num3 /= 2;
i += 1;
}
|
こちらも特に減点などはしていませんが,8桁だから8回繰り返すというのであれば,while() 文的では無いです.
while(++i)
{
printf("%d",num/digit);
num%=digit;
digit/=2;
if(i==8)
{
break;
}
}
|
while() 文なんだから break とか使わずに書いて欲しいです.
while(i>=1)
{
if(num>=i)
{
printf("%d",1);
num %= i;
i /= 2;
}
else
{
printf("%d",0);
i /= 2;
}
}
|
if() 文は必要ないですね.剰余を使うことを意識してください.
return 0;
printf("\n-------------------------\n\n");
|
どっかで別に一度プログラムを作って,その後で解答用紙に貼りつけるとこんなことも起こるのでしょうね.ハイフンラインの出力の命令の前にもう return 0; を書いてしまいました.
while(z != 0){
printf("0");
z --;
}
printf("%d\n",bin);
|
先頭の0を補う操作ですが,教科書の p.28 の表2_4にあるように桁数指定のまえに0をつけておくとできます.
{
while(ten < k)
{
printf("0");
k = k / 2;
}
while(ten > 0){
two = two + (ten % 2) * upper;
ten = ten / 2;
upper = upper * 10;
}
printf("%d",two);
}
|
インデントもおかしいのですが,while() 文全体を中括弧 { } でくくってブロックにしていることが変です.元々不要ですし.
で,残念ながら今週も出てきてしまいました絶対にやっちゃダメな例です.場合分けをする前にもっとよく処理について考えましょう.
if(a<=2){
printf("0000000%d\n",fact(a));
}
else if(a<=4&&a>=2){
printf("000000%d\n",fact(a));
}
else if(a<=8&&a>=4){
printf("00000%d\n",fact(a));
}
else if(a<=16&&a>=8){
printf("0000%d\n",fact(a));
}
else if(a<=32&&a>=16){
printf("000%d\n",fact(a));
}
else if(a<=64&&a>=32){
printf("00%d\n",fact(a));
}
else if(a<=128&&a>=64){
printf("0%d\n",fact(a));
}else{
printf("%d\n",fact(a));
}
|
- 前回の復習
前回は while 文でした.何回繰り返すかわからない処理の場合などには for 文よりも while 文の方が適している場合がありますので,今後も必要に応じて使い分けていきましょう.
- まとめ
今回はここまでの反復処理のまとめです.練習問題に取り組んで,さらに理解を深めましょう.
教科書のフローチャートはちょっといい加減なので,以下に具体的な処理のフローチャートの例を載せておきます.反復処理を考える上での参考にしてください.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned) time(NULL));
int i, num, max = 0;
for(i=1; i<=10; i++)
{
num = rand() % 90 + 10;
printf("%d ", num);
if(num>max)
{
max = num;
}
}
printf("\nThe maximum value of numbers above: %d\n", max);
return 0;
}
|
- 実習
実習の演習問題は当日ご案内します.
- 宿題
レポート提出システムをご覧ください.宿題の提示は当日月曜日の夕方18:00ころで,提出締切りは翌週の月曜日の10:00です.