物理情報処理基礎実習II 第9回

http://www.phys.ynu.ac.jp/labs/cosmic/shibata/jisshu/
物理情報処理基礎実習II
第9回
文字と配列
~文字・アスキーコード~
柴田 [email protected]
(原 [email protected])
石川 [email protected]
§課題7-解答例
aplsrvky01% cat kadai7.c
#include <stdio.h>
main()
{
double a,b;
char c;
printf(" The four rules of arithmetic: \n");
printf(" Input ( a [+,-,*,/] b ): ");
scanf("%lf %c %lf",&a,&c,&b);
switch(c){
case '+':
printf(" Addition: %lf %c %lf = %lf\n",a,c,b,a+b);
break;
case '-':
printf(" Subtraction: %lf %c %lf = %lf\n",a,c,b,a-b);
break;
case '*':
printf(" Multiplication: %lf %c %lf = %lf\n",a,c,b,a*b);
break;
§課題7-解答例つづき
case '/':
if(b!=0){
printf(" Division: %lf %c %lf = %lf\n",a,c,b,a/b);
}else{
printf(" ERROR: %lf %c %lf Divided by ZERO!\n",a,c,b);
}
break;
default:
printf(" ERROR: %lf %c %lf Undefined Operation!\n",a,c,b);
}
}
aplsrvky01% cc kadai7.c
aplsrvky01% ./a.out
The four rules of arithmetic
Input ( a [+,-,*,/] b ): 2 + 3
Addition: 2.000000 + 3.000000 = 5.000000
aplsrvky01% ./a.out
The four rules of arithmetic
Input ( a [+,-,*,/] b ): 2 - 3
Subtraction: 2.000000 - 3.000000 = -1.000000
§課題7-解答例つづき
aplsrvky01% ./a.out
The four rules of arithmetic
Input ( a [+,-,*,/] b ): 2 * 3
Multiplication: 2.000000 * 3.000000 = 6.000000
aplsrvky01% ./a.out
The four rules of arithmetic
Input ( a [+,-,*,/] b ): 2 / 3
Division: 2.000000 / 3.000000 = 0.666667
aplsrvky01% ./a.out
The four rules of arithmetic
Input ( a [+,-,*,/] b ): 2 / 0
ERROR: 2.000000 / 0.000000 Divided by ZERO!
aplsrvky01% ./a.out
The four rules of arithmetic
Input ( a [+,-,*,/] b ): 2 @ 3
ERROR: 2.000000 @ 3.000000 Undefined Operation!
§課題8 方程式の根
X2ーsin(x)=0の解(x=0以外)が0.1≦x≦1.0
の間にある。この区間内の関数f(x)=X2ーsin(x)の
端点での値を調べて誤差10ー6以内で解を求めたい。
端点のひとつと端点の中点の区間で解の存在範囲を
調べる。誤差が10ー6より大きければ、区間を半分にせ
ばめ解の存在範囲を繰り返し調べる。収束後(誤差が
10ー6以内)の反復回数と、端点・中点および関数の値
を表示するプログラムを作成し、実行せよ。
ただし、端点(0.1、1.0)および誤差10ー6は入力とし、
反復の最大回数は10000と限定する。
また、レポートには簡単なフローチャートも添付すること。
※出力書式はprintf(“x1=%15.10lf¥n”、x1);
を参考にせよ。
§課題8 フローチャート
課題8 f(x)=x2-sin(x)=0 の根
x1,x2:初期端点
真→青分岐
偽→赤分岐
X1,x2,e 入力
e:誤差 10-6
i<10000
f1*fm<0
X2=xm
f1*fm>0
X1=xm
端点の更新
xm=(x1+x2)/2
f1=f(x1)
fm=f(xm)
(|f1|<e)||(|fm|<e)
端点、中点の誤差判定
出力/終了
§注意
ここから先、
教科書に沿って学ぶことは限られます。
この章「文字と配列」では、以下の様に。
 文字型変数の理解
 文字列の扱いと配列
 整数・実数配列(追加事項)
テキスト中の例題の多くは、
データ型の理解と文字処理のために用意されているが、
科学計算用には整数・実数配列が重要である。
時間数の理由により多くの例題は省略し、
科学計算のために必要な事項を付け加える。
テキスト第3章の例題は自分で勉強しておくこと!
§文字
文字は整数
計算機では、文字を整数として管理している。
※計算機には0と1しか無いし、そうせざるを得ない。
ex.) int c;
c = getchar();
※getchar()は1文字を入力する関数なのに、
整数変数のcに結果を代入している。
アスキーコード(ASCII code)
文字には対応するアスキーコードが存在する。
‘A’=65 ‘B’=66 … ’Z’=90
 小文字アルファベット ‘a’=97 ’b’=98 … ’z’=122
 数字 ‘0’=48 ’1’=49 … ’9’=57 ※‘0’=0ではない!
 コントロールコード 0~31
