第8回 http://www.fit.ac.jp/~matsuki/lecture.html プログラミングⅡ 第8回 http://www.fit.ac.jp/~matsuki/lecture.html.

Slides:



Advertisements
Similar presentations
アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング基礎I(再) 山元進.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
第13回 プログラミングⅡ 第13回
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
ファイル操作と文字列の利用.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第10回 プログラミングⅡ 第10回
プログラミング論 関数ポインタ と 応用(qsort)
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング論 II 2008年10月30日 文字列
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
高度プログラミング演習 (09).
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
プログラミング論 文字列
プログラミング 4 文字列.
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

第8回 http://www.fit.ac.jp/~matsuki/lecture.html プログラミングⅡ 第8回 http://www.fit.ac.jp/~matsuki/lecture.html

連絡 小テスト 授業開始直後と終了直前に小テストを2行います 授業開始直後テスト(復習テスト)⇒前回の復習 授業終了直前テスト(本テスト)⇒その日の内容の復習 本テストの成績(正答率)が50%以下の場合は、宿題を出します(レポートとは別)。 宿題を決められた期日までに提出しない場合は、欠席扱いにします

宿題の提出について 以下の場合は、出題日の出席を欠席とする 締切日を過ぎた場合 正解率が7割未満の場合 提出は、PDFファイルを印刷して、それに答えを書いて提出すること。

プログラミングに関する質問時間 月曜日と金曜日の12:00から13:00までは, CAE室で,プログラミングに関する質問を受け付けています. 遠慮なく相談に来てください.

今日の内容 ポインタ(応用編) 配列とポインタの関係 引数と配列 文字列とポインタ 文字列を扱う関数紹介 動的メモリ確保 strlen関数, strcpy関数, strcat関数, strcmp関数 動的メモリ確保 malloc関数, free関数

文字列の操作

標準ライブラリ関数を使う 標準ライブラリ関数 自分で定義した関数 printf scanf その他 予め用意されている 書込め max solve func1 予め用意されている 標準的な処理を行う関数 書込め プログラマーが自作した関数

標準ライブラリ関数を使う 文字列操作を行う関数 を紹介 標準ライブラリ関数 printf scanf その他 予め用意されている 標準的な処理を行う関数 文字列操作を行う関数 を紹介

文字列操作を行う関数 strlen : 文字列の長さを求める関数 strcpy : 文字列をコピーする関数 書込め strlen : 文字列の長さを求める関数 strcpy : 文字列をコピーする関数 strcat : 文字列をつなげる(連結する)関数 strcmp : 2つの文字列を比較する関数 注意:  この文字列操作の関数を使うときは,string.hというファイルをインクルードする必要がある 書込め

文字列操作を行う標準ライブラリ関数を利用するときに必要 サンプルプログラム #include <stdio.h> #include <string.h> main() { 書込め 文字列操作を行う標準ライブラリ関数を利用するときに必要

文字列の長さを調べる(strlen関数) string lengthの略 関数宣言:   size_t strlen(const char *str); 機能:   文字列strのNULL文字を除く長さを返す. 正の値のみのint型 書込め 5 ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’ strlen(str) 5 str[0] str[1] str[2] str[3] str[4] str[5]

サンプルプログラム #include <string.h> #include <stdio.h> main() { 実行例 #include <stdio.h> #include <string.h> main() { char str[100]; printf(“文字列を入力してください\n”); scanf(“%s”, str); printf(“文字列の長さは%dです\n”, strlen(str) ); } 文字列を入力してください HELLO↵ 文字列の長さは5です. 書込め 文字列の長さを得る

文字列を配列にコピー(strcpy関数) string copyの略 関数宣言:   char* strcpy(char *str1, const char *str2); 機能:   文字列str2を文字列str1の領域にコピーして,str1を返す. str2は変わらない 書込め コピーする ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’ ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’ str1[0] str1[1] str1[2] str1[3] str1[4] str1[5] str2[0] str2[1] str2[2] str2[3] str2[4] str2[5] str1 str2

strcpyを使えば,簡単に配列に文字列を格納できる! サンプルプログラム #include <stdio.h> #include <string.h> main() { char str1[100]; char str2[100]; strcpy(str1, “HELLO”); strcpy(str2, “GoodBye”); printf(“配列str1は%sです\n”, str1); printf(“配列str2は%sです\n”, str2); } 実行例 配列str1はHELLOです 配列str2はGoodByeです str1に”HELLO”をコピー 書込め str2に”GoodBye”をコピー 書込め strcpyを使えば,簡単に配列に文字列を格納できる!

文字列を連結する(strcat関数) 関数宣言: char* strcat(char *str1, const char *str2); string concatenateの略 関数宣言:   char* strcat(char *str1, const char *str2); 機能:   文字列str2を文字列str1の末尾に追加して,str1を返す. 書込め str1 str1 B y e ! \0 G o o d G o o d \0 B y e ! \0 \0の上から追記される str2

サンプルプログラム 配列str1はHELLOです 配列str2はGoodByeです 連結するとHELLOGoodByeです 書込め #include <stdio.h> #include <string.h> main() { char str0[100]; char str1[100]; char str2[100]; strcpy(str1, “HELLO”); strcpy(str2, “GoodBye”); strcpy(str0, str1); strcat(str0, str2); printf(“配列str1は%sです\n”, str1); printf(“配列str2は%sです\n”, str2); printf(“連結すると%sです\n”, str0); } 実行例 配列str1はHELLOです 配列str2はGoodByeです 連結するとHELLOGoodByeです str0にstr1をコピー str0の末尾にstr2を連結 書込め str0(連結した文字列)を表示

