さて、ここからが非常に重要になってくる部分です。
最初に書きましたが、コンピュータでは「入力」したデータを「処理」した結果を「出力」することで動いています。
この「処理」の部分で何をするかで、プログラム(ソフトウェア)が変わります。
同じ「30」とう数値を「入力」しても、それが「30人」を表すのか「30km」を表すのか「30番」を表すのか、「30点」を表すのかデータの意味によって「処理」が変わります。
世の中で動作しているソフトウェアすべての「処理」を書き出すことは不可能ですから、基本的なことについて説明をしていきます。(それでも膨大ですが・・・)
まずは、コンピュータの得意分野である、計算について説明します。
皆さんも良くご存知の四則演算のやり方から書いていきます。
C言語では、+、−、×、÷といった計算は当然できますが、数学で使う記号(演算子)と一部違いがあります。
数学での演算子 | C言語での演算子 |
---|---|
+ | + |
− | − |
× | * |
÷ | / |
「×」は「*(アスタリスク)」と書き、「÷」は「/(スラッシュ)」と書きます。
※キーボードを見ると「×」や「÷」は無いですよね(x「エックス」はありますが・・・)
また、整数での計算に「剰余(余り)」というものがあります。
「剰余」の演算子は「%(パーセント)」です。
「余り」って何に使うの?と思う方もいらっしゃるかも知れませんが、これが結構使うのです。
とりあえず、今回はやり方だけ。
最初は、入力せずに計算結果だけを表示します。
<sample program 004-01>
#include <stdio.h> int main(void) { printf("%d\n", 12 + 5); printf("%d\n", 12 - 5); printf("%d\n", 12 * 5); printf("%d\n", 12 / 5); printf("%d\n", 12 % 5); return 0; } |
<実行結果>
17 7 60 2 2 続行するには何かキーを押してください・・・
普通に数値と数値の間に演算子を入れるだけです。
実行結果を見て「あれ?」と思った方もいると思います。
除算の結果が「2.4」ではなく「2」になっています。
何度も書いていますが、「%d」とは10進整数のことですから、小数点以下は切り捨てられます。(四捨五入ではないです)
では、「%d」を「%f」に書き換えて見ましょう。
<sample program 004-02>
#include <stdio.h> int main(void) { printf("%d\n", 12 + 5); printf("%d\n", 12 - 5); printf("%d\n", 12 * 5); printf("%f\n", 12 / 5); printf("%d\n", 12 % 5); return 0; } |
<実行結果>
17 7 60 0.000000 2 続行するには何かキーを押してください・・・
今度は「0.000000」になりました・・・なぜでしょう。
これは、数値に原因があります。
「12」や「5」といった数値は「定数」といいます。「変数」が変化可能な数値に対して「定数」は変化しない(定まった)数値です。
この「定数」は整数であれば自動的に「int型」、小数であれば自動的に「double型」とみなされます。
つまり「12」と「5」は整数のため、除算もint型(整数)として行われます。
int型(整数)同士の除算は、小数点以下切捨てとなります。
たとえ「%f」で表示したとしても、double型ではないので、正しい結果は得られません。
では、さらに書き換えてみます。
<sample program 004-03>
#include <stdio.h> int main(void) { printf("%d\n", 12 + 5); printf("%d\n", 12 - 5); printf("%d\n", 12 * 5); printf("%f\n", 12.0 / 5.0); printf("%d\n", 12 % 5); return 0; } |
<実行結果>
17 7 60 2.400000 2 続行するには何かキーを押してください・・・
「定数」を小数(double型)にすることで、正しい結果が表示されました。
では、除算は常に小数(doubleやfloat型)で行うべきなのでしょうか?
C言語では、「整数の除算は小数点以下切捨て」というルールをうまく使ってプログラムすることもあります。
後々、そういったプログラムも登場しますので、覚えておいてください。
では、次に「変数」を使った計算をやってみます。
プログラムの前に代入演算子について説明しなければなりません。
代入演算子は、その名の通り、「変数」に「何かを」代入するための演算子です。
演算子は「=(イコール)」を使います。
数学などの世界では、「=」演算子は、
12 + 5 = ?
といった具合に、答えの前に書いたり、
x = 5
といった具合に、「等しい」という意味で使います。
しかし、C言語での「=」演算子は、代入するという意味しかありません。
<sample program 004-04>
#include <stdio.h> int main(void) { int data = 34; printf("%d\n", data); return 0; } |
<実行結果>
34 続行するには何かキーを押してください・・・
「変数の宣言」のところで、「34」を代入しています。
これを使って、
<sample program 004-05>
#include <stdio.h> int main(void) { int data = 5; printf("%d\n", 12 + data); printf("%d\n", 12 - data); printf("%d\n", 12 * data); printf("%d\n", 12 / data); printf("%d\n", 12 % data); return 0; } |
<実行結果>
17 7 60 2 2 続行するには何かキーを押してください・・・
最初のプログラムと同じ結果が表示されるはずです。
変数だけを使って、
<sample program 004-06>
#include <stdio.h> int main(void) { int data1 = 12; int data2 = 5; printf("%d\n", data1 + data2); printf("%d\n", data1 - data2); printf("%d\n", data1 * data2); printf("%d\n", data1 / data2); printf("%d\n", data1 % data2); return 0; } |
<実行結果>
17 7 60 2 2 続行するには何かキーを押してください・・・
と書いても同じ結果が得られます。
ただ、このプログラムでは、「12」や「5」という数値を変更しなければ、常に同じ結果が表示されるだけです。
「入力」をうまく使って次のように書き換えます。
<sample program 004-07>
#include <stdio.h> int main(void) { int data1; int data2; scanf("%d", &data1); scanf("%d", &data2); printf("%d\n", data1 + data2); printf("%d\n", data1 - data2); printf("%d\n", data1 * data2); printf("%d\n", data1 / data2); printf("%d\n", data1 % data2); return 0; } |
<実行結果>
12 5 17 7 60 2 2 続行するには何かキーを押してください・・・
実行結果の「12」と「5」はキーボードから「入力」した数値(エコーバック)です。
何度か実行して、色々な値を打ち込んで見ましょう。
<sample program 004-06>で変数に代入を行いましたが、<sample program 004-07>では代入を行っていません。
最初に値を代入しなくても、scanfで入力されるので問題ありませんが、何も代入されず、入力もされない変数には最初何が入っているのでしょう?
<sample program 004-08>
#include <stdio.h> int main(void) { int data; printf("%d\n", data); return 0; } |
<実行結果>
Debug Error!
あらら、止まってしまいました。
Visual Studioでは、初期値が入っていない変数(何も代入されず、入力もされない変数)を使おうとしたり、表示しようとするとエラーになります。
※古いバージョンのVisual Studioでは、訳の分からない数値が表示されていました。
要するに、何も代入されず、入力もされない変数の中身は「不定(決まっていない)」のです。
他の言語では、0(ゼロ)が自動的に入るものもありますが、C言語では「不定」です。(一部そうでないものもありますが後々書きます)