情報工学演習I 第12回 C++の演習4(インライン展開).

Slides:



Advertisements
Similar presentations
C++ 基礎. 目次 C++ とは? C++ におけるオブジェクト指向 課題 C++ とは? Cには足りなかったものが付与されて出来た物 具体的には、 情報の隠蔽(カプセル化) 共通の名前付け(関数のオーバーロード) 再利用の仕組み クラスの導入 など オブジェクト指向 C++ では大規模なプログラミングの.
Advertisements

情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
プログラミング演習(1組) 第7回
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
情報工学演習I 第10回 C++の演習2(クラスの継承).
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
第12回新しい型と構造体.
第13回構造体.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
第12回構造体.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
Step-by-Step Guide on How to Start ALICE Analysis
アルゴリズムとプログラミング (Algorithms and Programming)
情報工学演習I 第13回 C++の演習5(仮想関数).
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング演習(2組) 第12回
C言語 配列 2016年 吉田研究室.
アルゴリズムとデータ構造 2011年6月13日
湘南工科大学 2013年12月10日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
プログラミングIII演習 第1回目.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミングII 第 7 回 オブジェクトの配列 New, delete 参照 田向.
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
補足説明.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
第10回関数 Ⅱ (ローカル変数とスコープ).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
精密工学科プログラミング基礎 第10回資料 (12/18実施)
知能情報工学演習I 第12回(後半第6回) 課題の回答
第7回 条件による繰り返し.
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
第2回課題 配布した通り.氏名・学生番号を忘れないこと.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
知能情報工学演習I 第7回(後半第1回) 課題の回答
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2012年6月11日
第5回 プログラミングⅡ 第5回
JAVA入門⑥ クラスとインスタンス.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
Cプログラミング演習 ニュートン法による方程式の求解.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
演算子のオーバーロード.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
printf・scanf・変数・四則演算
第5回 配列.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

情報工学演習I 第12回 C++の演習4(インライン展開)

授業の予定(後半) # 月日 内容 担当者 7 11月13日 C言語の演習4 (ポインタの演算,列挙型) 内海 8 11月20日 9 11月27日 C++の演習1(クラス) 岩村 10 12月 4日 C++の演習2(クラスの継承) (代理:谷川) 11 12月11日 C++の演習3 (関数のオーバロード) 12 12月18日 C++の演習4(インライン展開) 13 1月 8日 C++の演習5(仮想関数) 14 1月15日 C++の演習課題 谷川 15 1月22日 総合演習

今日の内容 第9回演習課題の解説 インライン関数

第9回演習課題の解説

第9回演習課題(1) 1. 以下の仕様を満たすプログラムを作れ 以下の仕様を満たすクラスを持つ 人の名前を保存することができる 数学、理科、英語の点数を保存することができる 3教科の点数を変更(上書き)できる関数と照会できる 関数がある 3教科の点数の平均を計算して返す関数がある 上記のクラスを用いて、2人分のデータ(名前、3教科の 点数)を順次コマンドラインから入力できる 全員分の情報を入力した後、一人ずつ名前と平均点を表示 する

第9回演習課題(1)の回答 ans9-1.cc 読みにくいコードは バグの温床 名前の入力のコード 一時的に 変数を定義 オブジェクトに名前や点数を渡す関数(set_nameや set_mathなど)を準備 オブジェクトから名前や点数をもらう関数(get_nameや get_mathなど)を準備 [欠点] main関数が込み入ってしまい、コードが読みにくい (何をしているのかを理解するのに考える必要がある) 名前の入力のコード cout << "Enter a name: "; // 名前の入力 string name; cin >> name; person[i].set_name(name); 一時的に 変数を定義

第9回演習課題(1)の別解 ans9-1_another.cc 名前の入力のコード 一時的な 変数が不要 クラスのget_nameやget_math関数で返す値を参照渡しに した(関数の宣言時、戻り値に「&」を付ける) [利点] 参照渡しにすれば、関数を呼び出して普通の変数の ように扱える  main関数がすっきりして、読みやすくなった // 名前を調べる string& get_name() { return name; } 名前の入力のコード cout << "Enter a name: "; // 名前の入力 cin >> person[i].get_name(); 一時的な 変数が不要

第9回演習課題(2) 2. 以下の仕様を満たすプログラムを作れ 以下の仕様を満たすクラスを持つ 2次元の座標を保持することができる 座標の初期値はオブジェクト作成時に与える 現在位置を更新(上書き)する関数を持つ 現在位置を返す関数を持つ 呼び出されると上下左右にそれぞれ移動する関数を持つ コマンドラインから上下左右に移動する命令を受け取り、 上記クラスの関数を呼び出して、移動させる 命令の例:up, down, left, right コマンドラインから現在位置を照会する命令を与えたとき は、現在位置を返す

