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