Prog1_10th

Similar documents
Prog1_15th

Prog1_12th

Prog1_6th

Prog1_6th

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint - 5Chap15.ppt

Microsoft Word - 3new.doc

2006年10月5日(木)実施

Microsoft Word - no202.docx

02: 変数と標準入出力

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Prog1_2nd

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

プログラミング基礎

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

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

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

Microsoft PowerPoint - 11.pptx

Prog1_3rd

PowerPoint プレゼンテーション

Prog1_10th

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

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

講習No.9

ポインタ変数

ポインタ変数

講習No.12

PowerPoint プレゼンテーション

02: 変数と標準入出力

Prog1_15th

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

情報処理演習 B8クラス

PowerPoint プレゼンテーション

メソッドのまとめ

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

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

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

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

< F2D837C E95CF CF68A4A94C5816A2E6A>

program7app.ppt

PowerPoint Presentation

memo

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

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - 09.pptx

ファイル入出力

gengo1-11

プログラミングI第5回

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

Microsoft PowerPoint - kougi11.ppt

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(

情報処理Ⅰ演習

gengo1-12

Microsoft Word - no15.docx

ポインタ変数

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

memo

Taro-リストⅢ(公開版).jtd

プログラミング実習I

ファイル入出力

PowerPoint Presentation

Microsoft Word - no11.docx

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

ポインタ変数

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

Microsoft Word - no12.doc

Microsoft PowerPoint - lec10.ppt

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

Prog2_10th

PowerPoint プレゼンテーション

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

gengo1-12


Prog2_9th

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

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

プログラミングI第10回

Microsoft PowerPoint - kougi9.ppt

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

Microsoft PowerPoint ppt

演算増幅器

gengo1-12

PowerPoint プレゼンテーション

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

第2回

プログラミングI第6回

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

gengo1-8

memo

Microsoft PowerPoint pptx

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

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

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

02: 変数と標準入出力

演算増幅器

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

Transcription:

2012 年 6 月 20 日 ( 木 ) 実施ポインタ変数と文字列前回は, ポインタ演算が用いられる典型的な例として, ポインタ変数が 1 次元配列を指す場合を挙げたが, 特に,char 型の配列に格納された文字列に対し, ポインタ変数に配列の 0 番の要素の先頭アドレスを代入して文字列を指すことで, 配列そのものを操作するよりも便利な利用法が存在する なお, 文字列リテラルは, その文字列が格納されている領域の先頭アドレスを表すので, 次の例のようにポインタ変数への代入が可能である この場合には, 配列の初期化の際のような文字列の文字数 + 1 の領域を新たに確保することは行われない 例 )char *p = "Programming Language C"; 例題 1(1 次元配列と文字列リテラルとの違い ) 次のソースプログラムをテキストエディタで入力して,prog10-1.c の名前を付けて保存する それを翻訳 編集して実行形式のファイルを作成し, 実行せよ /* prog10-1.c */ char dep1[] = "Faculty of Service Innovation"; char *dep2 = "Faculty of Service Innovation"; char *p; for (p=dep1; *p!='\0'; p++) printf("%s\n", p); for (p=dep2; *p!='\0'; p++) putchar(*p); 解説 1. 配列の初期化の際に, 代入するデータの要素数 ( この場合には文字数 +1) を以て配列の要素数として設定することができる この場合,[] 内は空とする 2.putchar は1 文字を画面に表示するライブラリ関数である 例題 2 ( 文字列の複写 ) 次のソースプログラムをテキストエディタで入力して,prog10-2.c の名前を付けて保存する - 1 -

それを翻訳 編集して実行形式のファイルを作成し, 実行せよ /* prog10-2.c */ #define MAX 256 char *cpystr(char *, const char *); char str[max]; char *uname = "Chiba University of Commerce"; char *p = str; printf("cpystr(p, uname) の戻り値 : %s\n", cpystr(p, uname)); printf("cpystr(p, uname) の呼び出しの結果,p の指す文字列 : %s\n", p); char *cpystr(char *a, const char *b) char *c = a; /* a のアドレスは変えずに指し示す中身だけ書き込んでいくため */ while (*b) /* b の指す文字が '\0' でない間は継続 */ *c = *b; c++; b++; *c = '\0'; /* この箇所は,while (*c++ = *b++) ; とも書ける */ return a; 解説 1. ユーザ定義関数 cpystr の 2 番目の引数は複写元の文字列を指すポインタを渡すため, 書き換わらないよう,const 型修飾子を付けている 2. この関数の 1 番目の引数には複写先の文字列を指すポインタを渡し, 複写後の aの値を戻す仕様となっている * ポインタ変数 p が指し示す char 型の配列としては, 充分大きな要素数のものを用意する 例題 3 ( 文字列の長さ ) 次のソースプログラムをテキストエディタで入力して,prog10-3.c の名前を付けて保存する それを翻訳 編集して実行形式のファイルを作成し, 実行せよ - 2 -

