• 検索結果がありません。

ポインタ変数

N/A
N/A
Protected

Academic year: 2021

シェア "ポインタ変数"

Copied!
27
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング及び実習⑤

(2)

文字処理

単一の文字は「

」と「

」(シングルクォーテー

ション)で囲んで表現される。文字のデータ型は

charまたはintである。intを用いたほうが、ライブ

ラリの関数の引数の型と一致する。

以下は全部intの使用に統一する。従って、

int ch;

で文字変数を宣言しておくと、

ch=‘A’;

のように、chに文字Aを付与する

ことができる(

int ch=‘A’;で宣言するの

もOK)。

!注意:ch=A;はだめ!

数値処理:

(3)

文字の入出力

キーボードからの入力は

ch=getchar(); or

scanf(“

%c

”, &ch);

/* intで宣言の場合、warning

messageが出る処理系がある。 charで宣言すると、

warning messageが出ない */

ディスプレイへの出力

(4)

空白文字

単一の文字として「空白文字」が色々なところに

使われる。

空白文字は以下のように与える

ch=‘ ’;

出力は前に述べた方法でchを出力することは

できるが、

putchar(‘ ’);

でも出力できる。もちろん、

printf(“ ”);

でもOK。

空白はよく判断文にも使われる:if(ch == ‘ ’) ....

(5)

制御文字とは

• 上に述べた普通の文字以外に、制御文字

と呼ばれるものがある。制御文字とは、出

力のコントロールやそのままでは表現でき

ない文字を扱うために用いられる。

(6)

主な制御文字

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

(7)

制御文字についての補足

制御文字は表面上2つの文字で表されているが、

計算機内部では

単一の文字

(つまり同じバイト数)

で表現されている。従って、普通文字と同様、

int ch;

ch=‘¥t’;

はOKである。以上のように制御文字を

ch

に付与す

ると、以下の2文は等価になる:

printf(“制御文字

¥t

使用例

¥t

機能¥n”);

printf(“制御文字

%c

使用例

%c

機能¥n”, ch, ch);

1文字分

(8)

コンピュータ内部では、全ての文字は整数(文

字コード)で表現されている。

(半角英数字や記

号)

文字は

アスキーコード

表と呼ばれるものに

従っている。たとえば英数字は以下の通りに対

応している。

‘A’, ‘B’, ..., ‘Z’

65-90

‘a’, ‘b’, .... ‘z’

97-122

‘0’, ... ‘9’

48-57

英数字文字と整数値の対応

文字 整数値 数字文字 英字文字

(9)

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); ?

(10)

演習問題1

三つの文字変数を用いて

任意

の3文字

をキーボードから入力し、それらに

+

記号を

挿入して出力するプログラムを書きなさい。

実行例:

$ ./a.out

abc

入力

+a+b+c

出力

(11)

プログラムの改良

前のプログラムの問題点の1つは、文字の数だ

け、文字変数を用意しなければならない。した

がって、文字の数が多い場合は対処困難である。

たとえば、以下の例では、10個の文字変数を用

意しなければならない。

実行例:

$ ./a.out

abcdefghij

入力

(12)

#include <stdio.h> main() { int ch; while((ch=getchar()) != '¥n') printf("+%c", ch); putchar('¥n'); }

プログラムの改良

(13)

プログラムのさらなる改良

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

(14)

#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF){ if(ch != '¥n') printf("+%c", ch); else printf("¥n"); } }

プログラムのさらなる改良

プログラム①

(15)

#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF) printf("+%c", ch); }

プログラム①とプログラム②は

何が違う?

プログラム②

(16)

②の実行結果は以下になる

実行例

$ ./a.out

abc

入力

+a+b+c

+

出力

opqxyz

入力

+o+p+q+x+y+z

+

出力

Ctrl-D

入力

終了

最後に+が出力される

(17)

演習問題2

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

(18)

ファイルの複写プログラム

#include <stdio.h> main() { int ch; while((ch=getchar()) != EOF) printf(“%c”, ch); // putchar(ch); }

(19)

ファイルの複写プログラム

This is a test file. Ryukoku University Program Lecture s.dat

./a.out<s.dat>o.dat

This is a test file. o.dat

(20)

例題(1/2)

文字をキーボードから入力し、改行を入れた時点で

小文字を大文字

大文字・数字・改行記号はこのまま

特殊文字(英数字・改行以外の文字)を空白

に変換して出力するプログラム。ただし、 Ctrl+Dで終了

とする。

(21)

例題(2/2)

#include <stdio.h> main() { 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); // 大文字か数字か改行はそのまま

(22)

注意

if(ch<‘a’ || ch>‘z’)

を用いて(つまり小文字でなけれ

ば)、大文字か数字であることを判断することは

できない(それ以外の文字かもしれない)。

また、文字変換は必ずしも正確ではない。

if((ch<‘a’ || ch>‘z’) && (ch<‘0’ || ch>‘9’))

// 小文字、数字ではない

putchar(ch-‘A’+‘a’);

(23)

第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,+)のような実質的に同

(24)

第5回実習課題(2/5)

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

(25)

第5回実習課題(3/5)

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

(26)

第5回実習課題(4/5)

課題3のヒント:

• 左括弧

をつけるために、先頭文字か先頭文字で

ないかの判定が必要。そのために、たとえば、

fg=1が先頭でfg=0が先頭でないというように、状

態変数(フラッグ)を導入すると便利かも。

• 今読み込んだ文字は改行文字かの判定も必要

になってくる。改行文字であれば改行の前に

括弧

をつけると同時に状態変数fgの値を1に戻

す必要がある(つまり、次に読み込まれる文字は

また先頭文字になる、ということ)。

(27)

第5回実習課題(5/5)

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

参照

関連したドキュメント

噸狂歌の本質に基く視点としては小それが短歌形式をとる韻文であることが第一であるP三十一文字(原則として音節と対応する)を基本としへ内部が五七・五七七という文字(音節)数を持つ定形詩である。そ

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

管理画面へのログイン ID について 管理画面のログイン ID について、 希望の ID がある場合は備考欄にご記載下さい。アルファベット小文字、 数字お よび記号 「_ (アンダーライン)

つの表が報告されているが︑その表題を示すと次のとおりである︒ 森秀雄 ︵北海道大学 ・当時︶によって発表されている ︒そこでは ︑五

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

“〇~□までの数字を表示する”というプログラムを組み、micro:bit