- 本日の作業内容
- 11/12の宿題の結果について
相変わらずインデント(字下げ)のおかしい答案がたくさん出ていますので,注意してください.以下はそれ以外の問題のある答案です.
コンパイルエラー b1247
解答用紙を使用していない b1220 b0969
100行以上の main 関数 b1223 b1260 b0969
上記は採点対象外です.
int a = rand() % 6 + 1,b = rand() %6 +1,c = rand() % 6 + 1, d=rand() % 6 + 1,r=0;
|
上のような変数定義は間違いでは無いのですが,今回は減点しています.理由は,これから学習する for 文のような反復処理に応用するときに書き直す必要があるからです.
上のような比較演算子の使用法はC言語にはありません.
Dices:4 5
Batter1: Out
Dices:6 6
Batter2: 2H
Points: 1
|
問題のところでわざわざ得点の部分に野球の得点を表す英語の Run を書いておいたのに,なぜかバスケットやバレーの得点で使うポイントを使っている人がいました.不思議です.例えば,野球では「打点」はRun Batted Inと言いますが,長いので,通常はRBIと言います.スポーツは表現がいろいろありますので,注意してください.
Dices: 3 2
Batter1: Out
Dices: 4 6
Batter2: Out
Run:1
|
上の2つのように得点の計算がおかしいものもときどきありました.他にもホームランが出ても0点というのもありました.
Dices: 2 5
Batter1:1HDices: 6 3
Batter2:Out
|
また,上のように改行が抜けているものもありましたので,注意してください.
解答用紙に氏名の無い人,学生番号の表示の無い人,最後のハイフンによるラインの無い人等もいましたのでやはり注意してください.
- 今週のメンター学習室について
11/23は祝日でお休みですので,今週のメンター学習室は11/21(水)の14:30-16:00に開設します.お間違えの無いようにお願いします.
- 前回の復習
実習課題のiii.では,やたらとたくさん条件を設定する人が散見されました.このような場合ではまず規則性を見つけることから始めてください.安打表のように2次元に表示されている場合には1次関数(直線の式)で整理できることを活用してください.その場合,左上が座標原点で,下方向にx軸,右方向にy軸と考えると今後の作業にも役立ちます.
iv.では最後のSorry!の処理の考え方がポイントでした.この課題では実は else では処理しにくい流れになっていましたので,実際には単純な if 文で構成します.そのとき,もう一つ適当な変数を用意してそれに状態を記憶させておくことが必要になります.このような変数をフラグ(flag,旗)と呼びますが,状態がある条件のときに旗を立てて目印を用意するイメージで使用します.実際には,初期値0の変数 flag を用意しておき,2から7のどれかの数で割り切れたときには値を1にするように if 文の中に処理を書いておきます.そうすると,全部の剰余の if 文が終わったときに,変数 flag の値が0のままなら約数が無かったことになるのでSorry!を表示させれば良いことになります.
- for 文
- for 文の基本
for 文は教科書p.39の図4.2の下にあるような形式で使用します.式1
から式3までは初期値,終了条件,増分を表します.これらは必要に応
じて処理のために使用するので,必ずしも書かなくてはいけないもので
はありません.ここが空欄であれば,教科書p.40にあるような無限ルー
プになります.
最初のころの授業でもおしらせしたように,今後万一無限ループを作ってしまっ
てプログラムが終わらない場合には,「コントロールキーとCのキー」を同時に押し
て処理を停止してください.Ctrl+Cと覚えておいてください.
教科書に出ているCtrl+ZはWindowsにおける強制終了です.
- 仮変数
for 文の式1から式3までの設定では変数 i がよく使用され
ます.これは整数(Integer)の頭文字を取ったものです.for
文ではこのように i を使用しますので,他の場所で i
を使用する場合には注意が必要です.ただし,複数の for
文が一つのプログラム中にあってもこの変数(仮変数)は i
のままで構いません.
次回以降で扱う多重のループの場合には変数は使い分ける必要があります.その
際にはアルファベットの順番で i, j, k, l, m, ... などがよく使用
されます。
- 複合演算子
教科書p.38で紹介されている複合演算子は非常に重要です.以後,頻繁に使用さ
れる予定です.変数の値を変更する際に利用されますので,よく理解しておいて
ください.本日の実習でも使用します.また,略号の方がよく使用されますので,
そちらも注意してください.
- インクリメント演算子
教科書のp.39に出てくるインクリメント演算子(とデクリメント演算子)も非常に
重要です.変数の値を1増やす,もしくは,1減らすという処理ですので,こちら
も頻繁に使用します.
応用例としては「カウンタ」があります.例えば,さいころを複数回振る作業で,
1の目が何回出てきたかを数えるような処理のときに変数の値を1ずつ増やせるこ
の演算子は効果的です.
- break
教科書では無限ループから抜け出すのに,if 文と break の
組合せの例が出ていますが,この授業では基本的に break は使用しま
せん.教科書p.39の for 文の説明にある「式2」を工夫することによっ
て,面白い for 文の抜け出し方が実現できますので,それを練習する
ことにします.
- 実習
実習の演習問題は当日ご案内します.
- 次回の予習範囲
教科書のp.48の例題4.8を予習してきてください.ただし,4行目でインクルード
されている conio.h というヘッダファイルは教室の環境には無いので
使えません.これは10行目の clrscr() (クリアスクリーン)を使うた
めのものなので,この行を削除すれば conio.h をインクルードしなく
ても大丈夫です.
また,例題4.8のやり方に固執すると今後のプログラミングに支障が出ますので,よりこの授業に合ったやり方を以下に紹介します.こちらについても理解をお願いします.
#include <stdio.h>
main()
{
int i, j;
for(i=-5; i<=5; i++){
for(j=0; j<=i*i-1; j++)
printf(" ");
printf("*\n");
}
return(0);
}
|
また,次のような方法もあります.
#include <stdio.h>
main()
{
int i, j;
for(i=-5; i<=5; i++){
for(j=0; j<=25; j++)
if(j==i*i)
printf("*");
else
printf(" ");
printf("\n");
}
return(0);
}
|
最後の方法がわかると期末試験等で楽にプログラミングできるはずです.
- 宿題
授業の終わりに宿題の案内をします.ただ
し,問題を見ることができるのは20日以降です.