【基礎から学ぶプログラミング言語】 C言語/プログラムで演算をする方法 ~int関数とdouble関数の使い方~

IT
スポンサーリンク
スポンサーリンク
スポンサーリンク

私たちは日常生活で何気なくパソコンやスマートフォンというコンピュータを使用しています。
これらのコンピュータが普通に動作しているのは、そのようにプログラミング言語が記述されているからです。
本記事は、そんなプログラミング言語について実際に学びながら要点をまとめていったメモという位置付けになります。
私は専攻が電気でプログラムに関しては全くの初心者ですので、同様に初心者の方には理解しやすくなっているかと思います。

今回は、「C言語/プログラムで演算をする方法」についての説明です。

1.初めに

前回、printfという関数の基本的な使い方について紹介しました。
その中で、その基本的な機能の1つとして加算ができることを説明しました。
printfに関する説明なので簡単にしか紹介はしませんでしたが、他にも色々な関数を組み合わせることでもうちょっと複雑な演算ができるようになります。

今回はもう少し踏み込んで、printfを使った四則演算や変数の取り扱いについてまとめていきます。

2.printfを用いた四則演算

まずは、四則演算…加算(足し算)・減算(引き算)・乗算(掛け算)・除算(割り算)のやり方からです。
前回の基本的な説明の最後で加算の方法を説明していますので、若干それの復習も混ざっています。

以下のようにプログラムを書いてみます。

#include<stdio.h>

void main() {
printf(“%d + %d = %d\n”, 5, 4, 5 + 4); /* 加算 */
printf(“%d – %d = %d\n”, 5, 4, 5 – 4); /* 減算 */
printf(“%d * %d = %d\n”, 5, 4, 5 * 4); /* 乗算 */
printf(“%d / %d = %d\n”, 5, 4, 5 / 4); /* 除算 */
}

図1

前回説明しましたが、%dは整数を置き換える変換指定子です。
このように、変換指定子内に計算式を入力することで、四則演算が可能になっています。

「+」が加算、「-」が減算、「*」が乗算、「/」が除算に対応しています
この関係性はExcelでも同様になっているので、違和感は無いかと思います。

「+」などの記号の前後にスペースを入れてありますが、これは見づらいから入れただけです。
別に無くても問題なく動きます。

このプログラムを実行すると、以下のように表示されます。

図2

ちゃんと四則演算されて…ないですね、除算だけ。
加算・減算・乗算は問題なく行われているのですが、除算だけ余りの部分が省略されてしまっています。
5÷4は1.25もしくは1余り1ですからね。

除算にて余りを表現したい場合、「%」を使用します。
具体的には、以下のように表現する必要があります。

図3


【5%4】と入力することで余りだけが表示されるようになります。
若干不便ですが、そういうものだと割り切りましょう。

コメント機能について

しれっと【/* 加算 */】という謎の表示が出てきましたが、これはメモ書きを残すコメント機能です
ブロックコメントと言います。
メモ書き・注釈が必要になった時に、【/**/】の「*(アスタリスク)」の間に好きな文字を入力してみてください。
すると、そこに入力した文字はメモ書きだと認識されてプログラムには何も作用しなくなります。

ブロックコメントの場合、【/*】と【*/】の間に挟まれていさえすれば、数行に渡ってメモ書きをしても問題無いです
長文のメモ書きが必要な場合はブロックコメントを活用しましょう。

また、【//】の後ろに文字を入力する方法でもコメント扱いになります
こちらは行コメントと言います。
「/* 加算 */」のところに「// 加算」と書かれていても、コメント扱いになるのです。
ただし、名称からわかる通り、1行にしか対応していません
数行に渡ってメモ書きをしたい場合はブロックコメントを用いましょう。

昔はブロックコメントしか無かったのですが、いつからか行コメントも標準搭載されるようになったようです。
個人的には1行でも数行でも対応していて昔から存在するブロックコメントだけで良いような気はしますが、そこは個人個人でやりやすいように使い分けてください。

3.変数の定義の仕方

ここまでの演算では、全て定数を取り扱ってきました。
定数とは、数値が一定の数のことです。

ですが、日常的な演算って全てが定数とは限りませんよね?

例えば、体重[kg]÷身長[m]の2乗で算出されるBMIというものが存在します。
BMIとは、国際的に用いられている肥満度の判定方法です。
なので、自分の身長と体重さえ分かれば、自分がどの程度肥満なのかがなんとなくわかるようになっています。

しかし、今の自分と1年後の自分では、身長も体重も同じとは限りません。
まだ若いなら成長して身長が伸びるかもしれませんし、ダラダラと過ごしていれば体重がブクブクと増えているかもしれません。
当然ですが、その時々によってBMIは変わってくるのです。

