プログラミング演習Ⅱ 第12回 文字列とポインタ(1)

Slides:



Advertisements
Similar presentations
プログラミング演習Ⅱ 第1回 ガイダンス 情報・知能工学系 山本一公 本演習の概要(1) C 言語の「基礎知識」の習得 – プログラミング演習Ⅰの続き – 配列、関数、ポインタ等 – プログラミング演習Ⅰの内容だけでは、 とてもじゃないが「 C 言語を勉強した」とは 言えない.
Advertisements

プログラミング演習Ⅱ 第 11 回 ポインタ(2) 情報・知能工学系 山本一公
1 第5回 配列. 2 今回の目標 マクロ定義の効果を理解する。 1次元配列を理解する。 2次元配列を理解する。 ☆2 × 2の行列の行列式を求めるプログラ ムを作成する.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
情報処理演習C2 ファイル操作について (2).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第7回 データの基本型 情報・知能工学系 山本一公
データ構造とアルゴリズム 第10回 mallocとfree
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング基礎I(再) 山元進.
プログラミング演習(2組) 第12回
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月6日、H.16(‘04)] 今日のメニュー 1 前回の課題の復習
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
ファイル操作と文字列の利用.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
第10回 プログラミングⅡ 第10回
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
前回の練習問題.
第7回 プログラミングⅡ 第7回
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 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 文字列の扱い.
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング 3 2 次元配列.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
知能情報工学演習I 第7回(後半第1回) 課題の回答
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング論 ポインタ
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
ネットワーク・プログラミング Cプログラミングの基礎.
精密工学科プログラミング基礎 第7回資料 (11/27実施)
プログラミング 4 文字列.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
第5回 配列.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

プログラミング演習Ⅱ 第12回 文字列とポインタ(1) 情報・知能工学系 山本一公 kyama@tut.jp

前回の課題の解説・ポイント 課題10-1 課題10-2 ポインタ変数の扱いに慣れるのが目的 普通に平均を求めるだけ こちらも、ポインタ変数の扱いに慣れるのが目的 簡単なソートアルゴリズム 選択ソート(一番小さい数を見つけて入れ替え) バブルソート(隣合う2数を比較して入れ替え)

課題9の採点結果から 課題9-1 課題9-2 配列に対して、要素毎のアドレスではなく、 先頭アドレスのみを表示しているケースがあった OKになってない人は、テストが不十分です 自分の書いたプログラムがどういう挙動になるか、客観的に読めるようになりましょう

今日の内容 教科書 pp.248~253 文字列とポインタ 「文字列とポインタ」となっていますが、 半分は「配列とポインタ」です

文字列リテラルとポインタ 文字列リテラルは、メモリ上のどこかに確保されている 文字列リテラルを評価すると、文字列の先頭文字へのポインタが返される 配列strの最初の要素が’A’、2番目の要素が’B’、3番目の要素が’C’、4番目の要素が0で初期化される ptrには、メモリ上のどこかに確保された文字列の先頭アドレスが代入される ptrが確保される場所と文字列リテラルの場所は無関係 char str[] = “ABC”; /* &str[0] =‘A’のアドレス となる */ char *ptr = “123”; /* ptr = ‘1’のアドレス となる */

配列とポインタの共通点 配列で使う添字演算子“[” “]”をポインタに対しても使うことができる 効果も同じ ポインタを使って、配列と同じことができる この場合、ptr[0]は‘1’ 、ptr[1]は‘2’、 ptr[2]は‘3’である C言語では、配列の先頭アドレスしか見ていない(要素数は無視)ので全く同じになる char str[] = “ABC”; /* &str[0] =‘A’のアドレス となる */ char *ptr = “123”; /* ptr = ‘1’のアドレス となる */

配列とポインタの違い(1) 配列変数はconst扱いなので、代入できない ポインタ変数は代入できる 配列変数への文字列リテラルの代入は、初期化の場合のみ可能 ポインタ変数の場合は、メモリ上のどこかに確保される文字列リテラルの先頭文字へのポインタが代入されるだけなのでプログラム中でも可能(Fig.11-3) char str[] = “ABC”; char *ptr = “123”; str = “DEF”; /* エラー! */ ptr = “456”; /* 正しい! */

配列とポインタの違い(2) 配列は、初期化時に要素数を指定できるので、使用しない領域を確保しておくことが可能(Fig.11-4(a)) ポインタはあくまでもアドレスを保持するだけの単独の変数(Fig.11-4(b)) 文字列リテラルは、文字列に必要な領域しか確保されない

