前回の関数のまとめ (1) プログラムは main() 関数の先頭から実行される 関数は main() 関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数 ( 変数 ) に コピーされる 関数内で求めた値は return 文によって関数値として呼び出し側に戻され.

Slides:



Advertisements
Similar presentations
プログラミング入門2 芝浦工業大学情報工学科青木 義満 第11回構造体. プログラミング入門2 2 構造体 5 人分のサッカー選手データ 全てのデータを関数に渡して,処理する場合 char name[5][256]; int assist[5]; int score[5]; void func( char.
Advertisements

プログラミング 関数編 情報科学科. プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる.
構造体変数 1234 x xyz A 普通の変数 ( ここでは座標値 ) 構造体変数 ( ここでは点を表す ) xyz B 14 y 5 z 点 A の x 座標 プログラム中では A.x 点 B の y 座標 プログラム中では B.y 例えば 「 3 次元空間で2点 A と B の 間に線分を引き・・・」
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
次ページに関数の解答例 課題12-1 (問題と解答) 複素数xとして, 実部を入力してください.10 虚部を入力してください.20
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
A B x y z 復習 構造体変数 普通の変数 x y z 構造体変数 x y z 箱のイメージ 引き出しのイメージ
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
第12回新しい型と構造体.
第13回構造体.
第12回構造体.
プログラミング入門2 ポインタについて補足 構造体 第11回 芝浦工業大学情報工学科 青木 義満、篠埜 功
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 プログラミング入門2 芝浦工業大学情報工学科 青木 義満
構造体 構造体, 構造体とポインタの組み合わせ,.
プログラミング 3 構造体(1).
第10回 プログラミングⅡ 第10回
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
今までの練習問題の復習.
前回の練習問題.
同じ構造をした「引き出し」変数を構造体変数と呼ぶ
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
復習 前回の関数のまとめ(1) プログラムはmain()関数の先頭から実行される
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
プログラミング 3 2 次元配列.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第5回 プログラミングⅡ 第5回
高度プログラミング演習 (11).
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング論 構造体
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
モバイルプログラミング第2回 C言語の基礎 (1).
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第2章 数値の入力と変数 scanfと変数をやります.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
C言語講座第5回 2017 構造体.
プログラミング演習I 補講用課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

前回の関数のまとめ (1) プログラムは main() 関数の先頭から実行される 関数は main() 関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数 ( 変数 ) に コピーされる 関数内で求めた値は return 文によって関数値として呼び出し側に戻され る. #include float menseki(float a, float b) { return (a * b / 2); } int main(void) { float x, y, kekka; printf(" 底辺は ?"); scanf(" %f ", &x); printf(" 高さは ?"); scanf(" %f ", &y); kekka = menseki(x, y); printf(" 面積は %f です. \n", kekka); } x,y:実引数 a, b: 仮引数 仮引数もローカル変数 → 関数内でのみ有効 関数の定義 関数の呼び出し 復習 スタートポイント

ローカル変数 (1) #include float menseki(float a, float b) { float s; s = a * b / 2; return s; } int main(void) { float a, b, kekka; printf(" 底辺は ?"); scanf(" %f ", &a); printf(" 高さは ?"); scanf(" %f ", &b); kekka = menseki(); printf(" 面積は %f です. \n", kekka); } menseki() 関数 ローカル変数 同じ変数名 a, b でも,関数が違 うと,別の変数と見なされる ⇒赤色 a,b と青色 a,b は別の変数 menseki() 関数 内のローカル変 数 a と b main() 関数 main() 関数内 のローカル変 数 a と b 復習

void キーワード void kansu(float a, float b) {.... return; } 返却値を持たない ( 関数値のない ) 関数の定義 void は返 却値が無 いことを 宣言 何も返さないので, return 式 ; とは書かない. return 文の省略も可能! int main(void) { int x; x = kansu(3, 4); printf("x=%d, %d", x, kansu(2,5)); } void 宣言された 関数の返却値を 利用しようとす るとエラー int func(void) { return 5; } int main(void) { printf(" 値は %d", func()); } 引数として void と書くと, 引数が無いことを宣言 復習

引数の値渡し int main(void) { int x = 12; mul10(x); printf("x = %d", x); } a 12 x main() 関数 変数 mul10() 関数 1212 引数のコピー 120 return 文実行 void mul10(int a) { a = a * 10; return; } 関数呼び出し x = 12 局所変数 ローカル変数 原則 引数は関数からコ ピーバックされない.呼 び出し側の変数 ( 実引数 ) は 変化しない.⇒値渡し (call by value) 例外 ポインタ引数,配列引数 ⇒参照渡し (call by reference) 引数のコピーバック main() 関数 mul10() 関数 引数を 10 倍する関数 復習

配列引数 ( 参照渡し ) を用いた関数 #include void mul10(int data[], int n) { int i; for (i = 0; i < n; i++) { data[i] = data[i]*10; } } int main(void) { int i, aa[30], s; // 配列 aa に 30 個のデータを入力する for (i = 0; i < 30; i++) { printf("%d 番のデータ :", i); scanf("%d", &aa[i]); } mul10(aa,30); printf(" データを全て 10 倍すると "); // データの表示 ( 省略 ) } 配列引数は参照渡しであるため, 呼び出し側の配列の値が変化す る! n 個のデータの値 を 10 倍する関数 データの個数 (n 個 ) を引数とす る 理由:この関数を再利用することを想 定.データの個数はいつも 30 個とは限 らないので,ループ回数を 30 回に固定 したくない 関数内のローカル配列変数 data を変化 すると,呼び出し側の配列 aa も変化 配列引数:かっこ [ ] のみつける.要素数を空欄にした 配列 →data[n]× data[0]× 配列を引数とした関数呼び出 し 配列名のみ書く. 配列全体を引数とするので [ ] は不 要 有効なデータの個数は 30 個 復習

プログラミング技術の発達 初期の時代 暗黒時代.モジュール化困難. 理解しやすいプログラム,再利用可能なプログラムが できなかった. 構造化プログラミング ループ制御,選択制御の整理. ローカル変数の導入 → モジュール化が容易. 理解しやすいプログラム,再利用しやすいプログラム ができるようになった. オブジェクト指向プログラミング 一度作成したモジュールの徹底した再利用が可 能. プログラミングの考え方の整理 現代のプロ グラミング 技術 グラフィカルユーザー インターフェースのプ ログラミングではこれ が必要 C++ 言語, Java 言語, C# 言語, Objective-C 言語

オブジェクト指向 オブジェクトを中心としたプログラムの考え方 オブジェクト = 物,全ての事物・事象 オブジェクトの例 人間 人間を表わす要素 性別,名前,年齢,身長,・・・, etc. 機械 機械を表わす要素 名前,重さ,部品の数,値段 実験データ 実験データを表わす要素 データ値の個数,データの値

構造体 ー オブジェクト指向の第一歩 いくつかの変数をまとめて新しい変数型を作る 例えば 複素数型 実部と虚部の float 型の2変数からできている 日付型 年,月,日を表す int 型の3変数からできている 学生身体データ型 学籍番号 (int 型変数 ) 名前 ( 文字列変数 ) 誕生日 ( 日付型構造体 ) 身長 (float 型変数 ) 体重 (float 型変数 )

構造体変数 1234 x xyz A 普通の変数 ( ここでは座標値 ) 構造体変数 ( ここでは点を表す ) xyz B 14 y 5 z 点 A の x 座標 プログラム中では A.x 点 B の x 座標 プログラム中では B.x 例えば 「 3 次元空間で2点 A と B の 間に線分を引き・・・」 実際には点 A や点 B は座標で 表すので,複数の変数が必 要 例えば 「 3 次元空間で2点 A と B の 間に線分を引き・・・」 実際には点 A や点 B は座標で 表すので,複数の変数が必 要 箱のイメージ 引き出しのイメージ

構造体のプログラム例 (1) ー 日付型 #include struct Date { int year; int month; int day; }; void main() { Date a, b; a.year = 2015; a.month = 7; a.day = 1; b = a; b.day = 2; printf(" 初めの日付は %d 年 %d 月 %d 日, ", a.year, a.month, a.day); printf(" 次の日付は %d 年 %d 月 %d 日 \n", b.year, b.month, b.day); } a.year は構造体変数 a のメ ンバ変数 year を意味する 構造体内の変数をメンバ変数と呼ぶ 初めの日付は 2015 年 7 月 1 日,次の日付は 2015 年 7 月 2 日 Date 型の構造体の定義 キーワード struct b.day は構造体変数 b の メンバ変数 day を意味す る 構造体 変数 a を b に代入 Date 型の構造体変数 a と b の宣言 yearmonthday b yearmonthday a Date は変数ではなく設計図

構造体のプログラム例 (2) struct Date { int year; int month; int day; }; void main() { Date a = {2002, 6, 28}; Date b; b = {2002, 6, 29}; Date c[20]; c[15].year = 6; c[15].month = 6; c[15].day = 28; printf(" 今日は %d 年 %d 月 %d 日 \n", c[15].year, c[15].month, c[15].day); } 構造体変数を宣言す ると同時に初期化 同時ではないのでダメ エラー Date 型構造体の配列の宣言 Date 型構造体の配列要 素 15 に値を代入 ※この例では配列の添え字 15 には特に意味はない

構造体のプログラム例 (4) #include struct Date { int year; int month; int day; }; struct Student { int number; // 学籍番号 char name[20]; // 名前 float height; // 身長 float weight; // 体重 Date birthday; // 誕生日 }; void printSt(Student s) { printf("%d 番 %s(%d 年 %d 月 %d 日生 )", s.number, s.name,s.birthday.year, s.birthday.month, s.birthday.day); return; } void main() { Student matsu = {1020, "matsushima", 163.5, 62.0, {1970, 2, 28}}; printSt(matsu); printf("\n"); } 1020 番 matsushima(1970 年 2 月 28 日生 ) Student 型構造体の内容を表示する関 数 引数は Student 型 構造体の 変数 Student 型構造 体のメンバと して Date 型構 造体変数を指 定 注意 ! s.number ○ number × 注意 ! s.number ○ number × 引き出しの内容 ( 情報 ) を丸ご と引数として受け取るイ メージ Student 型構 造体のメン バとして文 字列を指定

構造体のプログラム例 (5) #include struct Date { int year; int month; int day; }; struct Student { int number; // 学籍番号 char name[20]; // 名前 float height; // 身長 float weight; // 体重 Date birthday; // 誕生日 }; void printSt(Student s); void check(Student a) { printSt(a); if (a.weight > a.height) { printf(" は太りすぎだ! \n"); } else { printf(" はいい感じだ! \n"); } return; } void main() { Student matsu = {1020, "matsushima", 163.5, 62.0, {1970, 2, 28}}; check(matsu); } 1020 番 matsushima(1970 年 2 月 28 日生 ) は太りすぎ だ! printSt() 関数のプロトタイプ宣言 ( 関数定義はこの例では省略しているが実際は 必要 ) 注意 ! a.weight ○ weight × 注意 ! a.weight ○ weight ×

構造体と配列を組み合わせたプログラム例 (1/2) #include struct BaitoKanri // バイト管理構造体 { int id; // バイトの個人番号 char name[20]; // バイトの氏名 ( 文字列 ) int money[12]; //1 ~ 12 月に支払ったバイト料 (1000 円単位 ) }; // バイト一人分の番号,氏名,支払額の表示する関数 void PrintPerson(BaitoKanri baito) { int i; printf("%2d %-10s", baito.id, baito.name); for (i = 0; i < 12; i++) { printf(" %2d", baito.money[i]); } // バイト一人分の 1 年間の支払額を計算する関数 int Sum(BaitoKanri a) { int i, sum = 0; for (i = 0; i < 12; i++) { sum = sum + a.money[i]; } return sum; } 番号 氏名 毎月の給料 ( 単位 : 千円 ) 合計 Matsushima : Noda : Obama : Putin : 169 続行するには何かキーを押してください...  構造体変数の中に配列が含まれ ている場合 ( 配列を含む構造体 )  構造体変数が配列になっている 場合 ( 構造体変数の配列 )  構造体変数の中に配列が含まれ ている場合 ( 配列を含む構造体 )  構造体変数が配列になっている 場合 ( 構造体変数の配列 ) 配列を含む構造体の定義 この構造体にバイト一人あたりの 情報をすべて詰め込んで管理する この関数を使うと構造体 変数 baito の ( 一人分の ) 情 報を画面表示できる この関数は,構造体変数 a の ( 一人分の )1 年間の給 料総額を返す

構造体と配列を組み合わせたプログラム例 (2/2) #include struct BaitoKanri // バイト管理構造体 { int id; // バイトの個人番号 char name[20]; // バイトの氏名 ( 文字列 ) int money[12]; //1 ~ 12 月に支払ったバイト料 ( 単位 1000 円 ) }; int main(void) { BaitoKanri list[4] = { {10, "Matsushima", {10, 15, 12, 10, 15, 20, 20, 15, 11, 15, 12, 10}}, {15, "Noda", {10, 15, 14, 20, 15, 20, 20, 16, 11, 15, 42, 10}}, {16, "Obama", {20, 15, 13, 15, 15, 30, 20, 15, 11, 25, 12, 10}}, {20, "Putin", {12, 15, 12, 20, 15, 20, 10, 17, 11, 15, 12, 10}}, }; printf(" 番号 氏名 毎月の給料 ( 単位 : 千円 ) 合計 \n"); printf(" \n"); int i; for (i = 0; i < 4; i++) { PrintPerson(list[i]); printf(" :%4d\n", Sum(list[i])); } 番号 氏名 毎月の給料 ( 単位 : 千円 ) 合計 Matsushima : Noda : Obama : Putin : 169 続行するには何かキーを押してください... 構造体変数の配列宣言 一人分の情報 ここでは 4 人分の情 報で初期化 list[i] は, i 番目の一人分の 情報 ( 一つの構造体変数 ) これは配列引数ではないこ とに注意 !