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

プログラミング演習

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング演習"

Copied!
29
0
0

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

全文

(1)

プログラミング演習 II

2003

10

29

日(第

2,3

回)

木村巌

(2)

今日やること

配列の復習

ポインタの復習

多倍長整数の配列での実現 足し算と繰り上がり

malloc()

free()

(3)

配列

それぞれの型

T

について、

T

型の配列が存在 する(

void

型、「…を返す関数」型を除

く)

:

T var[16];

のように宣言する.

T

は、整数、浮動小数点 数、文字、などが主な例.

例:

int ary[16];

int

型の配列.

ary[0]

から

ary[15]

までの

16

(4)

配列の正体

T

型の値を、指定された個数だけ保持 できるメモリの先頭のアドレス(

T

のポインタ).

例:

int ary[16];

sizeof (ary); /* == sizeof (int) * 16 == 64byt

e */

(5)

配列は 0 から始まる

配列は、

0

から始まる添え字を持つ

int ary[16]

なら、

ary[0]

から

ary[15]

で.

ary[16]

を読み書きしても(読み書きで

きてしまう!)、結果は予測できな い!!

(6)

配列の要素はすべて同じ型

int ary[16];

と宣言すると、

ary[0]

から

ary[15]

はす べて

int

型.

(7)

配列の初期化

int ary[3] = {1, 2, 3};

int ary[] = {1, 2, 3};

どちらも同じ意味.

後者のほうが間違いがない(コンパイ ラが要素の数を数えてくれる).

(8)

レポート課題1(フィボナッ チ数)

フィボナッチ数

f(n)

は、次の漸化式で 定義される:

f(0) = 1, f(1) = 1,

f(n) = f(n-1) + f(n-2), n >= 2.

f(n)

を求めるプログラムをCで書け.各 項は

long

で表すこと

何項目まで正しく求められるか?

(9)

多倍長整数の配列での実現

暫定的に、以下のようにする:

配列の長さを固定:

DIM

とする 基数を固定:

BASE

とする

long

の配列、次元は

DIM

とりあえず非負整数のみ

添え字の小さい方が小さい方の桁

(10)

多倍長整数の配列での実現

(2)

つまり、

#define BASE 10

#define DIM 3

long a[DIM] = {1, 0, 0}; /* DIM = 3 */

なら、

a = 1 + 0*10

1

+ 0 * 10

2 =

1.

DIM

桁の

BASE

進表記

(11)

繰り上がり

a = a_0 + a_1*10^1 + a_2 * 10^2, b = b_0 + b_1*10^1 + b_2 * 10^2,

のとき、

c=a+b

をどのように計算するか

考える

c_i=a_i+b_i

i

桁目にするのではな

BASE

より大きくなったときに、次の 桁へ繰り上げる

(12)

プログラム例

( mpinteger-wo-malloc.c )

以上のようなアイディアで、フィボナ ッチ数の計算を行うプログラムを作る

(13)

ポインタ型

C

の型の一つ

任意の型

T

に対して、「

T

のポインタ 型」が定義できる

従って、「 T のポインタのポインタ」型 等々も定義できる

例:

integer

型のポインタ型変数

a……int

*a

例:

char

型のポインタ型変数

s…char *s

(14)

ポインタって何 ?

T

のポインタ型の値は、型

T

のモノ

object

)のアドレス(メモリ上の場

所)

T

のポインタ型の変数は、型

T

のモ ノのアドレスを保持するのに必要なだ けのメモリを占める

(15)

ポインタの作り方

T

のモノから、それを指すポインタ値を つくるには、アドレス演算子

&

を使う

例:

int a = 1; int *aptr; aptr = &a;

T

のポインタ値から、それが指している

T

のモノを見るには、間接演算子

*

を使

例:

int *bptr; int b;

(16)

ポインタって何?(続)

int a = 1; /*

int が保存できるメモリを確保し、 1 保存

*/

int *aptr = &a; /*

そのメモリの番地 

*/

1

aptr

(17)

ポインタに対して出来ること

T *p; /* p

T

型のポインタ

*/

ポインタの間接参照(そのポインタが 指すモノを取り出す):

*T /* T

型のモ

*/

ポインタの算術:

T ary[8]; T *p = &ary [0];

ならば、

p + i

ary[i]

 とは同じメ

(18)

なぜポインタがいるのか ?

一つの理由は、

C

言語での関数引数が、

値渡しだから

int a = 1; f(a);

とすると、

f()

に渡されるのは、

