...

終端文字

by user

on
Category: Documents
6

views

Report

Comments

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
Fly UP