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

Similar documents
Microsoft Word - no103.docx

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

ポインタ変数

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

プログラミング実習I

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

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

PowerPoint プレゼンテーション

講習No.8

Microsoft Word - 3new.doc

Microsoft Word - no11.docx

ポインタ変数

Microsoft PowerPoint - prog04.ppt

プログラミング基礎

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

演算増幅器

解答編 第 7 章実数型の計算と標準数学関数 演習問題 7.1 文法事項 1 ) 暗黙の型変換とは何か答えなさい 代入演算子 (=) や算術演算子 (+,-,*,/,%) では 2 つの演算項のデータ型が揃っている事が必要です 2 つの演算項のデータ型が異なる場合 可能ならば 演算項のデータ型を変換

Microsoft PowerPoint - 11.pptx

ポインタ変数

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

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

Microsoft PowerPoint - prog03.ppt

講習No.9

Microsoft Word - no202.docx

ポインタ変数

プログラミング実習I

Report#2.docx

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

PowerPoint Presentation

PowerPoint プレゼンテーション

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

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

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

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

第2回講義:まとめ

Prog1_6th

kiso2-09.key

スライド 1

Microsoft Word - no15.docx

Microsoft Word - no13.docx

計算機プログラミング

Microsoft PowerPoint - kougi7.ppt

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

cp-7. 配列

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

プログラミング基礎

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

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

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(

JavaScriptで プログラミング

2006年10月5日(木)実施

PowerPoint プレゼンテーション

Report#2.docx

※ ポイント ※

02: 変数と標準入出力

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

講習No.1

プログラミングA

Prog1_10th

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

PowerPoint Presentation

演算増幅器

gengo1-2

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

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

Microsoft PowerPoint - C1(演算と変数).ppt

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

JavaプログラミングⅠ

第9回 配列(array)型の変数

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

PowerPoint プレゼンテーション

ファイル入出力

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

02: 変数と標準入出力

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

02: 変数と標準入出力

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

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

Microsoft PowerPoint - prog03.ppt


プログラミング基礎

プログラミングA

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

Prog1_12th

Microsoft Word - no02.doc

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

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

Microsoft PowerPoint - C_Programming(3).pptx

gengo1-11

ファイル入出力

フィルタとは

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

Transcription:

解答編 第 9 章文字データの取り扱い 演習問題 9.1 文法事項 1 ) コンピュータにおける 文字データの取り扱いについて説明しなさい コンピュータでは 文字に整数の番号を割り当てて ( コード化して ) 文字コードとして扱います 実際に用いられる文字コードとして ASCII コード EUC コード JIS コード SJIS コードなど 様々な規格が存在します 2 ) C 言語の文字型は整数型の一種と考えられるが その理由を述べなさい 1) で答えたように 文字は文字コードとして扱われます つまり 文字は小さな整数値で表されているのです このため 文字型のデータの内容は 文字を表すコード番号であるという意味を除けば 単なる整数です このため C 言語の文字型は整数型の一種として考えることができます 3 ) 文字型のデータに対する四則演算は 実際にはどのような操作が行われるか答えなさい 文字型のデータに対する四則演算は 文字コードをただの整数値と考えた場合の演算となります 例えば 文字型データどうしの足し算では それぞれの文字のコード番号を整数として足し算したのと同じ結果が得られます 4 ) 標準文字処理関数などの標準関数を用いる利点を簡潔に述べなさい 大文字と小文字の変換など 文字データに対する操作をプログラミングする場合 文字コードの性質を上手く利用しなければスマートなプログラムを書くことが難しくなります しかし 一方で 文字コードの性質に依存したプログラムは その依存性のために他のコンピュータへのプログラムの移植性が損なわれる恐れがあります コンピュータのプログラムは 文字処理に関わらず 多くの機種依存性を持っており プログラムの移植の妨げになります 標準文字処理関数をはじめとする標準関数用いると 面倒な手続きを考えることなく 手軽に文字処理などの複雑な処理を行えます また 標準関数の設計はよく考えられており 初心者が苦心して作ったプログラムより効率や信頼性が高いといえます さらに 標準関数は C 言語を用いることができるコンピュータでは必ず利用できます このため 標準関数を使った部分に関しては 他のコンピュータにプログラムを移植した際に その動作を保証することができます 以上のような 簡便さと移植性の高さから 可能な場合は なるべく標準関数を用いてプログラムを設計することが望ましいといえます

