- 本日の作業内容
- 前回の宿題について
今回も解答用紙を使用していない人が出てしまいました.必ず解答用紙を使用してプログラムを作ってください.採点の対象外になりますので,残念なことになります.
解答用紙不使用: b1923
他にも採点対象外のものが出てしまったのですが,今回は scanf() を使用したものもありました.Webテキストにも書いたように,私の授業では scanf() は一切使用しません.提出されたプログラムは全てのものを一気にコンパイルして実行しますので,途中でキー入力を必要とする scanf() が入ってしまうと処理が止まってしまい面倒な事になります.ですので,scanf() は今後も入れないで下さい.自分の確認用に使用しても良いですが,提出版では削除するか,コメントに変えておいてください.
scanf()の使用: C003 b2135
コンパイルエラーも残念ながらいくつか出てきました.自分でコンパイルしてみればわかるはずなので,以後は確認よろしくお願いします.上で書いたように全員のプログラムを連続して一斉に実行するので,エラーのものはその妨げになることから削除しています.
コンパイルエラー: b2111 b2126 b2135 b2158
また,今回も回答用紙や実行結果の表示のところでの学生番号間違いがありました.こちらも注意してください.
学生番号間違い: b2116 b2157
さて,今回から制御構造と呼ばれるものの一つの if() 文が登場しましたので,予想通りたくさんの不適切なインデント(字下げ)が出てしまいました.インデントについては,解答例を参考にしっかり理解して欲しいと思いますが,それ以前にスペースキーでスペースを入れるのをまずやめてください.必ずTABキーを使用して見た目がキレイになるように揃えてください.それから if() が出てきたら字下げするのではなく,if() 文の中括弧 { これ以降が字下げされますので,そこも誤解の内容にお願いします.字下げのタイミングは中括弧です.
インデントの不備: C005 C007 C008 b1825 b1970 b1972 b2067 b2113 b2115 b2116 b2118 b2121 b2122 b2123 b2126 b2131 b2133 b2139 b2143 b2158 2159
以下は問題のあるプログラムの例です.参考にしてください.
int num = rand() % 20000 + 624;
|
2万通りの乱数というのは,人口と無関係ですね.
if(num>10666)
{
printf("A result of a random choice of Matsue citizen: Male\n");
}
if(num<10667)
{
printf("A result of a random choice of Matsue citizen: Female\n");
}
|
上のようなものがもっとたくさん出てくるかと心配しましたが,少なくてちょっと安心しました.MaleかFemaleかどちらかを必ず出力するので, if() の連発ではなく,if-else が適切です.
int num = rand() % 20623+1;
if(num<=9956.5)
|
if() 文の式で,変数 num は整数型なので,小数部分は意味が無いです.
int matsue_citizen = rand() % 20622 + 1;
|
20622通りでは,本来の人口の1/10とは違いますね.20623通りの数を出す必要があります.
今度は20624通りの乱数が出てしまいますので,こちらも間違いです.
if(dice>=1)
{
if(dice<=9957)
{
printf("A result of a randam choice of Matsue citizen: Male\n");
}
}
if(dice>9957)
{
if(dice<=20624)
{
printf("A result of a randam choice of Matsue citizen: Female\n");
}
}
|
まず変数名の「サイコロ」は適切ではないですよね.そして,無駄な if() がたくさん出てきました.判別する際の数ですが,両端の数を指定する必要は無いですね.
int n = rand() % 206230 + 1;
if(n<=99565)
|
UNIXなどの環境では間違っていません.でも,WindowsでMinGWを使うと,最大値が32766なので,if() 文の式は全て真ということになります.
if(num>=9957)
{
printf("Female\t");
}
else
{
printf("Male\t");
}
|
インデントもぐちゃぐちゃですが,それ以外に printf() の中の表示文の末尾が改行ではなくTABになってしまっています.
int citizen = rand();
//printf("%d\n" , citizen);//
if (citizen / 20623 <= 99565 / 206230)
|
先ほども書いたように,ただ rand() で乱数を発生させると最大値が32766ですので,比率が本来のものになりません.
int num=rand()%99+1;
if(num<=48)
|
さすがに,これでは雑ですね.1/10の数程度でと書いておいたのですが.
if( n <= 9957 )
printf("A result of a random choice Matue citizen: Male \n" );
|
上の例のTABは間違ってはいないのですが,スペース8個分あります.横に無駄に長くなるので,教科書と同じようにスペース4個分に設定しておきましょう.
Random number: 114965
Female
-------------------------
|
どうして出題されている表示形式を勝手に変更するのでしょうか?変えないで下さい.
- 前回の復習
前回は if-else 文でした.ポイントは何らかの処理を分岐しても必ず行う場合には,セーフティネットとしての else を使用するということでした.覚えておいてください.
また,変数の値の入れ替えは今後どんどん重要度が増しますので,きちんと把握しておきましょう.
- 論理演算子
論理演算子は教科書p.52の表3_3にある以下の3つです.戻り値は1もしくは0のブール値ですので, if 文の条件式のところや,後に出てくる for 文の式の中で通常は使用します.
演算子 | 名称 |
&& | 論理積(AND) |
|| | 論理和(OR) |
! | 論理否定(NOT) |
あらかじめ説明しておきますが,初心者がよくする間違いに以下のようなものがあります.
if(a > b, b > c) 意味不明な動作になる可能性
if(a == b || c) cに値があれば必ず真
if(a < b < c) 右の不等号以降は無視される
|
上記はいずれも間違ったプログラムです.正しくは,以下のように書く必要がありますので気をつけてください.
if(a > b && b > c) もしくは if(a > b || b > c)
if(a == b || a == c)
if(a < b && b < c)
|
- 実習
実習の演習問題は予習用の部分はすでに見えますのでしっかり予習してください.
- 次回の予習範囲
引き続き教科書のp.57まで予習をしてきてください.
- 宿題
宿題は月曜日の18:00公開です.