半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻 プログラミング基礎演習 第9回 配列と文字列 半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻
配列とは… 同じ型の変数の組 C言語での表現方法 順番が付いている 個数制限はint型整数の上限値まで 配列の各要素 aa[0], aa[1], aa[2],… 番号は0から始まることに注意! 配列全体 aa
平均点の計算 List9-1(教科書p.207) 小数点第1位までで四捨五入して書く #include <stdio.h> int main(void); int main(void) { int hatoyama, kan, noda; float heikin; hatoyama=65; kan=90; noda=75; heikin=(hatoyama+kan+noda)/3.0; printf("鳩山%d点\n菅%d点\n野田%d点", hatoyama, kan, noda); printf("平均は%.1f点\n",heikin); return(0); } 小数点第1位までで四捨五入して書く
数が少ないならよいが… 例えば、歴代総理大臣全員 変数が増えすぎて面倒 まとめて宣言、まとめて扱える 明治以来、62人(95代)もいる 番号が付けられる まとめて宣言、まとめて扱える
平均点の計算:配列を使う List9-2(教科書p.208) 配列の型 配列の定義:個数を明示 配列の各要素 最大値とサイズは1ずれる #include <stdio.h> int main(void); int main(void) { int point[3]; float heikin; point[0]=65; point[1]=90; point[2]=75; heikin=(point[0]+point[1]+point[2])/3.0; printf("鳩山%d点\n菅%d点\n野田%d点",point[0],point[1],point[2]); printf("平均は%.1f点\n",heikin); return(0); } 配列の型 配列の定義:個数を明示 配列の各要素 最大値とサイズは1ずれる ∵0から始まるため
配列と箱詰め菓子 5個詰め合わせ 型が同じなら違う物が入っていても良い okashi[3] okashi[5] 和風菓からいも
配列の要素 要素1つずつ:その型の変数と同じ int aa[3]; aa[0],aa[1],aa[2]はいずれもint型変数
平均点の計算:変数の配列番号 List9-3(教科書p.213) #include <stdio.h> int main(void); int main(void) { int point[3], sum, ii; float heikin; point[0]=65; point[1]=90; point[2]=75; sum=0; for(ii=0;ii<3;ii++) { sum=sum+point[ii]; } heikin=sum/3.0; printf("鳩山%d点\n菅%d点\n野田%d点",point[0],point[1],point[2]); printf("平均は%.1f点\n",heikin); return(0);
合計を求めるforループ ここではsum=0 1回ごとにpoint[ii]が足される Forループの中身を読む sum=0; for(ii=0;ii<3;ii++) { sum=sum+point[ii]; } 終わったときは、sum=Sii point[ii]
平均点の計算:もっと多要素へ マクロ定義:文字列の置き換え List9-4(教科書p.218) 変数のキャスト #include <stdio.h> #define MAX_SOURI 5 int main(void); int main(void) { int point[MAX_SOURI]; int sum, ii; float heikin; point[0]=65; point[1]=90; point[2]=75; point[3]=45; point[4]=82; 変数のキャスト sum=0; for(ii=0;ii<MAX_SOURI;ii++) { sum=sum+point[ii]; } heikin=(float)sum/(float)MAX_SOURI; printf("伊藤博文%d点\n",point[0]); printf(“黒田清隆%d点\n",point[1]); printf("山縣有朋%d点\n",point[2]); printf("松方正義%d点\n",point[3]); printf("伊藤博文%d点\n",point[4]); printf("平均は%.1f点\n",heikin); return(0);
変数のキャスト キャストcast 英語では…「配役」 C言語では 投げるとか鋳造するとか呪うとか他の意味もある 英語の本当の意味は、それらを包括する概念らしい C言語では 別の型の変数として扱わせる ()の中に役名の型を書き、直前に付ける 例: (int)aa, (double)ii, (float)xxとか
マクロ定義とプリプロセッサ プリプロセッサー 先頭が「#」の行 例:#define PI 3.14159265 コンパイルする直前に何かやらせる #include <ファイル名> ファイル名の中身を一時的にコピーしてから #define 第1文字列 第2文字列 第1文字列を第2文字列で置き換える 第1文字列は全て大文字にすることが多い 例:#define PI 3.14159265
平均点の計算:もっと多要素へ List9-4(教科書p.218) #include <stdio.h> #define MAX_SOURI 5 int main(void); int main(void) { int point[MAX_SOURI]; int sum, ii; float heikin; point[0]=65; point[1]=90; point[2]=75; point[3]=45; point[4]=82; sum=0; for(ii=0;ii<MAX_SOURI;ii++) { sum=sum+point[ii]; } heikin=(float)sum/(float)MAX_SOURI; printf("伊藤博文%d点\n",point[0]); printf("黒田清隆%d点\n",point[1]); printf("山縣有朋%d点\n",point[2]); printf("松方正義%d点\n",point[3]); printf("伊藤博文%d点\n",point[4]); printf("平均は%.1f点\n",heikin); return(0);
2次元配列、3次元配列 軽羹まんじゅう詰め合わせ 20個入り 24個入り karukan[5][4] karukan[2][4][3] 明石家 明石家 20個入り karukan[5][4] 24個入り karukan[2][4][3]
2次元マップ 2次元にいる“敵”の数を表示する void show_gmap(int gmap[GSIZE][GSIZE], int isize) /* 全宇宙マップを表示する 2012/10/19 Handa */ { int ii,jj; printf(" :"); for(ii=0;ii<isize;ii++) { printf("%3d ",ii); } printf("\n"); for(jj=0;jj<isize;jj++) { printf("%3d:",jj); for(ii=0;ii<isize;ii++) { printf("%3d ",gmap[ii][jj]); } printf("\n"); return;
2次元配列、3次元配列 「配列の配列」と考えても良い karukan[5][4] karukan[2][4][3] 明石家 明石家 karukan[5][4] karukan[2][4][3] 軽羹3個入り4本2段セット 軽羹4個入り5本セット
初期値の代入 基本は普通の変数と同じ 全体を{}でくくり、要素順に「,」で区切って並べる List9-4b 初期化 for(ii=0;ii<MAX_SOURI;ii++) { sum=sum+point[ii]; } heikin=(float)sum/(float)MAX_SOURI; printf("伊藤博文%d点\n",point[0]); printf(“黒田清隆%d点\n",point[1]); printf("山縣有朋%d点\n",point[2]); printf("松方正義%d点\n",point[3]); printf("伊藤博文%d点\n",point[4]); printf("平均は%.1f点\n",heikin); return(0); #include <stdio.h> #define MAX_SOURI 5 int main(void); int main(void) { int point[MAX_SOURI] ={65,90,75,45,82}; int sum=0, ii; float heikin; 初期化
文字コード ビットパターンを文字に1対1対応させる 英数字:1バイト(256種類)で足りる 足りない場合:2バイト以上で1文字にする 現状では、英数字はほとんどがASCIIコード 昔使っていたコードの例:EBCDICコード 足りない場合:2バイト以上で1文字にする 仮名と常用漢字は2バイトで足りる 現在、4種類並立:JIS、shift-JIS、EUC、UniCode 別の計算機やOSと情報交換する時には必要
文字コード C言語では基本は1バイト文字 多バイト文字は拡張仕様 2バイト文字=仮名や漢字 printfで表示する以外は使わないのが無難
文字の定数と変数 文字=1バイト整数 文字の“定数” 文字の変数 charは文字型とも1バイト整数とも呼ぶ 空白も1文字 文字=1バイト整数 charは文字型とも1バイト整数とも呼ぶ 文字の“定数” 例 'A', 'z', '@', '/', ' ' 変数名と識別するためにシングルクォート「'」で括る。 文字の変数 1バイト長の整数として書く 例 char aa; char moji; char my_initial;
プログラムで確かめる 文字定数があるプログラム ワンポイント:printf中の%c コードに対応する文字を出力する コードに対応する文字を出力する #include <stdio.h> int main(void) { char aa; aa='x'; printf("moji=%c=%d\n",aa,aa); return 0; }
文字列 文字列=1バイト整数の1次元配列 文字の“定数” 文字の変数 例 "Handa", "My name is", "OK!\n" 変数名と識別するためにダブルクォートで括る。 文字の変数 1バイト長の整数の1次元配列として書く 例 char aa[5]; char moji[8]; char my_initial[256];
文字列の長さ 文字列は長さがまちまち→どうやって扱う? 「ここで終わり」を決める。 C言語だとNULL 文字列はNULLで1バイト余分に必要 別のやり方の例:長さを別に覚えておく 文字列はNULLで1バイト余分に必要
プログラムで確かめる 文字の配列を文字列として書く #include <stdio.h> int main(void); { char aa[13]; aa[0]='H'; aa[1]='e'; aa[2]='l'; aa[3]='l'; aa[4]='o'; aa[5]=' '; aa[6]='w'; aa[7]='o'; aa[8]='r'; aa[9]='l'; aa[10]='d'; aa[11]='.'; aa[12]=NULL; printf("%s\n",aa); return 0; }
文字列の代入 1次元配列の代入と同じ 要素単位で1文字ずつ代入する 専用の関数が既に用意されている forループで代入しても良いが… strcpy(aa,bb); 使用する時には、まず #include <string.h>
文字列の代入 文字列定数の初期値代入 配列の場合と同じ。この場合だけ=で代入可能 例 char myname[6]="handa"; サイズは、null文字用に1バイト余分に用意する!
プログラムで確かめる 1文字ずつ出力させる 6文字目, bb[5]には何が? #include <stdio.h> #include <string.h> int main(void); int main(void) { int ii; char aa[6]="handa"; char bb[6]; strcpy(bb,aa); for(ii=0;ii<6;ii++) { printf("%c,%d\n",bb[ii],bb[ii]); } return(0); 6文字目, bb[5]には何が?
文字列の出力(表示) コードが表す文字として表示 printf文での書式 %s 注意:%cはnullがなくてもよいが %sはnullで終わっていないとまずい! 例 printf("moji=%s\n", moji);
文字列の配列 「文字の2次元配列」を使えば良い List9-6(教科書p.222) NULL文字分も忘れなく! #include <stdio.h> #define MAX_SOURI 5 int main(void); int main(void) { int point[MAX_SOURI] ={65,90,75,45,82}; char name[MAX_SOURI][10] ={"Ito", "Kuroda", "Yamagata", "Matsukata", "Ito"}; int sum=0, ii; float heikin; for(ii=0;ii<MAX_SOURI;ii++) { sum=sum+point[ii]; } heikin=(float)sum/(float)MAX_SOURI; printf("%sは%d点\n", name[ii], point[ii]); return(0);