プログラミング実習

プログラミング論
第七回
数字の計算,整数の入出力
本日の内容

数字の計算をする
– 加減乗除を行う
– インクリメント演算子とデクリメント演算子
加減乗除を行う


加減乗除を行うときは,算術演算子を用います。
算術演算子は,次の通りです。
演算子
+
*
/
%
説明
加算
減算
乗算
除算
余り
例
a=b+c;
a=b-c;
a=b*c;
a=b/c;
a=b%c;
算術演算子の注意点





整数値同士で除算を行うと,小数点以下
は切り捨てられる。
整数に対して%演算を使用すると,余り
を求めることができる。
0で除算を行うことはできない。
整数と実数を混ぜて計算すると,答えは
実数表現になる。
ensyu13.cで確認しましょう。
算術演算子の優先順位



*, / は,+, - より先に計算されます。
( )で囲むと,その中が先に計算されま
す。
同じ優先順位(*や/)の算術演算子が連
続する場合は,左側から先に計算されま
す。
– a/b/cの場合は,まず,a/bが計算され,その
結果とcの除算が計算されます。
演習

次の計算結果を予測しなさい。
ensyu14.cを実行し確認しなさい。
int
n =
n =
n =
n =
n =
n;
2 * 3 + 4 * 5;
16 / 3 – 6 / 2;
23 % 5 * 3;
2 * ( 3 + 4 ) / 2;
3 * ( 100 + ( 5 – 3) / 2);
考えてみましょう
5  4  (3  1)
23

右の式は,プログラ
ム上ではどのように
表現されると思いま
すか?

下のプログラムは,どんな式を意味していると
思いますか?
5  (2  1)  3 / 8  3  7
インクリメント演算子と
デクリメント演算子



プログラムの中で,「1だけ加算」「1だけ減算」と
いうのは,よく使います。
特に繰り返しの処理で。詳しくは後日。
C言語では,これらのために,特別なコンパクト
な記述ができます。
aの値を1だけ加算
a=a+1;
a++ または ++a
同様に,「1だけ減らす」は,a--, --a
インクリメント演算子と
デクリメント演算子

次のプログラムの動作を確認しましょう。(ensyu15.c)
#include <stdio.h>
int main(void)
{
int a = 5;
a=a+1;が実行されます
a++;
再度a=a+1;が実行されます
++a;
printf("a=%d\n",a);
}
a++と++aの違い

次のプログラムを実行してみましょう。ensyu16.c
// ensyu16.c ++aとa++の違い
#include <stdio.h>
int main(void)
{
int a,b;
a=5;
b=++a;
printf("b=%d a=%d\n",b,a);
a=5;
b=a++;
printf("b=%d a=%d\n",b,a);
}
a++と++aの違い

実行結果はこうなります。
b=++a;の結果
b=6 a=6
b=a++;の結果
b=5 a=6
Press any key to continue
なぜ,結果がちがうのでしょう???
b=++a;の意味は。

結果から予想されることは,
「aの値が1加算された後にbに代入された」
ということです。
つまり
a = a + 1;
b = a;
と同じです
それでは,b=a++;の意味は。

結果から予想されることは,
「aの値がbに代入された後に,aの値が1加算された」
ということです。
つまり
b = a;
a = a + 1;
と同じです
演習

kadai1.cのプログラムを完成させてください。
– int型変数としてaを宣言し,初期値として30を与
え,これを二進数に変換して表示するプログラ
ムです。
– 2で割って,その余りを配列d[]に入れていきま
す。d[0]が二進数の最下位桁とします。
– 先に筆算で二進数を求め,その通りの計算をプ
ログラムしてみてください。
考え方
十進数30を二進
数に変換する。
2 ) 30
2 ) 15 ・・0
2 ) 7 ・・1
2 ) 3 ・・1
1 ・・1
結果: 1 1 1 1
d[0]=a%2;
a=a/2; aは15になる
d[1]=a%2;
a=a/2; aは7になる
d[2]=a%2;
a=a/2; aは3になる
0
d[4],d[3],d[2],d[1],d[0]
d[3]=a%2;
d[4]=a/2;
演算子:その他

変数aに10を代入する
a = 10;

変数bに変数aの値を代入する
b = a;
1文で書けないかな?
このように書けます!
b = a = 10;
この優先順位で
計算されます。
演習


ensyu17.cで,b=a=10;の代入文の働き
を確認してください。
a=5; b=5; c=5; のような,同じ値を代入
する代入文は,1文で表現できます。この
代入文を,b=a=10;を参考にして考えて
みましょう。
インクリメント演算子,デクリメ
ント演算子の演習

次の代入文を実行した後の変数aとbの値を予想しなさい。
プログラムを作成し確認しなさい。
計算
答え
例題
a=50; ++a;
a=51
問題1
a=50; b=++a;
a=
b=
問題2
a=66; b=a++;
a=
b=
問題3
a=30; b=--a;
a=
b=
問題4
a=31; b=a--;
a=
b=
整数の入出力を行う

キーボードから整数値データを入力する
// ensyu18.c
// 整数値をキーボードから入力する
#include <stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
printf("a=%d\n",a);
return 0;
}
まずは実行して
みましょう。
整数の入出力を行う

キーボードから整数値データを入力する
// ensyu18.c
// 整数値をキーボードから入力する
#include <stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
printf("a=%d\n",a);
return 0;
}
これが初めてみる
関数ですね。
scanf関数


キーボード(標準入力)からの入力には,
一般にscanf関数を利用します。
変換仕様(書式)の指定により,数値(整
数,浮動小数点数),文字,文字列も入
力出来ます。
scanf(“%d”, &a);
これが変換仕様。
“ “で囲みます。
ここに変数名を指定します。
この変数に値が代入されます。
&はどうして必要なの?
scanf関数の変換仕様
変換仕様
意味
%d
10進数として入力する
%lf
浮動小数点(double) として入力
する
%f
浮動小数点(float)として入力する
%c
文字(一文字)として入力する
%s
文字列として入力する
そもそも,どうして変換仕様の
指定が必要なの?
キーボードから, 5
6
と入力された時。。
あなたなら,どう解釈しますか?
コンピュータでは, 5
というキーと 6
というキーが
押された,という判断しかできません。
そこで,
%dと指定
することで
•「ごじゅうろく」という整数かもしれない。実数かもしれない。
•いや,16進数の「ご・ろく」かもしれない。いや,8進数?
•‘5’という文字と’6’という文字の2文字の文字列かもしれな
い。
•いろんな解釈があって,決められません。
十進数の56という数値データだ,と判断出来るわけです。
変換仕様の働き-演習

ensyu18.cにおいて,
– 変換仕様をさまざまに変更して,その時の出
力をみてみましょう。
– 変数aの型を変更してみましょう。
– 変数の型と変換仕様が一致していないと正
確に動作しないことを確認してください。
では,&はなぜ必要なの?

では,試しに,&を無くしてみましょう。
コンパイルは通るけど,実行するとエラー
が出ます。

何か意味がありそうです(当たり前!)

コンピュータの身になって考えてみましょう

&の意味
scanf(“%d”, &a);は,「キーボードから入力された十進数値を,
変数aに代入してください」という意味です。
変数aの箱は,メモリ上のどこかにあるはずです。
「56」
変数aの箱
はどこ?
a
メモリの中
メモリの中のどこに変数aがあるかわからない!
&の意味
じゃ,どうすればいい?
「56」
56
a
メモリの中
メモリの中の変数a
の箱の場所
変数a様
OK! これが&a
の意味です!