strcatの動作内容 strcat(str0, str2); strcpy(str1, “HELLO”); str1 H E L L O \0 strcpy(str2, “GoodBye”); str2 G o o d B y e \0 strcpy(str0, str1); str0 H E L L O \0 strcat(str0, str2); str0 H E L L O G o o d B y e \0 書込め 書込め 書込め 書込め 書込め 書込め 書込め 書込め

配列の大きさに注意 配列の大きさが十分でない場合, 配列の領域をはみ出してコピーすることが起こる(メモリ破壊) メモリ破壊の発生      配列の領域をはみ出してコピーすることが起こる(メモリ破壊) str2 G o o d B y e \0 strcat(str0, str2); str0 H E L L O G o o d B y e \0 確保した領域 char str0[10] メモリ破壊の発生 書込め 取り扱うデータ量が,配列の大きさを超えないように注意

文字列を比較する(strcmp関数) 関数宣言: string compareの略 関数宣言: char* strcmp(const char *str1, const char *str2); 機能:   文字列str1と文字列str2を比較して,一致していたら0を返す 書込め True (同じ) False (違う) str1とstr2は同じ? strcmp(s1, s2); 0を返す 辞書の並び順で1か-1を返す 書込め

2つの文字列を比較した結果,戻り値が0であれば サンプルプログラム #include <stdio.h> #include <string.h> main() { char str1[100]; char str2[100]; printf(“1番目の文字列を入力:”); scanf(“%s”, str1); printf(“2番目の文字列を入力:”); scanf(“%s”, str2); if ( strcmp( str1, str2 ) == 0 ) printf(“2つの文字列は同じです\n”); else printf(“2つの文字列は違います\n”); } 実行例 1番目の文字列を入力:hello 2番目の文字列を入力:hello 2つの文字列は同じです 2つの文字列を比較した結果,戻り値が0であれば 書込め

動的なメモリ確保

文字列の長さを実行時に決める プログラム実行前に配列の大きさは決まっている (実行時の変更は不可) char str1[100]; ・・・・ scanf(“%s”, str1); char *str2 = “GoodBye”; 文字列の入力 決まった文字列の大きさを指すポインタとして定義 実行時に文字列を格納する領域を,動的に確保する (好きな大きさのメモリを確保) 書込め

文字列の長さを実行時に決める メモリの確保: malloc関数 を利用 メモリの開放: free関数 を利用 書込め 書込め この関数によって,好きなメモリサイズを確保することができる 書込め malloc関数で確保したメモリ領域は,必ずfree命令で解放しなければならない 使い終わったメモリは解放しないと,使えるメモリが減っていくことになる (通常の変数や配列では,プログラムが終了すると自動的に解放される) 書込め メモリを解放し忘れることを,メモリリーク(Memory leak)という

malloc関数 機能: 確保したいメモリサイズを引数に指定すると,そのサイズ分だけメモリを確保し,その先頭アドレスを戻り値として返す.   確保したいメモリサイズを引数に指定すると,そのサイズ分だけメモリを確保し,その先頭アドレスを戻り値として返す. 使い方:   char *p;   p = (char *)malloc(確保したいメモリサイズ) 例:   p = (char *)malloc(10); //10バイト分確保 書込め pはchar型へのポインタ char型へのポインタにキャストする必要がある 書込め pには,確保したメモリ領域の先頭アドレスが代入される バイト単位で指定

free関数 機能: 確保したいメモリ領域を解放する (mallocとfreeは必ず対で使う) 使い方:   確保したいメモリ領域を解放する   (mallocとfreeは必ず対で使う) 使い方:    free(解放するメモリ領域のアドレス); 例:   p = (char *)malloc(10); //10バイト分確保   free(p); //メモリ解放 書込め 書込め mallocで確保したアドレス 書込め

動的メモリ確保の注意&その他 書込め malloc関数とfree関数は,対で使う 文字列用の領域を確保する場合は,NULL文字用に1バイト余分に領域を確保する stdlib.hをインクルードする必要がある sizeof(型名または変数名)⇒その型や変数の大きさを調べることができる sizeof(int);  ⇒ 4 sizeof(double);  ⇒ 8 int x; sizeof(x); ⇒ 4 char y[20]; sizeof(y); ⇒ 20  1バイト×20個の要素=20バイト int z[20]; sizeof(z); ⇒ 80  4バイト×20個の要素=80バイト 書込め 書込め

書込め ‘\0’用に1バイト余分に必要 プログラムの強制終了 書込め 何文字のaを用意しますか:4 aaaaを用意しました #include <stdio.h> #include <stdlib.h> main() { char *str; int num, i; printf(“何文字のaを用意しますか:”); scanf(“%d”,&num); str = (char *)malloc(sizeof(char)*(num+1)); if (!str) { printf(“メモリ確保に失敗しました\n”); exit(0); } for (i=0; i<num; i++) { *(str + i) = ‘a’; *(str + num) = ‘\0’; printf(“%sを用意しました\n”, str); free(str); stdlib.hをインクルードする 書込め 書込め ‘\0’用に1バイト余分に必要 1×(num+1)バイト分の領域を確保 プログラムの強制終了 書込め 実行例 何文字のaを用意しますか:4 aaaaを用意しました メモリを解放