Transcript Document
オブジェクト指向言語 オブジェクト指向言語演習 第03回 C言語の基礎 変数と式 スケジュール(C言語) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 受講ガイダンスとプログラム開発基礎 Linuxの使い方と簡単なC言語プログラムの作成,実行 C言語 変数と式 (2004/10/4) C言語 制御と流れ (2004/10/4) C言語 関数 (2004/10/18) C言語 配列 (2004/10/18) C言語 文字列の表現 (2004/10/25) C言語 ポインタ (2004/10/25) C言語 構造体とユーザ定義型 (2004/11/1) C言語 ファイル (2004/11/1) 中間試験 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 2 出席確認 出席確認WebPage http://www.iis.it-hiroshima.ac.jp/att/ 講義用WebPage http://www.iis.it-hiroshima.ac.jp/~nagasaka/ lect/oo/2004/ 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 3 変数とは 変数とは データを記憶(保管)しておく場所(箱) → メモリ上のどこかにある コンピュータのデータはすべて0か1であらわされる2 進数で記述される 2進数と10進数の関係 2進数の1桁を1ビットと呼ぶ 8ビット=1バイト 2の10乗(1024)を10進数の1000と同じように扱う すなわち,1K=1024, 1M=1024K=1048576 慣習上,8の倍数の単位で取り扱うことが多い 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 4 変数に関するきまり 変数は使用する前に必ず宣言する プログラム(関数)の開始部で行う 宣言していない変数は使用できない。 変数宣言時にどういうデータ用の変数かを指定 整数型 (int) 実数型 (float, double) 文字型 (char) 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 5 整数型(1) 整数 たとえば,整数を8ビットの2進数で表現したとすると 0000 0000 ~ 1111 1111 となり,0~255までの256通り 負の数の表現は2の補数を用いる 最上位ビット(MSB)の1bitを負数を表すのに使用する。MSB が1の時負の数。 正の数との連続性が確保する必要がある。つまり,-2, -1, 0, 1, 2 ....のように 負の数の正の数を2進数で表し,全ビットを反転して1を加える。 例) -1を2byteの2進数で表す。 1 0000 0001 → 反転 1111 1110 +1 -1 1111 1111 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 6 整数型(2) 整数型(32ビットの例) int MSB 0 27.Sep.2004 -2147483648~ 2147483647(32ビット) 2進数の2の補数表現で表す LSB 31 0 0000000 00000000 00000000 00000000 0 0 1111111 11111111 11111111 11111111 2147483647 1 0000000 00000000 00000000 00000000 -2147483648 1 1111111 11111111 11111111 11111111 -1 Object Oriented Language - Y.Nagasaka: [email protected] 7 実数型 実数(浮動小数点表現 実数部と仮数部持つ) 無限に精度の高い数字を保持するのは不可能なので, 32,64,128ビットで浮動小数点表示する 10進数の例では,123.456789012を0.12345×103 仮数部 float ±3.4×10E-38 double ±1.7×10E-308 指数部 (IEEE32ビット) (IEEE64ビット) MSB 0 LSB 31 32ビットの例 指数部 指数部 仮数部 符号ビット(正1、負0) (絶対値) 符号ビット 27.Sep.2004 仮数部 2の補数表現 Object Oriented Language - Y.Nagasaka: [email protected] 8 文字型,文字列 文字 char 8bit アスキーコード → 256文字 ‘A’ アスキーコード表は教科書の374ページを参照 文字列 文字列は文字を複数組み合わせて表現する。文字列の最後を 表すための特殊文字は\0(0x00)である。 注意 文字列の”A”と文字の’A’は意味が違う。 “A”は’A’と’\0’の2文字を表す。 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 9 変数の宣言 変数の名前のきまり 先頭文字は英字 (数字ではだめ) 英字は A ~ Z 、 a ~ z と _ (アンダースコア) 31文字以内 一般的にはその内容を表す文字列にする 変数の宣言 データ型指定子 変数名; int int float char int 27.Sep.2004 height; length; pi; in, out; a, b, c; ← ← ← ← ← 整数型変数 整数型変数 実数型変数 文字型変数 整数型変数 height の宣言 length の宣言 pi の宣言 in out の宣言 a b c の宣言 Object Oriented Language - Y.Nagasaka: [email protected] 10 変数の使用法 変数へ代入 変数 = 式; =は右辺から左辺への代入の意味で あって、数学で用いる“等しい”ではな い。 “等しい”は==を使う。 式は他の変数の入った計算式や、数字や文字でも良い C言語では=による文字列の代入はできない 基本的には左辺と右辺の型が一致していないといけない height = 10; ← 整数型変数 height に数字10を代入 pi = 3.14; ← 実数型変数 pi に数字 3.14 を代入 out = ‘a’; ← 文字型変数 out に文字 a を代入 length = 2 * height; ← 計算結果を代入 length = ( 2.0 + height ) / 2.0; ← 誤り!! (左辺が整数、右辺が実数 すなわち型の不一致) out = “hiroshima”; ← 誤り!! (outは文字型変数なので1文字しか入らない) 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 11 型の変換 コンピュータの中のデータ表現が全く異なるので型が異 なると演算できない!! 代入は左辺と右辺の型が一致していないといけない 四則演算も基本的には型が一致している必要がある 計算途中で型の変更をしたい場合がある cast演算子 (変換したい型) 式 利用例 length = ( 2.0 + height ) / 2.0; ← 誤り!! length = (int) (( 2.0 + (float) height ) / 2.0 ); int i; i = (int) ‘a’; ←iには’a’のASCIIコード0x61(97)が入る 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 12 変数の初期化 変数に関するきまり 変数は使用する前に必ず宣言する プログラム(関数)の開始部で行う 宣言と同時に初期化することが出来る int height = 100; float pi = 3.141592; 27.Sep.2004 int height; hight = 100; float pi; pi = 3.141592; Object Oriented Language - Y.Nagasaka: [email protected] 13 演算子(1) 演算子(四則演算) 加算 ( + ) / 減算 ( - ) 乗算 ( * ) / 除算 ( / ) 除算の余り ( % ) 演算の順番 四則演算は左から右へ、 * / + - の順番で処理 したがって、以下の二つの結果は違う x = x * y + 2; x = x * ( y + 2 ); 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 14 演算子(2) 演算子の便利な利用方法 i++; j--; i+=5; j-=3; x*=(y+z); ← ← ← ← ← i j i j x = = = = = i j i j x + + * 1; 1; 5; 3; (y+z); i++と++iでは意味が違う。 int i=10, j=10; printf(“i++ %d \n”, i++); printf(“++j %d \n”, ++j); ← i 出力して i を1増やす ← j を1増やして j を出力する i++ 10 ++j 11 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 15 文字の演算 文字はASCIIコードで表される1バイトの数字(0 ~255)であるので、これに対して演算をすること ができる。 char Large, Small; int diff; scanf(“%c”,&Large); diff = ‘a’-’A’; Small = Large + diff; /* 文字変数の宣言 */ /* 文字の入力 */ /* 大文字を小文字に変換 */ 教科書の71ページを参照。 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 16 標準入出力(書式付) 出力 int printf(char *format, arg1, arg2, ...) 入力 int scanf(char *format, arg1, arg2, ...) それぞれ、format の制御のもとで、それぞれの引数 (arg1, arg2, など)を変換して、出力、または、入力 %d 10進数整数 (int) %x 16進数整数 (int) %f 実数 (float) 27.Sep.2004 %c 文字 %s 文字列 Object Oriented Language - Y.Nagasaka: [email protected] (char) (char *) [ 書式 ] 17 書式付出力(1) 書式指定(format)の表現方法 普通の文字列 そのまま出力される 変換仕様 次につづく変数を変換して出力する %と変換文字で構成 printf(“Input Number: %d and %d\n”, in_num_a, in_num_b); 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 18 書式付出力(2) 変換文字(代表的なもの) d, i int; 10進数 o int; 符号なし8進数 x, X int; 符号なし16進数 aからfをxは小文字、Xは大文字で表現 c int; 単一文字 s char *; 文字列(文字列終了コード‘\0’) f float; [-]m.dddddd とする実数 e double; [-]m.dddddde+xxx とする実数 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 19 書式付出力(3) %と変換文字の間に許されるもの(代表的なもの) マイナス符号 変換された文字を左づめで表示 フィールドの最小幅を指定する数字 上記マイナス符号が無ければ、変換された文字を右づめで、最 小幅を保ちつつ表示 ただし、最小であるので範囲を超える場合はそのまま表示する ピリオド フィールドの幅を示す数字と桁数を指定する数字の区切り 例 %-20s %15.3f 27.Sep.2004 20文字幅の文字列を左づめで出力 15文字幅の実数を小数点以下3桁 Object Oriented Language - Y.Nagasaka: [email protected] 20 標準入出力を使った例題(1) 標準入力から整数型の数値を2つ読み込み,そのまま表 示するプログラム #include <stdio.h> int main( void ) { int in1, in2; 整数変数in1,in2の宣言 printf("Input two integer numbers\n"); scanf("%d %d",&in1, &in2); scanfの時は& が必要! printf("The number is %d and %d.\n",in1,in2); return 0; } 27.Sep.2004 %dは整数型の入出力のフォーマットで 使用される Object Oriented Language - Y.Nagasaka: [email protected] 21 標準入出力を使った例題(2) 標準入力から実数型の数値を2つ読み込み,そのまま表 示するプログラム #include <stdio.h> int main( void ) { float f1, f2; 実数変数f1,f2の宣言 printf("Input two integer numbers\n"); scanf("%f %f",&f1, &f2); printf("The number is %15.3f and %15.3f.\n",f1,f2); return 0; } 27.Sep.2004 %15.3fは実数型データを15文字の幅 で小数点以下3桁の形式で打ち出すこと をあらわす Object Oriented Language - Y.Nagasaka: [email protected] 22 課題1 標準入力から2つの整数を読み込み,それらの2つの数 の和,差,積,商を新たに宣言した変数に代入し,それら を表示するプログラムを作成しなさい。実行結果は以下 のようにしなさい。(ファイル名oo03-1.c) % ./oo03-1 Input two integer a and b 73 The number is 7 and 3. a+b= 10 a-b= 4 a*b= 21 a / b = 2.333 黄色はキーボードか ら入力された数値 (注意) 商は計算結果が実数となるので,型変換を使わなくてはならない。 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 23 課題2 アルファベットの小文字1文字を入力し,そのアスキー コードと大文字を出力するプログラムを作成しなさい。 (ファイル名oo03-2.c) % ./oo03-2 Input small capital r The original character is r. The ASCII Code is 114(0x72). The large capital is R. ヒント • 文字の大文字を小文字に変換する例題は教科書の71ページのリスト 3.4に説明がある。 • 16進数で表示するときには%xを使う 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 24 コンパイルと実行 まずはじめに 作業ディレクトリの作成 一度実行すればよい % mkdir ~/wrk/ % mkdir ~/wrk/oo/ 次に 作業ディレクトリへの移動 プログラミング コンパイル・リンク 実行 % cd ~/wrk/oo % vi lect01-1.c % gcc -o lect01-1 lect01-1.c % ./lect01-1 * C言語プログラムのファイル名は、.c でなければならない 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 25