Comments
Description
Transcript
終端文字
2015/10/9 (6)配列の基本 配列の基本 演習Ⅱ 演習Ⅱ 第二週関数と配列 担当 榎並 C言語での配列 配列とは 0から始まる 同じ形式のデータを並べたもの 名前で指定するのではなく,番号で指定 番号 データ 0 76 1 54 2 84 3 92 4 43 5 77 6 52 例)7名からなるクラスの成績管理 int main(void) { int i; int seiseki[30]; for (i = 0; i < 7; i++) { printf(“番号%dの成績は?“, i+1); scanf("%d", &seiseki[i]); } ….. int data[10] とした場合,使える添え字は0~9 添え字は(0以上の)整数値しか使えない (添え字にdouble などは使用不可) 添え字に変数や数式を使うことが出来る 要素数は固定 途中で増やしたり減らしたり出来ない 添え字が要素数を超えているかどうかはチェックされ ない(超えてしまうとプログラムが異常動作する) どのような型でも配列に出来る int, double, その他なんでも可能 1 2015/10/9 初期値の入れ方 二次元配列 添え字を省略することも出来る 初期値の数は要素数より少なくても良い int seiseki[7] = {76, 54, 84, 92,43 , 77 ,52}; 番号 データ 0 76 1 54 もしくは 2 84 int seiseki[] = {76, 54, 84, 92,43 , 77 ,52}; 3 92 4 43 5 77 6 52 二次元配列は以下のように書く int data[5][10]; (int data[5,10]; は間違い) 3次元以上も可能 初期化も可能 int data[4][3] = { {5, 6, 3}, {4, 5, 2}, {6, 3, 1}, {1, 8, 9} }; 配列を引数に渡す (7)関数(その二) 関数(その二) 配列を引数に取る関数 int minimum(int data[], int num); 配列を受け取る関数であることを int main(void) 宣言する { int seiseki[10] = {70, 85, … }; 呼び出し側では, 配列の名前のみ int min; 指定すればよい min = minimum(seiseki, 10); printf(“minimum is %d¥n”, min); } int minimum(int data[], int num) { 受け取り側では,配列の要 ….. 素数を指定する必要は無い } 2 2015/10/9 const 修飾子 配列の中身の変更 int change(int data); int main(void) { int d = 70; change (d); printf(“d is %d¥n”, d); } int change(int data) { data = 0; } int change(int data[], int num); int main(void) { int d [10] = {70, 85, … }; change (d, 10); printf(“d[0] is %d¥n”, d[0]); } int change(int data[], int num) { data[0] = 0; } 値はかわらない 値はかわる 引数を関数に渡す仕組み(1) int change(int data); int main(void) { 実行位置 int d = 70; change (d); printf(“d is %d¥n”, d); } int change(int data) { data = 0; } const は値の変更を禁じる 変数をconst にした場合:値の変更が不可能 const int a = 10; a = 20; ←エラー ・ 引数をconst にした場合:値が変更されない int func (const int data[], int n); とすると,func 内でdata に値を代入できない int func (const int data[], int n) { data[0] = 10; ← エラー } 引数を関数に渡す仕組み(2) d 70 コピーが起こる 0 値渡し data int change(int data[], int num); int main(void) { int d [10] = {70, 85, … }; change (d, 10); printf(“d[0] is %d¥n”, d[0]); } int change(int data[], int num) { data[0] = 0; } 0 0 1 85 d 2 ... data 4 3 5 6 要素数は いくらでも良い 3 2015/10/9 二次元配列の引数渡し 二次元配列の場合は,関数定義における仮引数にお いて配列の個数を(一部)指定する必要がある int func(int data[][]); ← エラー int func(int data[2][3]); ← OK int func(int data[][3]); ← OK 引数を関数に渡す仕組み(2) int change(int data[][3]) ; int main(void) { int d [2][3] = {{1, 2, 3}, {4, 5, 6}}; change (d); printf(“d[1][2] is %d¥n”, d[1][2]); } int change(int data[][3]) { data[1][2] = 0; } d data [0][0] 1 [0][1] 2 [0][2] 3 [1][0] 4 [1][1] 5 [1][2] 0 要素数は いくらでも良い data[a][b] は,a * 3 + b 番の要素(この計算を実行時に行うために3が要る 文字列とは 文字が並んだもの “ABC” → 'A', 'B', 'C' の3つの文字が順に並ぶ C言語では「文字の配列」として表現される 文字とは (8)配列(その二) 配列(その二) 文字列 それぞれの文字に番号が振られている 例えば'A' は65(0x41), 'B' は66 '0' は 0 ではない (文字'0' は0x30 = 48 で表される) 4 2015/10/9 確かめてみる #include <stdio.h> int main(void) { int a; a = ’A’; printf(”A is %d¥n”, a); return 0; } 文字を表す型 整数の変数a に’A’ を代入して いる 結果はA is 65 ということは a = ’A’ とするのは a = 65; とするのと同じ. 文字(漢字,ひらがな除く)は合計数十個 文字を表す型: char str[10]; str[0] が1文字目,str[1] が2文字目,・・・ 文字列は"ABC" のようにダブルクォートで表現 整数を表す型の一種(int などの仲間) 通常,char 型は8bit 通常,int は 32bit (16bit の機械・処理系もある) 'a' のようにシングルクォートで挟む char ch = 'a'; 終端記号(ターミネータ) char str[8] = "ABC"; 文字の配列として表現する char (character の略) 文字コードを得る方法 文字列 アルファベット(大文字・小文字),数字,記号 8bit (256通り) で表すことが出来る A B C ’¥0’ 最後に終端記号(ターミネータ,'¥0')を置く char str[3] = "AB"; の場合 str[0] の中身は‘A’ str[1] は‘B’ str[2] は'¥0' '¥0' = 0 であって,'0' ではない('0' は48) 無視する ターミネータが来るまでが文字列とする ターミネータ以降は無視する 利点 文字列の長さを別の変数に管理する必要がない 5 2015/10/9 文字列の初期化 文字列の表示 配列を直接,文字列で初期化できる printf char s[] = "ABC"; char s[] = { 'A', 'B', 'C', '¥0' }; と同じ 要素数は3ではなく4になることに注意 要素数を省略することが出来る では%s で表示することが出来る char str[] = "ABC"; printf ("string is %s¥n", str); ひと文字は%c で表示することが出来る printf ("character of 48 is %c¥n", 48); printf ("character of str[0] is %c¥n", str[0]); 制御文字 文字列操作関数 改行記号'¥n' '¥n' (=10) は画面に出力されると改行する 終端文字(ターミネータ) '¥0' 「str・・・」という名称の関数群 strcat(s1,s2) : 2つの文字列を接続する strcmp(s1,s2) : 文字列を比較する s1>s2 で1 、s1<s2 で-1 、s1=s2 で0 を返す strcpy(s1,s2) : 文字列をコピーする strlen(s1) : 文字列の長さを返す 文字列の終端を表す その他多くの制御文字がある 制御文字は単一の文字としても,文字列中でも利用 できる '¥n' "ABC¥n" 以下のプリプロセッサを追加することで,文字列を取り扱う便 利な関数を使用できる: #include <string.h> 文字列長に制限のあるバージョンもある strncmp(s1,s2,n) : 第3引数にn を与えて,最初のn 文字だけを比較 strncat(s1,s2,n) : s1のうしろにs2をn 文字分連結 6