Microsoft Word - no13.docx

Similar documents
Microsoft Word - no15.docx

Microsoft Word - no12.doc

Microsoft Word - no204.docx

Microsoft Word - no15.docx

Microsoft Word - no11.docx

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

Microsoft Word - no202.docx

演算増幅器

DVIOUT

Microsoft Word - no14.docx

C言語7

Microsoft Word - no205.docx

Microsoft Word - no103.docx

演習課題No12

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

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

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

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

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

Microsoft PowerPoint - prog08.ppt

Microsoft Word - no206.docx

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

DVIOUT

Prog1_15th

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

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

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

17 1. strucr Potter ( ) Harry Potter and the Philosopher s Stone 1997 English Title : Harry Potter and the Philosopher s Stone : : 1997 #include<stdio

PowerPoint Presentation

Microsoft PowerPoint - lec10.ppt

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

kiso2-09.key

プログラミング基礎

プログラミング基礎

memo

PowerPoint プレゼンテーション

Prog1_6th

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

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

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

配列, 関数, 構造体

DVIOUT

PowerPoint プレゼンテーション

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

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

Microsoft PowerPoint - 11.pptx

Microsoft Word - no02.doc

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

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

02: 変数と標準入出力

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

02: 変数と標準入出力

初歩のC言語ターミナル_2014_May.pages

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

Microsoft Word - 3new.doc

プログラミング実習I

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

kiso2-06.key

Microsoft PowerPoint - lec4.ppt

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

gengo1-10

Cプログラミング1(再) 第2回

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

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

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Prog1_10th

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

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

02: 変数と標準入出力

講習No.9

Microsoft PowerPoint - prog07.ppt

main

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

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

PowerPoint プレゼンテーション

gengo1-11

プログラミング基礎

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

CプログラミングI

演算増幅器

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

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

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

02: 変数と標準入出力

program7app.ppt

02: 変数と標準入出力

プログラミング基礎

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

PowerPoint プレゼンテーション

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

Microsoft PowerPoint - ca ppt [互換モード]

プログラミング実習I

memo

講習No.8

C言語によるアルゴリズムとデータ構造

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

Microsoft Word - Training10_プリプロセッサ.docx

PowerPoint プレゼンテーション

第1回 プログラミング演習3 センサーアプリケーション

Transcription:

4. 構造体 4.1 構造体とは たとえば 分数をそのまま扱うときを考えてみましょう 分数は分子と分母の 2 つの部分からな っていることから 2 つの変数を用いて表すことが必要です ここでは約分も行うこととします ex34.c /* 分数の計算 */ int gcd(int m, int n); int a_num, a_den; /* 分数 a */ int b_num, b_den; /* 分数 b */ int c_num, c_den; /* 分数 c */ int x; /* 分子 : numerator 分母 : denominator */ printf("2 つの分数の値を入力してください :\n"); printf("1 つめ \n"); printf(" 分子 : "); scanf("%d", &a_num); printf(" 分母 : "); scanf("%d", &a_den); printf("2 つめ \n"); printf(" 分子 : "); scanf("%d", &b_num); printf(" 分母 : "); scanf("%d", &b_den); c_num = a_num * b_num; /* 分子の計算 */ c_den = a_den * b_den; /* 分母の計算 */ x = gcd(c_num, c_den); c_num = c_num / x; c_den = c_den / x; printf("%d / %d * %d / %d = %d / %d\n", a_num, a_den, b_num, b_den, c_num, c_den); return (0); /* ユークリッドの互除法により最大公約数を求める関数 */ int gcd(int m, int n) { /* 引数は 2 つでどちらも整数 戻り値は整数 */ int r; for(r = m % n; r!= 0; r = m % n) { m = n; n = r; return (n); 分子と分母の 2 つに分けて考えなければなりません また 変数自体も 2 つのものを同時に扱わな ければならず面倒です このようにいくつかの型をあわせて一つにまとめて使う必要があるときには構造体といわれるものを使うと楽になります 25

ex35.c /* 構造体を用いた分数 */ 応用プログラミング I II 2014.12.15 /* 分数の構造体 */ struct fraction { int num; /* 分子 */ int den; /* 分母 */ ; int gcd(int m, int n); struct fraction a, b, c; /* 分数 a, b, c */ int x; printf("2 つの分数の値を入力してください :\n"); printf("1 つめ \n"); printf(" 分子 : "); scanf("%d", &a.num); printf(" 分母 : "); scanf("%d", &a.den); printf("2 つめ \n"); printf(" 分子 : "); scanf("%d", &b.num); printf(" 分母 : "); scanf("%d", &b.den); c.num = a.num * b.num; /* 分子の計算 */ c.den = a.den * b.den; /* 分母の計算 */ x = gcd(c.num, c.den); c.num = c.num / x; c.den = c.den / x; printf("%d / %d * %d / %d = %d / %d\n", a.num, a.den, b.num, b.den, c.num, c.den); return (0); /* ユークリッドの互除法により最大公約数を求める関数 */ int gcd(int m, int n) { /* 引数は 2 つでどちらも整数 戻り値は整数 */ int r; for(r = m % n; r!= 0; r = m % n) { m = n; n = r; return (n); このように構造体を使えば 複数の変数をまとめて一つとして宣言でき 使うことができます 26

構造体を宣言するときには次のようにします struct 構造体名 { 型 1 メンバ変数 1;... ( 同時に変数宣言するときにはここに変数名を書く ); その構造体を用いた変数を定義するときには次のようにします struct 構造体名変数名 ; 4.2 構造体と関数 このままでは 構造体の良さがあまり見えません 構造体は分子 分母を合わせて一つにしているのですので 関数と組み合わせれば プログラムがわかりやすくなります ex36.c /* 構造体を用いた分数 */ /* 分数の構造体 */ struct fraction { int num; /* 分子 */ int den; /* 分母 */ ; struct fraction input_fraction(void); struct fraction mul(struct fraction x, struct fraction y); void print_fraction(struct fraction x); int gcd(int m, int n); struct fraction a, b, c; /* 分数 a, b, c */ printf("2 つの分数の値を入力してください :\n"); printf("1 つめ \n"); a = input_fraction(); printf("2 つめ \n"); b = input_fraction(); c = mul(a, b); print_fraction(a); printf(" * "); print_fraction(b); printf(" = "); print_fraction(c); printf("\n"); return (0); struct fraction input_fraction(void) { struct fraction x; printf(" 分子 : "); scanf("%d", &x.num); printf(" 分母 : "); scanf("%d", &x.den); return(x); 27

struct fraction mul(struct fraction x, struct fraction y) { struct fraction z; int g; z.num = x.num * y.num; /* 分子の計算 */ z.den = x.den * y.den; /* 分母の計算 */ g = gcd(z.num, z.den); z.num = z.num / g; z.den = z.den / g; return(z); void print_fraction(struct fraction x) { printf("%d / %d", x.num, x.den); /* ユークリッドの互除法により最大公約数を求める関数 */ int gcd(int m, int n) { /* 引数は 2 つでどちらも整数 戻り値は整数 */ int r; for(r = m % n; r!= 0; r = m % n) { m = n; n = r; return (n); このように構造体を使えば c = a のような代入もできますし 関数の戻り値として使うこともで きます これによって 本来 2 つの実数であったものを 1 つのもののように扱えるというわけです 構造体はこのように複数のものを 1 つにまとめることができるのです 複素数の例では 2 変数と も int 型でしたが 違う型のものを組み合わせてもかまいません 練習問題 4.1 ex36.c を参考に 和の計算を行う関数 (add) を完成させなさい ただし きちんと約分される ようにしなさい ex37.c /* 構造体を用いた分数の和の関数 */ /* 分数の構造体 */ struct fraction { int num; /* 分子 */ int den; /* 分母 */ ; struct fraction input_fraction(void); struct fraction add( ); void print_fraction(struct fraction x); int gcd(int m, int n); 28

struct fraction a, b, c; /* 分数 a, b, c */ printf("2 つの分数の値を入力してください :\n"); printf("1 つめ \n"); a = input_fraction(); printf("2 つめ \n"); b = input_fraction(); c = add(a, b); print_fraction(a); printf(" + "); print_fraction(b); printf(" = "); print_fraction(c); printf("\n"); 応用プログラミング I II 2014.12.15 return (0); struct fraction input_fraction(void) { struct fraction x; printf(" 分子 : "); scanf("%d", &x.num); printf(" 分母 : "); scanf("%d", &x.den); return(x); struct fraction add( ) { void print_fraction(struct fraction x) { printf("%d / %d", x.num, x.den); /* ユークリッドの互除法により最大公約数を求める関数 */ int gcd(int m, int n) { /* 引数は 2 つでどちらも整数 戻り値は整数 */ int r; for(r = m % n; r!= 0; r = m % n) { m = n; n = r; return (n); 29

4.3 構造体と配列 応用プログラミング I II 2014.12.15 構造体のメンバーに配列を持たせることもできますし 構造体の配列を作ることもできます 次 の例では成績管理用の構造体を作っていますが 学籍番号は文字列なので文字型の配列になっています ex38.c /* 成績表 */ #include <stdlib.h> /* 成績管理用の構造体の定義 */ struct student { char idnumber[8]; /* 学籍番号 */ int math; /* 点数 ( 数学 ) */ int eng; /* 点数 ( 英語 ) */ int jpn; /* 点数 ( 国語 ) */ ; /* プロトタイプ宣言 */ struct student input_student(void); void print_student(struct student x); struct student data; /* 配列 */ data = input_student(); print_student(data); return(0); /* 入力用関数 */ struct student input_student(void) { struct student x; printf(" 学籍番号 : "); scanf("%7s", x.idnumber); printf(" 数学 : "); scanf("%d", &x.math); printf(" 英語 : "); scanf("%d", &x.eng); printf(" 国語 : "); scanf("%d", &x.jpn); return(x); /* 表示用関数 */ void print_student(struct student x) { printf("%10s: %3d %3d %3d\n", x.idnumber, x.math, x.eng, x.jpn); 30

さらに この構造体を利用して 複数人数を扱うことにします 複数並べるためには 構造体の配列が必要になります 配列を含んだ構造体の配列 なので複雑に見えるかもしれません 今回は 数学の得点が高い順に並び替えを行っています 構造体の配列なので メンバにアクセスするには [ ] のあとに. メンバ名 をつけることになります ex39.c /* 成績表 */ #include <stdlib.h> #define MAX 100 /* 最大人数 */ /* 成績管理用の構造体の定義 */ struct student { char idnumber[8]; /* 学籍番号 */ int math; /* 点数 ( 数学 ) */ int eng; /* 点数 ( 英語 ) */ int jpn; /* 点数 ( 国語 ) */ ; /* プロトタイプ宣言 */ void input_students(struct student x[], int len); void print_students(struct student x[], int len); struct student data[max]; /* 配列 */ int numstudent; /* 人数 */ printf(" 人数を入力してください (1-%d): ", MAX); scanf("%d", &numstudent); input_students(data, numstudent); /* データの入力 */ printf("\n\n 入力結果 :\n"); print_students(data, numstudent); /* データの出力 */ return(0); /* 入力用関数 */ void input_students(struct student x[], int len) { int i; for(i = 0; i < len; i++) { printf("%d 人目 :\n", i + 1); printf(" 学籍番号 : "); scanf("%7s", x[i].idnumber); printf(" 数学 : "); scanf("%d", &x[i].math); printf(" 英語 : "); scanf("%d", &x[i].eng); printf(" 国語 : "); scanf("%d", &x[i].jpn); 31

/* 表示用関数 */ void print_students(struct student x[], int len) { int i; for(i = 0; i < len; i++) { printf("%10s: %3d %3d %3d\n", x[i].idnumber, x[i].math, x[i].eng, x[i].jpn); 練習問題 4.2(ex40.c) ex39.c の構造体 student に 平均点 を表すメンバを追加し input_student 関数内で平 均点を計算し print_student 関数内で平均点も出力するように変更しなさい 32