基礎プログラミング2015

Similar documents
02: 変数と標準入出力

02: 変数と標準入出力

基礎プログラミング2015

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

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

基礎プログラミング2015

JavaプログラミングⅠ

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

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

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

Microsoft Word - no12.doc

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

プログラミング基礎

プログラミング基礎

Microsoft PowerPoint - lec10.ppt

プログラミング基礎

PowerPoint プレゼンテーション

memo

演算増幅器

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

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

program7app.ppt

PowerPoint プレゼンテーション

デジタル表現論・第6回

gengo1-11

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

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

プログラミング実習I

Microsoft PowerPoint - 09.pptx

memo

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - prog08.ppt

基礎プログラミング2015

memo

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

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

Microsoft Word - 3new.doc

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

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

メソッドのまとめ

memo

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

Prog1_6th

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

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

Microsoft Word - no15.docx

PowerPoint プレゼンテーション

情報処理Ⅰ演習

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

Microsoft PowerPoint - chap10_OOP.ppt

Prog1_10th

3.1 stdio.h iostream List.2 using namespace std C printf ( ) %d %f %s %d C++ cout cout List.2 Hello World! cout << float a = 1.2f; int b = 3; cout <<

新版 明解C++入門編

CプログラミングI

プログラミングI第10回

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

Microsoft PowerPoint - ep_cpp04.ppt

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

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

Microsoft PowerPoint ppt

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

JavaプログラミングⅠ

Microsoft PowerPoint pptx

02: 変数と標準入出力

解きながら学ぶC++入門編

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

02: 変数と標準入出力

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

ソフトゼミC 第二回 C++の基礎

Microsoft Word - no204.docx

プログラミング入門1

PowerPoint プレゼンテーション

Microsoft Word - no13.docx

02: 変数と標準入出力

PowerPoint プレゼンテーション

02: 変数と標準入出力

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

Microsoft PowerPoint pptx[読み取り専用]

Microsoft PowerPoint - C++_第1回.pptx

02: 変数と標準入出力

講習No.10

デジタル表現論・第4回

kiso2-09.key

02: 変数と標準入出力

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

演習課題No12

JavaプログラミングⅠ

PowerPoint プレゼンテーション - 物理学情報処理演習

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

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

PowerPoint プレゼンテーション

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - 11.pptx

ファイル入出力

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Prog1_15th

C言語7

Taro-再帰関数Ⅲ(公開版).jtd

Microsoft PowerPoint - prog07.ppt

Transcription:

応用プログラミング 第 10 回 構造体 2017 年 11 月 22 日 ( 水 )

第 11 章 構造体

構造体 * 国民の個人情報を管理したい例 : マイナンバー (id), 名前 (na), 年齢 (ag) * 管理する方法は? 配列を用いる方法 ただし, 年齢などでソートするとき面倒 id[0] id[1] id[2] id[3] id[4] na[0] na[1] na[2] na[3] na[4] ag[0] ag[1] ag[2] ag[3] ag[4] ここも合わせてソート ここも合わせてソート ここをソートしたら

構造体 * 国民の個人情報を管理したい例 : マイナンバー (id), 名前 (name), 年齢 (age) * 構造体を用いて新しい型を作成する マイナンバー 名前 年齢の情報をもつ新しい Nation 型を作成 構造体は複数の情報を一つの型として扱える Nation 型 id name age Nation 型の配列 Na Na[0] Na[1] Na[2] Na[3] Na[4] id: 12345 name: Sasaki age: 30

