ポインタ変数

Similar documents
ポインタ変数

ポインタ変数

ポインタ変数

Microsoft Word - no103.docx

ポインタ変数

データ構造

プログラミング実習I

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

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

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

Microsoft Word - 3new.doc

PowerPoint Presentation

ファイル入出力

基礎プログラミング2015

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

PowerPoint プレゼンテーション

2 ASCII コードと文字型変数 2-1 ASCII コード 文字 コードコードコードコードコードコードコードコード文字文字文字文字文字文字文字 10 進 10 進 10 進 10 進 10 進 10 進 10 進 10 進 0 16 SP P 80 ` 96 p 112

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

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

講習No.9

Microsoft PowerPoint - prog03.ppt

PowerPoint プレゼンテーション

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

Microsoft Word - no11.docx

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

cp-7. 配列

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

ファイル入出力

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

データ構造

Prog1_10th

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

講習No.8

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

PowerPoint プレゼンテーション

プログラミング基礎

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

Microsoft PowerPoint - kougi6.ppt

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

PowerPoint プレゼンテーション

プログラミング基礎

スライド 1

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

PowerPoint プレゼンテーション

kiso2-03.key

プログラミング基礎

JavaプログラミングⅠ

データ構造

情報処理演習 B8クラス

フィルタとは

Microsoft PowerPoint - 3.pptx

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

第2回講義:まとめ

デジタル表現論・第6回

Microsoft Word - no15.docx

計算機プログラミング

物質工学科 田中晋

PowerPoint Presentation

kiso2-09.key

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

Microsoft PowerPoint - kougi2.ppt

解答編 第 9 章文字データの取り扱い 演習問題 9.1 文法事項 1 ) コンピュータにおける 文字データの取り扱いについて説明しなさい コンピュータでは 文字に整数の番号を割り当てて ( コード化して ) 文字コードとして扱います 実際に用いられる文字コードとして ASCII コード EUC コ

Microsoft PowerPoint - prog04.ppt

memo

Prog1_12th

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

プログラミング実習I

2006年10月5日(木)実施

講習No.1

Microsoft PowerPoint - 11.pptx

演算増幅器

講習No.12

※ ポイント ※

Microsoft Word - no202.docx

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

ゲームエンジンの構成要素

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

‚æ2›ñ C„¾„ê‡Ìš|

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

memo

PowerPoint Presentation

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

Prog1_15th

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

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

gengo1-12

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

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - kougi7.ppt

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

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

gengo1-12

JavaScriptで プログラミング

プログラミングA

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

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint プレゼンテーション

Transcription:

プログラミング及び実習 5 馬青 1

文字処理 数値処理 : 整数 浮動小数点数 単一の文字は と ( シングルクォーテーション ) で囲んで表現される 文字のデータ型は char または int である int を用いたほうが ライブラリの関数の引数の型と一致する 以下は全部 int の使用に統一する 従って int ch; で文字変数を宣言しておくと ch= A ; のように ch に文字 A を付与することができる (int ch= A ; で宣言するのも OK)! 注意 :ch=a; はだめ! 2

文字の入出力 標準入力 ( キーボードから入力 ) ch=getchar(); or scanf( %c, &ch); /* int で宣言の場合 warning message が出る処理系がある char で宣言すると warning message が出ない */ 標準出力 putchar(ch); or printf( %c, ch); 3

空白文字 単一の文字として 空白文字 が色々なところに使われる 空白文字は以下のように与える ch= ; 出力は前に述べた方法で ch を出力することはできるが putchar( ); でも出力できる もちろん printf( ); でも OK 空白はよく判断文にも使われる :if(ch == )... 4

制御文字とは 上に述べた普通の文字以外に 制御文字と呼ばれるものがある 制御文字とは 出力のコントロールやそのままでは表現できない文字を扱うために用いられる 5

主な制御文字 制御文字使用例機能 n printf( n ); 改行し 次の行の先頭にいく t printf( t ); 水平タブ b printf( b ); 一文字分戻る r printf( r ); 同じ行の先頭に戻る f printf( f ); 改ページ またはスクリーンクリア printf( ); を出力する注意 :printf( ) ではだめ! printf( ); を出力する注意 :printf( ) ではだめ! printf( ); を出力する注意 :printf( ) ではだめ! linuxではバックスラッシュ 6

制御文字についての補足 制御文字は表面上 2 つの文字で表されているが 計算機内部では単一の文字 ( つまり同じバイト数 ) で表現されている 従って 普通文字と同様 int ch; ch= t ; 1 文字分 は OK である 以上のように制御文字を ch に付与すると 以下の 2 文は等価になる : printf( 制御文字 t 使用例 t 機能 n ); printf( 制御文字 %c 使用例 %c 機能 n, ch, ch); 7

英数字文字と整数値の対応 コンピュータ内部では 全ての文字は整数 ( 文字コード ) で表現されている ( 半角英数字や記号 ) 文字はアスキーコード表と呼ばれるものに従っている たとえば英数字は以下の通りに対応している 英字文字 数字文字 A, B,..., Z 65-90 a, b,... z 97-122 0,... 9 48-57 文字 整数値 8

Question (1)putchar( A );? (2)putchar(65);? (3)int ch= A ; printf( %c %d n, ch, ch);? (4)printf( %c %d n, A, A );? (5)printf( %c %d n, 65, 65);? (6)putchar(65+3);? (7)putchar(68);? (8)putchar( A +3);? (9)ch= D ; putchar(ch- A + a );? (10)putchar( D - A + a -2);? 9

演習問題 1 三つの文字変数を用いて任意の3 文字をキーボードから入力し それらに + 記号を挿入して出力するプログラムを書きなさい 実行例 : $./a.out abc 入力 +a+b+c 出力 10

プログラムの改良 前のプログラムの問題点の 1 つは 文字の数だけ 文字変数を用意しなければならない したがって 文字の数が多い場合は対処困難である たとえば 以下の例では 10 個の文字変数を用意しなければならない 実行例 : $./a.out abcdefghij +a+b+c+d+e+f+g+h+i+j 入力出力 11

プログラムの改良 #include <stdio.h> int main(void) { int ch; while((ch=getchar())!= ' n') printf("+%c", ch); putchar(' n'); return 0; } 12

プログラムのさらなる改良 前のプログラムでは 一行が入力されると プログラムが終了してしまう 特殊なキーを押すまで 繰り返し入力ができるようにしたい 実行例 $./a.out abc 入力 +a+b+c 出力 opqxyz 入力 +o+p+q+x+y+z 出力 Ctrl-D 入力終了 13

プログラムのさらなる改良 #include <stdio.h> プログラム 1 int main(void) { int ch; while((ch=getchar())!= EOF){ if(ch!= ' n') printf("+%c", ch); else printf(" n"); } return 0; } 14

プログラム 1 とプログラム 2 は 何が違う? プログラム 2 #include <stdio.h> int main(void) { int ch; while((ch=getchar())!= EOF) printf("+%c", ch); return 0; } 15

演習問題 2 前のプログラム1を各入力文字を3 文字ずらす ( 例 :a d) ように修正しなさい ただし 文字はa~wの範囲内のものとする ( つまり x,y,zは除外する ) 実行例 $./a.out abc 入力 +d+e+f 出力 defghi 入力 +g+h+i+j+k+l 出力 Ctrl-D 入力終了 16

ファイルの複写プログラム #include <stdio.h> int main(void) { int ch; while((ch=getchar())!= EOF) printf( %c, ch); // putchar(ch); return 0; } 17

ファイルの複写プログラム s.dat This is a test file. Ryukoku University Program Lecture./a.out<s.dat>o.dat o.dat This is a test file. Ryukoku University Program Lecture 18

例題 (1/2) 文字をキーボードから入力し 改行を入れた時点で 小文字を大文字 大文字 数字 改行記号はこのまま 特殊文字 ( 英数字 改行以外の文字 ) を空白に変換して出力するプログラム ただし Ctrl+D で終了とする 19

例題 (2/2) #include <stdio.h> int main(void) { int ch; while((ch=getchar())!= EOF){ if(ch>= a && ch<= z ) // 小文字なら putchar(ch- a + A ); // 大文字に else if(ch>= A && ch<= Z ch>= 0 && ch<= 9 ch== n ) putchar(ch); // 大文字か数字か改行はそのまま else // 特殊文字なら } return 0; } putchar( ); // 空白に 20

注意 if(ch< a ch> z ) を用いて ( つまり小文字でなければ ) 大文字か数字であることを判断することはできない ( それ以外の文字かもしれない ) また 下記変換は必ずしも正確ではない if((ch< a ch> z ) && (ch< 0 ch> 9 )) // 小文字 数字ではない putchar(ch- A + a ); 21

例 : ファイルデータの整形 次の ipt.dat ファイルを opt.dat ファイルに変換するプログラム ipt.dat の中の no と番号の間は空白なし 他の空白は任意個 (1 個以上 ) の半角空白から構成される opt.dat の中の No と番号の間は 1 個の空白で 番号と点数の間は 1 個のタブ空白である 22

データ ipt.dat no.1 79 no.2 73 no.3 89 no.4 67 no.5 99 opt.dat No. 1 79 No. 2 73 No. 3 89 No. 4 67 No. 5 99 23

考え方の説明 no.4 67 先頭 改行 ( 空白と見なす ) ( 空白と見なす ) 前の文字と現在の文字がすくなくともどちらか一方が空白でなければ 現文字は出力する ただし 処理してから出力する 24

プログラム (1/2) #include <stdio.h> int main(void) { int ch, fg, fgm; // fg: 現在の文字の状態 fgm: 前の文字の状態 fgm=1; // 前の文字の初期状態 ( 先頭 ): 空白 while((ch=getchar())!=eof){ if(ch==' ' ch==' n') fg=1; // 現文字の状態 : 空白 // ( 改行を空白と見なす ) else fg=0; // 現文字の状態 : 空白でない 25

プログラム (2/2) if(fgm!= 1 fg!= 1){ /* 前と現在の文字のどちらかが空白でないそういう状態のみ 現文字を出力する */ if(ch=='n') {putchar( N );} // n を N に変換して出力する else if(ch=='.') printf(. ); //. の後ろに一個の空白を入れて出力する else if (ch== ' ') putchar(' t'); // 現文字が空白なら タブで出力 else putchar(ch); // 普通の文字ならそのまま出力する } fgm=fg; // 現文字の状態を前文字の状態とする } return 0; } 26

プログラムの実行./a.out<ipt.dat>opt.dat 27

第 5 回実習課題 (1/5) 1. 以下のようなプログラム (ex05-findpair.c) を作成しなさい (a) データ件数とデータをキーボードから入力し 変数 n と int 型配列 a に与える たとえば n: 11 a: 10 9 8 7 6 5 4 3 2 1 0 (b) 配列 aの任意 2つの ( 異なる ) 要素について 足し算と引き算のみを使って その計算結果が8となるすべてのペアを求める 解がないときは空行を出力し 解がある場合はそのすべてのペアを出力する たとえば上記の場合 10-2=8, 2+6=8なので (10, 2, -)(2, 6, +).. のように出力する なお (3,5,+) と (5,3,+) のような実質的に同じ内容のペアは両方を出力しても構わないとする また プログラムの構造については 一切制限ないとする 28

第 5 回実習課題 (2/5) 2. 大文字を小文字に 小文字を大文字に それ以外の文字はそのまま出力するプログラム (ex05.c) を作成しなさい ただし Ctrl-Dを押さない限り 文字列を繰り返し入力可能とする 実行例 : $./a.out A+b-c 入力 a+b-c 出力 1+2 入力 1+2 出力 a%& 入力 A%& 出力 Ctrl-D 入力終了 29

第 5 回実習課題 (3/5) 3. 課題 2 のプログラムを文字列の前後に括弧をつけて出力するようにプログラムを改良しなさい (ex05-adv.c) 実行例 : $./a.out A+b-c 入力 [a+b-c] 出力 1+2 入力 [1+2] 出力 a%& 入力 [A%&] 出力 Ctrl-D 入力 終了 30

第 5 回実習課題 (4/5) 課題 3のヒント : 左括弧をつけるために 先頭文字か先頭文字でないかの判定が必要 そのために たとえば fg=1が先頭でfg=0が先頭でないというように 状態を表すフラッグ変数を導入すると便利かも 今読み込んだ文字は改行文字かの判定も必要になってくる 改行文字であれば改行の前に右括弧をつけると同時に状態変数 fgの値を1に戻す必要がある ( つまり 次に読み込まれる文字はまた先頭文字になる ということ ) 31

発展課題 第 5 回実習課題 (5/5) 4. 任意に入力された文字列に対し 記号 +が挿入された以下のような逆順の文字列を出力するプログラム (ex05- addrev.c) を作成しなさい ただし Ctrl-Dを押さない限り 文字列を繰り返し入力可能とする 注意 : 挿入される記号と文字がペアにならないため 記号挿入に関しても例題とは違う ヒントとしてはたとえば int ch[100] のように 文字の一次元配列を使い 入力された文字列をいったん配列にためておき 文字 ( 及び記号 ) を逆順に一つずつ出力する方法が考えられる 実行例 $./a.out abc 入力 c+b+a 出力 54321 入力 1+2+3+4+5 出力 Ctrl-D 入力 32 終了