情報処理Ⅱ 第7回 2004年11月16日(火).

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
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
データ構造とアルゴリズム 第10回 mallocとfree
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
文字配列の課題1 解説 /* a */ #include <stdio.h> main( ) { int i;
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
プログラミング2 関数
プログラミング 4 記憶の割り付け.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
地域情報学 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回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第14回 2006年1月23日(月).
情報処理Ⅱ 第2回:2003年10月14日(火).
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
アルゴリズムとデータ構造1 2009年6月15日
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 2005年10月28日(金).
情報処理Ⅱ 2007年12月3日(月) その1.
コンパイラ 2012年10月11日
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
アルゴリズムとデータ構造 2010年6月17日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
情報処理Ⅱ 2006年11月8日(金).
情報処理Ⅱ 2007年2月2日(金).
情報処理Ⅱ 第2回 2004年10月12日(火).
第3回簡単なデータの入出力.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
情報処理Ⅱ 第3回 2004年10月19日(火).
C言語講座 四則演算  if ,  switch 制御文.
情報処理Ⅱ 2006年10月27日(金).
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
情報処理Ⅱ 第8回:2003年12月9日(火).
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

情報処理Ⅱ 第7回 2004年11月16日(火)

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

「空」とプログラム プログラミングと関係のない「空」の例 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); のいずれかで呼び出す.

NULLポインタ 空ポインタ定数(null pointer constant)とも呼ばれる. NULLはstdio.hなどで定義されている定数で,例えば,(void *)0 で表現される. キャスト(明示的な型変換)なしで,任意のポインタ型オブジェクトへの代入,任意のポインタ値との比較が可能 例: if ((fp = fopen("/dev/null", "r")) != NULL)

ナル文字 '\0' をナル文字(null character)という. 文字列の末尾につく. ○ '\0' == 0 × '\0' == '0' × '\0' != NULL 文字列の末尾につく. ナル文字は,文字列の字数には数えられないが,char型の1要素分(1バイト分)を占める. 例: #include <strings.h> および char word[] = "abcdef"; のあとで strlen(word) は6. sizeof(word) / sizeof(word[0]) は7.

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

まとめ 空ポインタ定数のNULL,ナル文字,空文,void型といった「空(null, empty, void)」の概念がある.

ポインタを使ったプログラミング 任意型のビットパターン出力 学ぶこと:ポインタのキャスト(型変換) 回文判定 学ぶこと:文字列の走査

任意型のビットパターン出力 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まで変えてみると

回文判定 仕様 例 入力は,コマンドライン引数から獲得する. コマンドライン引数の各文字列が回文になっていれば「Yes」を,そうでなければ「No」を出力する. 英字の大小を区別する.ASCIIコード以外の文字は使用しない. 例 ./palindrome 12321 123321 noon Noon 12321 : Yes 123321 : Yes noon : Yes Noon : No case-sensitive という

回文判定 左と右から1文字ずつ見て p '1' '2' '3' '4' '\0' q r '1' '2' '3' '\0' 1文字ずつ見ていく操作を 文字列の「走査(scan)」という 左と右から1文字ずつ見て 途中で一致していない箇所があれば,「No」 すべて一致し,参照位置が一致または交差すれば,「Yes」 p '1' '2' '3' '4' '\0' No q r Yes '1' '2' '3' '\0'

ポインタ変数は? char *p = argv[i]; char *q = p; char *r = p + strlen(p) - 1; 文字列走査では固定 char *q = p; 文字列の先頭から始まる 文字列走査により1ずつ増えていく char *r = p + strlen(p) - 1; 文字列の末尾から始まる 文字列走査により1ずつ減っていく

まとめ ポインタ型の値は,キャスト演算子で任意のポインタ型に変換できる. 文字列の走査には,char *型のポインタ変数を活用するとよい.