情報科学演習
2012.01.16
Back to index page
- 本日の作業内容
- 小テストについて
授業の最初に配列に関する小テストを実施します.解答用紙は閲覧可能ですので,
事前に準備をしておいてください.
解答用紙
提出方法
以下のようなメールを作成し,送信してください.
宛先 | 課題の提出専用なので,質問をこのアドレスに送らないでください. |
件名 | test_c6_120116_s1140** | C6クラス |
test_c7_120116_s1140** | C7クラス |
本文 | 学生番号と氏名を必ず記入すること
上記記載が署名にある人は署名のみでも可 |
添付ファイル名 | test_c6_120116_s1140**.c | C6クラス |
test_c7_120116_s1140**.c | C7クラス |
- 宿題の結果について
- 12月20日提示の宿題
int i,
a = rand()% 10 + 90,
b = rand()% 10 + 80,
c = rand()% 10 + 70,
d = rand()% 10 + 60,
e = rand()% 10 + 50,
f = rand()% 10 + 40,
g = rand()% 10 + 30,
h = rand()% 10 + 20,
l = rand()% 10 + 10,
m = rand()% 9 + 1;
printf("\n\nMy student number: s104009\n\n");
i=1;
while(i<=1){
printf("%d %d %d %d %d %d %d %d %d %d",a,b,c,d,e,f,g,h,l,m);
i++;
}
|
またまたすごいのが出てきました.自動化を常に意識していないと,上のような
力業に頼ってしまうので,注意してください.残念ながらこれは0点です.期末
試験でも同じですので,注意してください.
i=1;
while(i<=10){
i++;
sum-=10;
num = rand() % 10 + sum;
printf(" %2d", num);
}
|
処理が間違っている訳では無いのですが,このような答案が多く出てきます.気
になるのは,i++ の位置です.while ループの直前に変数
i の値を1に初期化しているのですが,ループの先頭で i++
としているので,いきなり i の値は2になっています.そ
れならば,最初から条件式を i<10 としておいて,最後に
i++ とすれば良いので,適切でない処理ということになります.
a=rand()%10+90;
printf("My student number: s114004\n");
i=1;
while(i<=10){
a=rand()%10+90;
a-=b;
b=b+10;
printf("%d ",a);
i++;
}
|
これは減点対象の答案です.while 文の前に変数 a に乱数
を代入していますが,ループの中でも同じように乱数を発生させて a
に代入しています.無駄な処理です.
while(count<=9){
a = rand() % 10 + 90;
a = a - b;
b = b + 10;
printf(" %d", a);
count++;
}
|
変数の名前は人にプログラムを見せるときに重要な意味を持つことを以前から説
明しています.上の例では,while ループの中だけで使用する仮変数
の名前が count になっていますが,なぜ,そのような名前を使用する
必要があるのでしょうか?
while(i<=10){
i++;
a=rand() %10+b;
printf(" %d",a);
b=b-10;
}
printf(" \n\n");
printf("-----------------------------------------\n");
|
上のものは一例ですが,依然としてインデントの不適切なものが多く見られます.
論理構成をよく考えてください.
int i, a, b;
i=90;
while(b>10){
a = rand() % 10;
b = a + i;
i-=10;
printf("%3d", b);
}
|
一回もループの中の処理が実行されない例です.while 文の式と初期
化した変数が対応していません.
- 1月10日提示の宿題
for(i=1;i<=10;i++){
for(j=1;j<=10;j++){
if(i+j-1>=10)
printf("%d ",(i+j-11));
else
printf("%d ",(i+j-1));
}
printf("\n");
}
|
他にもたくさん同様の解答がありましたが,今回のプログラムには if
文は必要ありません.剰余を使用することで解決できます.
for(i=1; i<=10; i++){
if(i==10)
printf(" 0");
else
printf(" %d" ,i);
for(j=2; j<=10; j++)
if((i+j-1)%10==0)
printf(" 0");
else
printf(" %d" ,(j+i-1)%10);
printf("\n");
}
|
結果としての表示は同じなのですが,上の例では文字としての0と整数値が混在
しています.避けた方が良い考え方です.
for(i=1;i<=10;i++){
for(j=i;j<=9+i;j++){
printf("%d ",j%10);
}
printf("\n");
}
|
上のものだけではありませんが,相変わらずインデントのおかしいものが多く見
られます.
for(i=1;i<=10;i++){
for(j=i;j<=9;j++)
printf("%d ", j);
for(k=0;k<=i-1;k++)
printf("%d ", k);
printf("\n");
}
|
一つの for でできるものを2つに別けて行っています.これも剰余を
使用することに気づいていないための無駄な処理です.
for(i = 1; i <= 10; i++){
a++;
for(j = 1; j <= 10; j++){
a = a % 10;
printf("%d ", a);
a++;
}
printf("\n");
}
|
変数 a は必要ありません.i と j を上手く使っ
て解答例のように実現できます.
- 前回の復習
- while 文の基本
ただ単に10回動作を繰り返すような処理の場合,以下のような書式で実現できま
す.
i = 1;
while(i<=10){
printf("%d ", i);
i++;
}
|
変数 i の初期化も,増分も自分で別途記述する必要があります.
- 反復回数が決まっていない場合の while 文
前回の実習課題の ii のように繰り返す回数が決まっていないときに
は,while 文の方が for 文よりも簡単になる場合がありま
す.
n = 100;
while(n>=0){
m = rand() % 11 + 20;
printf("%d - %d = ", n, m);
n -= m;
printf("%d\n", n);
}
|
- 1次元配列
この授業の最後の難関である配列です.これが使えないと実際のプログラミング
では困ります.複数の並んだ値を一つの名前で保存できる便利な機能ですので,
必ず使えるようになってください.
例えば,1日の気温を1時間ごとに自動で測定するシステムがあるとします.午前0
時から午後11時まで24個の温度を,
temp0, temp1, temp2, .... , temp23
のようにたくさんの変数を使用して記憶しておくことは無駄ですし,後から使う
ときにやりにくい面が多いことになります.そこで,配列 temp として
1時間ごとの温度を
temp[0], temp[1], temp[2], ... , temp[23]
のようにしておくと,変数名としては1つの temp だけで済みますし,
時間を添字として利用することで読み出しが簡単になります.
今日からのポイントは値が何番目に入っているかを示す「添字」の使い方です.この添字を
for 文などと組み合わせて自動的に処理する方法を理解しましょ
う.
- 実習
実習の演習問題は当日ご案内します.
- 次回の予習範囲
教科書のp.59-65を予習してきてください.
- 宿題
授業の終わりに宿題の案内をします.ただ
し,問題を見ることができるのは17日以降です.
目次ページに戻る