プログラミング論 第六回 変数について 本日の内容 浮動小数点数の出力 定数とは?(文字型,文字列について) 配列とは? 変数の初期化 浮動小数点数の出力 浮動小数点数って,何? 例えば,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桁で表示されるよ うに指定しなさい。
© Copyright 2025 ExpyDoc