今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

Similar documents
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft Word - 3new.doc

Microsoft Word - no202.docx

Microsoft PowerPoint - 計算機言語 第7回.ppt

情報処理演習 B8クラス

Prog1_10th

Microsoft Word - no103.docx

第1回 プログラミング演習3 センサーアプリケーション

PowerPoint Presentation

PowerPoint プレゼンテーション

演算増幅器

プログラミング実習I

PowerPoint Presentation

PowerPoint Presentation

ファイル入出力

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

Taro-ファイル処理(公開版).jtd

02: 変数と標準入出力

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

講習No.9

ファイル入出力

Microsoft PowerPoint - prog04.ppt

02: 変数と標準入出力

ポインタ変数

Microsoft PowerPoint - 5Chap15.ppt

02: 変数と標準入出力

ポインタ変数

Prog1_12th

プログラミング基礎

gengo1-12

ポインタ変数


プログラミング基礎

2006年10月5日(木)実施

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

gengo1-12

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

PowerPoint プレゼンテーション

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint プレゼンテーション

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

Microsoft Word - no11.docx

プログラミング実習I

第2回講義:まとめ

プログラミング基礎

PowerPoint プレゼンテーション

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

データ構造

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

講習No.12

memo

memo

gengo1-12

C言語講座 ~ファイル入出力編~

< F2D837C E95CF CF68A4A94C5816A2E6A>

Cプログラミング1(再) 第2回

Microsoft Word - no15.docx

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Microsoft PowerPoint pptx

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

PowerPoint プレゼンテーション

ポインタ変数

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - kougi7.ppt

ポインタ変数

Microsoft Word - Cプログラミング演習(9)

PowerPoint プレゼンテーション - 物理学情報処理演習

CプログラミングI

02: 変数と標準入出力

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

PowerPoint プレゼンテーション

Microsoft Word - no12.doc

※ ポイント ※

情報処理Ⅰ演習

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft PowerPoint - program.ppt [互換モード]

Prog1_6th

Microsoft Word - Cプログラミング演習(1)_2012

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

プログラミング演習3 - Cプログラミング -

Microsoft Word - Training10_プリプロセッサ.docx

C 言語講座 Vol 年 5 月 29 日 CISC

プログラミング演習3 - Cプログラミング -

kiso2-09.key

Microsoft Word - Cプログラミング演習(12)

02: 変数と標準入出力

Taro-ポインタ変数Ⅰ(公開版).j

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

Microsoft PowerPoint - CproNt11.ppt [互換モード]

Microsoft PowerPoint - 09.pptx

スライド 1

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

gengo1-8

Microsoft PowerPoint - kougi2.ppt

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Transcription:

C プログラミング演習 1( 再 ) 7 講義では C プログラミングの基本を学び演習では 実践的なプログラミングを通して学ぶ

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ構造 ( 配列や自作の構造 ) ライブラリの利用 (C++ ではクラス ) が必要

アルゴリズム アルゴリズムとは料理で言えばレシピ要するに 処理の段取りどのような処理をどのような順で行うか アルゴリズムによって処理効率に大きな違いがあることも

文字列を対象とした 数え上げ lang.sist.chukyo-u.ac.jp/classes/c/animals.txt は次のような内容のファイルである どんな動物が何回現れているだろうか? いぬねこねこさるいぬねこねこさるねこわにねこいぬねこ...

事前知識 : 文字と文字列 教科書 よくわかる C 言語 第 6 章 (p.63-75) 文字 --- 英数字や記号の 1 文字 a, B, 1, n など 文字を記憶する変数の型は char --- character( 文字 ) 文字列 --- 文字の並び 文字の配列 例 : abc, 123, tab t end n 文字列の最後には必ず 0 ( ナル文字 ) が入る ( が 表示はされない )-これが文字列の最後を表すキマリ 文字列を記憶する変数の型は クイズ : a は文字でしょうか 文字列でしょうか? また 字 は文字でしょうか 文字列でしょうか? char string[10]; などとする 答 : 文字列どちらでもない

事前知識 : 文字列 文字列 --- 文字の並び 文字の配列 ここで質問 abc, 123, tab t end n はどんな型でしょうか? 型の例 : 1 は int 1.0 は float A は char ここで 文字列 と答えた人 気持ちはわかりますが そういう名前の 型 はありませんえ!

事前知識 : 文字列 文字列 --- 文字の並び 文字の配列そう 答はここに書いてありました だから 例えば hello は 次の文字の配列を表しています : h e l l o 0 文字文字... 文字 だから char str[ ] = hello ; とすると 変数 str には 上の配列が記憶されたメモリの場所がセットされます

事前知識 : 文字列 文字列 --- 文字の並び 文字の配列 このことから 以下が 同じ意味 であることはわかりますね? char str[ ] = abc ; char str[ ] = { a, b, c, 0 };

文字の配列を指すポインタ char str[ ] = hello ; とすると 変数 str には 上の配列が記憶されたメモリの場所がセットされますと書きました 言い換えれば str ( だけではなく 配列 全部 ) は 文字 ( とか整数 ) の値を持っているのではなく 文字の配列の場所 ( アドレス ポインタ ) が値です ここで場所 ( ポインタ ) の値から その場所にあるデータを読み出す方法があります それが * です

