プログラミング実習

プログラミング論
第六回
変数について
本日の内容




浮動小数点数の出力
定数とは?(文字型,文字列について)
配列とは?
変数の初期化
浮動小数点数の出力

浮動小数点数って,何?
例えば,8桁分の箱があったとして,小数を表現してみよう!
あれっ?
桁が足りない
1 2
3
4
5
じゃ,ここに。
とりあえず,小数点の場所を決める?
12345.6 って入力したい。
6
ここに桁は余ってるのに。。
無駄??
どうも,桁を有効に使ってない。。
これを「固定小数点数」といいます。
浮動小数点数の出力
さて,ではどうしよう??
12345.6
0.123456×105
表現を変えてみよう
これらの部分だけを保存
するようにしよう!
1
2
3
3
4
5
6
0
5
こうすれば無駄な桁がないし,大きな値も表現できる!
「小数点の位置を変える」→「小数点の位置がfloatingする」→「浮動小数点」といいます。
次のプログラムを入力しましょう。
~浮動小数点数を出力する~
// 半径から円の面積を計算する
// ensyu6.c
#include <stdio.h>
int main(void)
{
double pi, r, s;
pi = 3.141592;
r = 2.0;
s = pi * r * r;
printf("面積は%fです\n", s);
return 0;
}
まずは,ここから。
// 半径から円の面積を計算する
// ensyu6.c
#include <stdio.h>
int main(void)
{
double pi, r, s;
pi = 3.141592;
r = 2.0;
s = pi * r * r;
printf("面積は%fです\n", s);
return 0;
}
浮動小数点型変数の宣言
double pi, r, s; の意味を考えましょう。



これは,「double型の変数として,3つを用意す
る。それぞれの変数名は,pi, r, sである。」とい
う意味になります。
C言語では,浮動小数点型には,float型と
double型があります。
どちらも小数(実数)を扱えますが,double型の
方が2倍の箱の大きさを持っているので,より細
かい実数を表現出来ます。
int型,float型,double型の比較
型名
int
float
double
バイト数
データ
の種類 (箱の大きさ)
整数
実数
実数
扱える数字の範囲
4バイト
-2147483648~
+2147483647
4バイト
有効桁7桁程度
×±10の±38乗位
8バイト
有効桁15桁程度
×±10の±308乗位
次は,ここ。
// 半径から円の面積を計算する
// ensyu6.c
#include <stdio.h>
int main(void)
{
double pi, r, s;
pi = 3.141592;
r = 2.0;
s = pi * r * r;
printf("面積は%fです\n", s);
return 0;
}
浮動小数点型変数の出力
printf(“面積は%fです\n”, s);




%fが浮動小数点数値の出力を行うときの変換仕
様です。
でも,実行すると,なんとなく小数点以下が長す
ぎる気がしませんか?
整数型と同じく,桁数の指定が出来ます。
例えば,%7.3fと指定すると,「全体で7桁,そのう
ち,小数点以下が3桁」という意味になります。
– この場合,小数点も桁数に含むので,7桁中,小数点
で1桁分,小数点以下が3桁,となりますので,整数部
は3桁になります。

実際にプログラミングして確認しましょう。
定数とは?



何気なく使ってきましたが,
a = 5;
というのは,
「変数aの値を5に定める」という意味です。
このように,ある値に定められた変数値を
「定数」と言います。
上の例のように,数値の場合,「数値定数」
と言います。
文字も使えます

次のプログラムを実行してみましょう。
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char a, b;
a = 'A';
b = 65;
printf("a=%c\n",a);
printf("b=%c\n",b);
return 0;
}
まず,ここ。
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char型,文字型の
char a, b;
変数の宣言です。
a = 'A';
b = 65;
printf("a=%c\n",a);
printf("b=%c\n",b);
return 0;
}
次に,ここ。
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char a, b;
a = 'A';
b = 65;
char型変数aに,文字
定数を代入します。
printf("a=%c\n",a);
printf("b=%c\n",b);
return 0;
}
文字定数は,‘ ‘ で
囲んで表現します。
なので,実行結果は。
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char a, b;
a = 'A';
b = 65;
printf("a=%c\n",a);
printf("b=%c\n",b);
return 0;
}
よって,%c と
いう文字のため
の仕様で出力
すると,実行
結果は,a=A
となります。
では,これは?
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char a, b;
a = 'A';
b = 65;
文字型の変数なのに,
65 という数値定数が
代入されている?
printf("a=%c\n",a);
printf("b=%c\n",b);
return 0;
}
でも出力は。。。
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char a, b;
a = 'A';
b = 65;
printf("a=%c\n",a);
printf("b=%c\n",b);
return 0;
}
文字型の
変換仕様
で出力する
と,同じく
b=A と出力
される?
試しにこうしてみたら?
// 文字定数を扱う ensyu7.c
#include <stdio.h>
int main(void)
{
char a, b;
a = 'A';
b = 65;
printf("a=%c\n",a);
printf("b=%d\n",b);
return 0;
}
この時は,
数値定数
の65が出
力される。。
なぜ?
文字型(char型)データの扱い