文字列の配列(1) 文字列の配列は、配列の配列で実現する場合と、ポインタの配列で実現する場合で(メモリ上の実体が)かなり異なる 配列による文字列の配列の場合 C言語での配列の配列(2次元配列)は、 1次元配列を2次元的に扱っているだけ char st[3][6] と定義されたものは実質 st[18] と同じ st[2][5] は st[2 * 6 + 5] としてアクセスされる すなわち、メモリ上には連続的に配置される

文字列の配列(2) ポインタによる文字列の配列の場合 Fig. 11-5 ポインタ配列の要素は、それぞれの文字列リテラルの先頭アドレスを指すだけ 文字列はそれぞれがメモリ上のどこかに存在する 実際にどこに配置されるかは処理系依存 Fig. 11-5 配列で実現する場合は、2次元配列の初期化と同様に、間に0が埋め込まれている ポインタの場合は0は入らないし、連続した領域に確保されてもいない ポインタの配列も、他の配列と同じように扱われるので、連続した領域に確保される

共通点・相違点まとめ 共通点 相違点 配列にもポインタにも添字演算子が使える 配列の配列(2次元配列)による文字列の配列 書き方も使い方も結果も同じ 区別なく使って特に問題ない 相違点 配列の配列(2次元配列)による文字列の配列 その実体が連続した領域に確保される(2次元配列なので、文字のないところには0が入る) 配列なので、文字列の代入は初期化時しかできない。文字単位の置き換えはできる。 ポインタの配列による文字列の配列 ポインタは連続した領域に確保されるが、実体は必ずしも連続した領域に確保されるわけではない 要素を別の文字列リテラルで置き換えることができる。

今週の課題 教科書p.253, List 11-5のプログラムを改造して、st[0][0]~st[2][5]、pt[0][0]~pt[2][5]の各要素の内容とアドレスを表示するようにし、「配列による文字列」と「ポインタによる文字列」のそれぞれの文字列リテラルがメモリ上でどのように配置されているか調べよ。文字列の内容はList 11-5から変更しないこと。 1次元配列の先頭アドレスをポインタ配列に代入すれば、2次元配列を実現できる。このようにして実現した2次元配列による行列の掛け算を行う関数(行列a×行列bの結果を行列ansに入れる関数。aはn×m行列、bはm×l行列、ansはn×l行列とする)void mat_mul(int *ans[], int *a[], int *b[], int n, int m, int l)を作成せよ。main関数なども作成して完成したプログラムを作ることとし、main関数の中で教科書p.103, 演習5-7の配列を与えて関数を呼び出し掛け算を計算せよ。

課題2のヒント(1) ポインタ配列を関数に渡す int main(void) { … char *ptr[3] = {“123”, “4567”, “78910”}; function(ptr); void function(char *ptr[]) { …

課題2のヒント(2) ポインタをポインタ配列に代入する int main(void) { … int a0[3], a1[3]; // 3要素の1次元配列 int *ptr[2]; // 2要素のポインタ配列 ptr[0] = a0; ptr[1] = a1; // これで2×3の行列ができる // 行列要素の代入 ptr[0][0] = 1; ptr[0][1] = 2; ptr[0][2] = 3; ptr[1][0] = 4; ptr[1][1] = 5; ptr[1][2] = 6;

課題2のヒント(3) これ何の役に立つの? 1次元配列は、malloc()関数によりプログラム中で可変長の領域を確保できるので、これを応用することによって任意の多次元可変長配列をプログラム中で作ることができる int n, m, i; int **ptr; … // n × m の2次元配列を作る ptr = (int**)malloc(sizeof(int*) * n); // n次元のポインタ配列 for (i = 0; i < n; i++) { ptr[i] = (int*)malloc(sizeof(int) * m); // m次元の実配列 }

レポートについて 電子メールで提出 提出先は prog2@slp.cs.tut.ac.jp Subjectを「プログラミング演習2 課題11提出 学籍番号・氏名 」とすること C言語ソースファイルを添付する メールの本文には何も書かなくて良いです ソースファイルの頭にコメントで以下の情報を入れる 学籍番号・氏名 プログラムの説明(どのように動くのか、工夫した点等) 実行結果(長い場合は一部)を貼る 提出締切は、1月30日(水) 12:00 (1週間後)

授業用Webサイト URL: http://www.slp.cs.tut.ac.jp/~kyama/programming2/ 課題のpdfファイルが置いてあります。 授業で使ったpptファイルを置いていきます。 質問メールは、以下のどちらかのアドレスまで kyama@tut.jp prog2@slp.cs.tut.ac.jp C-515へ直接質問しに来ても構いません