検証 右のプログラム (stringtest1.c) を試してみましょう まず str を文字列として 初期値を入れています その値を printf で文字列として表示させています 次に str が指している場所の文字 次の場所 ( 次の場所は +1 で得られます ) の文字... を表示させています #include <stdio.h> int main(void) { char str[ ] = "abc"; printf("%s n", str); printf("%x %x %x n", str[0],str[1],str[2]); printf("%c %c %c n", str[0],str[1],str[2]); printf("%c %c %c %d n", *str,*(str+1),*(str+2),*(str+3)); return 0; }

文字を指すポインタ このように * はその変数の値がどのようなものを表しているか (char, int, float など ) を表す記号であることがわかりました ( この記号は すでにファイルを扱うときに出ていました ) この知識を用いて 以下を考えてみましょう : char str[ ] = abc ; char *try = abc ; クイズ : 変数 try がどのようなものか 説明してみてください また これは str の値と同じでしょうか 違うでしょうか?

検証 右のプログラム (stringtest3.c) を試してみましょう まず str を文字列とし try にも初期値を入れています try の値を printf で文字列として表示させています 次に try が指している場所の文字 次の場所 ( 次の場所は +1 で得られます ) の文字... を表示させています最後に str と try が等しいかを調べています #include <stdio.h> int main(void) { char str[ ] = "abc"; char *try = "abc"; } printf("%s n", try); printf( %c %c %c %d n, *try,*(try+1),*(try+2),*(try+3)); printf("str == try? ans = %d n", str == try); return 0;

文字の配列とポインタの関係 右のプログラム (stringtest2.c) を試してみましょう abc という文字の配列において それぞれの要素 ( 例えば str[1]) がどのような値なのか またそのアドレスがどうなっているかを示すプログラムになっています このことから (1)str[1] と *(str+1) が同じものであること (2) 文字の配列の要素が, メモリ上では 1 番地ずつずれていることがわかります #include <stdio.h> int main(void) { char str[ ] = "abc"; printf("%s n", str); printf("%x %x %x n", str[0],str[1],str[2]); printf("%c-%c-%c-%d n", *str,*(str+1),*(str+2),*(str+3)); printf("------------- n"); printf("%x %x %x n", &str[0], &str[1], &str[2]); printf("%x %x %x n", str, str+1, str+2); return 0; }

文字列の配列 右のプログラム (stringtest4.c) を試してみましょう ここでは 文字列の配列 str を定義しています ( この場合 5 という文字の長さ指定が必要です --- 書かずにコンパイルしたらどうなるか やってみましょう ) なお 走らせる前に どのような表示がなされるか 推測してみましょう #include <stdio.h> int main(void) { char str[ ][5] = {"ab","xyz"," 漢字 "}; printf("%x %x %x n", str[0],str[1],str[2]); printf("%s %s %s n", str[0],str[1],str[2]); printf("%s-%s-%s n", *str,*(str+1),*(str+2)); return 0; }

解説 str[0] 18ff44 a str char str[ ][5] = {"ab","xyz"," 漢字 "}; によって メモリ上に 5 バイト 3 の場所が確保され そこに文字列が記憶される str[1] 18ff45 18ff46 18ff47 18ff48 18ff49 18ff4a b 0 不明不明 x y 5 バイト なお 漢 は 0x8abf 字 は 0x8e9a Shift-JIS で表現される str[2]... 18ff4e 18ff4f 0x8a 0xbf 参考 : http://qpon.quu.cc/pc/sjis.htm 18ff50... 0x8e 5 バイト

文字列に関する関数 教科書のp.71 : string.h ヘッダファイルにて定義されている strcpy(char s1[ ], char s2[ ]) strcat(char s1[ ], char s2[ ]) int strcmp (char s1[ ], char s2[ ]) int strlen(char s[ ]) 後でこれを使う

文字列を対象とした 数え上げ lang.sist.chukyo-u.ac.jp/classes/c/animals.txt の中にどんな動物が何回現れているかを数えるプログラムをつくろうただし どんな動物が現れるか分からないままではちょっと難しいので ( そのうち出来るようになるはずだが ) ここでは いぬ ねこ うさぎ くま さる たぬき きつね ぱんだ ねずみ わに だけが出てくる可能性があるものとしよう

システムの設計 概略 次のようなアルゴリズムを考える 1. ファイル (animals.txt) から一行ずつ読み込み 文字列を要素とする配列 ( 仮に変数名を str とする ) にその文字列を記憶する 2. 候補の動物名の一個ずつに対し 1. str の要素それぞれに対して 一致するかどうか調べる 2. 一致した個数を 動物名とともに表示する

1. ファイル (animals.txt) から一行ずつ読み込み 文字列を要素とする配列 ( 仮に変数名を str とする ) にその文字列を記憶する これを具体的にどうするかを考えよう 必要な物は (1) 文字列を要素とする配列 文字列の長さを LEN ファイルの行数を LINES とすると char str[lines][len]; // チェック! なぜこの順番? (2) ファイル (animals.txt) から一行ずつ読み込んで 配列で記憶する方法 これは今までにもやってきたこと

