https://youtu.be/oK3w2NXG270
\textcolor{pink}{四国めたん: } 教師役ですわ
\textcolor{lime}{ずんだもん: } 生徒役なのだ
\footnotesize \textcolor{pink}{四国めたん:} 皆さん、こんにちは。四国めたんです
\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ
\footnotesize \textcolor{pink}{四国めたん:} 今回もC言語のお勉強をしていきましょう
\footnotesize \textcolor{lime}{ずんだもん:} レッツゴーなのだ
\footnotesize \textcolor{pink}{四国めたん:} 第7回目の今回は 整数および浮動小数点数の変数を使用した四則演算 をしていきたいと思いますわ
\footnotesize \textcolor{lime}{ずんだもん:} 以前の回とはどう違うのだ?
\footnotesize \textcolor{pink}{四国めたん:} 以前は整数値や浮動小数点数そのものを使った演算でしたわね
\footnotesize \textcolor{pink}{四国めたん:} でも今回は変数同士や変数を含む演算を見て行きますわ
\footnotesize \textcolor{lime}{ずんだもん:} 了解なのだ
変数でも四則演算はできるのです
\footnotesize \textcolor{pink}{四国めたん:} とりあえず実例を見て行きましょう
#include <stdio.h>
void main()
{
int a = 1;
int b = 2;
int c = a + 3;
printf("aの値は%d、cの値は%dです。\n", a, c);
c = a + b;
printf("aの値は%d、bの値は%d、cの値は%dです。\n", a, b, c);
double x = 1.0;
double y = 2.0;
double z = x + 3.0;
printf("xの値は%f、zの値は%fです。\n", x, z);
z = x + y;
printf("xの値は%f、yの値は%f、zの値は%fです。\n", x, y, z);
}
printfでは複数の書式指定子を使えます
\footnotesize \textcolor{lime}{ずんだもん:} なんかprintf
の引数の数が増えているのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、今まではprintf
の 書式指定子 については1つしか使用してきませんでしたわ
\footnotesize \textcolor{pink}{四国めたん:} でも実際には複数の 書式指定子 を使用することができるのですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} 使用している 書式指定子 が増えた分、対応する変数を増やして順番にカンマ区切りで列挙するのですわ
\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ
整数の変数の演算を解説します
\footnotesize \textcolor{pink}{四国めたん:} それでは各部分を見ていきますわ
\footnotesize \textcolor{pink}{四国めたん:} 最初は整数の変数を使用した足し算ですわ
\footnotesize \textcolor{lime}{ずんだもん:} 最初に変数"a"と"b"を宣言、初期化しているのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、その後、変数"c"の宣言と同時に"a"に3を足した値で初期化を行っていますわね
\footnotesize \textcolor{lime}{ずんだもん:} printf
で結果を表示しているのだ
\footnotesize \textcolor{pink}{四国めたん:} その後"a"に"b"を足した値を"c"に代入していますわ
\footnotesize \textcolor{lime}{ずんだもん:} 結果をprintf
で表示しているのだ
浮動小数点の変数の演算を解説します
\footnotesize \textcolor{pink}{四国めたん:} 次は浮動小数点数の変数を使用した足し算ですわ
\footnotesize \textcolor{lime}{ずんだもん:} 最初に変数"x"と"y"を宣言、初期化しているのだ
\footnotesize \textcolor{lime}{ずんだもん:} でもおかしいのだ
\footnotesize \textcolor{pink}{四国めたん:} 何がですの?
\footnotesize \textcolor{lime}{ずんだもん:} 変数の宣言は括弧"{}"内の最初でしか行えなかったはずなのだ
\footnotesize \textcolor{pink}{四国めたん:} 古い情報ですわね
\footnotesize \textcolor{pink}{四国めたん:} 確かにC言語の古い仕様では、例外を除いて変数の宣言は括弧"{}"内の最初でしかできませんでしたわ
\footnotesize \textcolor{pink}{四国めたん:} でも最近の仕様では、他の言語の影響もあって制限が緩和されていますわ
\footnotesize \textcolor{lime}{ずんだもん:} そうなのか?
\footnotesize \textcolor{pink}{四国めたん:} ですので途中で変数を宣言しても問題ないのですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} それでは浮動小数点数の変数を使用した足し算に戻りますわよ
\footnotesize \textcolor{lime}{ずんだもん:} はいなのだ
\footnotesize \textcolor{pink}{四国めたん:} といっても整数の変数を使用した足し算と変わりませんわ
\footnotesize \textcolor{lime}{ずんだもん:} サラッと終わったのだ
\footnotesize \textcolor{pink}{四国めたん:} 他の演算についても同様ですわね
\footnotesize \textcolor{pink}{四国めたん:} このように 変数と数値 や 変数同士 の演算ができるのですわ
書式指定子の数についてのお話しです
\footnotesize \textcolor{lime}{ずんだもん:} ところで 書式指定子 の数よりも変数を多く列挙したらどうなるのだ?
\footnotesize \textcolor{pink}{四国めたん:} ワーニングが出て、余った分が無視されますわね
\footnotesize \textcolor{lime}{ずんだもん:} じゃあ 書式指定子 の数よりも変数を少なく列挙したらどうなるのだ?
\footnotesize \textcolor{pink}{四国めたん:} ワーニングが出て足りない分は適当な値が表示されますわね
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} とりあえずやってみますわね
#include <stdio.h>
void main()
{
int a = 1;
int b = 2;
int c = a + 3;
printf("aの値は%d、cの値は%dです。\n", a, c, b);
c = a + b;
printf("aの値は%d、bの値は%d、cの値は%dです。\n", a, b);
double x = 1.0;
double y = 2.0;
double z = x + 3.0;
printf("xの値は%f、zの値は%fです。\n", x, z);
z = x + y;
printf("xの値は%f、yの値は%f、zの値は%fです。\n", x, y, z);
}
\footnotesize \textcolor{lime}{ずんだもん:} なんか、変な値が出力されているのだ
\footnotesize \textcolor{pink}{四国めたん:} 警告も出力されていますわね
0や0.0による割り算は?
\footnotesize \textcolor{pink}{四国めたん:} ここでひとつ重大な問題がありますわ
\footnotesize \textcolor{lime}{ずんだもん:} 重大なもんだい?
\footnotesize \textcolor{pink}{四国めたん:} はい、変数に代入された値が0や0.0だった場合に割り算ができるのかどうかですわ
\footnotesize \textcolor{lime}{ずんだもん:} 0や0.0、そのもので割った場合はエラーが発生していたのだ
\footnotesize \textcolor{pink}{四国めたん:} とりあえず実行して確認してみましょう
\footnotesize \textcolor{pink}{四国めたん:} まずは0で確認します
#include <stdio.h>
void main()
{
int a = 1;
int b = 0;
int c = a / b;
printf("aの値は%d、bの値は%d、cの値は%dです。\n", a, b, c);
}
\footnotesize \textcolor{lime}{ずんだもん:} プログラムの実行自体はできたのだ
\footnotesize \textcolor{lime}{ずんだもん:} でも途中で止まってしまったのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、 Integer division by zero という バンドルされていない例外 が発生しましたわ
\footnotesize \textcolor{pink}{四国めたん:} 今度は浮動小数点数の変数でも確認してみましょう
#include <stdio.h>
void main()
{
double x = 1.0;
double y = 0.0;
double z = x / y;
printf("xの値は%f、yの値は%f、zの値は%fです。\n", x, y, z);
}
\footnotesize \textcolor{lime}{ずんだもん:} お~、実行されて結果も出たのだ
\footnotesize \textcolor{pink}{四国めたん:} 除算の結果は inf 、つまり 無限大 ということですわね
\footnotesize \textcolor{lime}{ずんだもん:} 無限大 という答えでは使い物にならないのだ
\footnotesize \textcolor{pink}{四国めたん:} 以上から整数、浮動小数点数共に変数が"0"の場合には割ることが出来ないと考えて良いと思いますわ
剰余算は可能ですか?
\footnotesize \textcolor{lime}{ずんだもん:} 変数を使用した剰余算はどのようになるのだ?
\footnotesize \textcolor{pink}{四国めたん:} 早速試してみましょう
#include <stdio.h>
void main()
{
int a = 1;
int b = 2;
int c = a % b;
printf("a%%bの値は%dです。\n", c);
double x = 1.0;
double y = 2.0;
double z = x % y;
printf("x%%yの値は%fです。\n", z);
}
\footnotesize \textcolor{lime}{ずんだもん:} 浮動小数点の剰余算x % y
の部分でエラーが出ているのだ
\footnotesize \textcolor{pink}{四国めたん:} とりあえず浮動小数点の部分を消去して実行してみましょう
#include <stdio.h>
void main()
{
int a = 1;
int b = 2;
int c = a % b;
printf("a%%bの値は%dです。\n", c);
}
\footnotesize \textcolor{lime}{ずんだもん:} 整数の変数を使用した剰余算は普通に実行出来ているのだ
\footnotesize \textcolor{pink}{四国めたん:} そうですわね
演算の順番は?
\footnotesize \textcolor{pink}{四国めたん:} 演算の順番についても見ていきましょう
\footnotesize \textcolor{lime}{ずんだもん:} 整数や浮動小数点数の場合とおなじではないのか?
\footnotesize \textcolor{pink}{四国めたん:} まあ、そうですわね
\footnotesize \textcolor{pink}{四国めたん:} とりあえずプログラムを実行してみましょう
#include <stdio.h>
void main()
{
int a = 1;
int b = 2;
int c = 3;
int d = a + b * c;
printf("a+b*cの値は%dです。\n", d);
d = (a + b) * c;
printf("(a+b)*cの値は%dです。\n", d);
double x = 1.0;
double y = 2.0;
double z = 3.0;
double w = x + y * z;
printf("x+y*zの値は%fです。\n", w);
w = (x + y) * z;
printf("(x+y)*zの値は%fです。\n", w);
}
\footnotesize \textcolor{pink}{四国めたん:} a + b * c
やx + y * z
は掛け算が先に計算されますので"7"や"7.000000"が答えとなりますわ
\footnotesize \textcolor{pink}{四国めたん:} (a + b) * c
や(x + y) * z
は括弧"()"内が先に計算されますので"9"や"9.000000"が答えとなりますわね
\footnotesize \textcolor{lime}{ずんだもん:} 期待どおりなのだ
整数と浮動小数点を混ぜた演算は?
\footnotesize \textcolor{lime}{ずんだもん:} 整数と浮動小数点数の変数が混ざった演算はどのようになるのだ?
\footnotesize \textcolor{pink}{四国めたん:} とりあえずプログラムを実行してみましょう
#include <stdio.h>
void main()
{
int a = 1;
double x = 2.0;
double y = a + x;
printf("a+xの値は%fです。\n", y);
y = x - a;
printf("x-aの値は%fです。\n", y);
y = a * x;
printf("a*xの値は%fです。\n", y);
y = x / a;
printf("x/aの値は%fです。\n", y);
}
\footnotesize \textcolor{lime}{ずんだもん:} 特に問題なく計算できているのだ
\footnotesize \textcolor{pink}{四国めたん:} 自動的に整数の変数の値が浮動小数点数に変換されてから計算されていますわね
\footnotesize \textcolor{lime}{ずんだもん:} 変数"y"の型をint
とするとどうなるのだ?
\footnotesize \textcolor{pink}{四国めたん:} 浮動小数点数での計算が行われた後、変数"y"に値を入れる際に小数点以下が切り捨てられて整数に変換されますわ
\footnotesize \textcolor{pink}{四国めたん:} 確認してみましょう
#include <stdio.h>
void main()
{
int a = 1;
double x = 2.0;
int y = a + x;
printf("a+xの値は%dです。\n", y);
y = x - a;
printf("x-aの値は%dです。\n", y);
y = a * x;
printf("a*xの値は%dです。\n", y);
y = x / a;
printf("x/aの値は%dです。\n", y);
}
\footnotesize \textcolor{lime}{ずんだもん:} 確かに整数に変換されているのだ
整数の変数への浮動小数点数の代入
!
整数の変数に浮動小数点数を代入する場合、小数点以下の数値が切り捨てられます
当然ですが、この操作は大変大きな誤差を発生させます
ですので計算の途中で浮動小数点数を整数の変数に代入することは避けるべきです
とはいえどうしても浮動小数点数を整数の変数に代入する必要がある場合は計算の最後のみに限るべきです
その際は単に代入するだけではなく、"math.h"に含まれるceil
関数による切り上げやfloor
関数による切り下げなどを使っても良いでしょう
負数の扱いに違いが出るので、どれを使うかは慎重に選んでください
#include <stdio.h>
#include <math.h>
void main() {
double x = -1.2;
int a = x;
int b = ceil(x);
int c = floor(x);
printf("整数への代入は%d\n", a);
printf("ceolは%d\n", b);
printf("floorは%d\n", c);
}
サンプルコードを実行した場合、
整数への代入は -1
ceolは -1
floorは -2
となります
正数の場合には整数への代入はfloor
と同じですが、負数の場合には整数への代入はceil
と同じ動作となります
なおC99以降では四捨五入にround
関数を使用することができます
\footnotesize \textcolor{lime}{ずんだもん:} ところで演算後に同じ変数に代入することはできないのか?
\footnotesize \textcolor{pink}{四国めたん:} できますわ
\footnotesize \textcolor{pink}{四国めたん:} 確認してみましょう
#include <stdio.h>
void main()
{
int a = 4;
double x = 2.0;
x = a + x;
printf("a+xの値は%fです。\n", x);
x = x - a;
printf("x-aの値は%fです。\n", x);
x = a * x;
printf("a*xの値は%fです。\n", x);
x = x / a;
printf("x/aの値は%fです。\n", x);
}
\footnotesize \textcolor{lime}{ずんだもん:} 確かに演算の答えが変数"x"に代入されているのだ
\footnotesize \textcolor{pink}{四国めたん:} 2番目以降の演算x - a
やa * x
, x / a
の変数"x"については前の演算で得られた答えを使用していることが確認できますわね
まとめ
\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした。
\footnotesize \textcolor{pink}{四国めたん:} 以上で 変数を使用した四則演算 を終了しますわ
\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ
Discussion