- 本日の作業内容
- 小テスト
最初に小テストを実施します.レポート提出システムを利用して行いますので,ログインして待っていて下さい.
なお,小テストでは窓際の席で柱があるために飛び出している机の端末(合計6台)は使用しないで下さい.
- 宿題について
宿題の提出に関しては残念ながら今回も不備が見られました.今後は注意してください.
コンパイルエラーの答案
b1418 b1481
最初のは学生番号とハイフンラインを printf を使って表示させるのでは無く,プログラムの中に書いたためエラーになったもの,二つ目はコメント行の */ を消してしまったものです.残念です.
学生番号と名前の無い答案もありました.これも採点しませんでした.
b1473
後は,今年も大馬鹿者が出てきました.まったく困ったものです.本来なら単位無しなので,以後はきちんとして下さい.
b1308 b1315
解答用紙を使用していない人も1名いました.
b1269
さて,以下は不備や問題のある解答の例です.自分の解答と似たものが無いかよく見てください.
printf("Random numbers: ");
printf("%d", num1);
printf(" and ");
printf("%d\n", num2);
|
上の例は間違いでは無いのですが,このように分割しないで printf 一つで済ませた方がすっきりします.
a = rand()%11*2+1;
b=rand()%11*2+1;
|
これも間違いでは無いのですが,同じ形式の式なのにスペースの使い方が異なっています.
printf("Random numbers: %d and %d\n", m % 21 + 1 , n % 21 + 1 );
|
発生させるのは奇数です.
printf("and %d\n", rand() % 11*2 + 1);
int a = rand() % 11*2+1, b = rand() %11*2 + 1;
|
毎回乱数を発生させると和を求めるときに違う数になってしまいます.
while(1){
a = rand() % 21 + 1;
b = rand() % 21 + 1;
if(a % 2 == 1 && b % 2 == 1){
printf("Random numbers: %d and %d\nSum of above numbers: %d\n\n", a, b, a + b);
break;
}
}
|
たかが奇数を発生させるだけでこんな不細工な長い処理を殻のはセンス無しです.
int num1 = rand() % 10 + 1;
int num2 = rand() % 10 + 1;
int tas,kisu1,kisu2;
kisu1 = 2*num1 + 1;
kisu2 = 2*num2 + 1;
|
この処理では1は発生しません.
printf("Random numbers: %d and %d\n",(num1*2)+1,(num2*2)+1);
printf("Sum of above numbers: %d\n\n",((num1*2)+1)+((num2*2)+1));
|
毎回こんな風に計算をしないで済ませるために変数というものがあります.
int n = rand() % 20 + 1;
int m = rand() % 20 + 1;
printf("Random numbers: %d and %d\n",n+1,m+1);
|
ぜんぜん奇数では無いですね.
以下はインデント(字下げ)のおかしいものです.ただし,自分では見えないものもありますので,TABなのかスペースなのか注意しながら作業してください.基本的にはWebページからのコピーはこのような問題を起こす可能性が高いです.
printf("-----------------------------\n");
return(0);
}
|
int a, b;
a = rand() % 11 * 2 + 1;
b = rand() % 11 * 2 + 1;
|
printf("-----------------------------------------------\n");
return(0);
}
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int a,b,c;
|
なんで関数 main() のブロックを1文字下げるのでしょう?
main()
{
srand((unsigned) time(NULL));
int a, b, m;
|
printf("-----------------------------\n");
return(0);
}
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
srand((unsigned) time(NULL));
int a,b;
a=rand() % 11 *2 + 1;
b=rand() % 11 *2 + 1;
|
/* この行以降に解答のプログラムを書くこと */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
|
なんで全部1文字分下がっているのでしょう?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
printf("My student number: s144099\n\n");
int a= rand(),b= rand(),c,d;
c = ( a % 10 + 1 ) * 2 + 1 ;
d = ( b % 10 + 1 ) * 2 + 1 ;
printf("Random numbers: %d and %d \n",c,d);
printf("Sum of above numbers: %d \n\n", c + d);
printf("------------------------\n");
}
|
なんで main() も下がるのでしょう?
- 前回の復習
四則演算と剰余を利用した乱数の発生について学習しました.四則演算では剰余が非常に大事であることを説明しましたが,今後も頻繁に登場するので早く使いこなせるようになってください.実習時に問題が見られた乱数と printf の使い方について以下にもう一度まとめておきます.
- 乱数について
C言語に標準で用意されている乱数を発生する関数 rand() ですが,これは整数型の数で扱える最大桁数のものが出ます.以下のような処理で確認してください.
int num;
num = rand();
printf("%d\n", num);
|
これでは扱いにくいので,例えばサイコロのように1から6までの整数というようなときには,その範囲の数に限定して発生させなければいけません.そのために,使用するのが剰余算です.6の剰余を利用することによって6種類の整数に限定して発生させることが可能です.
int num;
num = rand() % 6;
printf("%d\n", num);
|
ただし,それでは剰余は割り切れたときに0になってしまいますし,最大値は割る数よりも1だけ小さい数ですので,正の整数にするために加算をしておく必要があります.それが結局,例として紹介したものになっています.
ですので,rand() を使用するときにはその後の剰余算と必ずセットになりますので,覚えておいてください.
- printf 文
printf 文を使用すると表示したいテキスト(文字列)の中に変数の値を入れて表示することが可能です.もう一度,例をよく見て理解してください.
- if 文
今回からは「制御構造」というプログラミングの重要な要素を含む学習です.教
科書をよく読んでしっかり理解してください.以下に特に注意する点を挙げてお
きます.
- 処理の流れ
前回までのプログラムでは,プログラムの1行目から順に処理を行って,最後に
return(0); が来て,全ての処理を終わり,画面をプロンプトに
戻してくれていました.if のような制御構造が入ると,全ての
行を順番に実行するのではなく,場合によって実行するかしないか分かれ
ることになります.必ず実行される行とそうでない行があることに注意し
てください.それを分かりやすくするのが「フローチャート」です.
- フローチャート
教科書の図3.1からいわゆるフローチャートの紹介が始まっています.プログラ
ムにおける処理の流れを表したもので,ややこしい処理もフローチャートで理解
するとわかりやすくなるので,今後は必要に応じて自分でも作るようにしてくだ
さい.
- 関係演算子
大小関係を判断する演算子です.頻繁に使用しますので,覚えておいてください.
- 等価演算子
等しいか等しくないかを判断する演算子です.ここで,高い頻度で間違える可能
性があるのが「等しい」かを判断する == です.等号一つでは「代入」
なのですが,ときどき間違えますので,注意してください.例えば,以下のプロ
グラムは動作がおかしくなります.
#include <stdio.h>
main()
{
int n = 1;
if(n = 2)
printf("OK\n");
return(0);
}
|
- ブロック
教科書のp.24にブロックの紹介があります.if 文においては,if
の中の処理が1行だけであるならばブロックを表す中括弧 { }
は省略可能ですが,複数の処理が入ると中括弧が必須になります.ま
た,ブロック内ではインデント(字下げ)を行ってください.
- else 処理
if が出てくると,その条件式が真の場合に処理が行われることになります.式が偽の場合には何も起こりません.それだけでは簡潔な処理や必要な処理が作れないので,プログラミング言語には必ず else というものが用意されています.日本語で言うなら「そうでないならば」に相当します.
else を使用するかどうかの基準は,必ず何かの処理を行なうかどうか,です.この後の実習で試してみましょう.
- 実習
実習の演習問題は当日ご案内します.
- 次回の予習範囲
教科書のp.33まで予習をしてきてください.特に,論理演算子のところは重要で
すので,しっかり学習してください.
- 宿題
授業の終わりに宿題の案内をします.ただ
し,問題を見ることができるのは28日以降です.
レポート提出システムを利用します.
- メンター学習室
内容も宿題も段々と難しくなっていきます.つまづく前にメンター学習室を活用して十分にプログラミング練習をしましょう.開設時間は水曜日の14:30-16:00です.