ここで言う身長・体重・BMIのように変化する数は、一般的に変数と呼ばれます。

演算する場合も何かしらの変数を使用したいと考えた場合、intという関数を使用する必要があります。
実際にプログラムを見ながら考えてみた方が早いので、まずはプログラムを入力してみましょう。

#include<stdio.h>

void main() {
int a;
a = 1;
printf(“%d + %d = %d\n”, a, a, a + a);
}

図4

まず、【int a】と入力することで、“a”という名前の整数を入れることができる箱(=変数)を用意することができます
その下で【a = 1】と入力することで、「“a”に“1”を代入します」という意味になります。
この変数に数値を代入することを初期化と呼びます。
【a = 2】にすれば以降は“a”を数字の“2”として、【a = 3】にすれば以降は“a”を数字の“3”として初期化されることになります。
なので、%dには1(a)という数字だと認識されるようになり、a(1)+a(1)=2という演算結果が導き出されているというわけです。

また、【int a】と【a = 1】をバラバラに宣言しなくとも、【int a = 1】とすれば変数の定義と値の代入が同時に可能になります。

ちなみに、初期化していない変数を使用してプログラムを実行すると、エラーが発生してうまく実行できなくなります。
仮に【int a】を消去してプログラムを実行した場合、「識別子“a”が定義されていません」や「初期化されていないローカル変数“a”が使用されています」といったエラーコードが出てきます。

