プログラミング論 第七回 数字の計算,整数の入出力 本日の内容 数字の計算をする – 加減乗除を行う – インクリメント演算子とデクリメント演算子 加減乗除を行う 加減乗除を行うときは,算術演算子を用います。 算術演算子は,次の通りです。 演算子 + * / % 説明 加算 減算 乗算 除算 余り 例 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) 23 右の式は,プログラ ム上ではどのように 表現されると思いま すか? 下のプログラムは,どんな式を意味していると 思いますか? 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 の意味です!
© Copyright 2024 ExpyDoc