天国にいけるC言語入門 シーズン1 パソコン超初心者がゼロから東方風シューティングをつくる編 ver.0.4.15.789 RELIEF
おめでとう 実数値の数値計算の実行結果を整数値表示にするカールトンさんの問題も解決しました 解その1 キャスト演算子を用いる場合
🌻🌼実数を含む計算式の計算結果を整数値で表示する方法 解🌼🌻
おめでとう 実数値の数値計算の実行結果を整数値表示にするカールトンさんの問題も解決しました 解その1 キャスト演算子を用いる場合
😊おめでとう😊
実数値の数値計算の実行結果を
整数値表示にするカールトンさんの問題も解決しました 解その1
キャスト演算子を用いる場合
清美「
#include <stdio.h>
int main(void)
{
float a;
a=1.05;
printf("あなたの預金額はただいま%f円です。\n",10000*a);
return 0;
}
プログラムの実行結果(統合開発環境EAZY IDECの場合)
あなたの預金額はただいま10499.999523円です。
プログラムの実行結果(統合開発環境Visual Studioの場合)
あなたの預金額はただいま10500.000000円です。
このプログラムの実行結果(統合開発環境EAZY IDECの場合)を
キャスト演算子をもちいて
あなたの預金額はただいま10500円です。
と表示させてみるね。」
清美「マジカルソースコード変形~~~第1形態💖
#include <stdio.h>
int main(void)
{
float a;
a=1.05;
printf("あなたの預金額はただいま%d円です。\n",(int )(10000*a));
return 0;
}
プログラムの実行結果(統合開発環境EAZY IDECの場合)
あなたの預金額はただいま10499円です。
プログラムの実行結果(統合開発環境Visual Studioの場合)
あなたの預金額はただいま10500円です。
清美「このようにキャスト演算子を用いると
プログラムの実行結果(統合開発環境EAZY IDECの場合)を
あなたの預金額はただいま10499.999523円です。
から
あなたの預金額はただいま10499円です。
に
変更させることができるんだよ
でも
(int )(10000*a)の部分を
(int )10000*aと記述して
ソースコードを構成すると
#include <stdio.h>
int main(void)
{
float a;
a=1.05;
printf("あなたの預金額はただいま%d円です。\n",(int )10000*a);
return 0;
}
プログラムの実行結果
あなたの預金額はただいま0円です。
となるんだ
なぜなら
(int )10000*aの(int )は10000*a全体にかかるのでなくて
10000だけにかかる
つまり
整数値10000を整数値10000に変更したことになるんだよ
だから
(int )10000*aは
結局
整数値10000に実数値の型float型の変数a(に格納されている実数値)をかけることになるから
整数値10000の数値の型変換がおこり
整数値10000は実数値の型(の形式でメモリ)に格納し直されることになります
(int )10000*aは
実数値×実数値
となるので
(int )10000*aの計算結果は実数値になります。
だから
printf("あなたの預金額はただいま%d円です。\n",(int )10000*a);
を実行すると
実数値を%d出力変換指定子を使ってprintf出力表示するということになり
プログラムの実行結果は
あなたの預金額はただいま0円です。
と表示されることになるんだね。
だから
(int)10000*aではなく
(int)(10000*a)
と記述するんだね。」
聡子「清美ちゃん すんご~いい\(^o^)/」
清美「まだまだ~😊
10000*a=10499.999523の状態で
キャスト演算子(int)をこのように
(int)(10000*a)
と用いた場合
10499.999523は整数値に型変換される
整数値の型int型の形式でメモリに格納し直されることになるので
10499.999523の小数点以下の項は切り捨てられて
(int)(10000*a)=10499
になるんだよ~
(EAZY IDECの場合)
そう
💖小数点以下の項は四捨五入でなく切り捨てられるんです💖
これが
キャスト演算子のシステムなんだ~きゃはっ
だから
このままでは
プログラムの実行結果を
あなたの預金額はただいま10500円です。
と表示することはできない。
どうしよ~ってなるよね~
聡子ちゃん なんとかして~
きゃっ きゃっ💖💖💖 」
聡子 「ええっ!?」
聖美 「はいぃ?」
清美「実はキャスト演算子を使って
プログラムの実行結果
あなたの預金額はただいま10499.999523円です。
を
あなたの預金額はただいま10499円です。
でなく
あなたの預金額はただいま10500円です。
に変更する
いい方法があるのです。
それは次のプログラムなの。
マジカルソースコード変形~~~第2形態~~~~~💖
」
#include <stdio.h>
int main(void)
{
float a;
a=1.05;
printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));
return 0;
}
プログラムの実行結果(EAZY IDECの場合)
あなたの預金額はただいま10500円です。
プログラムの実行結果(Visual Studioの場合)
プログラムをデバッグなしで実行すると
いったん
警告 C4305 '=': 'double' から 'float' へ切り詰めます。 Project6 c:\users\solarplexuss\source\repos\project6\project6\source.cpp 5
と表示されますが
あなたの預金額はただいま10500円です。
と表示されます。
聖美「おお すご~い
なんでかわからないけれど
printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a));
から
printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));
に変更しただけで
プログラムの実行結果が
あなたの預金額はただいま10499円です。
から
あなたの預金額はただいま10500円です。
に変更されてる!」
聡子「(int)(10000*a+0.5))の中の0.5がミソみたいね。」
清美「実数値を含む計算式の計算結果は実数となるので
実数値を含む計算式の計算結果は
かならず小数点以下の数値を含みます
このとき
😊小数点以下第1位😊
は次の数値達のように0から9のいずれかの値をとるよね。
(👇小数点以下第1位に注目してください)
7.000000
323.0234
1.111
6.23444555
5.3346
2.4555
3.54567
4.688888
1.74
2.8686
2.9999
などなど・・・
このままではわかりにくいので
ここでは
小数点以下第1位が
5
6
7
8
9
となっている実数値
10499.5
10499.6
10499.7
10499.8
10499.9
と
小数点以下第1位が
0
1
2
3
4
となっている実数値
10500.0
10500.1
10500.2
10500.3
10500.4
についてかんがえてみるね
今は10000*aの計算結果は(EAZY IDECの場合)
10499.999523
だったから
10000*a=10499.999523
は
👇
10499.5
10499.6
10499.7
10499.8
10499.9
10000*a=10499.999523👈このあたりの数値
10500.0
10500.1
10500.2
10500.3
10500.4
👆
このように
これらの実数値の真ん中あたりの大きさの実数値
となるの
これらの
実数値をキャスト演算子(int)をつけてprintf出力表示すると
#include <stdio.h>
int main(void)
{
printf("%d\n",(int )10499.5);
printf("%d\n",(int )10499.6);
printf("%d\n",(int )10499.7);
printf("%d\n",(int )10499.8);
printf("%d\n",(int )10499.9);
printf("%d\n",(int )10499.999523);
printf("%d\n",(int )10500.0);
printf("%d\n",(int )10500.1);
printf("%d\n",(int )10500.2);
printf("%d\n",(int )10500.3);
printf("%d\n",(int )10500.4);
return 0;
}
プログラムの実行結果(EAZY IDECの場合)
プログラムの実行結果(Visual Studioの場合)
10499
10499
10499
10499
10499
10499👈printf("%d\n",(int )10499.999523);の実行結果です
10500
10500
10500
10500
10500
C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 2703348) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...
が表示されるの
このプログラムでは
キャスト演算子(int)を
10499.5
10499.6
10499.7
10499.8
10499.9
10000*a=10499.999523👈このあたりの数値
10500.0
10500.1
10500.2
10500.3
10500.4
に用いることにより
10499.5
10499.6
10499.7
10499.8
10499.9
10000*a=10499.999523👈このあたりの数値
10500.0
10500.1
10500.2
10500.3
10500.4
の
小数点以下の部分が切り捨てられているよね。
これらの数値に0.5を足した
10499.5+0.5
10499.6+0.5
10499.7+0.5
10499.8+0.5
10499.9+0.5
10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値
10500.0+0.5
10500.1+0.5
10500.2+0.5
10500.3+0.5
10500.4+0.5
すなわち
10500.0
10500.1
10500.2
10500.3
10500.4
10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値
10500.5
10500.6
10500.7
10500.8
10500.9
に
以下のように
👇
(int)(10500.0)
(int)(10500.1)
(int)(10500.2)
(int)(10500.3)
(int)(10500.4)
(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値
(int)(10500.5)
(int)(10500.6)
(int)(10500.7)
(int)(10500.8)
(int)(10500.9)
👆
キャスト演算子(int)を作用させると
小数点以下の項は切り捨てられ
(int)(10500.0)
(int)(10500.1)
(int)(10500.2)
(int)(10500.3)
(int)(10500.4)
(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値
(int)(10500.5)
(int)(10500.6)
(int)(10500.7)
(int)(10500.8)
(int)(10500.9)
は
10500
10500
10500
10500
10500
10500
10500
10500
10500
10500
10500
を表すことになります
実際に
10500.0
10500.1
10500.2
10500.3
10500.4
10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値
10500.5
10500.6
10500.7
10500.8
10500.9
に
キャスト演算子(int)をつけてprintf出力表示すると
👇
#include <stdio.h>
int main(void)
{
printf("%d\n", (int)(10499.5 + 0.5));
printf("%d\n", (int)(10499.6 + 0.5));
printf("%d\n", (int)(10499.7 + 0.5));
printf("%d\n", (int)(10499.8 + 0.5));
printf("%d\n", (int)(10499.9 + 0.5));
printf("%d\n", (int)(10499.999523 + 0.5));
printf("%d\n", (int)(10500.0 + 0.5));
printf("%d\n", (int)(10500.1 + 0.5));
printf("%d\n", (int)(10500.2 + 0.5));
printf("%d\n", (int)(10500.3 + 0.5));
printf("%d\n", (int)(10500.4 + 0.5));
return 0;
}
プログラムの実行結果(EAZY IDECの場合)
プログラムの実行結果(Visual Studioの場合)
10500
10500
10500
10500
10500
10500
10500
10500
10500
10500
10500
C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 2707212) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...
と表示されます。
そう
(int)(10500.0)
(int)(10500.1)
(int)(10500.2)
(int)(10500.3)
(int)(10500.4)
(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値
(int)(10500.5)
(int)(10500.6)
(int)(10500.7)
(int)(10500.8)
(int)(10500.9)
は
💖💖💖小数点以下の項が切り捨てられた整数値10500💖💖💖をあらわしているの
キャスト演算子(int)によって
実数値データがint型にキャスト(実数値データがint型に搭載)されるとき
🌞実数値型の形式でメモリに格納されている🌞
🌞実数値データは🌞
🌞整数値型の形式でメモリに格納し直され🌞
🌞整数値データとなるの🌞
簡単にいえば
実数値データの小数点以下の部分が切り捨てられて整数値データとなるのね
だから
10499.5
10499.6
10499.7
10499.8
10499.9
10000*a=10499.999523👈このあたりの数値
10500.0
10500.1
10500.2
10500.3
10500.4
に
0.5
を足して
10499.5+0.5
10499.6+0.5
10499.7+0.5
10499.8+0.5
10499.9+0.5
10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値
10500.0+0.5
10500.1+0.5
10500.2+0.5
10500.3+0.5
10500.4+0.5
としたものに
キャスト演算子(int)を
(int)(10499.5+0.5)
(int)(10499.6+0.5)
(int)(10499.7+0.5)
(int)(10499.8+0.5)
(int)(10499.9+0.5)
(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値
(int)(10500.0+0.5)
(int)(10500.1+0.5)
(int)(10500.2+0.5)
(int)(10500.3+0.5)
(int)(10500.4+0.5)
👆
このように作用させるという この方法を用いれば
10499.5
10499.6
10499.7
10499.8
10499.9
10000*a=10499.999523👈このあたりの数値
10500.0
10500.1
10500.2
10500.3
10500.4
のような
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データは
全部
10500
と表示されるんだよ
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データが
10500
になるって
まるで
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データが
四捨五入されて
10500
になったみたいね」
聖美「あっ ほんとね」
清美「
先程のプログラムにおいては
👇
#include <stdio.h>
int main(void)
{
float a;
a=1.05;
printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));
return 0;
}
プログラムの実行結果
あなたの預金額はただいま10500円です。
(統合開発環境EAZY IDECの場合)
👆
10000*a=10499.999523(統合開発環境EAZY IDECの場合)
となるんだけど
10000*a=10499.999523は
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データだよね
だから
10000*aに0.5が加えられた
10000*a+0.5=10499.999523+0.5=10500.499523
は
(10499.500000・・・に0.5を足した)
10500.000000・・・
から
(10500.499999・・・に0.5を足した)
10500.999999・・・
に収まる範囲の数値データとなります
そして
10500.000000・・・
から
10500.999999・・・
に収まる範囲の数値データ
に
キャスト演算子(int)を作用させると
小数点以下の部分が切り捨てられて
10500
となるね
同様に
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データの小数点以下第1位が四捨五入されても
小数点以下の部分が切り捨てられて
10500
となるね
つまり
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データに0.5を足して
キャスト演算子(int)を作用させた時に得られるデータ
と
10499.500000・・・
から
10500.499999・・・・・・
に収まる範囲の数値データを四捨五入した時に得られるデータ
は
等しくなるんだね
つまり
一般的に
元の実数値に0.5をたして
キャスト演算子(int)を作用させたときに得られるデータ
と
元の実数値の小数点以下第一位を四捨五入して得られるデータ
は
等しくなるの
つまり
実数値の小数点以下第一位を四捨五入したい場合は
実数値に0.5をたして
キャスト演算子(int)を作用させればよいということになるの」
聡子「うわあ 感心(*´▽`*)」
清美「えへ
お話は戻って
10499.500000・・・+0.5
10000*a+0.5すなわち10499.999523+0.5
10500.499999・・・+0.5
すなわち
10500.000000・・・
10000*a+0.5すなわち10499.999523+0.5
10500.999999・・・
にキャスト演算子(int)を作用させた
(int)(10500.000000・・・)
(int)(10000*a+0.5)すなわち(int)(10499.999523+0.5)
(int)(10500.999999・・・)
は
小数点以下の項が切り捨てられ
10500
10500
10500
を表すことになります
このことは
10499.500000・・・
10000*aすなわち10499.999523
10500.499999・・・
の
小数点以下第一位を四捨五入することになるの
ですので
printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));
が実行されると
あなたの預金額はただいま10500円です。
が
printf出力表示されるの
あまり重要ではないかもしれないけど
ここでの注意点は
10000*aが
10000*a=10499.999523
で
10499.500000・・・
から
10500.499999・・・・・・
の範囲内の数値データになっているということかな?
もし
10000*aの計算結果が
10499.999523
でなく
10000*a=10599.5となったりすると
10000*a=10599.5は
10499.500000・・・
から
10500.499999・・・・・・
の範囲外の実数値になっちゃうので
10000*aに0.5を足したものは
10500.000000・・・
から
10500.999999・・・・・・
の範囲外の実数値になっちゃうの
10500.000000・・・
から
10500.999999・・・・・・
の範囲外の実数値に
キャスト演算子(int)を作用させて
小数点以下の部分を切り捨てても
すなわち
10499.999999・・・
より小さい実数値
もしくは
10501.000000・・・
より大きい実数値
に
キャスト演算子(int)を作用させて
小数点以下の部分を切り捨てても
10500
にならならなくなります
いいかえるならば
10000*a=10599.5
の小数点以下第一位を四捨五入しても
10600となるのです
10500にはなりませんね
10599.5に0.5を足したものに
キャスト演算子(int)を作用させて
printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));
を実行しても
あなたの預金額はただいま10600円です。
と表示されて
あなたの預金額はただいま10500円です。
と
表示されることはありません
あなたの預金額はただいま10500円です。
が表示されるためには
そもそも
10000*aが
10499.500000・・・
から
10500.499999・・・・・・
の範囲内の数値であるというところがポイントなんだね」
聡子「わぁ ほんとだ~」
聖美「絶好調じゃな~い。清美」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます