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

プログラミング演習

N/A
N/A
Protected

Academic year: 2021

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

Copied!
15
0
0

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

全文

(1)

プログラミング演習 II

2003 12 10 日(第 7 回)

木村巌

(2)

今日やること

構造体、構造体のポインタ、 typedef

(3)

復習

前回は、正負の整数の加減算を実装し

(4)

構造体( structure )

教科書 11

異なる型を一つに集約する

配列は、同じ型の値のみ保持できるの だった

(5)

構造体の宣言

struct tag {

型名 メンバ 1;

型名 メンバ 2;

…….

};

(6)

構造体の例

struct mpi {

int dim;

long *digits;

};

struct mpi a;

(7)

構造体のメンバへのアクセス

struct mpi a; /*  の時は */

a.dim;

a.digits;

によって、構造体 a の各メンバーにアク セスできる

a.dim = 4;

a.digits = {0, 1, 2, 3};

/* a の各メンバーを設定  */

(8)

構造体へのポインタ

任意の型 T に対して、 T へのポインタ型がある のだった

構造体についても、構造体へのポインタが存在 する.たとえば、

struct mpi { long dim;

long *digits;

} *a;

/* a mpi というタグ名の構造体へのポインタ */

(9)

構造体の動的な生成

構造体をプログラムに静的に書き込ん でおくのではなく、プログラムの実行 中に生成することができる

malloc() で必要なサイズのメモリを確保

して、目的とする構造体のポインタへ キャストする.

(10)

構造体の動的な生成(例)

mpi へのポインタ a は、前のスライドの ように宣言されているとする.

a = (struct mpi*) malloc (sizeof (struct mp i))); /* 構造体 mpi が収まるサイズのメモ リを確保 */

malloc() のエラーチェックは省いてい

る)

構造体のメンバの設定などについては、

(11)

型宣言、構造体へのポインタ

教科書 11.2, 11.3

プログラム例 mpistruct.c

(12)

型の定義( typedef )

C言語の型システムに、新たに型を追 加することができる

typedef の使い方:

typedef 既存の型 新しい型 ;

typedef long *long_ptr;

long へのポインタを、 long_ptr という

(13)

構造体のポインタを新たな型と する

上のように定義した構造体 mpi を指すポイ ンタを、新たな型として定義する:

typedef struct mpi *mpi_t;

これで、 long, double のような組込型同様

に、 mpi_t も使うことができる.

(ただし、 mpi_t 型の変数は、使う前にメ モリを確保し、各メンバーを初期化する必 要がある.関数 mpi_init() 参照)

(14)

レポート課題

前回 3 分割した、

main.c main() 関数のみを含む)

mpilib.h (プロトタイプ宣言や define 含む)

mpilib.c (実際の関数定義などを含む)

を、従来の long * による mpi ではなく

、今日説明した mpi_t に変更すること コンパイルして、実行した様子も示せ

(15)

レポート課題提出要領

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

アドレスは[email protected]

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

文献や友人のレポートを参考にした場合 は、それを明記のこと.

参照

関連したドキュメント

授業科目名 (英文名) プログラミング演習 (Introduction to C Language) 科目区分 対象学生 ※ 単位数 2.00 開講年次・ 学期 2年次・前期 担当教員

割合 60% 40% 履修上の留意点・ルール レポート

割合 60% 40% 履修上の留意点・ルール レポート

プログラム解説 int main(void){ printf(“hello, world!¥n”); return 0; } メイン関数がここから{

★教科書 p.39 図 3.2 および 3.3 参照. scanf

結果的に、明示的に記憶クラス指定子を使う場面は static 記憶クラス指定子を局所変数につける場 合(これを static

つまり絶対値を求める関数のひとつ abs( ) は引数、戻り値ともに整数型です。このため、実数の絶 対値を求めることはできません。実数向けには float 型に対応する fabsf( )

 与えられた 与えられた long long が素数なら が素数なら 1, 1, そうでないなら そうでないなら 0 0 を返す関数 を返す関数 int isprime (long p) int