(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

Similar documents
7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft PowerPoint - handout07.ppt [互換モード]

演算増幅器

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

02: 変数と標準入出力

Microsoft PowerPoint - 13.ppt [互換モード]

02: 変数と標準入出力

プログラミング基礎

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Prog1_15th

講習No.12

Microsoft PowerPoint - 12.ppt [互換モード]

プログラミング基礎

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

プログラミング基礎

基礎プログラミング2015

プログラミングI第10回

JavaプログラミングⅠ

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

Microsoft Word - no12.doc

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft PowerPoint - 13th.ppt [互換モード]

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

memo

memo

Microsoft PowerPoint - 11.pptx

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft PowerPoint - lec10.ppt

演習課題No12

PowerPoint Presentation

Microsoft PowerPoint - 12Chap16.ppt

Microsoft Word - 3new.doc

プログラミング実習I

Microsoft PowerPoint - 09.pptx

プログラミング実習I

DVIOUT

Microsoft Word - no15.docx

Microsoft PowerPoint - kougi9.ppt

配列, 関数, 構造体

Microsoft PowerPoint - chap10_OOP.ppt

memo

Microsoft PowerPoint - 計算機言語 第7回.ppt

02: 変数と標準入出力

gengo1-11

Taro-リストⅠ(公開版).jtd

02: 変数と標準入出力

02: 変数と標準入出力

C言語講座

PowerPoint プレゼンテーション

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

PowerPoint プレゼンテーション

02: 変数と標準入出力

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

目次

PowerPoint プレゼンテーション

Taro-ポインタ変数Ⅰ(公開版).j

02: 変数と標準入出力

PowerPoint Presentation

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft Word - no202.docx

Prog1_10th

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

プログラミング基礎I(再)

Microsoft Word - Cプログラミング演習(7)

cp-7. 配列

PowerPoint プレゼンテーション

02: 変数と標準入出力

02: 変数と標準入出力

ファイル入出力

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint Presentation

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

02: 変数と標準入出力

第3回 配列とリスト

Microsoft PowerPoint - 6.pptx

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

Microsoft PowerPoint - kougi8.ppt

ファイル入出力

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft Word - no13.docx

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

02: 変数と標準入出力

memo

PowerPoint Template

program7app.ppt

ポインタ変数

Prog1_12th

情報処理演習 B8クラス

Microsoft Word - Cプログラミング演習(11)

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

Microsoft PowerPoint - prog04.ppt

Microsoft Word - no204.docx

講習No.1

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint プレゼンテーション

Transcription:

8 構造体と供用体 ( 教科書 P.71) 構造体は様々なデータ型,int 型,float 型や char 型などが混在したデータを一つのまとまり, 単位として扱える.( 配列は一つのデータ型しか扱えない.) 構造体は柔軟なデータ構造を扱えるので, プログラムを効率よく開発できる. つまり構造体を使用すると, コード量を抑え, バグを少なくし, 開発時間を短くし, 簡潔なプログラムが作れる. 共用体は, 構造体と同様の機能をもつが, 変数の記憶領域の制限がある. 8.1 構造体 ( 構造体と配列の違い ) 個人データとして学生番号, 身長, 体重, 名前の 4 種類のデータを扱うことを考える. それらを配列で扱う場合,4 種類の配列を管理することになる ( 図 1, 左 ). 一方, それらを構造体で扱う場合, 1 種類の構造体,STUDENT のみを管理することになる ( 図 1, 右 ). 後者はデータを一つの単位,STUDENT で扱えるので, プログラムを簡潔に表現できる. int id; double height; double weight; char name[12]; struct STUDENT{ int id; double height; double weight; char name[12]; 図 1 配列はデータ構造を複雑にする ( 左 ). 構造体はデータ構造を簡単にする ( 右 ). STUDENT はタグ名と呼ばれ, 一種のデータ型である.{ の中の変数はメンバ変数と 呼ばれる. 構造体は,(1) 型の定義をし,(2) 変数の宣言をし,(3) 初期値を設定して使用する. 8.1.1 構造体の定義 (1) 構造体の型定義 文法は次のとおり. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... /* 最後にセミコロン ; を忘れない */

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; double height; double weight; char name[12]; 8.1.2 メモリ配置と初期化 データを構造体変数にセットする方法は二つある. 文法は次のとおり. 構造体変数の初期化 ( その 1) struct 構造体タグ名 構造体変数名 = { 値 1, 値 2, 例 : struct STUDENT stdata = { 2018, 175.5, 57.0, John 構造体変数の初期化 ( その 2) struct 構造体タグ名 { メンバ名 1;... メンバ名 n; 構造体変数名 ={ 初期値 1, 初期値 2,... 例 : struct STUDENT{ int id; /*id=2018 となる */ double height; /*height=175.5 となる */ double weight; /*weight=57.0 となる */ char name[12]; /*name[]=jhon となる */ stdata = { 2018, 175.5, 57.0, "Jhon"

データはメモリ上に次のように保存される. id 2018 4 バイト,int 型 低番地 height 175.5 8 バイト,double 型 weight 57.0 8 バイト,double 型 name[12] Jhon 12 バイト,char 型配列 高番地 図 2 メモリ上に展開されるデータ. 8.1.3 各メンバへのアクセス ( メンバ変数のアクセスの仕方 ) データを構造体のメンバ変数に代入するときは次の表現を使う. 構造体変数名. メンバ変数名 = データ 例 : stdata.height = 175.5; /* 175.5 を stdata のメンバ変数 height へ代入 */ また構造体のメンバ変数からデータを取り出すときは次の表現を使う. 変数 = 構造体変数名. メンバ変数名 例 : h = stdata.height; /* stdata のメンバ変数 height の値を h へ代入 */

ここで例題を示す. このプログラムはまず構造体,STUDENT の型を定義する. 次にそ れぞれの構造体変数,stdata0,stdata1,stdata2 にデータをセットする. 次にそれらのデー タを画面に表示する. プログラム 8-1 #include<stdio.h> void main(void) { struct STUDENT{ /* 構造体 STUDENT の型を定義する */ int id; /* 学生番号 */ double height; /* 身長 */ double weight; /* 体重 */ char name[12]; /* 名前 */ struct STUDENT stdata0 = {2018, 175.5, 57.0, "Jhon", /* 構造体変数を定義し,*/ stdata1 = {2032, 155.5, 47.5, "Julia", /* 同時にメンバ変数 */ stdata2 = {2037, 160.0, 70.0, "Mike" /* へ値を代入する */ stdata0.id, stdata0.height, stdata0.weight, stdata0.name); stdata1.id, stdata1.height, stdata1.weight, stdata1.name); stdata2.id, stdata2.height, stdata2.weight, stdata2.name); コンパイル, リンクと実行の手順は次のとおり. >gcc o p8_1 p8_1.c[enter] >./ p8_1 [Enter] 8.1.4 構造体の配列 構造体を配列として扱うことができる. 文法は次のとおり. struct 構造体タグ名配列名 [ 要素の個数 ]; 例 :STUDENT 型の構造体配列変数 stlist[] の宣言. struct STUDENT stlist[3];

8.1.5 構造体の入れ子 ( 構造体の中の構造体 )( 略 ) 構造体の中に構造体を含めることができる. 下のリストでは, 構造体,STUDENTの中で構造体変数 birthdayを宣言している. もし扱うデータの項目が増えたとしても, この様にいつでもデータ構造を柔軟に変更できる. struct DATE{ /* 生年月日を扱うための構造体の型の定義 */ int year; /* 年 */ int month; /* 月 */ int day; /* 日 */ struct STUDENT{ /* 学生の情報を扱うための構造体の型の定義 */ int id; /* 学生番号 */ struct DATE birthday; /* 構造体 DATEの構造体変数の宣言 */ 8.1.6 略 8.1.7 構造体とポインタ 構造体もポインタによるデータの操作ができる. 文法は次のとおり. struct 構造体タグ名 * 構造体ポインタ変数 ; 構造体ポインタ変数 = & 構造体変数 ; 例 : struct STUDENT * stptr; /* 構造体ポインタ変数 stprt を宣言する */ stptr = &stdata; /* stprt に構造体変数のアドレスを与える */ 構造体のメンバ変数にアクセスするときには次の表現を使う. 例 : stptr->id = 2018; /* 2018 を構造体 stptr のメンバ変数 id にセットする */ 例 : myid = stptr->id; /* 構造体 stptr のメンバ変数 id の値を変数 myid にセットする */ 注意 : 構造体の各メンバ変数にアクセスするとき, ピリオド,. を使用した. しか しポインタを介して各メンバ変数にアクセスするときは記号,-> を使用す る.(-> はハイフン >)

また構造体を引数として関数に渡すことができる. 次のプログラムはまず構造体, STUDENT の型を定義する. 次にメンバ変数 (id,height,weight, name) にデータをセットする. 関数,print_data で現在のメンバ変数のデータを画面に表示する. 次に関数,up_data で,height と weight をキーボードから入力したデータで書き換える. 最後に最新のデータを画面に表示する. プログラム 8-4 #include<stdio.h> struct STUDENT{ /* 構造体 STUDENT の宣言 */ int id; /* 学生番号 */ double height; /* 身長 */ double weight; /* 体重 */ char name[12]; /* 名前 */ void print_data(struct STUDENT data); /* 関数のプロトタイプ宣言 */ void up_data(struct STUDENT *ptr); /* 関数のプロトタイプ宣言 */ void main(void) { struct STUDENT stdata = {2018, 175.5, 57.0, "John"/* 構造体の宣言と初期値のセット */ print_data(stdata); /* 構造体 stdata を引数として, 関数を呼び出す */ up_data(&stdata); /* 構造体 stdata のアドレスを引数として, 関数を呼び出す */ print_data(stdata); /* 構造体 stdata を引数として, 関数を呼び出す */ void print_data(struct STUDENT data) /* 構造体 stdata を構造体 data で受けとる */ { /* 構造体のメンバ変数へのアクセスはドット (.) を使う */ data.id, data.height, data.weight, data.name); void up_data(struct STUDENT *ptr) /* 構造体 stdata のアドレスをポインタ変数 ptr で受けとる */ { double h, w; printf("height, Weight? n"); /* 画面に入力を促すメッセージを表示する */ scanf("%lf, %lf", &h, &w); /* キーボードからデータを入力する */ ptr->height = h; /* メンバ変数へのアクセスは-> を使用する */ ptr->weight = w; /* 入力例 : 170.3, 63.0[Enter] */

8.2 供用体 供用体の文法は構造体のそれと同様である. ただし struct の代わりに union を使用す る. struct UNI_DATA{ union UNI_DATA{ char c_data; char c_data; int d_data; int d_data; double f_data; double f_data; udata; udata; 構造体はメンバ変数の領域が独立してメモリに確保されるが, 供用体はメンバ変数の領 じゅうふく域が重複してメモリに確保される. 構造体と供用体について, メンバ変数のメモリ上での 配置の違いを次に示す. 低番地 構造体 共用体 char c_data int d_data char c_data int d_data 矢印の出発点は 3 つとも同じ double f_data double f_data 高番地 供用体のそれぞれのメンバ変数はメモリを供用している. つまり供用体では 1 つのメン バ変数の値のみ保持される. 供用体はメモリ容量が制限される環境において, 構造体に近 いデータ構造を使用したいときに使われる ( 例えばマイクロコントローラの開発環境 ).