a

の値 のコピー.変数

a

そのものが渡されるの ではない

プログラム例:

swap.c

を参照

(19)

ポインタと配列との関係(テキ スト10章)

式の中に現れる配列は、「

T

の配列」から

T

へのポインタ」に変換される

(ary_ptr.c

)

このときのポインタは、配列の

0

番目の成分 を指すポインタ

int a[8], *aptr; aptr = a;

と、

int a[8], *aptr; aptr = &a[0];

とはまったく同じ

(20)

メモリの確保:静的な確保

これまでは、プログラムの字面に、メ モリの確保が指示されていた:

たとえば、

long a[10];

は、

sizeof(long) *

10 byte

のメモリを確保し、その先頭アド

レスを

a

という名前で識別する

プログラムの実行が始まる前、コンパ イル時にすべてのメモリが確保されて

(21)

メモリの動的確保: malloc()

プログラムの実行が始まってから、指 定された大きさのメモリを確保するラ イブラリ関数:

void *malloc(size_t).

malloc (16);

16byte

のメモリを確保し

、その先頭アドレスを返す

.

返されるアドレスは、

void

型のポインタ

Void

型のポインタは、任意の型に変換可 能な「総称型」(

generic type

(22)

型の明示的変換(キャスト)

C

の型システムでは、一定の規則の下 で、型の変換が行える.

当然行えるべき変換…

int

から

long, flo at

から

double, int

から

float, long

から

d ouble

など:

int a; long aa; aa = (long) a;

逆もある.(精度の切り捨て)

(23)

総称型: void *

malloc()

で確保したメモリは、何に使わ

れるか限定できない

何にでも使える型:

void *

実際には、

void *

をほかの型に変換

(キャスト)して使う

void *tmp; tmp = malloc (16);

(24)

malloc() の使い方

場合によっては、メモリの確保に失敗する

その場合、返値が

NULL

void *tmp;

long *a;

tmp = malloc (sizeof (long) * 4);

if (tmp == NULL) /* エラー処理  */

else a = (long *)tmp;

(25)

変数のエクステント

変数の有効期間

関数内で宣言された変数は、その関数 内に制御がある間のみ有効だった(プ ログラミング演習Iの

6/15

の回の資料 参照)

関数内で確保したメモリは、明示的に 解放されるまで有効.

(26)

malloc() を使った多倍長計算

プログラム例参照.

(27)

レポート課題 2

BASE100, DIM 3

の場合、

1. a = 23 + 34*100 + 45*100^2, b = 11 + 22*10 0 + 33*100^2

について、

a+b

を手で計算せ よ.

2. a = 23 + 34*100 + 45*100^2, b = 88 + 77*10

0 + 44*100^2

について、

a+b

を手で計算せ よ.

(28)

レポート課題 3

プログラム例

mpinteger.c

で、

BASE

を100とし、

mpinteger-wo-malloc.c

のように、引数として何番目のフィボ ナッチ数まで計算するかを指定できる ように改造したものを作成せよ.

(29)

レポート課題提出要領

2003

11

4

日(火)一杯に、木村 までメールで送ること.

アドレスはiwao@sci.toyama-u.ac.jp

添付ファイルではなく、できるだけメ ール本文にレポート本文を記載してく ださい.

参考にした文献や友人のレポートは、

その旨明記すること.

参照

関連したドキュメント

In: Schaufeli WB, Maslach C, Marek T(Eds), Professional burnout: Recent developmentsintheoryandresearch,Taylor&Francis, Washington,DC,pp1-16,1993. 9) Maslach C, Jackson SE:

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

First, the theory characterizes the category of sets and mappings as an abstract category in the sense that any model for the axioms which satisfies the additional (non-elementary)

The purpose of this paper is analyze a phase-field model for which the solid fraction is explicitly functionally dependent of both the phase-field variable and the temperature

ドリル教材 教材数:6 問題数:90 ひきざんのけいさん・けいさんれんしゅう ひきざんをつかうもんだいなどの問題を収録..

具体音出現パターン パターン パターンからみた パターン からみた からみた音声置換 からみた 音声置換 音声置換の 音声置換 の の考察

開催数 開 催 日 相談者数(対応した専門職種・人数) 対応法人・場 所 第1回 4月24日 相談者 1 人(法律職1人、福祉職 1 人)

4/6~12 4/13~19 4/20~26 4/27~5/3 5/4~10 5/11~17 5/18~24 5/25~31 平日 昼 平日 夜. 土日 昼