/* prog10-3.c */ unsigned int lenstr(const char *); char str[] = "Students Projects"; printf("lenstr の戻り値 : %d\n", lenstr(str)); printf("sizeof の結果 : %d\n", sizeof str); unsigned int lenstr(const char *a) unsigned int n; for (n = 0; *a!= '\0'; n++, a++) ; return n; 解説 sizeof は変数やポインタがメインメモリ上で占める領域の大きさをバイト単位で計算する 演習 1 文字列の大小関係を比較するユーザ定義関数 cmpstrと, それを利用して二つの文字列の大小関係を画面に表示するユーザ定義関数 disp を作成し, これらの関数の動作を確かめるプログラムを考える 文字列の大小関係は辞書順で定義される cmpstr は, 先頭からの位置が同じ文字同士の文字コードを順次比較し, 等しくなくなった時点でその差を戻し, 最後まで一致していれば 0 を戻す仕様となっている この空欄 1),2),3) を埋めてソースプログラムを完成させ, テキストエディタで入力して,ex10-1.cの名前を付けて保存する それを翻訳 編集して実行形式のファイルを作成し, 実行せよ /* ex10-1.c */ int cmpstr(const char *, const char *); 1) disp(const char *, const char *); - 3 -

char str1[] = "body"; char str2[] = "book"; char str3[] = "book"; char str4[] = "apple"; disp(str1, str2); disp(str2, str3); disp(str3, str4); int cmpstr(const char *a, const char *b) 2) (*a == *b) a++; b++; if (*a == '\0') return *a - *b; void disp(const char *c, const char *d) int diff; diff = cmpstr(c, d); if (diff < 0) printf("[%s] < [%s]\n", c, d); else if (diff 3) 0) printf("[%s] == [%s]\n", c, d); else printf("[%s] > [%s]\n", c, d); 演習 2 ( 余裕のある人向け ) 例題 3の文字列の長さを測定するユーザ定義関数 lenstrを利用して, 文字列を連結するユーザ定義関数 catstr を作成し, この関数の動作を確かめるプログラムを考える catstr は,1 番目の引数で与えた文字列に 2 番目の引数で与えた文字列を連結して戻す仕様となっている この空欄 1),2),3) を埋めてソースプログラムを完成させ, テキストエディタで入力して, ex10-2.cの名前を付けて保存する それを翻訳 編集して実行形式のファイルを作成し, 実行せよ ( 提出するファイルはex10-2.cの完成版とする ) - 4 -

/* ex10-2.c */ #define MAX 256 unsigned int lenstr(const char *); 1) *catstr(char *, const char *); char str1[max] = "Service "; char str2[] = "Innovation"; printf(" 文字列 1: [%s]\n", str1); printf(" 文字列 2: [%s]\n", str2); printf(" 連結後の文字列 : [%s]\n", 2) (str1, str2)); unsigned int lenstr(const char *a) unsigned int n; for (n = 0; *a!= '\0'; n++, a++) ; return n; char *catstr(char *a, const char *b) 3) *c = a + lenstr(a); /* a の指し示している先の最後の要素のアドレスをセット */ while (*b) *c = *b; c++; b++; *c = '\0'; return a; * 文字列の複写, 文字列の長さの測定, 文字列の大小関係の比較, 文字列の連結は, それぞれ, 文字列操作のライブラリ関数 strcpy,strlen,strcmp,strcat を利用して行うことが出来る これらを利用するには,#include <string.h> が必要である 今回の例題や演習問題はこれらの関数の実装の仕方の一例となっている なお, 実用的なプログラムでは, 複写する文字列や連結する文字列のバイト数を指定するstrncpyや strncatを用いた方が安全である - 5 -

提出物 : 1) 例題 1,2,3 の出力結果をコピーして貼り付けたテキストファイル res10.txt 2) 演習 1 のソースプログラムのファイル ex10-1.c の完成版 - 6 -