Transcript int
オブジェクト指向言語 オブジェクト指向言語演習 第05回 C言語の基礎 変数と式(復習) スケジュール(C言語) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 受講ガイダンスとプログラム開発基礎 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) C言語 構造体とユーザ定義型 (2004/11/8) C言語 ファイル (2004/11/8) 中間試験 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 コンピュータ(計算機)の構成 コンピュータとは, 補助記憶装置 (ハードディスク テープなど) 主記憶装置 (半導体メモリ) 中央処理装装置 CPU 00000000 アドレスバス 制御装置 算術演算装置 プログラム 命令解読装置 データ 入出力装置 (I/O unit) データバス データとプログラ ムは2進数で蓄え られている。 FFFFFFFF 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 4 コンピュータの動作 プログラム格納(Stored Program)方式 メモリから命令読み込み 27.Sep.2004 命令解読 この方式のコンピュータはノイマ ン型コンピュータとも呼ばれ,現 代のコンピュータのほとんどはこ の方式を採用している。 命令実行 実行したい命令をメモリ上に配置 し,順番に実行することで,複雑 なプログラムを実行することがで きる。 命令ポインタを進める CPU(現代のPentium4なども)も 主記憶装置(メインメモリ)に蓄 えられた命令を順番に実行してい るだけである。ただし,1秒間に 数百万回の命令を実行している。 Object Oriented Language - Y.Nagasaka: [email protected] 5 コンピュータプログラム CPUが解読・実行できる2進数の命令を直接書くのは 難しいので,人間に理解しやすい論理的な言語(高 級言語)でプログラムを記述する必要がある。 さまざまな高級言語をコンピュータ上で実行するた めには大きく2つの方法がある。 コンパイル方式(C, C++, Fortran, Pascalなど) 作成したプログラムをコンパイラと呼ばれる変換プログラ ムでコンピュータの実行できる命令に予め書き換える。 高速である。 インタプリタ方式(Basicなど) プログラムを逐次機械語に変換しながら実行 低速であるが,機種依存が少ない。 低級言語→アセンブラ等CPUの命令に近い言語 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 6 C言語でのプログラム開発 本講義では,Linux(UNIXの一種)を利用する。 C言語はコンパイル言語なので, 1. テキストエディタ(vi)でソースファイルを作成。 2. 作成したソースファイルをコンパイラ(gcc)を 用いて実行ファイルに変換する。 3. 実行ファイルを実行して,実行結果が正しけれ ば終了。 4. 1に戻り,ソースファイルを修正する。 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 7 Linuxでの端末の出し方 デスクトップ上で右クリックし,一番上を選択する。 あるいは,メニューパネル(GNOME端末)から選ぶ。 メニューパネル 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 8 端末の中でシェルを使う(1) 端末の左に出ている [a604***@host ~] $ はプロンプトと 呼ばれるものであり,コマンド受付状態のときに表示される。 授業資料では%をプロンプトの代わりに使用することがある。 Linux(UNIXなど)のファイルは,/(ルート)をトップとする 木構造(tree structure)で管理されている。 プロンプトの~は自分のホームディレクトリを表し,現在の ディレクトリ(カレントディレクトリ)をあらわしている。カ レントディレクトリを知るコマンドはpwdである。 ファイルの一覧を見るのはlsコマンド。-lのオプションをつけ ると詳しい表示が出る。 drwxr-xr-x ディレクトリ, Group(r-x), drwxrwxr-x ディレクトリ, Group(rwx), 27.Sep.2004 Owner(rwx), Other(r-x) Owner(rwx), Other(r-x) Object Oriented Language - Y.Nagasaka: [email protected] 9 端末の中でシェルを使う(2) ディレクトリ移動はcd (Change Directory)を使う。 作成した~/wrk/ooにファイルを作成するため,そ のディレクトリに移動する( cd ~/wrk/oo )。 ディレクトリは GUI環境では フォルダと呼ば れることもある。 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 10 ソースプログラムの作成 ソースプログラムはviを用いて作成する。 viの使い方: vi lec05-1.c lec05-1.cと言う名前のファイルをviを用いて作成(修正) よく使うviコマンド 27.Sep.2004 挿入モード移行 i (カーソル前), a (カーソル後), A (行末) コマンドモード移行 [Esc] カーソル移動 ← h,↓j ,↑k, →l 行削除 dd, 1文字削除 x, 1単語削除 dw , 行連結 J 行コピー Y, n行コピー nY コマンドモード カーソル後ペーストp, カーソル前ペーストP のみで使える 書き出し :w, 終了 :q , 書き込み終了 :wq 行番号表示 :set number, 行番号消去 :set nonumber Object Oriented Language - Y.Nagasaka: [email protected] 11 コンパイルと実行 C言語のコンパイルにはgcc(Gnu C Compiler)を 用いる。Linux OS自身もgccで作成されている。 gccの使い方: % gcc -o lect05-1 lect05-1.c -o 出力ファイル ソースファイル オプション-oで指定されたファイルに機械語 ファイルを出力 C言語で書かれたテキスト ファイル コンパイルされたファイルの実行 % ./lect05-1 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 12 変数とは 変数とは データを記憶(保管)しておく場所(箱) → メモリ上のどこかにある コンピュータのデータはすべて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] 13 変数に関するきまり 変数は使用する前に必ず宣言する プログラム(関数)の開始部で行う 宣言していない変数は使用できない。 変数宣言時にどういうデータ用の変数かを指 定 整数型 (int) 実数型 (float, double) 文字型 (char) 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 14 変数の宣言 変数の名前のきまり 先頭文字は英字 (数字ではだめ) 英字は A ~ Z 、 a ~ z と _ (アンダースコア) 31文字以内 一般的にはその内容を表す文字列にする 変数の宣言 データ型指定子 int int float char int 27.Sep.2004 変数名; height1,height2; ← total, tmp; ← pi, rate; ← in, out; ← a, b, c; ← 整数型変数 整数型変数 実数型変数 文字型変数 整数型変数 height1, height2 の宣言 total の宣言 pi,rate の宣言 in out の宣言 a b c の宣言 Object Oriented Language - Y.Nagasaka: [email protected] 15 変数の使用法(1) =は右辺から左辺への代入の意味で あって、数学で用いる“等しい”で はない。 “等しい”は==を使う。 変数へ代入 変数 = 式; 式は他の変数の入った計算式、数字,文字でも良い C言語では=による文字列の代入はできない 基本的には左辺と右辺の型が一致しないといけない height1 = 10; height2 = 8; pi = 3.14; out = ‘a’; ← ← ← ← 整数型変数 整数型変数 実数型変数 文字型変数 height1 に数字10を代入 height2 に数字8を代入 pi に数字 3.14 を代入 out に文字 a を代入 total = height1 + height2; ← 計算結果を代入 rate = height1 / height2; ← 型の不一致で誤り out = “hiroshima”; ← 誤り!! (outは文字型変数なので1文字しか入らない) 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 16 変数の使用法(2) 変数の中身(height1, height2)を交換する tmp = height1; height1 = height2; height2 = tmp; 27.Sep.2004 別の変数tmpを使う Object Oriented Language - Y.Nagasaka: [email protected] 17 型の変換 コンピュータの中のデータ表現が全く異なるので型 が異なると演算できない!! 代入は左辺と右辺の型が一致していないといけない 四則演算も基本的には型が一致している必要がある 計算途中で型の変更をしたい場合がある cast演算子 (教科書pp.98-99:キャスト) (変換したい型) 式 利用例 rate = height1 / height2; ← 誤り!! (実数型に整数型どうしの割り算結果を代入している) rate = (float) height1 / (float) height2; ←正解 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 18 変数の初期化 変数に関するきまり 変数は使用する前に必ず宣言する プログラム(関数)の開始部で行う 宣言と同時に初期化することが出来る 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] 19 演算子(1) 演算子(四則演算) 加算 ( + ) / 減算 ( - ) 乗算 ( * ) / 除算 ( / ) 除算の余り ( % ) 演算の順番 四則演算は左から右へ、 * / + - の順番で処理 したがって、以下の二つの結果は違う x = x * y + 2; x = x * ( y + 2 ); 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 20 演算子(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] 21 文字の演算 文字は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] 22 標準入出力(書式付) 出力 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 *) [ 書式 ] 23 書式付出力(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] 24 書式付出力(2) %変換文字(代表的なもの) %d, %i %o %x, %X int; 10進数 int; 符号なし8進数 int; 符号なし16進数, a(10)からf(15) をxは小文字、Xは大文字で表現 int; 単一文字 char *; 文字列(文字列終了コード‘\0’) float; [-]m.dddddd とする実数 double; [-]m.dddddde+xxx とする実数 %c %s %f %e printfでの例 printf(“Hight1=%d 27.Sep.2004 Hight2 =%d\n”, height1, height2); Object Oriented Language - Y.Nagasaka: [email protected] 25 書式付出力(3) %と変換文字の間に許されるもの(代表的なもの) マイナス符号 変換された文字を左づめで表示 フィールドの最小幅を指定する数字 上記マイナス符号が無ければ、変換された文字を右づめで、 最小幅を保ちつつ表示 ただし、最小であるので範囲を超える場合はそのまま表示 する ピリオド フィールドの幅を示す数字と桁数を指定する数字の区切り 例 %-20s %15.3f 27.Sep.2004 20文字幅の文字列を左づめで出力 15文字幅の実数を小数点以下3桁 Object Oriented Language - Y.Nagasaka: [email protected] 26 標準入出力を使った例題(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] 27 標準入出力を使った例題(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] 28 課題1 キーボードから身長と体重を入力し,BMI値を計算す るプログラムを作成しなさい(oo05-1.c)。 BMI = 体重(kg) / {身長(m) * 身長(m)} #include <stdio.h> int main(void){ float height, weight, bmi; printf("Input weight(kg) and height(m)\n"); scanf ("%f %f",&weight, &height); bmi = この部分を作成 ; printf("BMI = %f \n", bmi); return 0; } 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 29 課題2 教科書のp.74のリスト3.5と表3.8を参考にして,ブ ランク定数とアボガドロ数を書式指定して印字する プログラムを作成せよ(oo05-2.c)。ただし,表3.8 の例すべてを1つのプログラムで実現すること。 27.Sep.2004 Object Oriented Language - Y.Nagasaka: [email protected] 30 コンパイルと実行 まずはじめに 作業ディレクトリの作成 一度実行すればよい % 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] 31