- 本日の作業内容
- 前回の宿題について
長い休みを挟んだので十分に考えられたプログラムが出てくることを期待しましたが,案に相違して未提出が多かったのが残念です.さらに,コンパイルエラーが3つも出てしまいました.提出前の確認をいつもお願いしておりますが,どうしてこうなるんでしょうかね?
コンパイルエラー: b1923 b2121 b2153
あとはいつもの問題もやはり発生してしまいました.注意しましょう.
出力時番号間違い: b2115
不適切なインデント: C003 b1970 b1972 b2027 b2067 b2117 b2118 b2130 b2160
さて,以下は例によって問題のあるプログラムの例です.参考にしてください.
変数名は大文字で始ないで,と,何度も何度もお願いしているのですが.何故に大文字がいいんでしょうかね?数学でも座標の x と y は小文字のはずですが.
printf(" 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 \n");
|
問題文の中に目盛りとなる数字も反復処理で作るよう指示していたので,上のようなものは減点です.
for(i=1; i<=5; i++)
{
a=rand() % 10;
for(i=1; i<=9-a; i++)
|
外側の for() 文を回す変数が i で,内側で出て来た for() 文でも変数 i を使うというのは特定の目的が無い限りダメですね.実際に表示がおかしいことに気づいたはずですが?
for() 文の式2が i < 5 なので,4回しか繰り返しません.これも実際に実行したら気づくはずですけど?
以下は表示がおかしい例の3連発です.
9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9
* * * * * * * * 8ー1 *
* * * * * * 6ー3 * * *
* * * * 4ー5 * * * * *
* * * * * * 6ー3 * * *
* * * * 4ー5 * * * * *
|
スペースで補うことをしていないので,表示が崩れていますよね.解答例を参考にしてください.
9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9
* * * * 4-5 * * * * * * * * 3-6 * * * * * * * * * * 4-5 * * * * * 0-9 * * * * * * * * * * 1-8 * * * * * * * *
-------------------------
|
こちらは改行を入れていないので,表示が崩れている例です.これも自分で確認できたはずなので,修正してから出してください.
for( space = 0; space < 9 - num; space++)
{
printf(" ");
}
for(j = 0; j < num; j++)
{
printf("* ");
}
|
上の for() 文で printf() で表示させているのがスペース1個なので,幅が違って表示がずれますね.これも自分で気づくはずなんですが,どうして直して出さないのでしょうか?
for(j=1; j<=5; j++)
{
astericks_left = rand() % 9 + 1;
astericks_right = rand() % 9 + 1;
if(astericks_left>=1 && astericks_left<=8)
{
printf("%*c\b",-2*astericks_left+19,' ');
}
else
{
printf("%*c\b",astericks_left-9,' ');
}
for(k=1; k<=astericks_left; k++)
{
printf("* ");
}
printf("%d", k-1);
printf("-");
for(l=1; l<=astericks_right; l++)
{}
printf("%d ", l-1);
for(l=1; l<=astericks_right; l++)
{
printf("* ");
}
printf("\n");
}
|
乱数を2個発生させているので,根本から間違っています.足して9にならないとダメです.
- 前回の復習
多重の for 文になると,変数 i や j がどのように変化しているのか,しっかりと把握する必要があります.頭の中だけで考えていくのも限界がありますので,ぜひ紙などに変数の動きを書きながら自分のプログラムの動作を考えるようにしましょう.
- 多重の for 文
多重のループにすると2次元的な表現ができることを学習しました.サンプルとして以下のプログラムを紹介しておきますので,今後の参考にしてください.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned) time(NULL));
int num, i, j;
for(i=1; i<=10; i++)
{
num = rand() % 9 + 1;
printf("%d: ", num);
for(j=1; j<=num; j++)
{
printf("%d", num);
}
printf("\n");
}
return 0;
}
|
今週の演習問題はこれまで以上に難しいと感じる人が多く出てくると予想しています.ただ,中で使用している処理自体は全てこれまでに経験しているものです.ポイントは処理の並べ方,すなわちアルゴリズムです.
今後は小学校からのプログラミング学習が始まりますが,そこで求められているのは特定の言語の習得ではなく,アルゴリズムの学習です.処理を一つ一つ順番につなげていくこと,機械でもわかるということは誰にでもわかる命令を用意すること,などですが,今回の演習問題でも同じです.何をどうすればよいのか,一つ一つ順番に考えていくことで実現できます.
ところで,「プログラミングの難しさ」について,週間東洋経済の記者が体験して自分の状況を記事にしています.面白いので,興味有る人は読んでみてください.
素人がプログラミングに挑んでみて見えた境地
最初に挫折しやすい壁を越えるコツはどこに
ざっくり言うと,「質問攻めにできる人を金をかけてでも捕まえたい」ということのようです.皆さんはこの演習で自由に質問できるので,幸せな環境にいると言えるでしょうけどね.
その他の関連記事も面白いので,読んだ方が良いですよ.皆さんは今年度は残念ながら自習授業でこれまでのように気軽に演習中の質問ができなくなってしまいました.その分,時間の制約なく自由に学べるので,それはそれで良しとしましょう.
プログラミング学ぶ社会人が急増している事情
ITをより活用できる能力があれば幅が広がる
子どもにプログラミングを学ばせる真の意義
根本にあるのは、親たちの切なる願いだ
- 実習
実習の演習問題は当日ご案内します.
- 次回の予習範囲
引き続き多重の for 文を扱います.予習用の課題を見ておいてください.
- 宿題
今回の宿題も本日の18:00からレポート提出システムで公開されます.提出は24日の10:00までです.