解答編第 9 章文字データの取り扱い演習問題 9.2 プログラム例 9.2 を参考にして aから zまでの文字の文字コード表を出力するプログラムを作りなさい プログラムの実行例は 図 9.8のようになります ( 図 9.8 省略 : 本文を参照のこと ) 解答例を解答プログラム 9.1 に示します このプログラムは プログラム例 9.2 の処理を for 文によって繰り返しただけのもので非常に単純です 文字型 (char 型 ) の変数 letter を整数型の変数と同じようにカウンタ変数として使える点に注目して下さい 文字コードを型変換した後に 特別に何か処理をするのでなければ 解答プログラム 9.2 のように プログラムを簡略化することができます printf() 関数への 解答プログラム 9.1 文字コード表を作るプログラム p9_1.c 文字コード表を作る Tadaaki Shimizu 2006.11.17 char letter; // 文字 int charcode; // 文字コード for(letter = 'a'; letter <= 'z'; letter++) charcode = (int)letter; printf("%c : %d\n", letter, charcode); 解答プログラム 9.2 文字コード表を作るプログラム 2 p9_2.c 文字コード表を作る 2 Tadaaki Shimizu 2006.11.17 char letter; // 文字 for(letter = 'a'; letter <= 'z'; letter++) printf("%c : %d\n", letter, (int)letter); 2

引数の引き渡しの際に型変換をすることで プログラム中の変数を 1 つ減らすことができます 解答プログラム 9.1 と解答プログラム 9.2 では a から z までのアルファベットが文字コード上で順番に隙間無く並んでいることを仮定しています 従って このような仮定が成り立たない文字コードを用いているコンピュータでは このプログラムは正しく動作しません この問題を解決する簡単な方法は あるでしょうか? あります!! もし 文字が順番に並んでない可能性があるというならば 無理にでも順番に並べてしまえばよいでしょう 具体的には 配列を使って 配列の中に文字を a から順に z まで並べて格納してしまいます このためには 次の第 10 章で学ぶ文字列を使うことができます ( ここからの説明で理解できない点は 第 10 章を学んだ後に読んで下さい ) 改良したプログラムを 解答プログラム 9.3 に示します このプログラムでは 初期化付き宣言によって char 型の配列 letter[] にアルファベットの列を文字列として格納します 配列 letter[] について for 文により 0 番目の要素から '\0'( ヌル文字 : 文字列の終端記号 ) の前まで 順に文字と文字コード番号を表示します 解答プログラム 9.3 は 文字コードが前述の仮定を満たしていない場合でも 正しく動作します しかも 解答プログラム 9.1 と解答プログラム 9.2 と比べて たいして複雑になっているわけでもありません シンプルでかつ移植性も高いという意味では 非常に良いプログラムだということができます 解答プログラム 9.3 文字コード表を作るプログラム 3 p9_3.c 文字コード表を作る 3 Tadaaki Shimizu 2006.11.17 char letter[] = "abcdefghijklmnopqrstuvwxyz"; // 文字 int i; // カウンタ変数 for(i = 0 ; letter[i]!= '\0'; i++) printf("%c : %d\n", letter[i], (int)letter[i]); 3

