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

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
22
0
0

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

全文

(1)

Cプログラミング1(再)

第4回

講義では、Cプログラミングの基本を学び

(2)

前回の復習

関数を作る:何を引数として、どういう計算をし、何を返すか 関数についての注意: * main関数で使われている変数と同じ名前の変数があって も、それらには何ら関係はない * 関数名と同じ変数は、その関数内では使わないようにす る(紛らわしさを少なくするため) * 呼び出しされる前に定義がされていること * 配列を引数とする場合、配列のサイズは書かない

(3)

main関数で使われている変数と同じ名前の変数が

あっても、それらには何ら関係はない

こんな解答があった:

int nenrei(int a, …, int z) { // gengouという仮変数も変数宣言もない

中略 if (gengou == ‘H’) { … } int main(void) { char gengou; …

scanf(“%c”, &gengou);

(4)

関数名と同じ変数は、その関数内では使わ

ない

間違いとは言えないが、紛らわしいのでやめた方がよい

(値を返すための変数は、その関数名と同じものを使わなければ ならない、と勘違いしていないか?)

例: int max(int arr[], int n) { int i, max=arr[0];

return max; }

(5)

呼び出し

される前に

定義

がされていること

流儀1.教科書流(まずmain定義) プロトタイプ宣言を用いる

int max(int arr[], int n); int main(void) {

printf(“max = %d¥n”, max(ar,n)); …

}

int max (int arr[], int n) { …

}

流儀2.主役(main関数)は最後に登場

int max (int arr[], int n) { … } int main(void) { … printf(“max = %d¥n”, max(ar,n)); … } 関数の定義 関数呼び出し

(6)

配列を引数とする場合、配列のサイズは書

かない

配列を引数とする関数の例

float dotProduct(float a[ ], float b[ ]) {

中途略

}

int main(void) {

float x,ar1[NUM], ar2[NUM]; ..

x = dotProduct(ar1, ar2); }

間違いの例

float dotProduct(float a[10], float b[NUM]) {

中途略

}

int main(void) {

float x,ar1[NUM], ar2[NUM]; ..

(7)

なぜ関数を作るか

関数を組み合わせて、より複雑な仕事ができるようにする 確実に動く関数から、複雑な動きをする関数に発展させる 大きな仕事を一つの関数で書く(作る)よりも、 小さいわかりやすく単純な仕事に分け(段取り、分割統治) それぞれを確実に動くようにして(デバッグが容易) より大きな仕事が確実に動くようにする ほうが、効率も作りやすさも上である!

(8)

コンピュータにおけるデータの表現方法

コンピュータの内部は2進数で表現されている 基本単位はビット (bit) 1ビット は 一つの ON/OFF 状態の表現 もしくは 0 か 1 という状態を表す コンピュータの処理は「バイト(byte)」単位で処理 1 byte = 8 bits

(9)

数の表現方法

デジタル (digital) デジタル vs アナログ 離散、不連続 連続 昔は「アナログ型コンピュータ」というものがあった 今のコンピュータは「デジタル型コンピュータ」 すべての物事を「デジタル (= 飛び飛びの値)」として表現 精度を高めることで問題を解決

(10)

コンピュータは有限の桁数を処理

50の階乗を求めよ (1) C でプログラムする… (2) Python で次を実行する: fact = 1 ; n=50 for i in range(1,n+1) : fact *=i print(n,"! =", fact) int main(void) { int i,fact=1,n=50; for(i=1; i<=n; i++) {

fact *= i; } printf("%d! = %d¥n", n, fact); return 0; } Cには「型」がある。それぞれの型により 表現できる範囲が決まっている

(11)

データには型がある

Cの変数で記憶できるもの(データ)は基本的に

である

それは整数(integer)と浮動小点数(floating point number)の2種類

疑問: 文字や配列(文字列を含む)はどうなの?

ひとまずの解答: 文字は「符号なしの整数」

(12)

いろいろな整数の表記法

• 符号なし整数 例: 5U • 10進数 数字の並び 例: 123 • 16進数 先頭に 0x または 0X をつける 例: 0xc8 • 8進数 先頭に0をつける 例: 0310

(13)

いろいろな数を表示してみよう

printf の第1引数の書式指定において %d と書くと、対応する整数を10進表示 したが、8進や16進で表示するのはどうするのか? 答: %o とすると 8進表示、 %x で16進表示 #include <stdiu.h> int main(vuid) { int i;

fur(i=1; i<=100; i++)

printf("%5d %5u %5x¥n", i, i, i); return 0; } 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 10 8 9 11 9 10 12 a 11 13 b 12 14 c 13 15 d 14 16 e 15 17 f 16 20 10 17 21 11 18 22 12 19 23 13 20 24 14 21 25 15 22 26 16 23 27 17 24 30 18 25 31 19 26 32 1a

(14)

オーバーフローについて

• オーバーフロー(overflow): 桁あふれ Cの数として表現できるものには限界がある ⇒ 表現できる範囲を超えると正常な結果が得られない Cでは、整数を「2進数」として内部表現していました。 int型の変数で記憶できるのは32ビット=-231 ~ 231-1までの数を 表現 参考: 13! ≒ 6.227 *109 例:階乗計算プログラムで 10から20までの階乗計算を表示させてみよう (ウェブ上の参考プログラム「階乗計算」参照) http://lang.sist.chukyo-u.ac.jp/Classes/C/fact.c -2147483648 2147483647≒2.15*109

(15)

浮動小数点数

Cではfloat型の数は次のような形で表現される(0.15625を表す):

0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

31 30 23 22 0 仮数部(23bits) 指数部(8bits) 符 号 おおまかに言って、指数部で2の乗数を、仮数部で小数点以下の数(精度)を表す これで表現できる正の数のは、2-149 ≒ 1.4 ×10-45 であり、 それよりも小さな数は0 として扱われる --- アンダーフロー(undeflow) 124 – 127 = -3 1+1/22=1+1/4 =1.25 ⇒ 1.25 * 2-3 = 0.15625 したがって、精度を気にしなければ、大きな数や小さな数は「対数」計算を用いる

(16)

小数点数の内部表現の表示プログラム

浮動小数点数を入力し、その内部表現を16進数として表示する (warningは出るが動くはず) #include <stdio.h> int main(void) { int i; printf(“小数点数? >"); scanf("%f", &i); printf("%x¥n", i); return 0; } C:¥Users¥sirai¥C>float.exe 小数点数? >0.15625 3e200000 3 e 2 0 0 0 0 0

(17)

文字の表現方法

ASCII文字セット(ウェブ検索して調べてみよう) (半角)アルファベットや数字、スペースなどの記号(キーボー ドに刻印されている日本語文字以外の文字)は 1バイトで表現 ‘A’ は 数としては 0x41 ‘a’は 0x61 ‘B’ は 数としては 0x42 ‘b’は 0x62 … ‘0’は数としては 0x30 ‘1’は数としては 0x31 …

(18)

いろいろな文字と数の関係を表示する

#include <stdio.h> int main(void) { char c; for(c='A'; c<='Z'; c++) printf("%c:¥t%5d %5o %5x¥n", c, c, c, c); printf("---¥n"); for(c='a'; c<='z'; c++) printf("%c:¥t%5d %5o %5x¥n", c, c, c, c); return 0; } 出力結果: A: 65 101 41 B: 66 102 42 C: 67 103 43 D: 68 104 44 E: 69 105 45 F: 70 106 46 G: 71 107 47 H: 72 110 48 (中途略) ---a: 97 141 61 b: 98 142 62 c: 99 143 63 d: 100 144 64 e: 101 145 65 f: 102 146 66 (以下略)

(19)

制御コードとエスケープ・シーケンス

制御コード 文字、数字、記号のようには『表示されない』モノ 例:改行、タブなど これらを「表現する」にはどうするか? よくある方法は、¥n ¥t ¥r ¥f のように、 「¥とアルファベットの組み合わせ」を用いて表す ¥は(環境によっては\) 「次の文字を特別扱いせよ」を表す ⇒ エスケープ文字

(20)

日本語の文字表現

アルファベットや数字、記号は 1バイトで表現可能(100個もない ため) それに対して日本語の文字は数千個(常用漢字で2,136) ⇒ 表現するには少なくとも2バイト必要 加えてASCII コードとの両立が望ましい

JISコード(ISO-2022-JP)--- 通常、¥e $ B と ¥e ( B というエスケー

プシーケンスではさまれた「2バイトずつのコード」

Shift-JISコード、EUCコード Unicode --- UTF-8, UTF-16

(21)

宿題(易しい)

(1) 整数を入力し、その8進数と16進数それぞれの表現を返すプロ グラムを書いてみよう 実行例:青字は入力 数?> 123 8進数: 173 16進数: 7b (2) 16進数を入力し、その10進表現を返すプログラムを書こう 実行例:青字は入力 16進数?> abcd 10進数:43981

(22)

宿題(続き)

(3) ASCII コードについて調べよ 文字を入力するとそのASCIIコードを返すプログラム、 逆にASCIIコード(整数)を入力すると文字を返すプログラム を作ってみよ (4) 「漢」「字」はそれぞれ内部的にはどのような表現がされて いるか、調べるプログラムを書いてみよ (5) (多倍長ではないintの)整数としてあらわされる最大の数と最 小の数(マイナスの数)をプログラムを書いて求めてみよ。

参照

関連したドキュメント

これらの定義でも分かるように, Impairment に関しては解剖学的または生理学的な異常 としてほぼ続一されているが, disability と

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

(( .  entrenchment のであって、それ自体は質的な手段( )ではない。 カナダ憲法では憲法上の人権を といい、

子どもの学習従事時間を Fig.1 に示した。BL 期には学習への注意喚起が 2 回あり,強 化子があっても学習従事時間が 30

今回の SSLRT において、1 日目の授業を受けた受講者が日常生活でゲートキーパーの役割を実

現行の HDTV デジタル放送では 4:2:0 が採用されていること、また、 Main 10 プロファイルおよ び Main プロファイルは Y′C′ B C′ R 4:2:0 のみをサポートしていることから、 Y′C′ B

子どもたちは、全5回のプログラムで学習したこと を思い出しながら、 「昔の人は霧ヶ峰に何をしにきてい

各テーマ領域ではすべての変数につきできるだけ連続変量に表現してある。そのため