コンピュータの中では,文字であっても0と1
の数値のコード(=文字コード)で表現され
ています。
ちなみに,アルファベット大文字のAの場合,
0100 0001
という数値(二進数)で表されます。
これは,十進数で考えると,65ですね。
文字型(char型)データの扱い

つまり,こういうことです。
– 1バイト(8桁)の0と1のコードで,文字を表現す
る。
– 文字として解釈する(%c)こともできるし,数値と
して解釈する(%d)事も出来る。
– char型というのは,1バイトの大きさの二進数を
表すものであり,整数として考えると,-128~
+127を表す事が出来る。
– 1バイトの二進数コードと文字の関係は,ASCII
文字コードとして決められている。
文字型(char型)データの扱い
char a, b;
a = ‘ A ‘;
b = 65;
文字定数を代入します。文字定数は,’ ‘ で囲みます。
文字定数は,ASCIIコードにより二進数に変換されて
変数aに代入されます。
数値を代入する事も出来ます。ただし,char型は1バイトなので,
-128~+127の範囲の整数となります。
aには,Aに対するASCIIコードである 0100 0001 という数値が代入されます。
結局,2つの変数に保存されるデータは同じです!
bには,十進数65,二進数で 0100 0001 という数値が代入されます。
0100 0001
%c(文字)として出力すると,A と出力されます。
%d(十進数整数)として出力すると,65 と出力されます。
演習

ensyu7.cにおいて,
– 変数aについても,%dとして出力すると65が出力さ
れる事を確認しなさい。
– 一般に文字コードは16進数で表現されます。16進
数で出力するように変更しなさい。
– a=‘5’; として,aを%dと%cで出力してみなさい。

この場合,aの値は,5という「文字」であり,5という「数値」
ではありません。
– 他の文字がどのような文字コードなのかを調べなさ
い。

ensyu8.cを実行し,結果を確認しなさい。
文字列と配列




一文字の文字定数を扱ってきましたが,実際,
一文字だけを取り扱う事はあまりないですよね。
名前の入力にしたって,
HAMAMOTO
で8文字あるし。
このようなものを「文字列」といい,文字列を表
す定数の事を「文字列リテラル」といいます。
でも,char型の変数は,1バイトの大きさしかな
く,1文字しか入りません。8文字からなる文字
列はどのように表せばいいのでしょう?
文字列と配列
char a;
a
これだと,用意される箱は1つだけなので,
H
a = ‘ H ‘;
a
一文字しか入りません。。。
箱をたくさんつないじゃえばいいのでは?
文字列と配列
H
a
A
a
M
a
A
a
M
a
O
a
T
a
O
a
こうしちゃえばいい!
このような,「同じ型の変数の箱のつながり」は,
次のように宣言します
char a[8];
このような「同じ型の変数のつながり」を配列といいます。
それぞれの箱には番号が付けられます。
例えば,最初の箱に’H’を代入するには,
a[0]=‘H’;
演習



char型配列a[8]に,HAMAMOTOという文字列
リテラルを入力し,表示するプログラムを作りま
しょう。
ensyu9.cを完成させてください。
a[0]からスタートするので,8文字の文字列です
が,a[8]は使いませんね。なぜでしょう?
– 出力させた結果の最後がおかしくなっていると思い
ます。それと関係がありそうです。
– a[8]に,’\0’を代入してみてください。どうなります
か?

一文字ずつでなく,一度に文字列を代入する方
法もあります。ensyu10.cを実行してみてくださ
い。
その他の配列

配列は,その他のデータ型でも,もちろん作る事
が出来ます。

int a[10];



int型の変数を10個用意してく
れます。
a[0], a[1], a[2], ……, a[9]の
10個です。
個別に利用出来るので,
a[3]=100;
という使い方が出来ます。
[ ]内の数字を添字といいます。
変数の初期化



「変数を宣言したとき,最初の値は不定で分
からない」といったことを思い出してください。
「んっ?忘れた。」という場合は,ensyu11.c
を実行してみてください。
入力した覚えのない数値が出力されますよ
ね。
変数の初期化

変数は,宣言するときに「初期化」する事が出来ます。
int a = 100;

これは,これと同じ処理です。 int a;
a = 100;
配列には,次のような初期化の方法があります。
int d[4] = {10, 20, 30, 40};
int d[4];
d[0]=10; d[1]=20; d[2]=30; d[3]=40;
これと同じ意味です
int d[] = {10, 20, 30, 40}
char s[5] = “abcde”;
char s[] = “abcde”;
これらも
同じ意味
です。
これも実は同じ意味です。
char s[5];
s[0] = ‘a’; s[1] = ‘b’; s[2] = ‘c’;
s[3] = ‘d’; s[4] = ‘e’; s[5] = ‘\0’;
演習

ensyu12.cのプログラムを完成させなさい。
– char型配列変数nameを宣言しなさい。その
時,自分の名前を初期値として与えなさい。
– double型変数tallを宣言する際,自分の身
長を初期値として与えなさい。
– 「~さんの身長は~cmです。」と出力する
printf文を作りなさい。
~の部分には変数値が与えられるようにしなさ
い。
 身長は,整数部3桁,小数部1桁で表示されるよ
うに指定しなさい。