解答編第 9 章文字データの取り扱い演習問題 9.3 2 つの文字を入力し その間のアルファベットを順に出力するプログラムを作りなさい 例えば eと iが入力されると e,f,g,h,iの 5 文字が出力されます ただし 2 つの文字の入力の順番は問わないように プログラムを作りなさい この問題は単純なのですが やってみると面倒くさいことが山積みです 文字の入力だけでも 考えなければならないことが沢山あります 演習問題では プログラムの詳細については指定していませんので 問題にチャレンジする皆さんが自分自身で考える必要があります 以下に挙げる点は あくまでも例ですので 参考程度に思って下さい 1) アルファベット以外の文字が入力されたらどうする? この解答例では エラーメッセージを表示して終了することにしました 2) 大文字と小文字の扱いはどうする? この解答例では 全て小文字に直して扱うことにしました 解答例を 解答プログラム 9.4 に示します このプログラムでは 変数に scanf() 関数を使って 1 文字入力しています その後 isalpha() 関数によって 入力された文字がアルファベットかどうか調べ アルファベットでなければ プログラムを終了しています さらに tolower() 関数を使って小文字にします 上記の文字入力を変数 startletter と endletter について行った後 変数 startletter の方に順番の若いアルファベットが入るように入れ替えをします ここでは 順番が若いアルファベットほど値が小さい文字コードである という仮定をしています 文字の表示では for 文を用いて カウンタ変数 i により startletter に格納された文字から endletter に格納された文字の 1 つ前までを表示します さらに for 文を抜けた後 もう一度 printf() 関数で i の内容を "%c" によって表示します このとき i の値は endletter の値と一致しているので きちんと最後の文字が表示されます このように ちょっと面倒な表示方法を取ったのは 文字と文字の間に,( カンマ ) を表示し 最後の文字の後で改行するという表示形式にしたかったからです このプログラムでは 文字の入力 の部分では 標準関数を用いてプログラムの機種依存性を取り除いていますが 文字の入れ替え と 文字の表示 の部分では 文字コードの性質 ( 若い順に連続にコード化されている ) を直接使っています この依存性を取り除くことは 演習問題 9.3 の解答例で示したような方法で可能ですが プログラムが複雑にかつ遅くなります しかも 少なくとも英文字のアルファベットについては ここで仮定した性質を持たない文字コードは考えられないので よほどのことがない限り大丈夫でしょう 4

解答プログラム 9.4 連続したアルファベットを表示するプログラム p9_4.c 連続したアルファベットを出力 Tadaaki Shimizu 2006.11.20 #include <ctype.h> char startletter, endletter; // 開始 / 終了文字 char tmp; // 入れ替え用のテンポラリ変数 int i; // カウンタ変数 // 文字の入力 printf(" 1 文字入力 : "); scanf("\n"); // 1 文字入力のためのおまじない scanf("%c", &startletter); if(!isalpha((unsigned char)startletter)) printf("error : 入力はアルファベットではありません \n"); startletter = (char)tolower((unsigned char)startletter); // 文字の入力 printf(" 1 文字入力 : "); scanf("\n"); // 1 文字入力のためのおまじない scanf("%c", &endletter); if(!isalpha((unsigned char)endletter)) printf("error : 入力はアルファベットではありません \n"); endletter = (char)tolower((unsigned char)endletter); // 文字の入れ替え if(startletter > endletter) tmp = startletter; startletter = endletter; endletter = tmp; // 文字の表示 for(i = startletter; i < endletter; i++) printf("%c,", i); printf("%c\n", i); 5

解答編第 9 章文字データの取り扱い [ ちょっと難しい話題 ] 解答プログラム 9.4 では isalpha() 関数などを用いるときに isalpha((unsigned char)endletter) としています この中で気になるのは (unsigned char) というキャスト演算子ではないでしょうか char 型が整数型の一種であるということは 本文中で述べました 多くのコンパイラでは char 型は -128 から 127 までを表すことができる符号付きの整数型として扱われます 一方 文字データはコード番号であり正の数です char 型の変数は文字コードの入れ物としては 符号無しの整数と同じように使われています char 型のデータを文字のデータとしてだけ使っている場合は char 型が符号付きか符号無しかということはあまり問題になりません しかし char 型を int 型に型変換する場合は大問題を引き起こします 0 から 127 までの文字コードは char 型から int 型に型変換する場合 その値を保ったまま変換されます しかし 128 以上の文字コードは 問題を起こします 128 以上の文字コードは char 型を符号ありと考えると負の数になってしまいます このため 符号付きの char 型の変数に格納された 128 以上の文字コードは int 型に型変換すると 負の数になってしまいます この事態を防ぐには char 型を一度強制的に符号無しにしてしまえば良いのです このためには (unsigned char) キャスト演算子を用います 上記の isalpah() 関数の呼び出しでは 変数 endletter に格納されたデータを キャスト演算子で一旦 符号無し char 型 (unsigned char 型 ) に強制的に型変換し その後 暗黙のうちに int 型に型変換してから 渡しているのです これによって 128 以上の文字コードも正しく扱うことができます 本書の例題や演習問題では コメントや printf() 関数による表示 ( 書式文字列 ) を除いては 文字として英数字だけを想定しています それでも 面倒なことは幾つもあります ましてや 日本語など英語以外の文字を扱うとなると大変です 文字や文字列の扱いは プログラムを書く者にとって 思った以上に厄介なことなのです

