- 本日の作業内容
- 前回の宿題について
今回はついに無限ループが出てきました.これは面倒なので,無限ループにならないことを確認してからの提出をお願いします.また,コンパイルエラーも残念ながら出ています.こちらも自分で確認するとわかるので,そこんとこよろしく.
無限ループ: C008
コンパイルエラー: b2126 b2153
そして,相変わらずの解答用紙の不使用です.もう採点しないことは前回このWebテキストにも書いておいたので,分かってもらえるはずなのですが.
解答用紙不使用: b1923
朗報は,インデントの不備が減ったことでしょうか.この調子で,皆さんも適切なインデントで見やすいコードを書くことに努めましょう.
不適切なインデント: b2118 b2134
以下は例によって問題のあるプログラムの例です.参考にしてください.
for() 文などの反復処理でよく使用する変数 i ですが,これは整数の英語 integer から来ているもので,a とかでなく i を使うことには意味があります.double 型の変数名としては適切ではないので,そのときそのときで適切な変数名をつけるよう注意してください.
int i, num, count, A = 0;
|
変数 count が初期化されていないので値が不定となり,後々変な値が出ます.また,変数名は小文字で始めましょう,となんども言っているのですがね.
float num = rand() %9999 + 1;
|
発生する乱数が4桁の正の整数になっていないですね.出るのは,1から9999です.
number = rand() %9990 + 9;
|
さらに不可解な乱数です.9から9998の範囲ですよね.
for(;num>1 ;)
{
if(num>1)
{
num /= 2;
count++;
printf("%.2f ", num);
}
}
|
このようなプログラムがいくつか見られました.でも,for() 文の中の if() は不要ですよね?
int num, a=0;
num = rand() % 9000 + 1000;
printf("Original radiation dose: %d Bq\n\n", num);
for( ; num>1; )
{
num /= 2;
a += 30;
printf("%d ", num);
}
|
変数を int 型で定義してしまったので,小数部が切り捨てられて,答えが変わってしまいます.
printf("original radiation dose: %.f Bq\n\n", num);
for(; num>0.5; num/=2)
{
printf("%.2f",num);
if(num>1)
{
year +=30;
}
}
|
ただの %f だと,標準的な仕様では小数部が6桁表示されますので,問題文で指定している出力形式と違ってしまいます.教科書p.27の書式指定子のところをしっかり復習してください.
for ( i = 0; 1<connecter; )
{
double shousuu=(connecter*100) /2;
double round(double shousuu);
printf("%.2f ",shousuu/100);
connecter=shousuu/100;
i=i+1;
}
|
インデントもダメなのですが,それ以上に for() 文の中で double 型などを定義しています.反復処理を行っているので,毎回宣言することになりますよね.なぜ,for() 文の中で定義するのでしょうか?
さて,今回は絶対にやっちゃダメなのが出てきてしまいました.プログラミングは,これまでにも説明しましたが,自分が楽をするために行うものです.自動化や自動処理といった放っておけばあとは勝手にコンピュータがやってくれるという状態にするのがプログラムの目的です.手作業で頑張るのはダメです.
if(num>=8193 && num<=9999)
{
for(i=2; i<=16384; i *= 2)
{
printf("%.2f ", num / i);
}
printf("\n");
printf("420 years to become less than 1 Bq\n");
}
else if(num>=4096 && num<=8191)
{
for(i=2; i<=8192; i *= 2)
{
printf("%.2f ", num / i);
}
printf("\n");
printf("390 years to become less than 1 Bq\n");
}
else if(num>=2048 && num<=4095)
{
for(i=2; i<=4096; i *= 2)
{
printf("%.2f ", num / i);
}
printf("\n");
printf("360 years to become less than 1 Bq\n");
}
else if(num>=1024 && num<=2047)
{
for(i=2; i<=2048; i *= 2)
{
printf("%.2f ", num / i);
}
printf("\n");
printf("330 years to become less than 1 Bq\n");
}
else if(1000<=num && num<=1023)
{
for(i=2; i<=1024; i *= 2)
{
printf("%.2f ", num / i);
}
printf("\n");
printf("300 years to become less than 1 Bq\n");
}
|
- 前回の復習
for 文について学習してきました.演習問題の解答例も載せていますので,それらを参考に反復処理を理解できるようになってください.
- while 文
while 文は,for 文と異なり,実行条件(式2)しか指定しま
せん.その分,自由度が高いので,熟練した人はよく使用します.最初は
for 文の方が簡単なので,この授業では基本的に for
文を使用しますが,知っておいて損はありません.
for 文で式2だけを使用する場合や式3が無い場合などは while 文を使用する方がすっきり書けることがあります.
前回の演習問題の i. は, while 文を使用すると以下のように書けます.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned) time(NULL));
int num = rand() % 90 + 10, i;
printf("Number: %d\nDivisors : ", num);
i = 1;
while(i<=num)
{
if(num%i==0)
{
printf("%d ", i);
}
i++;
}
printf("\n");
return 0;
}
|
- 実習
実習の演習問題は当日ご案内します.
- 次回の予習範囲
教科書のp.62-64を一応一通り読んでおいてください.実際にはより複雑な for 文にチャレンジしますので, for 文の基礎をしっかり押さえておくようにおねがいします.
- 宿題
宿題はレポート提出システムを利用して行いますので,当日の18:00に公開予定の課題を確認して下さい.