また、最新の環境では特に問題は無いのですが、古い環境でC言語を用いた場合、初期化は必ず先頭部分に配置するというルールが存在しました
要するに、「{」のすぐ後には初期化が来なければエラーが発生したんです。
あくまで古い環境の場合に限った話なので気にする必要は無いのですが、一応頭の片隅には『そんなルールがあったんだなぁ』程度に思い出せるように置いておきましょう。

変数を複数定義する

変数を定義するにはintを使用すれば良いという点は理解してもらえたかと思います。
ただ、変数を複数使用したい場合もありますよね?
そんな時もintを使用すればOKです。

今回は、“a”の他にも“b”という変数を定義してみます。

#include<stdio.h>

void main() {
int a = 4;
int b = 2;
printf(“%d + %d = %d\n”, a, b, a + b);
}

図5

ここでは“a”と“b”を別々に定義しましたが、「,(コンマ)」で区切ることで連続して定義することも可能です。
以下のようなプログラムでも同様の結果が得られますので、試してみてください。

図6

変数を複数定義する(応用)

変数を複数定義すると、演算の幅が広がります。
一例として、平均値を演算してみます。

#include<stdio.h>

void main() {
int a = 4, b = 2;
int average = ( a + b ) / 2;
printf(“%dと%dの平均値は%dです。\n”, a, b, average);
}

図7

ここでは、“a”と“b”の他に“average”という文字列を変数として定義しました。
averageは平均という意味です。

ここではわかりやすいように変数を“average”と入力しましたが、実際はアルファベット1文字や数文字程度の英数字の組み合わせで定義することがほとんどです
厳密には、半角のアルファベット(小文字のa~z、大文字のA~Z)、数字(0~9)、アンダーバーだけ使用できます。
アルファベットの小文字と大文字は別文字扱いになります。

また、「最初の文字は数字にしてはいけない」「既存のC言語の予約語は使用できない」という決まりがあります。

予約語とは、intや後述のdoubleのようなあらかじめ用法が定められている単語のことです。
例えば、対数のことをlogと表すじゃないですか。
それなのに変数をlogと置いたら、対数を表すlogなのか、変数として定義したlogなのか、判断ができないでしょう?
プログラムにおいてもそうならないようにしているというだけの話です。

あらかじめaverageは「(a+b)/2」になるように定義しておいたので、その演算結果が表示されているわけですね。
このように、変数の計算に変数を使うこともできるのです。
…算数を知っていれば間違えはしないのですが、「a+b/2」にしてしまうと「b/2」が優先されて計算結果が変わってしまうので、しっかりと括弧で閉じましょうね。

ちなみに、変数を定義する関数はintだけでなく、doubleでも定義可能です
doubleの場合は、実数が入ります。

仮に平均値をdoubleで表す場合、実数なので変換指定子が%fに変わるという点に注意が必要です。

図8

%dのままにしているとprintfのところに波線が入り、実行結果が“0”になります。

図9

「=」はイコールではなく代入

intは、初期化をして、そこに数値を代入して使用します。
では、以下のように入力したら、結果はどのように表示されると思いますか?

#include<stdio.h>

void main() {
int c = 4, d = 2;
c = c + 1;
d = d * 3;
printf(“%d 、%d\n”, c, d);
}

図10

「c=c+1」という部分に違和感を覚えるかもしれませんが、ここの「=」という記号はイコールではなく代入という意味になります。
その為、cにc+1が代入されます。
結果、以下のように表示されます。

初期化した“c(4)”に+1された結果と、初期化した“d(2)”に×3した結果が表示されているでしょう?
若干ややこしいですが、こんな仕組みになっています。

代入演算子

上に示した図10のプログラムですが、全く同じ演算を以下のような表現でも実行することが可能です。

#include<stdio.h>

void main() {
int c = 4, d = 2;
c += 1;
d *= 3;
printf(“%d 、%d\n”, c, d);
}

図11

「+=」と「*=」という謎の表現がありますよね?
これらのことを代入演算子と呼びます。

何度も初期化を表す文字を入力するのが面倒な場合は覚えておくと良いかもしれませんね。

ただし、「+ =」や「* =」のように間にスペースを入れると代入演算子ではなくなってエラーが発生するので注意してください。

intとdoubleの変換

intは整数、doubleは実数と言いましたが、違いはわかりますでしょうか?

実数は虚数以外の全ての数を表していますが、整数は小数や分数を含まない数を指しています。
例を挙げると、実数なら1.1のような小数も表現できますが、整数には1.1は含まれないんです
実数の一部が整数ということですね。

詳しくは以下の記事にまとめてあります。


演算過程で整数(int)と実数(double)が入り乱れたとしても、勝手に小数点以下が切り捨てされたりして何だかんだでプログラムは動くのですが、その際にワーニングメッセージが出てきます。
この状態は望ましくないので、int→double、double→intに変換する場合は、キャストという処理をしましょう。

#include<stdio.h>

void main() {
int c = 4 , c2;
double d = 2.1 , d2;
c2 = (int)d;
d2 = (double)c;
printf(“c2 = %d 、d2 = %f\n”, c2, d2);
}

図12

intで“c2”、doubleで“d2”を初期化しているので、本来なら“c2”は整数、“d2”は実数を入れる必要があります。
ですが、ここでは“c2”に“d(実数である2.1)”、“d2”に“c(整数である4)”を代入してみます。

このような場合は、intに変換したい場合は(int)、doubleに変換したい場合は(double)と付け加えましょう。
これがキャストです。

こうしてキャストした結果、“c2”は“d(2.1)”が整数化されて“2”になり、“d2”は“c(4)”が実数化されて“4.0”になるわけです。

整数と実数で変換指定子も変わってくるので、覚えるのが面倒なら最初から使用するのは実数だけに絞った方が楽な気はします。

ちなみに、整数(int)を実数(double)に変換する場合は切り捨てなどの変化が起きない為、ワーニングは発生しません。
実数から整数への変換で切り捨てなどの変化が起きる場合のみワーニングが発生します。
まあ、ワーニングが発生しなくてもキャストをしておくに越したことはないですけどね。

4.データ型について

今回の説明ではintとdoubleという関数について詳しく説明してきました。
これらの関数はデータ型と呼びます。
この関数の後に続く文字列はどんなデータなのかを表している関数がデータ型に分類されます

intもdoubleも後に続くのは数字だったでしょう?
『後ろに付いているのは数字だよ~』と教えてあげるからデータ型というわけです。

データ型の関数は、一般的には「○○型」というように呼ばれます。
なので、ここまではint関数・double関数と記述していましたが、int型・double型と呼ばれていることが多いです。
関数であることには変わりは無いので、○○関数でも間違えているわけではないと思いますけどね。

intとdoubleの他のデータ型には、char(1Byteの符号付整数を表す)short(2Byteの符号付整数を表す)などが存在します。
この言い方で表すと、intは(4Byteの符号付整数を表す/※動作環境によっては2Byteになる)になります。

また、doubleなら(8Byteの倍精度浮動小数点実数を表す)となります。
倍精度と呼んでいるように、float(4Byteの単精度浮動小数点実数を表す)というものも存在します。
単純にfloatの倍のデータ量を持っているのがdoubleになりますので、floatを使う意味は特に無いです。
昔は今と違ってコンピュータの演算速度や記憶容量の関係でfloatを使っていたようです。
今のコンピュータスペックなら全部doubleにしても特に影響は無いので、大体はdoubleを使うようになっています。

データ型で代表的なものは上記で述べたような関数になりますが、そこまで詳しく覚えておく必要があるかと言われると微妙なところなので、intは整数の入れ物、doubleは実数の入れ物程度に理解しておけば充分かと思います。

以上、「C言語/プログラムで演算をする方法」についての説明でした。