第9回演習課題(2)の回答 ans9-2.cc x座標とy座標をint型で宣言し、データメンバとした class Coordinate { // 座標を扱うクラス private: int x, y; // 座標 // 現在地のx座標を返す int ret_pos_x() { return x; }

第9回演習課題(2)の別解 ans9-2_another.cc 座標を表す構造体を導入した [利点] コードが読みやすくなる struct position { int x, y; }; class Coordinate { // 座標を扱うクラス private: position pos; // 座標 // 現在地を返す position ret_pos() { return pos; }

第9回演習課題(3) 3. ニュートン法で方程式を解くプログラムを作れ。 ただし、以下の仕様を満たすものとする ニュートン法: 方程式はax3+bx2+cx+d=0とし、a, b, c, dはコマンドラ インから入力 ニュートン法: 曲線の接線とx軸の交点を求める処理を何度も繰り返して解を導く方法 何かを参考にした場合は、その旨を述べる。書いてない場合は0点

第9回演習課題(3)の回答 ans9-3.cc ニュートン法を計算するクラスを定義した (クラスの使用は必須ではないが、実はあると便利) ニュートン法を計算するクラスを定義した (クラスの使用は必須ではないが、実はあると便利) class Newton { // ニュートン法のクラス private: double eps; // 終了条件(更新量の閾値) int mc; // 終了条件(更新回数) double a, b, c, d; // 関数の係数 public: // コンストラクタ Newton(double _eps, int _mc, double _a, double _b, double _c, double _d); double func(double x); // 関数の値 double deriv(double x); // 関数を微分した値 double solve(double x); // ニュートン法で解を解く };

インライン関数

ソースコードを置き換えてからコンパイルする インライン関数 関数呼び出しで生じるオーバーヘッドを回避する方 法 関数呼び出しは処理のオーバーヘッドが生じる 引数があれば余計にオーバーヘッドが大きくなる インライン関数のコードは、呼び出し元のコードに埋め込 まれる C言語のマクロに似ている ソースコードを置き換えてからコンパイルする #define PI 3.14159265358979 #define tasu(a,b) (a+b) #define tasu2(a,b) a+b Int c=tasu(10,5); Int c= (10+5); Int c=3*tasu2(10,5); Int c= 3*10+5;

実際にインライン化されるかどうかはコンパイラ依存 インライン関数 実際にインライン化されるかどうかはコンパイラ依存 宣言方法 関数の宣言の前にinlineを入れるだけ int tasu(int x, int y) { // 足し算する関数 return x+y; } inline int tasu_inline(int x, int y) { // 足し算する関数(インライン版)

インライン関数 ex17_inline1.cc #include <time.h> // 時間測定用 #include <iostream> using namespace std; int tasu(int x, int y) { // 足し算する関数 return x+y; } inline int tasu_inline(int x, int y) { // 足 し算する関数(インライン版) int main() { int sum; clock_t start, end; // 処理の開始時間 と終了時間 sum=0; start = clock(); // 開始時間測定 for(int i=0; i<214748364; i++) { sum = tasu(sum,i); } end = clock(); // 終了時間測定 cout << "Computation time without inline: " << end-start << endl; sum = tasu_inline(sum,i); cout << "Computation time with inline: " << end-start << endl; return 0;

インライン関数(クラスの場合) 宣言方法:クラスの定義の中に関数の定義を書く class tashizan { public: int tasu(int x, int y); // 足し算する関数 int tasu_inline(int x, int y) { // 足し算する関数(インライン版) return x+y; } }; int tashizan::tasu(int x, int y) { // 足し算する関数

インライン関数 (クラスの場合) ex18_inline2.cc int main() { tashizan t; // オブジェクトの生成 #include <time.h> // 時間測定用 #include <iostream> using namespace std; class tashizan { public: int tasu(int x, int y); // 足し算する関数 int tasu_inline(int x, int y) { // 足し算 する関数(インライン版) return x+y; } }; int tashizan::tasu(int x, int y) { // 足し 算する関数 int main() { tashizan t; // オブジェクトの生成 int sum; clock_t start, end; // 処理の開始時 間と終了時間 sum=0; start = clock(); // 開始時間測定 for(int i=0; i<214748364; i++) { sum = t.tasu(sum,i); } end = clock(); // 終了時間測定 cout << "Computation time without inline: " << end-start << endl;

インライン関数 (クラスの場合) ex18_inline2.cc 続き sum=0; start = clock(); // 開始時間測定 for(int i=0; i<214748364; i++) { sum = t.tasu_inline(sum,i); } end = clock(); // 終了時間測定 cout << "Computation time with inline: " << end-start << endl; return 0;

演習課題

第12回演習課題(1) 1. 以下の条件を満たすプログラムを作成せよ 以下の仕様を満たす時を表すクラスを持つ データメンバとして、時間、分、秒を表すものを持つ メンバ関数を使用して、任意の時間、分、秒をオブジェ クトに渡すことができる メンバ関数を使用して、現在オブジェクトに保存されて いる時間、分、秒を受け取ることができる メンバ関数を呼び出せば、自分のオブジェクトに保存さ れている時間、分、秒と別のオブジェクトが持つ時間、 分、秒を足すことができる 上記のクラスのオブジェクトを使用して、2つの時間、分、 秒を設定して、足し算して結果を表示する

第12回演習課題(2) 2. 以下の仕様を満たすプログラムを作成し、オブ ジェクトの深いコピーが実現できていることを示す 以下の仕様を満たすクラスを持つ データメンバとして、3次元配列を動的に確保する コピーコンストラクタを持ち、オブジェクトの深いコ ピーが実現できる

提出に関して 提出するもの ソースファイル(.ccまたは.cpp ファイル) ファイル名はkadai1218_学籍番号_課題番号.cc(.cpp) (Visual Studioの場合) ファイル名はkadai1218_学籍番号_課題番号_v.cc (.cpp) 実行結果の出力と講義に関するコメント .txt ファイルで、学籍番号、氏名を含む ファイル名はreport1218_学籍番号.txt とする

提出に関して(続き) 提出期限 提出方法 注意点 1月15日(水) 00:00 授業支援システムから提出 1月15日(水) 00:00 提出方法 授業支援システムから提出 注意点 ファイル名の命名規則が間違っているものは採点しない コンパイルの通らないものは採点しない