No.9

プログラミング論
第九回
整数・浮動小数点数・文字・文字列
の入出力
本日の内容



整数の入出力を行う
浮動小数点数の入出力を行う
文字・文字列の入出力を行う
– 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の間の「スペース」の扱いの
違いを確認してください。