Microsoft PowerPoint - 09.pptx

Similar documents
Microsoft PowerPoint pptx[読み取り専用]

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

Microsoft PowerPoint pptx

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

情報処理Ⅰ演習

プログラミング実習I

gengo1-11

memo

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

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

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

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

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

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

Microsoft PowerPoint pptx

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

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

memo

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

Prog1_10th

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

02: 変数と標準入出力

講習No.12

Microsoft PowerPoint - prog07.ppt

02: 変数と標準入出力

Microsoft PowerPoint pptx

program7app.ppt

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

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

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

プログラミング入門1

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

02: 変数と標準入出力

Microsoft PowerPoint - 11.pptx

プログラミング入門1

Microsoft Word - 3new.doc

cp-7. 配列

CプログラミングI

gengo1-10

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

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

gengo1-8

第2回講義:まとめ

Microsoft Word - no11.docx

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

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

講習No.12

PowerPoint プレゼンテーション

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

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

memo

Prog1_6th

02: 変数と標準入出力

プログラミング及び演習 第1回 講義概容・実行制御

Microsoft PowerPoint - prog04.ppt

基礎プログラミング2015

Microsoft PowerPoint - lec10.ppt

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

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

PowerPoint プレゼンテーション

PowerPoint Presentation

DVIOUT

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

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

C言語7

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

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

メソッドのまとめ

Microsoft PowerPoint pptx

基礎プログラミング2015

プログラミング実習I

プログラミング入門1

メソッドのまとめ

プログラミング入門1

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Javaプログラムの実行手順

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

Microsoft PowerPoint - 5Chap15.ppt

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

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

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

JavaプログラミングⅠ

PowerPoint プレゼンテーション

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

講習No.10

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

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

プログラミング基礎

Microsoft Word - CHAP2.DOC

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

PowerPoint プレゼンテーション

デジタル表現論・第4回

PowerPoint Presentation

デジタル表現論・第6回

Transcription:

情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 )

関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源 ) の最小化 main 関数がないとプログラムは動かない 2

仮引数と実引数 関数定義の例 int min(int x, int y)... 関数呼び出しの例 printf("min: %d n", min(x, y)); 仮引数と実引数の区別 関数定義のxとyは仮引数. 変数であり, それぞれ型名を書く int min(int x, y) は間違い 関数呼び出しの x と y は実引数. 任意の式でよい 仮引数に, 実引数の式の評価値を代入してから, 関数の処理が始まる仮引数と実引数が同じ変数名であっても, 有効範囲が異なるため, 別オブジェクトとなる 3

引数の授受 C の関数呼び出しでは必ず値渡し (call by value) になる. 値渡し : 実引数のコピーが仮引数に格納される. その後, 仮引数の値を変更しても, 実引数の値には影響しない. 参照渡し (call by reference) をしたければ, ポインタ値を引数とすればよい. 参照渡し : 仮引数の値を変更すれば, 実引数の値もそれに変わる.C ではこの意味での参照渡しをすることができないが, ポインタ値を渡すことで, その参照先の値を変えることができる. アドレス渡しともいう. 4

2 つの値を交換する関数 値渡し 失敗 引数は関数内の仮引数にコピーされる. 関数内の仮引数の中で, 値を交換しても, 関数の外のオブジェクトは変更されない. 参照渡し 成功 関数の仮引数は, 指し示す先を持つ. * ポインタ変数 = 値 とすることで, ポインタ変数が指し示す ( 関数の外の ) オブジェクトに値を代入する. swapint.c 5

値渡しで失敗する理由 (1) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1, y = 1; swapint_bad(x, y); x = 1 main 6

値渡しで失敗する理由 (2) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1, y = 1; swapint_bad(x, y); x = 1 x = 1 main 7

値渡しで失敗する理由 (3) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1 tmp x = 1, y = 1; swapint_bad(x, y); x = 1 main 8

値渡しで失敗する理由 (4) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1, y = 1; swapint_bad(x, y); x = 1 x = 1 tmp=1 main 9

値渡しで失敗する理由 (5) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1, y = 1; swapint_bad(x, y); x = -11 x = 1 tmp=1 main 10

値渡しで失敗する理由 (6) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1, y = 1; swapint_bad(x, y); x = -11 1 x = 1 tmp=1 main 11

値渡しで失敗する理由 (7) コード ( 抜粋 ) void swapint_bad(int x, int y) int tmp; swapint_bad tmp = x; x = y; y = tmp; x = 1, y = 1; swapint_bad(x, y); x = -11 1 x = 1 tmp=1 main 12

参照渡しで成功する理由 (1) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); x = 1 main 13

参照渡しで成功する理由 (2) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); px x = 1 py main 14

参照渡しで成功する理由 (3) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); px x = 1 tmp py main 15

参照渡しで成功する理由 (4) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); px x = 1 tmp=1 py main 16

参照渡しで成功する理由 (5) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); px x = -11 tmp=1 py main 17

参照渡しで成功する理由 (6) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); px tmp=1 py x = -11 1 main 18

参照渡しで成功する理由 (7) コード ( 抜粋 ) void swapint_good(int *px, int *py) int tmp; swapint_good tmp = *px; *px = *py; *py = tmp; x = 1, y = 1; swapint_good(&x, &y); px tmp=1 py x = -11 1 main 19

