半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻

Slides:



Advertisements
Similar presentations
理化学研究所 第 10 回 構造体 半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻 鹿児島大学 プログラミング基礎演習.
Advertisements

1 第5回 配列. 2 今回の目標 マクロ定義の効果を理解する。 1次元配列を理解する。 2次元配列を理解する。 ☆2 × 2の行列の行列式を求めるプログラ ムを作成する.
1 例題 ex3b ( 配列 ) 科学科プログラミング. 2 例題 : ex3b  以下の 3 つについて例題を進める ステップ 1 :配列 ステップ 2 :最小と最大 ステップ 3 :文字型の配列.
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
A B x y z 復習 構造体変数 普通の変数 x y z 構造体変数 x y z 箱のイメージ 引き出しのイメージ
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング応用 printfと変数.
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
知能情報工学演習I 第8回( C言語第2回) 課題の回答
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
情報処理Ⅱ 2006年11月24日(金).
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
情報処理Ⅱ 第7回 2004年11月16日(火).
知能情報工学演習I 第8回(後半第2回) 課題の回答
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
情報処理Ⅱ 2005年11月25日(金).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
知能情報工学演習I 第9回(後半第3回) 課題の回答
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
第5回 配列.
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻 プログラミング基礎演習 第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);