★計算処理2★
前回のプログラムで「変数」を使った計算を行いましたが、次のプログラムを実行してみてください。
<sample program 005-01>
#include <stdio.h>
int main( void )
{
int data1 = 10;
int data2 = 6;
printf( "計算結果は%dです。\n", data1 + data2 );
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
return 0;
}
|
<実行結果 VC++ Express Edition>
計算結果は16です。
data1 = 10
data2 = 6
続行するには何かキーを押してください・・・
今回は結果表示も少し分かりやすくしてみました。
変数「data1」に10が入っており、変数「data2」に6が入っています。
計算結果は、data1とdata2を加算した結果が表示されています。
結果を表示した後、data1とdata2の中身を表示していますが、それぞれの中身は変わっていません。
では、計算結果の「16」はどこへ行ったのでしょうか?
結果表示をする時に一時的に計算され、結果表示が終わった後は、消えてなくなっています。
例えば、後々この「16」という数値を使いたい場合は、もう1度計算しなおさなければならないのでしょうか?
実は、計算結果も「変数」に「代入」し、残しておくことができます。
<sample program 005-02>
#include <stdio.h>
int main( void )
{
int data1 = 10;
int data2 = 6;
int result;
result = data1 + data2;
printf( "計算結果は%dです。\n", result );
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
printf( "result = %d\n", result );
return 0;
}
|
<実行結果 VC++ Express Edition>
計算結果は16です。
data1 = 10
data2 = 6
result = 16
続行するには何かキーを押してください・・・
表示する前に、変数「result(結果)」にdata1とdata2の加算結果を「代入」しています。
こうしておくことで、表示後も「result」に計算結果が残りますので、後で計算し直さなくても使えるわけです。
ところで、
result = data1 + data2;
という書き方に違和感がありませんか?
数学等では、
data1 + data2 = result;
という書き方で書いてきたはずです。
これは、「代入のルール」が関係しています。
「代入のルール」は、代入は常に右から左へ行うというルールです。
result = data1 + data2;
これは、data1とdata2を加算した結果をresultに代入するという意味ですから、ルールに従って「=」演算子の左側に代入先「result」を書くのです。
では、計算結果を変数に代入することを応用した便利なプログラムのヒントを2つ書いてみます。
#include <stdio.h>
int main( void )
{
int counter = 0;
printf( "conter = %d\n", counter );
counter = counter + 1;
printf( "conter = %d\n", counter );
counter = counter + 1;
printf( "conter = %d\n", counter );
counter = counter + 1;
printf( "conter = %d\n", counter );
return 0;
}
|
<実行結果 VC++ Express Edition>
counter = 0
counter = 1
counter = 2
counter = 3
続行するには何かキーを押してください・・・
変数「counter(カウンタ)」には最初0(ゼロ)が入っています。
変数「counter」に1を加算した結果を、再度「counter」に代入します。
すると「counter」の中身が1だけ増加しています。
また、同じように1を加算した結果を、再度「counter」に代入します。
さらに、1増加します。
これを繰り返すことで、変数の中身を1ずつ増やすことができるのです。
これは、後々重要な考え方になります。
次にもう1つ、
#include <stdio.h>
int main( void )
{
int sum = 0;
printf( "sum = %d\n", sum );
sum = sum + 10;
printf( "sum = %d\n", sum );
sum = sum + 5;
printf( "sum = %d\n", sum );
sum = sum + 8;
printf( "sum = %d\n", sum );
return 0;
}
|
<実行結果 VC++ Express Edition>
sum = 0
sum = 10
sum = 15
sum = 23
続行するには何かキーを押してください・・・
今度の変数「sum(合計)」には、最初0(ゼロ)が入っています。
最初は「sum」に10を加算した結果を、再度「sum」に代入しています。
次に、その10が入っている「sum」に5を加算した結果を、再度代入します。
すると、前に入っていた10に新しく5が加算された結果15が代入されます。
さらに8を加算した結果を代入すると、「sum」は23になります。
つまり、10+5+8の計算ができたということです。
これは、数値の合計値を求めるという非常に重要な考え方になります。
数をカウントしたり、合計したりするのにこんなプログラムを書かなければならないの!?
という方は、「コンピュータは本当に便利なのか」をご覧ください。
実際は、同じようなプログラムをダラダラと書いていくのではなく、「繰り返す」という命令がありますので、こんなに長くはなりません。
次に、演算子の使い方です。
#include <stdio.h>
int main( void )
{
int data1;
int data2;
int data3;
int result;
data1 = data2 = data3 = 5;
result = data1 + data2 + data3;
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
printf( "data3 = %d\n", data3 );
printf( "result = %d\n", result );
return 0;
}
|
<実行結果 VC++ Express Edition>
data1 = 5
data2 = 5
data3 = 5
result = 15
続行するには何かキーを押してください・・・
演算子は複数つなげて使うことも出来ます。
data1 = data2 = data3 = 5;
これは、右から見ていきます。
まず、5がdata3に代入され、data3がdata2に代入され、data2がdata1に代入されます。
result = data1 + data2 + data3;
これは左から見ていきます。(ただし、代入は最後)
data1+data2の結果とdata3を加算した結果をresultに代入します。
演算子には優先順位があり、普通の四則演算の優先順位と同じです。
つまり、+や−より*や/の方が優先度が高く、=は+、−より優先度が低いため、最後に処理されます。
優先順位の証明?として次のプログラムを実行してみてください。
<sample program 005-06>
#include <stdio.h>
int main( void )
{
int data1 = 5;
int data2 = 2;
int data3 = 7;
int result;
result = data1 + data2 * data3;
printf( "result = %d\n", result );
result = ( data1 + data2 ) * data3;
printf( "result = %d\n", result );
return 0;
}
|
<実行結果 VC++ Express Edition>
result = 19
result = 49
続行するには何かキーを押してください・・・
加算よりも、乗算の方が優先されますが、括弧がついている場合、括弧内の計算の優先度が上がります。
・変数から変数への代入
変数から変数へ代入することもよく行われますので、それについて説明します。
<sample program 005-07>
#include <stdio.h>
int main( void )
{
int data1 = 15;
int data2;
data2 = data1;
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
return 0;
}
|
<実行結果 VC++ Express Edition>
data1 = 15
data2 = 15
続行するには何かキーを押してください・・・
ここでのポイントは2つ
1つは、代入は右から左ということ(これは前に書きました)
もう1つは、代入というのは「コピー」であるということです。
data1からdata2へ代入していますが、当然data2には「15」が入っています、そして代入元のdata1にも「15」が残っています。
これは、「15」が移動したのではなく、コピーされたということを表しています。
それでは、これまでずっと説明だけを行ってきましたので、1つ問題を出すことにしましょう。
<sample program 005-06>
#include <stdio.h>
int main( void )
{
int data1 = 15;
int data2 = 24;
/* ここにプログラムを追加する */
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
return 0;
}
|
<実行結果 VC++ Express Edition>
data1 = 24
data2 = 15
続行するには何かキーを押してください・・・
変数「data1」に「15」が、変数「data2」に「24」が入っています。
今、書いてあるプログラムはそのままに(変更しない)、変数の中身を入れ替えたいのです。
実行結果を見てください。
変数「data1」に「24」が、変数「data2」に「15」が入っていることが分かります。
追加するプログラムは、皆さんにお任せします。(やり方は1通りではないので、好きなように書いてください)
ただし、もう1度書いておきますが、今書いてあるプログラムを変更してはいけません。
許されるのは追加だけです。
皆さんの環境で、実際にプログラムを追加し、実行して試しながら考えてください。
色々悩んで、うまくいかない時は、下のサンプルを見てください。
初めての方が最初に悩むのは、
<sample program 006-02>
#include <stdio.h>
int main( void )
{
int data1 = 15;
int data2 = 24;
data1 = data2;
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
return 0;
}
|
<実行結果 VC++ Express Edition>
data1 = 24
data2 = 24
続行するには何かキーを押してください・・・
こういったケースからでしょうか。
実行結果の通り、入れ替わっていません。
次に、
<sample program 006-03>
#include <stdio.h>
int main( void )
{
int data1 = 15;
int data2 = 24;
data1 = data2;
data2 = data1;
printf( "data1 = %d\n", data1 );
printf( "data2 = %d\n", data2 );
return 0;
}
|
<実行結果 VC++ Express Edition>
data1 = 24
data2 = 24
続行するには何かキーを押してください・・・
これも同じです。
最初の1行
data1 = data2;
の時点で、data1に元々入っていた「15」は上書きコピーされてなくなってしまいます。
上にも書きましたが、「=」演算子には「代入する」という意味しかありませんので、交換は出来ません。
解答例は次回にしましょう。