演習問題 9.4 1 桁の 16 進数を入力すると 対応する 10 進数を表示するプログラムを作りなさい 16 進数と 10 進数の対応を 表 9.5に示します ( 表 9.5 省略 : 本文を参照 ) 解答例を解答プログラム 9.5 に示します 16 進数を 単なる英数字と考えて char 型のデータとして扱いました 1 文字入力の扱いについては 演習問題 9.3 で詳しく述べたので省略します プログラムは色々と書きようがあるでしょうが ここでは 文字データとして入力された 16 進数を int 型の整数に直して その結果を表示するようにしました 数値に変換 という部分と 結果の出力 の部分を完全に分けてプログラムを作ったので 多少の無駄もありますが わかりやすくはなっているのではないでしょうか? このプログラムでは 数字や英文字の文字コードが順番に連続して並んでいること 解答プログラム 9.5 16 進数と 10 進数の変換 p9_5.c 16 進数 Tadaaki Shimizu 2006.11.20 #include <ctype.h> #define ERROR_INPUT -1 // エラーコード ( 入力エラー ) char hexadecimal; int decimal; // 16 進数 // 10 進数 // 16 進数 : 文字として入力 printf(" 16 進数 1 桁入力 : "); scanf("\n"); // 1 文字入力のためのおまじない scanf("%c", &hexadecimal); hexadecimal = (char)tolower((unsigned char)hexadecimal); // 数値に変換 if(isdigit((unsigned char)hexadecimal)) // 0-9 の場合 decimal = (int)(hexadecimal - '0'); else if(hexadecimal >= 'a' && hexadecimal <= 'f') decimal = (int)(hexadecimal - 'a') + 10; else decimal = ERROR_INPUT; // 結果の出力 if(decimal!= ERROR_INPUT) printf("%c : %d\n", hexadecimal, decimal); else printf("error: 入力が 16 進数ではありません \n");

解答編第 9 章文字データの取り扱いを仮定しています そんなことを全く仮定せずに どんな文字コードでも動くようにする方法もあります プログラム例 9.6 を見て下さい 泥臭い力技ですが 扱う数字が 16 種類程度と少ない場合には よい方法です 解答プログラム 9.6 16 進数と 10 進数の変換 p9_6.c 16 進数 Tadaaki Shimizu 2006.11.20 #include <ctype.h> #define ERROR_INPUT -1 // エラーコード ( 入力エラー ) char hexadecimal; int decimal; // 16 進数 // 10 進数 // 16 進数 : 文字として入力 printf(" 16 進数 1 桁入力 : "); scanf("\n"); // 1 文字入力のためのおまじない scanf("%c", &hexadecimal); // 数値に変換 switch(hexadecimal) case '0': decimal = 0; case '1': decimal = 1; case '2': decimal = 2; case '3': decimal = 3; case '4': decimal = 4; case '5': decimal = 5; case '6': decimal = 6; case '7': decimal = 7; case '8': decimal = 8; case '9': decimal = 9; case 'a': case 'A': decimal = 10; case 'b': case 'B': decimal = 11; 8

case 'c': case 'C': decimal = 12; case 'd': case 'D': decimal = 13; case 'e': case 'E': decimal = 14; case 'f': case 'F': decimal = 15; default : decimal = ERROR_INPUT; // 結果の出力 if(decimal!= ERROR_INPUT) printf("%c : %d\n", hexadecimal, decimal); else printf("error: 入力が 16 進数ではありません \n"); 9