プログラミング論 第九回 整数・浮動小数点数・文字・文字列 の入出力 本日の内容 整数の入出力を行う 浮動小数点数の入出力を行う 文字・文字列の入出力を行う – scanf関数と入力の変換仕様 演算子:その他 変数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 の意味です! 浮動小数点数の入出力を行う //ensyu19.c 浮動小数点数の入出力 #include <stdio.h> int main(void) { double pi = 3.14159; double r, l, s; printf("半径を入力してください:"); scanf("%lf", &r); double型の変換仕様は%lfです。 l = 2 * pi * r; s = pi * r * r; printf("円周は%fです。\n", l); printf("面積は%fです。\n", s); return 0; } 浮動小数点数の入出力を行う //ensyu19.c 浮動小数点数の入出力 #include <stdio.h> int main(void) { double pi = 3.14159; double r, l, s; printf("半径を入力してください:"); scanf("%lf", &r); scanfの前にメッセージを表示すると l = 2 * pi * r; 何を入力するか分かり,親切です。 s = pi * r * r; printf("円周は%fです。\n", l); printf("面積は%fです。\n", s); return 0; } 浮動小数点数の入出力を行う //ensyu19.c 浮動小数点数の入出力 #include <stdio.h> int main(void) { double pi = 3.14159; double r, l, s; scanf("半径を入力してください: %lf", &r); scanfの中にメッセージを記入する l = 2 * pi * r; ことはできません。注意しましょう。 s = pi * r * r; printf("円周は%fです。\n", l); printf("面積は%fです。\n", s); return 0; } 演習 ensyu20.cは,入力された実数を四捨五入して 整数にして出力するプログラムです。 空欄に適切な処理を書き入れて,プログラムを 完成させてください。 ただし,入力される実数は正の数とします。 正の実数の四捨五入は,0.5を足して整数型に 代入する(小数部がカットされる)ことにより実 現出来ます。 文字の入出力を行う 次のプログラムを実行してみましょう //ensyu22.c 一文字の入出力 #include <stdio.h> int main(void) { int ch; ch = getchar(); putchar(ch); return 0; } キーボードから入力された 一文字を,文字コードに変換 して整数型変数に代入します。 文字の入出力を行う 次のプログラムを実行してみましょう //ensyu22.c 一文字の入出力 #include <stdio.h> int main(void) { int ch; ch = getchar(); 整数型変数に保存された数値を putchar(ch); 文字コードで解釈して画面に表示 します。 return 0; } 文字の入出力を行う putcharでは,次のように直接文字や文字コードの指定ができます。 //ensyu22.c 一文字の入出力 #include <stdio.h> 文字の場合は’ ‘で囲んで与えます。 ‘\n’として改行することもできます。 int main(void) 文字コードは整数値で与えます。 { 16進数のコードで与えたいときは, int ch; 0x41と入力します(文字Aの場合)。 } // ch = getchar(); putchar( ‘A’); putchar( 65 ); return 0; ensyu22.cを訂正して動作確認してください 一文字の入出力を行う -演習 ensyu23.cは,一文字の入出力をscanfを 用いて行うものである。 空欄に適切な処理を書き入れ,プログラ ムを完成させなさい。 文字列の入出力を行う 次のプログラムの動作を確認しましょう。 //ensyu24.c 文字列の入出力を行う #include <stdio.h> int main(void) { char ss[80]; gets(ss); puts(ss); return 0; } 文字列変数です。 最大80文字まで 保存可能です。 文字列の入出力を行う 次のプログラムの動作を確認しましょう。 //ensyu24.c 文字列の入出力を行う #include <stdio.h> int main(void) { char ss[80]; gets(ss); puts(ss); return 0; } キーボードから文字列を 入力する関数です。 文字列を保存する配列名 を与えます。 文字列の入出力を行う 次のプログラムの動作を確認しましょう。 //ensyu24.c 文字列の入出力を行う #include <stdio.h> int main(void) { char ss[80]; gets(ss); puts(ss); return 0; } 文字列を出力する関数です。 文字列変数(配列名)を指定します。 “ABC”のように直接文字列を指定する こともできます。 演習 ensyu24.cのプログラムにおいて, puts(ss); と同じ働きをするように,この処 理をprintfで置き換えてください。 文字列の終端について 文字列は,終わりを指定しなければ,どこまでを 正しい文字列データとして表示すればよいのか分 かりません。 文字列を入力したとき,その終端には「文字列終 端マーク」が自動的に挿入されます。 文字列終端マークのことを「NULL文字」といいま す。 通常は「数値の0」です。 「数値の0」では,通常の数値変数の意味なのか, 終端マークの意味なのか分かりにくいので,’\0’ と特殊表現することもあります。 演習-文字列終端マーク ensyu25.cは,文字列変数に初期値として ”hamamoto kazuhiko”という文字列が与えら れているプログラムです。 このまま実行すると, hamamoto kazuhiko と表示されます。 5文字目に「数値の0」を代入した場合の出力を 確認してください。 同様に,「特殊文字’\0’」を代入した場合の出 力を確認してください。 scanfによる文字列の入力 //ensyu26.c scanfを用いた文字列の入力 #include <stdio.h> int main(void) { char ss[80]; scanf("%s", ss); puts(ss); return 0; } 文字列の変換仕様 は%sとなります。 配列変数の場合は,&が必 要ありません。 詳しくは,後期に学習します。 scanfによる文字列の入力 ensyu26.cにおいて, hamamoto kazuhiko と入力してみましょう。 どのように出力さましたか? hamamoto のみの出力・・・? scanf(“%s”, …); では,スペースは文字列終端マーク として判断されるので注意が必要です。 演習 - scanfとgetsの違い ensyu27.cを実行してみましょう。 入力は hama kazu でお願いします。 gets()とscanf()とで,2回入力します。 それぞれの場合において,一文字ずつ文 字コード(十進数)を出力させるプログラ ムです。 hamaとkazuの間の「スペース」の扱いの 違いを確認してください。
© Copyright 2024 ExpyDoc