1. ファイル (animals.txt) から一行ずつ読み込み 文字列を要素とする配列 ( 仮に変数名を str とする ) にその文字列を記憶する これを具体的にどうするかを考えよう (2) ファイル (animals.txt) から一行ずつ読み込んで 配列で記憶する 文字列の長さを LEN ファイルの行数を LINES とすると char str[lines][len]; // チェック! なぜこの順番? FILE *fp; int n=0; fp = fopen( animals.txt, r ); // animals.txtを開く while (fscanf(fp, %s, str[n]) いままでやってきたことです!= EOF) { // str[n] に読み込んだ文字列を記憶 n++; } // nには読み込んだ行数が入っている

2. 候補の動物名の一個ずつに対し strの要素それぞれに対して 一致するかどうか調べる 一致した個数を 動物名とともに表示する 次に これを具体的にどうするかを考えよう 必要な物は (1) 候補の動物名を記憶する方法 (2) 文字列同士を比較して 一致しているかどうか 調べる方法

(1) 候補の動物名を記憶する教科書に従って 次のようにしてもよい 候補は : いぬ ねこ うさぎ くま さる たぬき きつね ぱんだ ねずみ わに だから 要素を文字列とする配列を用意すれば良い その配列 ( 変数 ) の名前を Animals とすると (LEN の値を最初に与えておく ) 文字列の配列は char 変数名 [ ][LEN] = { 初期値 }; で宣言配列二重配列初期値となる文字列の並び char Animals[][LEN] = {" いぬ ", " ねこ ", " うさぎ ", " くま ", だから " さる ", " たぬき ", " きつね ", " ぱんだ ", " ねずみ ", " わに "};

(1) 候補の動物名を記憶する ( 別解 ) 候補は : いぬ ねこ うさぎ くま さる たぬき きつね ぱんだ ねずみ わに だから 要素を文字列とする配列を用意すれば良い その配列 ( 変数 ) の名前を Animals とすると 文字列の配列は char* 変数名 [ ] = { 初期値 }; で宣言 要素は文字列配列初期値となる文字列の並び char* Animals[] = {" いぬだから ", " ねこ ", " うさぎ ", " くま ", " さる ", " たぬき ", " きつね ", " ぱんだ ", " ねずみ ", " わに "};

ここまでできたら ちゃんと動くかテストしてみよう テスト 1. 配列 Animals 右のプログラムを完成させ animalscheck.c と名前をつけ 実行してみよう どんな結果が表示されれば成功といえるか 考えてから実行しよう #include <stdio.h> // 候補となる動物の個数 #define NUM 10 // 動物名の最大長さ #define LEN 8 int main(void) { // 配列 Animals の宣言 // 他に必要な変数があれば その宣言 // Animalsの値をprintfを用いて確認 for(i=0; i < NUM; i++) { printf("%s n",animals[i]); 書けるよね? } return 0; }

テスト 2. ファイルからの読み込み 右のプログラムを完成させ animalsinput.c と名前をつけ 実行してみよう どんな結果が表示されれば成功といえるか 考えてから実行しよう #include <stdio.h> // ファイルの行数の最大値を仮に100とする #define LINES 100 // 動物名の最大長さ #define LEN 8 // 読み込み対象のファイル名 #define InFile "animals.txt int main(void) { // 配列 strなど 必要な変数の宣言 // ファイルから読み込んで配列 strに記憶 // その時に読み込んだ行数を変数 nに記憶 // ファイルを閉じる // strの値をprintfを用いて確認 for(i=0; i< n; i++) { } return 0; } printf("%s n",str[i]); 書けるよね?

(2) 文字列同士を比較して 一致しているかどうか 調べる stringh. ヘッダファイルで定義された strcmp 関数を使う これがどんな引数をとり どういう条件でどんな値を返すかを確認する

以上ができたら プログラムを完成させよう (countanimals.c) 1. ファイル (animals.txt) から一行ずつ読み込み 文字列を要素とする配列 ( 仮に変数名を str とする ) にその文字列を記憶する 2. 候補の動物名の一個ずつに対し 1 str の要素それぞれに対して 一致するかどうか調べる 2 一致した個数を 動物名とともに表示する #include <stdio.h> #define NUM 10 #define LINES 100 #define LEN 8 int main(void) { // 配列 Animals と str 他必要な変数の宣言 // 1. ファイルから読み込んだ文字列を // 配列 str に記憶 // ファイルを閉じる // 2. 候補の動物名の一個ずつに対し ( 繰り返し ) for(i=0; i<num; i++) { // 1 一致した個数を記憶する変数 m に 0 代入 // 2 str の要素それぞれに対して動物名が // 一致すれば m++ とする // 3 m>0 なら 動物名と m の値を表示 } return 0; }

プログラムがかけたら コンパイル ( ビルド ) して animals.txt のデータで試してみよう 不具合があれば修正し 再度テストする