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