情報処理Ⅱ 2005年11月25日(金).

Slides:



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

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
文字配列の課題1 解説 /* a */ #include <stdio.h> main( ) { int i;
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
String - 文字列 2009年10月9日 7ADD2116 佐藤洋輔.
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
情報処理Ⅱ 2007年11月5日(月).
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング 4 記憶の割り付け.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門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.
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第14回 2006年1月23日(月).
情報処理Ⅱ 第2回:2003年10月14日(火).
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語 はじめに 2016年 吉田研究室.
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
情報処理Ⅱ 第2回 2005年10月14日(金).
ネットワーク・プログラミング Cプログラミングの基礎.
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
情報処理Ⅱ 2005年10月28日(金).
情報処理Ⅱ 2007年12月3日(月) その1.
コンパイラ 2012年10月11日
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
情報処理Ⅱ 2006年11月8日(金).
情報処理Ⅱ 2007年2月2日(金).
情報処理Ⅱ 第2回 2004年10月12日(火).
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月27日(金).
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

情報処理Ⅱ 2005年11月25日(金)

本日学ぶこと ポインタのポインタ ポインタを使ったプログラミング さまざまな「空」 コマンドライン引数 回文判定(コマンドライン引数から語を獲得) 任意型のビットパターン出力 さまざまな「空」 NULLポインタ void型 ナル文字('\0') 空文

ポインタのポインタ 指し示すものを指し示す 例: char **p; p p[0] p はchar **型 (参考)多次元 配列の模式図

多次元配列とポインタのポインタ 配列とポインタが異なるように,「多次元配列」と「ポインタとポインタ」も異なる. × int a[2][3]; int **p = a; ○ int b[2][3]; int (*q)[3] = b; 一次元配列に限り, ○ int c[2]; int *r = c; a と b は「int [2][3]」型,ただしポインタ値としては「int (*)[3]」型 c は 「int [2]」型,ただしポインタ値としては「int *」型 int *q2[3]; と書くと,これは「int *[3]」型,ポインタ値としては「int **」型

コマンドライン引数 コマンドライン引数とは C言語でコマンドライン引数を獲得するには argv argv[0] argv[1] 例: cc program.c でコンパイルするとき, 「cc」はコマンド名,「program.c」はコマンドライン引数と呼ばれる. C言語でコマンドライン引数を獲得するには main関数を main(int argc, char *argv[ ]) と宣言する. argv はchar **型のポインタ変数 argv argv[0] argv[1] argv[2] = NULL "cc" argc = 2 "program.c"

NULLポインタ NULLは特殊な扱いをする定数であり,空ポインタ定数(null pointer constant)とも呼ばれる. キャスト(明示的な型変換)なしで, 任意のポインタ型オブジェクトへの代入や, 任意のポインタ値との比較が可能 if,for,whileなどの条件式に,ポインタ値が指定可能 真…NULL以外のすべてのポインタ値 偽…NULL

コマンドライン引数とargv(1) argv argv[0] argv[1] argv[2] = NULL "./commandline" 「./commaneline abc」を実行したときの 初期状態 argv argv[0] argv[1] argv[2] = NULL "./commandline" "abc"

コマンドライン引数とargv(2) argv argv[-1] argv[0] argv[1] = NULL "./commandline" としたとき argv argv[-1] argv[0] argv[1] = NULL "./commandline" "abc"

コマンドライン引数とargv(3) argv argv[-2] argv[-1] argv[0] = NULL さらに argv++; としたとき argv argv[-2] argv[-1] argv[0] = NULL "./commandline" "abc" *argv はNULL(偽)

回文判定にコマンドライン引数を 仕様 例 入力は,コマンドライン引数から獲得する. コマンドライン引数の各文字列が回文になっていれば「Yes」を,そうでなければ「No」を出力する. あとは前述の回文判定と同じ. 例 ./palindrome2 12321 123321 noon Noon 12321 : Yes 123321 : Yes noon : Yes Noon : No

ここまでのまとめ ポインタは「型 *変数名;」で宣言し,式の中では その参照先を「*変数名」により得ることができる. 値として参照するときは,ポインタ変数でも配列変数でも同じ書式. 変数宣言により生じる効果は,配列とポインタとで異なる. ポインタ値の加減算はポインタ変数の得意技. コマンドライン引数は,ポインタのポインタで獲得できる.

任意型のビットパターン出力:仕様など 仕様 例 出力したいオブジェクトの型や値は,プログラムの中で与える. 各ビットは上位から下位の順に出力する. 1バイトごとに空白文字を置いて出力する. 例 入力: int x = -40; 出力: 11011000 11111111 11111111 11111111 入力: float f = 40; 出力: 00000000 00000000 00100000 01000010

任意型のビットパターン出力:方針 float f = 40; char *p = (char *)&f; とすると,*p, *(p + 1), ..., *(p + sizeof(float)-1) は,fの「バイトごとの」中身である. 1バイトのビットパターンを求めるプログラムを活用して, バイトごとに出力すればいい! float f : p p+1 p+2 p+3 char *p : は1バイト

ポインタのキャストが必要な理由 float f = 40; としたとき, p1+1 float *p1 : float f : p3+1 char *p2 = &f; は,型が合わない. char *p3 = (char *)&f; とすればうまくいく. float *p1 : p1+1 は1バイト char *p3 : p3+1 float f :

ビットパターン出力 float f = 40; の結果 バイトごとに逆順に出力すると fを-10から10まで変えてみると 00000000 00000000 00100000 01000010 バイトごとに逆順に出力すると 01000010 00100000 00000000 00000000 fを-10から10まで変えてみると

「空」とプログラム プログラミングと関係のない「空」の例 Cにおける「空」とは,「それは空である」,「空の…がある」などを明示するための概念 「部屋がない」と「空室がある」は違う. 空集合φ={}と,空集合のみからなる集合{φ}={{}}は違う. Cにおける「空」とは,「それは空である」,「空の…がある」などを明示するための概念

void型 voidは「何もない」や「無効な値」を表す型名 用途 × void x; ○ void *x; ただし,sizeof(void)は0ではなく1 用途 関数が引数や戻り値を持たないことを明示するとき void exit(int status); void procedure(void); 任意のポインタ型を表現するとき void *p; void *malloc(size_t size); プログラムを終了するライブラリ関数.通常,exit(0); もしくは exit(1); のいずれかで呼び出す.

ナル文字 '\0' をナル文字(null character)という. 文字列の末尾につく. ○ '\0' == 0 × '\0' == '0' × '\0' != NULL 文字列の末尾につく. ナル文字は,文字列の字数には数えられないが,char型の 1要素分(1バイト分)を占める.

空文 「式;」を式文という.式文から式を取り除いたものを空文(null statement)という. 用途 'a' 'b' 'c' 'd' 「{}」は,空ブロックと呼ばれる. 用途 for文の初期化,条件,増分の省略 for (;;) ... 反復の処理 for (p = "abcdef"; *p && *p != 'c'; p++) ; 'a' 'b' 'c' 'd' 'e' 'f' '\0' p

まとめ int main(int argc, char *argv[])で,コマンドライン引数(文字列の配列)を獲得できる. ポインタ型の値は,キャスト演算子で任意のポインタ型に変換できる. 文字列の走査には,char *型のポインタ変数を活用するとよい. 空ポインタ定数のNULL,void型,ナル文字,空文といった「空(null, empty, void)」の概念がある.

第1回レポートについて 配布資料の通り 提出は,来週金曜日(12月2日)の授業開始時 配点は,10点 演習室等でプログラムを打ち込み,実行すること