関数の中の配列変数 (1) 関数の中で配列変数を定義すれば, 関数処理の中で確保され, 関数処理が終わると破棄されるような配列が作られる. void print_message(void) char message[] = "Wakayama"; printf("%s n", message); print_message message 'W''a''k''a''y''a''m''a' ' 0' 20

関数の中の配列変数 (2) 関数の仮引数に配列変数を書けば, その配列と型が適合するポインタ変数になる. void print_message(char message[]) printf("%s n", message); 不完全型実体はポインタ変数 要素数 ( 多次元配列の場合は左端のみ ) は無視される. 要素数なしでもよい. print_message message 'W''a''k''a''y''a''m''a' ' 0' 21

多項式の計算 仕様 多項式関数 f(x) = c n x n + c n 1 x n 1 + + c 1 x + c 0 と実数 a が与えられたときに,f(a) を計算する. 考え方 係数 c 0, c 1, c 2, c n を, 配列変数で保持する. c i は,xのi 次の係数 f(a) = ( (c n * a) + c n 1 )* a + ) + c 0 により求め ( ホーナー法 ), 乗算の回数を減らす. v 0 = c n v 1 = v 0 * a + c n 1 v 2 = v 1 * a + c n 2 = c n *a*a + c n 1 *a + c n 2 v i = v i 1 * a + c n i polynomial_mainonly.c 22

コード ( 抜粋 ) 多項式の計算を行う関数 double calc(double f[], int size, double x) f の配列の要素数 double val; (xの次数 + 1) int i; val = f[size 1]; for(i = size 2; i >= 0; i ) val = val * x + f[i]; return val; 係数の配列 ( の先頭を指し示すポインタ変数 ) f(x) を求めるための x の値 v c n v v*x + c n i v = f(x) = c n x n + c n 1 x n 1 + + c 1 x + c 0 関数定義の効果 : 異なる次数の多項式でも, 一つの (C の ) 関数 calc により, 値を求められる. polynomial.c 23

関数と変数 で学ぶこと 目的 関数を自分で定義し, 変数の利用方法 範囲を明示的に制限することで, 適切な機能分割 ( モジュール化, 再利用 ) を図る. してはいけないこと main 関数のみで 100 行以上のプログラム グローバル変数を駆使するプログラム プログラムを読みやすくする 保守性向上 24

変数 (Variable) 識別子 オブジェクト 識別子 (Identifier): 変数名, 関数名, 型定義名などの 名前 識別子とオブジェクト (Object) の違い 識別子は, プログラムファイル ( 静的 ) で記述される ラベル オブジェクトは, プログラム実行中 ( 動的 ) に生成される 実体 同一の識別子に対して複数のオブジェクトが生成されることもある. 25

識別子の宣言に関するルール グローバルに同一の識別子を複数宣言できない. 一つのブロック内に, 同一の識別子を複数宣言できない. 関数はブロック内で定義できない. 必ずグローバル区間での定義となる. GCC( 演習室のコンパイラ ) では, 関数の中に関数を定義できるが, 使用しないこと! ブロック内に変数を定義するときは, それより外にある同一の識別子と重複してもよい. ただし, 外にある同一の識別子は参照できない. モジュール化に関して有用なルール. 26

2 つの重要な記憶域クラス 静的記憶域期間 ( 静的変数,static 変数 ) static を指定した変数と, グローバル変数が該当する. プログラムの実行に先立ち, オブジェクトが生成され, 初期値が設定される. プログラム終了まで破棄されない. 初期値を指定しないオブジェクトには 0 が代入される. 初期値は, コンパイル時に計算可能な定数式でなければならない. 自動記憶域期間 ( 自動変数,auto 変数 ) autoを指定した変数,staticやexternの指定なくブロック内で定義した変数と, 関数の仮引数が該当する. 宣言文を実行するたびに, オブジェクトが生成され, 初期値があれば毎回初期化される. ブロックを終えると, 破棄される. 初期値を指定しないオブジェクトの初期値は不定. 初期値は任意の計算式でよい. 27

有効範囲と記憶域クラス ここで問題 ( 小テストではありません ) グローバルな静的変数は, 宣言 できる できない. グローバルな自動変数は, 宣言 できる できない. ローカルな静的変数は, 宣言 できる できない. ローカルな自動変数は, 宣言 できる できない. ローカルな静的変数の用途 ブロック内で情報を保存しておき, あとで利用する. 動的に確保することなく, 配列領域を戻り値とする. 自動変数では扱いきれない大容量オブジェクト (100 万個の int 配列など ) を取り扱う. 28

有効範囲と生存期間 破棄されるまでは, ブロックの外からでも ( ポインタなどで間接的に ) オブジェクトの参照や値の書き換えができる. ポインタによる参照渡しが可能となる. 関数内の自動変数に対応するオブジェクトは, 関数処理が行われるたびに生成される. 再帰呼び出しをする関数 が構成できる. 何らかの関数の中 message message[0] = 'w'; としてよい wakayama 'W''a''k''a''y''a''m''a' ' 0' 29

年末年始の授業予定 12 月 25 日 ( 木 ): 第 10 回, レポート課題提示 1 月 8 日 ( 木 ): 第 11 回 1 月 19 日 ( 月 ): 第 12 回 1 月 26 日からの週には 3 回授業があり, そのうち 1 回は A601 で実施します. 30