はじめに
どうも! みなため(@MinatameT)です。
今回は、「3の倍数と3のつく数字だけを表示するプログラム」のソースコードと実行結果を紹介します。ただし、扱う数字の範囲は1から99までとします。
今回の記事は(私の書く内容にしては)難易度がやや高いですが、頑張って理解していきましょう。
必要な文法
- floor関数を使うので、#include<math.h>を忘れずに宣言しておいてください。
- x = floor(a) で、aの小数部分をすべて切り捨てた値をxに代入します。例えば、a = 1.89ならx = 1となります。
- f = modf(a,&i) で、aの整数部分をiに、小数部分をfに代入します。データ型は原則すべてdouble型です。例えば、a = 1.23なら、i = 1、f = 0.23となります。
これらを踏まえて、ソースコードと実行結果を確認していきます。ただし、これは「解答例」ですので、他のやり方もあります。
3の倍数と3のつく数字だけを表示するプログラム
ソースコード
#include<stdio.h>
#include<math.h>
int main(void)
{
int n,f;
double i;
for(n=1; n<=99; n=n+1) //1から99の範囲
{
if((n%3)==0) //3の倍数なら
{
printf("%d\n",n);
}
else
{
f = (modf(((double)n/(double)10),&i))*10 + 0.1; //1の位を抽出する。
if((floor(n/10))==3) //10の位が「3」なら
{
printf("%d\n",n);
}
else if(f==3) //1の位が「3」なら
{
printf("%d\n",n);
}
}
}
return(0);
}
nは、1から99まで、(for文によって)1ずつ増えていく整数値です。
まず、nが3の倍数であることを判定するために、nを3で割ったあまりを求めます。そして、それが0かどうかを確認します。このとき、0であれば3の倍数です。
3/3=1のあまりは0ですし、6/3=2のあまりも0ですし、9/3=3のあまりも0だからですね。
f = で始まる行についてですが、この行では1の位を抽出しています。やっていることのイメージとしては、次の手順のとおりです。
- 例えば、「73」の1の位を抽出するとします。
- 「73/10」をして「7.3」になりました。
- 「7.3」の小数部だけを抽出して「0.3」になりました。
- 「0.3」を10倍して「3」になりました。これで、「73」の1の位である「3」が抽出できました。
「(double)n/(double)10」でn/10を計算していますが、modf関数の中ではdouble型を使う必要があるので、int型からdouble型に型キャスト(変換)しています。型キャストは、変数の前に(double)をつければOKです。
&iは、iにn/10の整数部分を代入していますが、今回、iは使いません(本当はif文で使えるのですが、わかりにくいので使っていません。)。したがって、&iは無視してください。
n/10の小数部を10倍したものに+0.1しています。10倍する理由は、nの1の位を抽出するためです。しかし、このままだと誤差が発生する場合があります。
+0.1する理由は、n/10の結果に発生した誤差を補正するためです。double型の割り算の計算結果は、例えば、9.00のはずが誤差で8.99になる(実際はもっと小さな誤差です。)……といったことがあるので、+0.1をして補正しています。
fはint型なので、小数部は勝手に切り捨てられます。例えば、8.11は8になります。
このように、「n/10の小数部」を10倍して+0.1したものをf(int型)に代入することで、nの1の位をfに抽出できます。
ちなみに、nの10の位は、n/10の小数部を切り捨てることで抽出できます。
実行結果
3
6
9
12
13
15
18
21
23
24
27
30
31
32
33
34
35
36
37
38
39
42
43
45
48
51
53
54
57
60
63
66
69
72
73
75
78
81
83
84
87
90
93
96
99
見事、3の倍数と3のつく数字だけが表示されました!
今回はなかなか難しかったと思います。皆さん、お疲れ様でした。
関連記事