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

Similar documents
演算増幅器

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

Microsoft Word - no13.docx

Microsoft Word - no12.doc

プログラミング基礎

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

プログラミング基礎

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

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

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

02: 変数と標準入出力

Microsoft PowerPoint - 12Chap16.ppt

概要 プログラミング論 構造体 構造体 複数の変数を組合わせて, ひとまとめにしたもの 簡単 重要 自己参照型, リスト 重要, 難しい S-1 S-2 新しい構造体の宣言 struct 構造体名 { データ型メ

02: 変数と標準入出力

Microsoft PowerPoint - comprog11.pptx

PowerPoint プレゼンテーション

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

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

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

memo

Microsoft Word - no202.docx

JavaプログラミングⅠ

memo

Microsoft Word - 3new.doc

演習課題No12

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

講習No.12

Microsoft Word - no204.docx

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

memo

program7app.ppt

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

02: 変数と標準入出力

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

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

第3回 配列とリスト

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog08.ppt

Microsoft Word - no11.docx

Microsoft PowerPoint - prog03.ppt

Prog1_15th

Microsoft PowerPoint - lec10.ppt

基礎プログラミング2015

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

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

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

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

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

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

Microsoft PowerPoint - kougi9.ppt

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

PowerPoint プレゼンテーション

GEC-Java

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

プログラミング基礎

Microsoft PowerPoint - 11.pptx

gengo1-11

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

C言語講座

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

Microsoft PowerPoint ppt

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

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

02: 変数と標準入出力

Microsoft PowerPoint - C4(反復for).ppt

配列, 関数, 構造体

プログラミング実習I

C-programming_kouza4(2007)

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

GEC-Java

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

gengo1-8

プログラミングI第10回

Prog1_6th

デジタル表現論・第6回

cp-7. 配列

Microsoft PowerPoint - 6.pptx

データ構造

02: 変数と標準入出力

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

JavaプログラミングⅠ

第9回 配列(array)型の変数

Microsoft PowerPoint - C1(演算と変数).ppt

アクション講座 第1回目

memo

Microsoft PowerPoint - prog04.ppt

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

スライド 1

DVIOUT

プログラミング基礎

PowerPoint Presentation

目次

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Microsoft Word - no02.doc

レコードとオブジェクト

#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

Transcription:

Outline プログラミング演習第 7 回構造体 on 2012.12.06 電気通信大学情報理工学部知能機械工学科長井隆行 今日の主眼 構造体 構造体の配列 構造体とポインタ 演習課題 2 今日の主眼 配列を使うと 複数の ( 異なる型を含む ) データを扱いたい 例えば 成績データの管理 複数のデータを扱う 配列を使う! 名前学籍番号点数 ( 英語 ) 点数 ( 数学 ) Aomori 1 59.4 84.3 名前 学籍番号 点数 ( 英語 ) 点数 ( 数学 ) Aomori 1 59.4 84.3 Itamoto 2 43.8 94.2 Kimura 3 74.3 64.5 Itamoto 2 43.8 94.2 Kimura 3 74.3 64.5 Sato 4 57.3 73.4 Sugiyama 10 62.6 55.9 Sato 4 57.3 73.4 Sugiyama 10 62.6 55.9 3 float eng[5] = 59.4, 43.8, 74.3, 57.3, 62.6 他にも math[5] code[5] name[10][5] などを用意する Sato 君は数学が何点だったかを知りたい新たにYasui 君のデータを追加したい 不便? どのようなデータ構造にすべきか? 4

構造体 構造体のテンプレートを宣言する 配列 : 同じ種類 ( 型 ) のデータを複数個まとめて扱う int hoge[10] 構造体 まとめて扱いたいデータを自分で定義し 新しいデータ型として使うことができる 構造体 : 異なる型のデータを複数個まとめて扱いたい! double score; char name[50]; 構造体のテンプレート ( 枠組み ) を宣言 struct タグ名 データ型メンバ名 ; 名前 学籍番号 テストの点数 10 科目 150 人分 構造体の出番です double eng; double math; char name[50]; 5 6 構造体を宣言する 構造体のメンバを参照する 使う段階で宣言 ( 変数の宣言と同じ ) する struct タグ名変数名の並び ; struct seiseki student; struct seiseki newstudent; 実際には構造体のメンバにアクセスしたい ( つまり 名前や点数 学籍番号を知りたい ) 構造体の各メンバは 構造体変数名. メンバ名 のようにピリオド (.) を用いて指定します この (.) を ドット演算子 と呼ぶ /* 番号 名前 点数を表示する例 */ printf("%d %s %f %f n", student.code, student.name, student.eng, student.math); 他の型の変数の時と比べてみると分かり易い int data; float score; student.eng = 85.4; /* 英語の点数を 85.4 に修正する例 */ 7 8

実際に構造体を使った例 構造体のイメージ図 double eng; double math; char name[50]; 構造体の初期化 アドレス 0x10000000 0x10000001 メモリ 20 hoge student.code 1 char int double eng; char name[4]; char hoge = 20; struct seiseki student =1,64.5, AOI struct seiseki student = 10, 62.6, 55.9, "Sugiyama" struct seiseki student2; 0x10000005 student.eng student2 = student; student2.math = 20.0; 64.5 double 構造体 struct seiseki student printf("%d %s %f %f n", student.code, student.name, student.eng, student.math); printf("%d %s %f %f n", student2.code, student2.name, student2.eng, student2.math); 9 0x1000000D A student.name[0] O student.name[1] I student.name[2] char[4] \nstudent.name[3] 10 構造体を使ったソースコードの例 まだ完璧ではない? ある人の平均点を求めて表示するプログラム /* 学籍番号 */ double Average = 0.0; struct seiseki student = 1, 59.4, 84.3, "Aomori" Average = (student.eng + student.math)/2.0; ここで宣言すると他の関数でもこの構造体を使える関数の中で宣言すると他の関数ではその構造体は使えない 各人のデータはまとめて扱えるようになりましたが 名前 学籍番号 点数 ( 英語 ) 点数 ( 数学 ) Aomori 1 59.4 84.3 Itamoto 2 43.8 94.2 Kimura 3 74.3 64.5 Sato 4 57.3 73.4 Sugiyama 10 62.6 55.9 printf("average:%f n", Average); p7-1.c まとめた各人のデータをさらにまとめて扱いたい!! 11 12

構造体の配列 構造体の配列を使い複数のデータをまとめて扱う基本的な考え方は 一般的な変数 ( 型 ) の配列と同じ 構造体の配列を宣言する 使う段階で配列を宣言 ( 一般の配列宣言と同じ ) する Aomori Itamoto Kimura Sato Sugiyama 1 2 3 4 10 59.4 43.8 74.3 57.3 62.6 84.3 94.2 64.5 73.4 55.9 struct タグ名変数名 [ 配列の数 ]; struct seiseki ClassA[50]; struct seiseki ClassB[100]; 0 番 1 番 2 番 3 番 4 番 一つのデータとして扱える入れ物 全体でひとつのデータとして扱える そこから 個々のデータが取り出せる 13 他の型の変数の時と比べてみると分かり易い int data[50]; float score[100]; 14 構造体配列を初期化する 宣言時に値を代入 ( 初期化 ) することができる 基本は配列と同じ struct seiseki classa[5] = 1, 59.4, 84.3, "Aomori", 2, 43.8, 94.2, "Itamoto", 3, 74.3, 64.5, "Kimura", 4, 57.3, 73.4, "Satou", 10, 62.6, 55.9, "Sugiyama" 15 構造体配列に値を代入する 構造体ごとにまとめてデータを扱う struct seiseki student = 10, 62.6, 55.9, "Sugiyama" struct seiseki student2; struct seiseki classa[5] = 1, 59.4, 84.3, "Aomori ", 2, 43.8, 94.2, "Itamoto", 3, 74.3, 64.5, "Kimura", 4, 57.3, 73.4, "Satou" 同じ種類の構造体変数に直接代入 student2=student; classa[4]=student2; student=classa[0]; 配列の場合は添え字が使える 添え字を使ってデータを取り出せる 16

構造体配列のメンバを参照する 実際には構造体のメンバにアクセスしたい ( つまり 名前や点数 学籍番号を知りたい ) 構造体の各メンバは 構造体変数名. メンバ名 のようにピリオド (.) を用いて指定します この (.) を ドット演算子 と呼ぶ配列にした場合も基本的には同じ /* 各人の番号 名前 点数を表示する例 */ printf("%d %s %f %f n", student.code, student.name, student.eng, student.math); for(i = 0; i < 5; i++) printf("%d %s %f %f n", classa[i].code, classa[i].name, classa[i].eng, classa[i].math); classa[4].eng = 85.4; /* 英語の点数を 85.4 に修正する例 */ 17 練習問題 各科目の平均点を求めて表示するプログラムを完成しよう double AverageEng = 0.0; double AverageMath = 0.0; struct seiseki classa[5] = 1, 59.4, 84.3, "Aomori", 2, 43.8, 94.2, "Itamoto", 3, 74.3, 64.5, "Kimura", 4, 57.3, 73.4, "Satou", 10, 62.6, 55.9, "Sugiyama" for(i=0; i<5; i++) AverageEng=AverageEng/5; /* 和を総数で割る */ AverageMath=AverageMath/5; /* 和を総数で割る */ /* 学籍番号 */ 18 解答例 構造体のポインタ double AverageEng = 0.0; double AverageMath = 0.0; struct seiseki classa[5] = 1, 59.4, 84.3, "Aomori", 2, 43.8, 94.2, "Itamoto", 3, 74.3, 64.5, "Kimura", 4, 57.3, 73.4, "Satou", 10, 62.6, 55.9, "Sugiyama" for(i=0; i<5; i++) AverageEng += classa[i].eng; AverageMath += classa[i].math; AverageEng=AverageEng/5; /* 和を総数で割る */ AverageMath=AverageMath/5; /* 和を総数で割る */ /* 学籍番号 */ 構造体のポインタも使えます例 struct seiseki *p_student; struct seiseki student; p_student = &student; ポインタを使った場合のメンバーの参照の仕方に注意 " -> " を使う ( アロー演算子と呼ばれる ) (*p_student).code p_student->code (*p_student).name (*p_student).score シンタックスシュガー p_student->name p_student->score p7-2.c 19 20

構造体配列とポインタの関係 構造体配列とポインタの関係続き 構造体のポインタが使えると言うことは struct seiseki classa[5]; /* 構造体配列 */ のとき classa が &classa[0] を意味する ( シンタックスシュガー ) classa[0] と *classa は同じものを表す!! なので メンバを参照するやり方は 3 つ考えられる classa[0].eng と (*classa).eng と classa->eng さらに ポインタの演算も使えるので struct seiseki classa[5]; /* 構造体配列 */ のとき classa[0].eng と (*classa).eng と classa->eng が同じ classa[1].eng と (*(classa+1)).eng と (classa+1)->eng が同じ classa[4].eng と (*(classa+4)).eng と (classa+4)->eng が同じ 21 これかこれを使う 22 本日の演習 ー準備ー まずは p7-4.cをダウンロードする コンパイル 実行して正しく動作することを確認する ー課題ー ( ここから先をメールで送る ) p7-4.cの平均点の計算部分を関数にしましょう 引数に構造体のポインタを使う 計算結果が2つでてくる ( 英語と数学 ) ので 関数を呼び出す側で結果を入れる変数をアドレス渡しする ソースコードと実行結果をメールで送る 送る際には注意事項をよく確認すること http://apple.ee.uec.ac.jp/comprog 諸注意 今日の講義の感想 質問をメール本文に書いてください よく分かった ここが分からない など double AverageEng = 0.0; double AverageMath = 0.0; もととなるソースコード struct seiseki classa[5] = 1, 59.4, 84.3, "Aomori", 2, 43.8, 94.2, "Itamoto", 3, 74.3, 64.5, "Kimura", 4, 57.3, 73.4, "Satou", 10, 62.6, 55.9, "Sugiyama" for(i=0; i<5; i++) AverageEng += classa[i].eng; AverageMath += classa[i].math; AverageEng=AverageEng/5; /* 和を総数で割る */ AverageMath=AverageMath/5; /* 和を総数で割る */ /* 学籍番号 */ p7-2.c 23 24

/* 学籍番号 */ /* 平均計算関数のプロトタイプ宣言 */ void CalcAverage(struct seiseki* classa, double* Average1, double* Average2); double AverageEng = 0.0; /* 英語の平均値 */ double AverageMath = 0.0; /* 数学の平均値 */ struct seiseki classa[5] = 1, 59.4, 84.3, "Aomori", 2, 43.8, 94.2, "Itamoto", 3, 74.3, 64.5, "Kimura", 4, 57.3, 73.4, "Satou", 10, 62.6, 55.9, "Sugiyama" ヒント void CalcAverage(struct seiseki* classa, double* Average1, double* Average2) C 言語の総まとめ まるばつゲームを作る! おまけ まずはアルゴリズムが必要 ゲーム全体の流れ COMがどのように手を決めるのか? とりあえず作ってみた Comを強くするには? /* 平均の計算 ( 関数に情報を渡している )*/ CalcAverage( ); /* 結果をアドレス渡しにしていることに注意 */ 25 marubatsu.c 26