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

Similar documents
Report#2.docx

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

ポインタ変数

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

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

ポインタ変数

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

Microsoft Word - no11.docx

1. 入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ プログラムは個別にコンパイルし make コマンドで実行すること 入力データは 50 以下とし 以下の数が混在しているとする 16 進数 : 先頭 1 文字が x または X( エックスの小文字か大文字 ) 8 進数 : 先頭 1

基礎プログラミング2015

PowerPoint プレゼンテーション

ポインタ変数

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(C 言語 ) サンプル問題 知識科目 第 1 問 (

ポインタ変数

プログラミング基礎

ファイル入出力

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

Microsoft PowerPoint - 11.pptx

Prog1_10th

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

講習No.9

Report#2.docx

slide5.pptx

kiso2-09.key

プログラミング実習I

ファイル入出力

PowerPoint プレゼンテーション

計算機プログラミング

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

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

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

講習No.12

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

プログラミング基礎

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft PowerPoint - w5.pptx

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

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

Microsoft PowerPoint - prog08.ppt

プログラミング基礎

スライド 1

プログラミング実習I

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

:30 12:00 I. I VI II. III. IV. a d V. VI

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

memo

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

Microsoft PowerPoint - prog03.ppt

:30 12:00 I. I VI II. III. IV. a d V. VI

講習No.1

Microsoft Word - report#8.docx

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

gengo1-12

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

第2回講義:まとめ

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

Report#2.docx

gengo1-12

PowerPoint プレゼンテーション

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

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

Microsoft Word - no103.docx

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

PowerPoint プレゼンテーション

gengo1-12

ポインタ変数

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

gengo1-10

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

Microsoft Word - no202.docx

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

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

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

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

kiso2-03.key

CプログラミングI

gengo1-2

gengo1-6

Microsoft Word - no15.docx

PowerPoint Presentation

Microsoft Word - 06

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

Javaによるアルゴリズムとデータ構造

Microsoft PowerPoint - prog07.ppt

Microsoft PowerPoint - prog04.ppt

物質工学科 田中晋

PowerPoint プレゼンテーション

Java講座

PowerPoint プレゼンテーション

memo

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

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

プログラミングA

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

Microsoft PowerPoint ppt

ohp03.dvi

Transcription:

1. ライブラリ関数 islower(), toupper() を使い 下記の trlowup プログラムを書き換えて 新規に trupper プログラムを作成せよ * サンプルプログラム 1 /* 2 Program : trlowup.c 3 Comments : translate lower case characters into upper case ones. 4 */ 5 6 #include <stdio.h> 7 8 char trlowup(char); 9 10 int main(){ 11 char c; 12 13 while( (c=getchar())!= EOF ) 14 putchar( trlowup(c) ); 15 return(0); 16 } 17 18 char trlowup( char c ){ 19 if ( 'a' <= c && c <= 'z' ) 20 return( c-'a'+'a' ); 21 else 22 return( c ); 23 } * 実行結果 pw010% cat data1 abcdefghijklmnopqrstuvwxyz pw010% cc trlowup.c -o trlowup pw010% trlowup abcdef ABCDEF xyzxyyyzz XYZXYYYZZ ^C pw010% pw010% trlowup < data1 ABCDEFGHIJKLMNOPQRSTUVWXYZ - 1 -

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : 095739K 4 Author : TOUME, Kouta 5 Comments : Used Library function islower() & toupper() 6 */ 7 8 #include<stdio.h> 9 #include<ctype.h> 10 11 char trupper(char); 12 13 int main(){ 14 char c; 15 16 while((c = getchar())!= EOF) 17 putchar(trupper(c)); 18 19 return(0); 20 } 21 22 char trupper(char c){ 23 if(islower(c)) 24 return(toupper(c)); 25 else 26 return(c); 27 } * 実行結果 new-host:report4 kouta$ cat data1 abcdefghijklmnopqrstuvwxyz new-host:report4 kouta$./trupper < data1 ABCDEFGHIJKLMNOPQRSTUVWXYZ new-host:report4 kouta$./trupper abcdef ABCDEF xyz#%&' XYZ#%&' ^C * 考察 islower() 関数 - 引数として渡した文字がアルファベットの小文字なら真 それ以外は偽になる関数である toupper() 関数 - 引数として渡した文字がアルファベット小文字ならば 大文字にして値を返す関数である - 2 -

9 行目 - islower() toupper() 関数を使うためには ctype.h というヘッダーファイルを読み込む 11 行目 - trupper() を char 型の関数として定義 引数は char 型 16-17 行目 - getchar() で文字を 1 文字ずつ読み込んで char 型変数 c に代入 - 変数 c の値が EOF と等しくなかったら putchar() で trupper() 関数に 1 文字ずつ値を渡す 22-27 行目 - char 型関数 trupper() は char 型の引数を受け取り変数 c に代入 - if 文 islower() 関数 変数 c が小文字なら 真 を返す そうでなければ 偽 を返す 真の場合 toupper() 関数 小文字を大文字にした値を mein 関数に返す 偽の場合 大文字なので そのままの値を main 関数に返す 実行結果より 小文字以外の文字 ( 大文字や記号 ) は変換されずそのまま出力されている また while() 文の終了条件である EOF は ^C (control キー + C) であることが分かる 2. trupper プログラムを書き換えて rot13 暗号化プログラム rot13 復号化プログラムを作成せよ rot13 とは 次のようにアルファベットを 13 文字ずらす暗号化の方法である A --> N a --> n B --> O b --> o C --> P c --> p...... Z --> M z --> m * プログラム rot13.c 1 #include<stdio.h> 2 #include<ctype.h> 3 4 char rot13(char); 5 6 int main(){ 7 char c; 8 9 while((c = getchar())!= EOF) 10 putchar(rot13(c)); 11 12 return(0); 13 } 14 15 char rot13(char c){ 16 if(islower(c)) 17 return((c - 'a' + 13) % 26 + 'a'); 18 else if(isupper(c)) 19 return((c - 'A' + 13) % 26 + 'A'); 20 else 21 return(c); 22 } - 3 -

* 実行結果 new-host:report4 kouta$ cat data2 This is a pen. new-host:report4 kouta$./rot13 < data2 Guvf vf n cra. new-host:report4 kouta$./rot13 abcdefghijklm nopqrstuvwxyz ABCDEFGHILKLM NOPQRSTUVYXYZ ^C * 考察 isupper() 関数 - 引数として渡した文字がアルファベットの小文字なら真 それ以外は偽になる関数である 4 行目 - rot13() を char 型の関数として定義する 引数は char 型 6-13 行目 - trupper プログラムの 13-20 行目と同じなので省略する 15-22 行目 - char 型関数 rot13() は char 型の引数を受け取り変数 c に代入 - if 文 islower() 関数 変数 c が小文字なら 真 を返す そうでなければ 偽 を返す - 真の場合 (c - 'a' + 13) % 26 + 'a' 変数 c から文字 'a' を引くことで 0 25 までの数字を表現することができ その値に 13 を足し 26 の剰余をとる その値を 'a' に足すことで a を n に b を o に z を m に暗号化することができる - else-if 文 isupper() 関数 変数 c が大文字なら 真 を返す - 真の場合 (c - 'A' + 13) % 26 + 'A' 小文字と同様の処理をすることで A を N に B を O に Z を M に暗号化する - 偽の場合 小文字でも大文字でもない文字 ( 記号 ) はそのまま出力される a を暗号化した場合 n になり n を暗号化すると a に戻る 同様に b は o に o は b となるので このプログラムは 暗号化だけでなく 復号化も兼ね備えたプログラムだということがわかる - 4 -

3. オリジナルの暗号化 復号化プログラムを作成せよ * 暗号化プログラム 1 #include<stdio.h> 2 3 #define SHIFT 8 4 5 char encryption(char); 6 7 int main(){ 8 char c; 9 10 while((c = getchar())!= EOF) 11 putchar(encryption(c)); 12 13 return(0); 14 } 15 16 char encryption(char c){ 17 if(c + SHIFT <= '~') 18 return(c + SHIFT); 19 else if(c + SHIFT >= '~') 20 return(('~' - c + SHIFT)+ ' '); 21 else 22 return(c); 23 } * 復号化プログラム 16 char decryption(char c){ 17 if(c - SHIFT >= ' ') 18 return(c - SHIFT); 19 else if(c - SHIFT <= ' ') 20 return('~' - (' ' - c + SHIFT)); 21 else 22 return(c); 23 } * 実行結果 * 暗号化 new-host:report4 kouta$./encryption This is a pen. \pq{(q{(i(xmv6^c * 復号化 new-host:report4 kouta$./decryption \pq{(q{(i(xmv6 This is a pen.^c - 5 -

* 考察 3 行目 - #define 文 SHIFT を 8 に置き換える 5 行目 - encryption() を char 型の関数として定義する 引数は char 型 7-14 行目 - trupper プログラムの 13-20 行目と同じなので省略する 暗号化の場合 16-23 行目 - char 型関数 encryption() は char 型の引数を受け取り変数 c に代入 - if 文 条件文 c + SHIFT <= '~' 変数 c に SHIFT( 8 ) を足した値が ASCII コードの表示可能文字 '~' を超えていなければ c + SHIFT の演算結果を main 関数に返す 演算結果が '~' を超える場合は差分を求め 表示可能文字の最初の文字 ' ' に その差分を足すことで ' ' '~' の範囲で文字のシフトが可能である 復号化の場合 16-23 行目 - char 型関数 decryption() は char 型の引数を受け取り変数 c に代入 - if 文 条件文 c - SHIFT >= ' ' 変数 c から SHIFT( 8 ) を引いた値が ASCII コードの表示可能文字 ' ' 以下でなければ c SHIFT の演算結果を main 関数に返す 演算結果が ' ' 以下になる場合は差分を求め 表示可能文字の最後の文字 '~' から その差分を引くことで 暗号化された文の復号化が可能である rot13 のプログラムでは 暗号化 復号化プログラムは一つのプログラムであったが オリジナルの暗号化 復号化プログラムはそれぞれ別のプログラムとし SHIFT の分だけ文字をシフトし暗号化 暗号文をシフトした分 元に戻し復号化とする また シフトする文字数を #difine で 定義したので SHIFT の値を任意に変更することができるようにした - 6 -

考察 今回は 関数の定義や islower() toupper() などのライブラリ関数を用いて 小文字を大文字に変換したり それを応用して暗号化 復号化プログラムを作成した 'a' <= c && c <= 'z' などの条件文はライブラリ関数の islower() を使うことでスマートで 分かりやす条件文になり 小文字を大文字にする条件文は toupper() を用いることで 複雑な条件文と同様の処理をすることが可能になる また ライブラリ関数と ASCII コード表をうまく組み合わせて使うことで 文章を暗号化したり 復号化するプログラムができた 今回作成した オリジナルの暗号化 復号化プログラムは 文字をシフトしただけなので しらみつぶしにシフトしていけば 何文字シフトしたか簡単に 分かってしまうので 全然実用的ではないと思う 暗号化する際のアルゴリズムに 論理演算子や算術演算子を組み合わせることで もっと簡単で複雑な暗号化 復号化プログラムができるのではないかと思われる 感想 今回のプログラミングのレポートは 1 2 は比較的楽に解くことができたけど オリジナルの暗号化 復号化プログラムを考えるのは 結構楽しかったが 時間がかかった いろいろアイディアは出てきたのですが 暗号化プログラムはできても 復号化プログラムが作れなかったりと非常に大変でした 参考文献 - Steve Oualline 著 谷口功訳 C 実践プログラミング第 3 版 オーム社 - 初心者のためのポイント学習 C 言語 http://www9.plala.or.jp/sgwr-t/ ( 09/06/07 access ) - 7 -