Microsoft PowerPoint pptx[読み取り専用]

Similar documents
Microsoft PowerPoint - 09.pptx

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

Microsoft PowerPoint pptx

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

プログラミング実習I

情報処理Ⅰ演習

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

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

gengo1-11

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

memo

Microsoft PowerPoint pptx

02: 変数と標準入出力

Microsoft PowerPoint ppt

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

Microsoft PowerPoint pptx

02: 変数と標準入出力

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

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

02: 変数と標準入出力

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

02: 変数と標準入出力

PowerPoint プレゼンテーション

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

02: 変数と標準入出力

Prog1_10th

02: 変数と標準入出力

02: 変数と標準入出力

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

02: 変数と標準入出力

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

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

memo

プログラミング入門1

memo

gengo1-10

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint - prog07.ppt

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

Microsoft Word - no11.docx

Microsoft PowerPoint - 11.pptx

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

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

CプログラミングI

Microsoft PowerPoint - lec10.ppt

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

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

program7app.ppt

プログラミング入門1

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

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

講習No.12

講習No.12

PowerPoint プレゼンテーション

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

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

Prog1_6th

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

Microsoft Word - 3new.doc

cp-7. 配列

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

基礎プログラミング2015

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

PowerPoint Presentation

02: 変数と標準入出力

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

基礎プログラミング2015

ファイル入出力

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

C言語講座

PowerPoint Presentation

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

PowerPoint プレゼンテーション

ファイル入出力

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

演算増幅器

Microsoft PowerPoint - chap10_OOP.ppt

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

Microsoft PowerPoint pptx

プログラミング入門1

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

JavaプログラミングⅠ

gengo1-8

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

メソッドのまとめ

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

Microsoft PowerPoint - prog06.ppt

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

Javaプログラムの実行手順

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

PowerPoint プレゼンテーション

メソッドのまとめ

PowerPoint プレゼンテーション

プログラミング入門1

講習No.1

第2回講義:まとめ

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 - 03

Transcription:

情報処理 Ⅱ 第 8 回 2009 年 12 月 7 日 ( 月 )

本日学ぶこと 関数と変数 目的 関数を自分で定義し, 変数の利用方法 範囲を明示的に制限することで, 適切な機能分割 ( モジュール化, 再利用 ) を図る. してはいけないこと 問題 main 関数のみで 100 行以上のプログラム グローバル変数を駆使するプログラム プログラムを読みやすくする 保守性向上 多項式関数 f(x) = c 0 + c 1 x + c 2 x 2 + + c n x n と実数 a が与えられたときに,f(a) を計算できる? 次数 nの異なる様々な関数に対して, 求められる? 入 p.109 2

関数 (Function) 関数の分類 自作関数 : 自分で定義する. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする main 関数がないとプログラムは動かない 入 pp.274-275 リ p.346 3

関数定義の方法 構文 : 型名関数名 ( 引数並び ) { 文...} 型名は, 関数の戻り値の型. 値を返さないときは,void と書く. 引数並びは, 型名変数名 をカンマで区切ったもの. 引数がないときは,void と書く. 例 : double myatof(const char *str0) { } 例 : void procedure(int x, int y) { } 一括の変数宣言と異なり, このintは省略できない. リ pp.347-354 4

void 型 voidは 何もない や 無効な値 を表す型名 void x; 用途 void *x; 関数が引数や戻り値を持たないことを明示するとき void exit(int status); void procedure(void); 任意のポインタ型を表現するとき void *p; void *malloc(size_t size); プログラムを終了するライブラリ関数. 通常,exit(0); もしくは exit(1); のいずれかで呼び出す. 入 p.274 リ p.349, p.300, p.498, p.501 5

関数の呼び出し 関数定義の例 : double f(double x) {return x+1;} 関数呼び出しの例 :b=f(a); 変数 aの値を引数として, 関数 f を呼び出し, その戻り値を, 変数 bに代入する. x を関数 f の仮引数 (parameter), a を関数 f の実引数 (argument) という. これらを区別する必要のないときは, ともに引数引数という. 仮引数の宣言には型名も書く. 実引数には書かない. x = a; の代入を行ってから, 関数本文の処理に入る. 関数の処理が終われば, 変数 x ( のオブジェクト ) は消滅する. x = f(x); と書いてもよい. このとき, 仮引数の x と, 実引数の x ( あらかじめ定義しておく ) は, 別のオブジェクトである. 入 pp.277-278 リ pp.347-348 6