※改行(LF), tab, ^C, ^D, ^Z等画面制御やジョブ制御
 その他、特殊記号 → 教科書p.95 表3-1
 大文字アルファベット
§コントロールコード
 コントロールコード(control code、Ctrl-?と表記)と
呼ばれる文字は、getcharで正常入力できない!
 ジョブ制御



Ctrl-C (3) プログラムの実行を中断する。
Ctrl-D (4) 入力の終了を意味し、EOFを返す。 (DOSではCtrl-Z)
Ctrl-Z (26) 実行中のプログラムを一時停止させる。(fg コマンドで再開)
 入力編集




Ctrl-H (8) バックスペース
Ctrl-J(10) 改行
Ctrl-U(21) 行消去
Ctrl-V(22) コントロールコード入力のためのプレフィックス。
Ctrl-Vに続けて入力した1文字が実際に入力される。
 端末制御


Ctrl-S(19) 通信停止
Ctrl-Q(17) 通信再開
 その他

NULL(0) は空文字の意味として使われる。
§文字の決まりごと
値の表現
c = ‘A’ ;
※シングルクォートで囲む
出力書式
 printf(“%c”,c)
; ※文字として出力。出力結果は:A
 printf(“%d”,c) ; ※アスキーコードを出力。出力結果:65
文字の大小=アスキーコードの大小
‘1’ < ‘A’ < ‘a’ → 49 < 65 < 97
様々な文字コード
パソコンなど
 EBCDICコード: メインフレーム、大型計算機など
 ASCIIコード:
§エスケープシーケンス
エスケープシーケンス(escape sequence)
\(¥)記号を用いて表す特殊表示
コントロールコード
\n(改行)=10、\t(Tab)=9、\a(ビープ音)=7
C言語の仕様(制限)によって、
特別な扱いが必要となる文字。
\‘(‘)、\“(“)、\\(\)
ex.) printf(“ \”ABC\\”) → 出力結果 ”ABC\
特殊な場合
printfで、%を表示したいとき
ex.) printf(“%%”) → 出力結果 %
§文字 -例 キーボードに割り当てられた文字の
アスキーコードを表示するプログラム
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <stdio.h>
main()
{
int c;
printf(“Hit any key(s), Ctrl-C to finish\n”);
while(1){
※無限ループ(Ctrl-Cで中断)
c=getchar();
if(c<32){
※コントロールコードの場合
printf(“ASCII code of Ctrl-%c = %d\n”,64+c,c);
}else{
※普通の文字の場合
printf(“ASCII code of %c = %d“,c,c);
}
}
}
§文字 -例- 解説と問い
解説
 while(1)は、条件が常に真になっているので、
無限ループを形成する。
→ Ctrl-Cでプログラムの実行を強制終了させること。
 コントロールコードもキーボードに割り当てられている。
※Ctrlキーを押しながらアルファベットキーを押す
ex.) [Ctrl]-[a] = 1、[Ctrl]-[b] = 2、... [Ctrl]-[z] = 26。
 その他いくつかの特殊キー
[ESC] = 27、 [Tab] = 9 等。
問い
 問1:NULL(値は0)
は、
どのキーに割り当てられているか?
※ヒント:‘A’(値65)から1を引いたものに相当する文字は?
 問2:カーソル移動キー(矢印キー)や、
ファンクションキー([F1]~[F12])には、
どんなアスキーコードが割り当てられているか?
§課題9 大文字・小文字変換
アルファベットの大文字と小文字のアスキーコードには
大文字+32=小文字の関係がある(例:‘A’=65, ‘a’=97)。
キー入力した文字が大文字なら小文字に変換し、その
逆に小文字ならば大文字に変換して標準出力装置
(ディスプレイ)に出力するプログラムを作成し、実行例
を示せ。フローチャートも示せ。
ただし、アルファベット以外の文字については変換せず
にそのまま出力するものとする。
ヒント:
1文字キー入力関数はgetcharを使用。
ctrl-Dを入力したらプログラムを終了する。
1文字出力の書式は“%c”。
§来週はテスト!!
遅刻しないように!
範囲は第2章まで。
変数の型、入出力書式、四則演算、
制御構造