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