return 関数処理中に return 値 ; があれば, そこで関数の処理を終え, 値を戻り値 (return value) とする. 値の前後にカッコは不要. 戻り値の型が void なら, return; と書ける. 戻り値の型がvoid 以外なら, 必ずreturn 値 ; で処理を終えるように書く. リ p.267 7

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

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

値渡しで失敗する理由 (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 y =-1 main 入 p.230 10

値渡しで失敗する理由 (2) コード ( 抜粋 ) void swapint_bad(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } swapint _ bad x = 1 y = -1 x = 1, y = -1; swapint_bad(x, y); x = 1 y =-1 main 入 p.230 11

値渡しで失敗する理由 (3) コード ( 抜粋 ) void swapint_bad(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } swapint _ bad x = 1 y = -1 tmp x = 1, y = -1; swapint_bad(x, y); x = 1 y =-1 main 入 p.230 12

値渡しで失敗する理由 (4) コード ( 抜粋 ) void swapint_bad(int x, int y) { int tmp; } tmp = x; x = y; y = tmp; swapint _ bad x = 1 tmp=1 y = -1 x = 1, y = -1; swapint_bad(x, y); x = 1 y =-1 main 入 p.230 13

値渡しで失敗する理由 (5) コード ( 抜粋 ) void swapint_bad(int x, int y) { int tmp; } tmp = x; x = y; y = tmp; swapint _ bad x = -11 tmp=1 y = -1 x = 1, y = -1; swapint_bad(x, y); x = 1 y =-1 main 入 p.230 14

値渡しで失敗する理由 (6) コード ( 抜粋 ) void swapint_bad(int x, int y) { int tmp; } tmp = x; x = y; y = tmp; swapint _ bad x = -11 y = -11 tmp=1 x = 1, y = -1; swapint_bad(x, y); x = 1 y =-1 main 入 p.230 15

値渡しで失敗する理由 (7) コード ( 抜粋 ) void swapint_bad(int x, int y) { int tmp; } tmp = x; x = y; y = tmp; swapint _ bad x = -11 y = -11 tmp=1 x = 1, y = -1; swapint_bad(x, y); x = 1 y =-1 main 入 p.230 16

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

参照渡しで成功する理由 (2) コード ( 抜粋 ) void swapint_good(int *px px, int *py py) { int tmp; tmp = *px px; *px = *py py; *py = tmp; } swapint_good px py x = 1, y = -1; swapint_good(&x, &y); x = 1 y =-1 main リ p.356 18

参照渡しで成功する理由 (3) コード ( 抜粋 ) void swapint_good(int *px px, int *py py) { int tmp; tmp = *px px; *px = *py py; *py = tmp; } swapint_good px py tmp x = 1, y = -1; swapint_good(&x, &y); x = 1 y =-1 main リ p.356 19

参照渡しで成功する理由 (4) コード ( 抜粋 ) void swapint_good(int *px px, int *py py) { int tmp; } tmp = *px px; *px = *py py; *py = tmp; swapint_good px tmp=1 x = 1, y = -1; swapint_good(&x, &y); x = 1 y =-1 py main リ p.356 20

参照渡しで成功する理由 (5) コード ( 抜粋 ) void swapint_good(int *px px, int *py py) { int tmp; } tmp = *px px; *px = *py py; *py = tmp; swapint_good px tmp=1 x = 1, y = -1; swapint_good(&x, &y); x =-1= y =-1 py main リ p.356 21

参照渡しで成功する理由 (6) コード ( 抜粋 ) void swapint_good(int *px px, int *py py) { int tmp; } tmp = *px px; *px = *py py; *py = tmp; swapint_good px tmp=1 x = 1, y = -1; swapint_good(&x, &y); x =-1= y =-1= 1 py main リ p.356 22

参照渡しで成功する理由 (7) コード ( 抜粋 ) void swapint_good(int *px px, int *py py) { int tmp; } tmp = *px px; *px = *py py; *py = tmp; swapint_good px tmp=1 x = 1, y = -1; swapint_good(&x, &y); x =-1= y =-1= 1 py main リ p.356 23

main 関数の型 main 関数の ( 戻り値の ) 型は,int とする. void main とする本も多いが, 規格上適切ではない. 正常終了は return 0; と書き, 異常終了は return 1; と書くのが一般的. main 関数が返す値, およびexit 関数の引数は, 終了ステータス (exit status) と呼ばれる. Linuxなら, コマンド実行後, echo $? を実行することでその値を確認できる. コンパイルが成功したときに限り, ファイルを実行する が一つのコマンドで書ける リ pp.359-362 24

関数定義の順番 呼び出す関数は, 呼び出す前に ( プログラムファイルの上のほうで ) 宣言されていなければならない. 対策 宣言や定義がない場合は,int 関数名 (); とみなして呼び出しを試みる. 呼び出す順序に注意して関数を並べる. 関数プロトタイプを使用する. 25

関数プロトタイプ (Function prototype) 関数原型 ともいう 構文 : 型名関数名 ( 引数の型の並び ); セミコロンを忘れずに 引数の型の並び は, 引数 ( 型と変数 ) の並び でもよい. このとき変数名は無視される. 一般に, 各関数の定義より前 ( 上 ) に記述する. 例 : int swapint_good(int *, int *); 関数プロトタイプを用いることで, 関数定義の順番を気にすることなくプログラムを記述できる. 関数の入出力が明確になる. 入 pp.278-279 リ pp.350-351 26

変数 (Variable) 識別子 オブジェクト 識別子 (Identifier): 変数名, 関数名, 型定義名などの 名前 識別子とオブジェクト (Object) の違い 識別子は, プログラムファイル ( 静的 ) で記述される ラベル オブジェクトは, プログラム実行中 ( 動的 ) に生成される 実体 同一の識別子に対して複数のオブジェクトが生成されることもある. 宣言により, 変数ならそのオブジェクト, 関数ならその実行コードが, 記憶域 ( メモリ ) 上に割り当てられるとき, その宣言を特に定義定義という. 関数プロトタイプや,externを用いた変数や関数の宣言, 構造体などの独自型定義は, この意味で定義ではない. 入 p.223 リ p.37, pp.102-103 27

変数を宣言 定義する際の注意点 型は何か? グローバルかローカルか? auto( 自動 ) か static( 静的 ) か extern( 外部 ) か? リ pp.104-106 28

グローバル変数とローカル変数 各変数は, 定義された位置によって, 有効範囲 (scope) を持つ. グローバル変数 あらゆるブロックの外で定義された変数. 有効範囲はファイル末尾まで. ローカル変数 ブロックの中で定義された変数. 有効範囲はブロック終了まで. ブロックの中 とは, { と } で挟まれた領域のこと 関数の仮引数もローカル変数 グローバル - global l - 大域的 - あらゆるブロックの外 ローカル - local - 局所的 - あるブロックの中 入 pp.280-281 リ pp.111-114 29

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

型の属性 記憶域クラス extern, static, auto, register 型修飾子 const, volatile 例 : extern void function1(const char *); int x(void) {static ti int c=0;...} リ p.104 31

記憶域クラス (1) auto: そのオブジェクトの生存期間は自動記憶域期間である. 積極的に auto を書くことはない. static: そのオブジェクトの生存期間は静的記憶域期間である. 必要なときに使う. extern: 他の場所で宣言された識別子を使用する. 分割コンパイルで不可欠. プログラムが複数のソースファイルで構成されることがある. 大規模プログ externとstaticは, 関数にラミングでは当たり前だが, 本授業で対しても指定できる. は実例を出さない. リ p.107 32

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

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

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

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

多項式の計算 仕様 多項式関数 f(x) = c n n-1 n x + c n-1 x + + c 1 x + c 0 と実数 aが与えられたときに,f(a) を計算する. 考え方 係数 c 0, c 1, c 2, c n を, 配列変数で保持する. c i は,xx の 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 polynomial1.c 37

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

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

まとめ 関数を自分で定義し呼び出すとき, どのような点に注意しなければならないか? 参照渡しにはポインタが不可欠であるのはなぜか? グローバル変数とローカル変数, 静的変数と自動変数の違いは何か? グローバルな自動変数は存在するか? 関数の中で配列を扱うとき, どのような点に注意しなければならないか? 40