struct Nation{ int id; string name; int age; ; 構造体の定義 (P.100) * 構造体を作る方法 struct によって定義する using namespace std; の直後 ( 関数の前 ) に定義するのが一般的 struct Nation{ int id; string name; int age; x, y; // Nation 型の変数 x, y struct 型の名前 { 必要なデータ型の宣言 自作する型の名前は先頭を大文字にするのが良い ( 通常の変数型と区別するため ) { の後ろのセミコロン ; を忘れないこと! ( ; の前に変数を書くと, 同時に宣言もできる仕様なので何も宣言しない場合でも ; が必要. 空文のような扱い.)

構造体の基本 (P.101) * 定義した構造体を使用する方法 Nation x; x.id = 12345; x.name = Sasaki ; x.age = 30; id: 12345 name: Sasaki age: 30 構造体の変数宣言 : 構造体の名前 + 変数名 構造体の各要素にアクセス : 変数名 +.( ドット ) + 要素名 * あとは基本的に普通のデータ型と同様に扱える

構造体の基本 (P.101) Staff{ string name; int age; ; // 実行結果 John 33 John 33 int main(){ Staff x; x.name = John ; x.age = 33; cout << x.name << << x.age << endl; Staff y = x; cout << y.name << << y.age << endl; return 0;

構造体の基本 (P.101) // Staff 構造体の定義は先ほどと同じ int main(){ Staff list[3]; list[0].name = Tom ; list[0].age = 29; list[1].name = Bob ; list[1].age = 31; cin >> list[2].name >> list[2].age; for(int i = 0; i < 3; i++){ cout << list[i].name << << list[i].age << endl; return 0; // 実行結果 Alice 25 Tom 29 Bob 31 Alice 25

構造体変数の初期化 (P.102) * 配列のようにして初期化する 構造体の各要素 ( メンバ ) の型に注意して初期化値を決める Staff x; x.name = Sasaki ; x.age = 30; Staff x = { Sasaki, 30; Staff の要素は string 型, int 型の順 * 構造体の配列の初期化は 2 次元配列のときに似ている Staff member[2] = {{ Sasaki, 30, { Tom, 29;

構造体変数の初期化 (P.102) // Staff 構造体の定義は同じ int main(){ Staff x = { Bob, 31; Staff y = x; // xが持つ値を初期化値に指定 Staff list[3] = {x, y, { Sasaki, 30; for(int i = 0; i < 3; i++){ cout << list[i].name << << list[i].age << endl; return 0; // 実行結果 Bob 31 Bob 31 Sasaki 30 Staff 型の 1 次元配列を宣言 初期化

構造体 配列を要素にもつ構造体 (P.103) * 構造体は任意の型の要素を持てる ( 例 : 配列, 別の構造体, etc.) 異なる構造体の中では同じ変数名を使ってよい ( 関数と同じ ) struct Point{ string name; // 点の名前 int x, y; // x, y 座標 ; // 定義 0 y ΔABC C:(1,1) A:(2,3) B:(4,2) x struct Triangle1{ string name; // 三角形の名前 Point a, b, c; // 三角形の頂点 ; // 定義 1 struct Triangle2{ string name; // 三角形の名前 Point abc[3]; // 三角形の頂点 ; // 定義 2

// 定義 0 // 定義 1 構造体 配列を要素にもつ構造体 (P.103) // 実行結果 T1:{A(2, 3), B(4, 2), C(1, 1) int main(){ Triangle1 t = { T1, { A, 2, 3, { B, 4, 2, { C, 1, 1; cout << t.name << :{ << t.a.name << ( << t.a.x <<, << t.a.y << ) <<, << t.b.name << ( << t.b.x <<, << t.b.y << ) <<, << t.c.name << ( << t.c.x <<, << t.c.y << ) << endl; return 0; t.name : Triangle1 型変数 t の name( 名前 ) にアクセス t.a.name : t がもつ Point 型変数 a の name( 名前 ) にアクセス t.a.x : t がもつ Point 型変数 a の x(x 座標 ) にアクセス t.a.y : t がもつ Point 型変数 a の y(y 座標 ) にアクセス

// 定義 0 // 定義 2 構造体 配列を要素にもつ構造体 (P.103) // 実行結果 T1:{A(2, 3), B(4, 2), C(1, 1) int main(){ Triangle2 t = { T1, {{ A, 2, 3, { B, 4, 2, { C, 1, 1; cout << t.name << :{ ; for(int i = 0; i < 3; i++){ cout << t.abc[i].name << ( << t.abc[i].x <<, << t.abc[i].y << ) ; if(i!= 2) cout <<, ; cout << << endl; return 0; t.abc[i].name : t がもつ Point 型配列 abc の i 番目の name( 名前 ) t.abc[i].x : t がもつ Point 型配列 abc の i 番目の x(x 座標 ) t.abc[i].y : t がもつ Point 型配列 abc の i 番目の y(y 座標 )

構造体の関数での利用 (P.104) * 構造体は一つの変数型として扱える 関数の仮引数や戻り値としても指定できる 他の変数同様, 関数内で値を変更しても main 関数方には影響なし // 構造体 Point の定義 Struct Point{ string name; int x, y; ; 構造体を用いることにより, return 文で一度に複数の情報を送ることができる 関数内で変更しても main 関数 ( 呼び出し元 ) の変数には影響しない // 返却値が Point 型の関数 input Point input ( ){ Point p = { noname, 0, 0; cin >> p.name <<, << p.x <<, << p.y << endl; return p; //Point 型の仮引数をもつ output 関数 void output(point k){ cout << k.name <<, << k.x <<, << k.y << endl; k.name = done ;

Struct Point{ string name; int x, y; ; 構造体の関数での利用 (P.104) Point input ( ){ Point p = { noname, 0, 0; cin >> p.name <<, << p.x <<, << p.y << endl; return p; void output(point k){ cout << k.name <<, << k.x <<, << k.y << endl; k.name = done ; // 左からの続き int main(){ Point a = input(); output(a); cout << a.name << endl; const int N = 2; Point b[n]; for(int i = 0; i < N; i++){ b[i] = input(); output(b[i]); return 0; // 実行例 A 1 2 A, 1, 2 A B 3 0 B, 3, 0 // 以下略

構造体のリファレンス引数 (P.105) * 構造体をリファレンス引数で関数に渡すことが可能 * 構造体のリファレンス引数に対しては, 2 通りの使われ方がある : ( 左 ) 関数内での値の更新を呼び出し元の関数にも反映させるとき ( 右 ) サイズが大きい構造体を引数として取るとき void update(point& p){ p.x += 2; p.y += 3; void print(const Point& p){ cout << p.name <<, << p.x <<, << p.y << endl; 右の場合は, 値の変更を目的としていないので, 習慣的に const 宣言を行う ( 値の変更をさせないようにする )

構造体のリファレンス引数 (P.105) struct Point{ string name; int x, y; ; int main(){ Point a = { X, 1, 2; update(a); print(a); void update(point& p){ p.x += 2; p.y += 3; void print(const Point& p){ cout << p.name <<, << p.x <<, << p.y << endl; const int N = 2; Point b[n] = {{ A, 3, 4, { B, 5, 6; for(int i = 0; i < N; i++){ update(b[i]); return 0; // 実行結果 X, 3, 5 A, 3, 4 B, 5, 6

構造体のポインタ引数 (P.106) * 構造体をポインタ引数で関数に渡すことが可能 * ポインタとして構造体の要素にアクセスする方法が 2 通りある : ( 左 ) 間接演算子 * を用いる方法 ( 右 ) アロー演算子 -> を用いる方法 void update(point *p){ if(p!= 0){ (*p).x += 2; (*p).y += 3; 同値 void update(point *p){ if(p!= 0){ p -> x += 2; p -> y += 3; もしポインタ p が何も指し示していなければ, プログラムが異常を起こすので, p が NULL ポインタかどうかを確認 (p!= 0)

構造体のポインタ引数 (P.106) struct Point{ string name; int x, y; ; void update(point *p){ if(p!= 0){ p -> x += 2; // (*p).x += 2; p -> y += 3; // (*p).y += 3; int main(){ Point a = { X, 1, 2; update(&a); print(&a); const int N = 2; Point b[n] = {{ A, 3, 4, { B, 5, 6; for(int i = 0; i < N; i++){ print(&b[i]); void print(const Point *p){ if(p!= 0){ cout << p -> name <<, << p -> x <<, << p -> y << endl; return 0; // 実行結果 X, 3, 5 A, 3, 4 B, 5, 6

配列の情報をまとめる構造体 (P.107) * 配列と配列の要素数を一つの構造体にする 配列内の要素を出力 配列のどこまで値が入っているかが重要 構造体にして, 配列とその要素数をひとまとめにする const int N = 10; // 大域変数 struct MyArray{ int size; double d[n]; ; ( 例 ) MyArray k = {3, {1.1, 2.2, 3.3; k.size に要素数 3 が格納されているので, 関数には k を渡すだけで良い.

配列の情報をまとめる構造体 (P.107) const int N = 10; // 大域変数 Struct MyArray{ int size; double d[n]; ; void print(const MyArray& a){ for(int i = 0; i < a.size; i++) cout << a.d[i] << ; cout << endl; void add(myarray& a, double d){ if(a.size < N){ a.d[a.size] = d; a.size++; int main(){ MyArray x = {5, {1.2, 2.3, 3.4, 4.5, 5.6; print(x); for(double i = 1.0; i < 10.0; i++) add(x, i); print(x); return 0; // 実行結果 1.2 2.3 3.4 4.5 5.6 1.2 2.3 3.4 4.5 5.6 1.0 2.0 3.0 4.0 5.0

練習問題 問題. 人名と好きな果物 ( 高々 3 つ ) を格納する配列の組を保存するための Pfruit 構造体を宣言し, ある果物を入力すると, その果物が好きな人物の名前を列挙するプログラムを作成せよ. ただし, 入力した果物が好きな人がいない場合は, Not exist と出力せよ. // 3 人の名前と好きな果物リスト Alice : banana, apple, orange Bob : apple, strawberry Tom : apple, orange // 実行例 1 Input a fruit: orange Alice, Tom // 実行例 2 Input a fruit: apple Alice, Bob, Tom // 実行例 3 Input a fruit: pineapple Not exist.