Oop8 function函式.

Slides:



Advertisements
Similar presentations
C++语言程序设计教程 第5章 构造数据类型 第6章 C++程序的结构.
Advertisements

移动应用软件开发技术 第二讲:C++编程基础
行程(process).
第一章 C语言概述 计算机公共教学部.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
新世代計算機概論 第14章 程式語言.
Using C++ The Weird Way Something about c++11 & OOP tricks
高级语言程序设计 主讲人:陈玉华.
第5章 函数与预处理 《 C语言程序设计》 (Visual C++ 6.0环境) 本章导读
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
函數(一) 自訂函數、遞迴函數 綠園.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
Classes: A Deeper Look, Part 1
C++ with Managed Extensions
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Function.
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
前處理指令可以要求前處理器 (preprocessor) 在程式編譯之前,先進行加入其它檔案的內容、文字取代以及選擇性編譯等工作。
第 6 章 函式.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
第四章 小技巧.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
期中考试成绩分布 《程序设计》-2017年秋.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第6章 预 处 理.
第九章 预处理命令.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
Introduction to the C Programming Language
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C程序设计.
第5章 函 数.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第6章 预 处 理.
Introduction to the C Programming Language
第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。
第九章 物件導向-進階.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第三章 高级函数特性.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
隨機函數.
Presentation transcript:

oop8 function函式

Outline 什麼是函式:function? 函式的定義與型別宣告 遞迴式的函式 前置處理器:Preprocessor 標準函式庫 變數等級:storage class

什麼是函式:function?

函式的重要特性 函式的行為由定義函式的敘述集合決定, 其呼叫、傳引數的方式一定要依定義規範行使。 函式具有一般語言 (如:PASCAL) 的 function 及 procedure 的雙重功能。 函式的定義可以獨立寫成一個原始檔, 並個別編譯後再整體聯結在一起。 使用函式可以使程式更具結構化、更能相互支援、也更易除錯更易維護。

函式的定義與型別宣告

ANSI 函式定義與宣告

函數的定義與宣告 【定義函數的語法】 函數型態 函數名稱 參數列 函數主體 函數型態 函數名稱(資料型態 參數1,資料型態 參數2, …) 函數型態 函數名稱(資料型態 參數1,資料型態 參數2, …) { // 函數主體 [return expression ;] }   函數型態 函數名稱 參數列 函數主體

函數的定義與宣告 【呼叫函數的語法】 函數的宣告--函數原型 函數名稱(引數1,引數2, …);  【呼叫函數的語法】 函數名稱(引數1,引數2, …);   函數的宣告--函數原型 函數型態 函數名稱(資料型態 參數1,資料型態 參數2, …);

函數範例

C++的程式架構 #include < > #define 資料型態 函數1(參數列); // 函數原型,即函數的宣告 資料型態 函數1(參數列); // 函數原型,即函數的宣告 資料型態 函數2(參數列); // 函數原型,即函數的宣告 ... 全域變數的宣告; 資料型態 main(參數列) // 定義main函數 { 私有變數的宣告; 函數主體; return 運算式或值; }  資料型態 函數1(參數列) // 定義函數1  資料型態 函數2(參數列) // 定義函數2

變數的能見度 全域(Global)變數 私有(Private)變數 範疇運算子(::)

函式的傳回值 return

return 的使用例

return 的使用例

使用函式的注意事項 函式定義時要同時宣告其型別 呼叫函式前要先宣告該函式 傳入函式的引數值, 其型別要與函式原定義一致 接收函式傳回值的變數, 其型別也要與函式一致

使用函式的注意事項

使用函式的注意事項

定義與宣告的區別 函式的宣告是用來宣示函式的名稱、型別, 宣告後 compiler 會建立該函式的相關資料, 而在後來的呼叫時 compiler 才能順利的執行該程式。 函式的定義是程式中一個完整的個體, 用來訂定函式的名稱、引數個數、及函式的內容。函式的定義也具有函式宣告的功能。

參數的傳遞 以值傳遞(Call By Value) 以址傳遞(Call By Address) 以參考值傳遞(Call By Reference)

以值傳遞(Call By Value) int add(int x, int y) { x += y; return x; } int i = 789, j = 876 ,r; r = add(80, 90); cout << "add(80,90) = " << r << endl; cout << "add(" << i << "," << j << ") = " << add(i, j) << endl; 【執行結果】 add(80,90) = 170 add(789,876) = 1665 int add(int x, int y) { x += y; return x; }  

以址傳遞(Call By Address) int add(int *x, int *y) { *x += *y; *y = -(*y); int i = 789, j = 876; cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "i + j = " << add(&i, &j) << endl; cout << "j = " << j << endl << endl; int add(int *x, int *y) { *x += *y; *y = -(*y); return *x; } 【執行結果】 i = 789 j = 876 i + j = 1665 i = 1665 j = -876

以參考值傳遞(Call By Reference) int i = 789, j = 876; cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "i + j = " << add(i, j) << endl; cout << "j = " << j << endl << endl; int add(int &x, int &y) { x += y; y = -(y); return x; } 【執行結果】 i = 789 j = 876 i + j = 1665 i = 1665 j = -876

遞迴式的函式

遞迴式的函式

遞迴式的函式

遞迴式的函式

遞迴式的函式

遞迴式的函式

遞迴式的函式 程式未完, 接下頁

遞迴式的函式 接上頁

遞迴式的函式

遞迴問題範例—河內之塔

遞迴問題範例—河內之塔

遞迴問題範例—河內之塔 程式未完, 接下頁

遞迴問題範例—河內之塔 接上頁

遞迴問題範例—河內之塔

內嵌(inline)函數 #include <iostream.h> inline int max(int x, int y); // 將max宣告為inline function void main(void) { int i = 789, j = 876; cout << "max(" << i << "," << j << ") = " << max(i, j) << endl; return; } inline int max(int x, int y) // 將max定義為inline function if (x > y){ return x; else{ return y;

遞迴函數(Recursive Function) cout << "5! = " << factorial(5) << endl; long factorial(int n) { if (n == 1){ return 1; // 當n等於1時同址呼叫 } else{ return n * factorial(n-1); // 當n大於1時呼叫factorial(n-1);

主程式的引數 // 程式名稱: 9_func10.cpp // 程式功能: 測試argc, argv #include <iostream.h> void main(int argc, char *argv[]) { int i; string s[5]; cout << "argc = " << argc << endl; for(i = 0; i < argc; i++){ s[i] = argv[i]; cout << "argv[" << i << "] = " << argv[i] << endl; cout << "s[" << i << "] = " << s[i] << endl; }   return; 【執行結果】 D:\PROGRAM>9_FUNC7.EXE abc def argc = 3 argv[0] = D:\PROGRAM\9_FUNC7.EXE s[0] = D:\PROGRAM\9_FUNC7.EXE argv[1] = abc s[1] = abc argv[2] = def s[2] = def

前置處理器:Preprocessor C 語言在程式進行編譯之前, 會先將程式中含有 # 記號的部份先行處理, 這個動作我們稱為前置處理 (Preprocess)。 執行前置處理的並不是 compiler, 而是前置處理器。一般都與 compiler 合併在一起。主要有 3 大功能:巨集 (MACRO) 指令、含括 (include) 檔案、和條件式編譯。

巨集指令 #define 又稱代換 (Token Replacement) 指令

有引數的巨集定義 有引數的巨集定義寫法:

有引數巨集的使用例

有引數巨集的使用例

有引數的巨集與函式的比較

利用巨集來除錯

利用巨集來除錯

#undef 的使用

條件性編譯指令

條件編譯的使用例

條件編譯的使用例

標準函式庫 math.h

pow() 的使用例

stdlib.h

time.h

time.h 的使用例

程式執行的時間 利用 clock() 函式可計算程式執行的時間, 用來評估程式執行的效能。

函數的應用 內建函數:亂數產生器rand( ) 與 random(n) 內建函數:日期與時間getdate( ) 與gettime( ) 內建函數: ceil(x) 與floor(x) 內建函數: 平方根 sqrt(x) 內建函數: 次方 pow(x, y) 列印空白與列印空白列 布林函數 氣泡浮昇排序法 堆疊的實作(使用陣列) 堆疊的實作(使用鏈結串列結構)

變數等級:storage class C 程式的結構與變數等級 內在 (auto) 變數 內在靜態 (static auto) 變數 外在 (external) 變數 靜態外在 (static extern) 變數 函式也是外在個體 register 變數

C 程式的結構與變數等級 C 共有:auto、static auto、extern、static extern、及 register 5 種 class, 可以在變數宣告的同時指定其等級。

內在變數的視野

內在 (auto) 變數 內在變數的生命週期 內在變數的優缺點 區段 (Block) 的構造與視野

區段 (Block) 的構造與視野

block 中的 auto 變數

block 中的 auto 變數

內在靜態 (static auto) 變數 static auto 變數是在函式內部定義的。 auto 變數是以堆疊存放的, 必須在函式執行時才會存在, 所以稱為宣告 (declaration)。 但其他如 static auto、extern、static extern 等級的變數, 都是以固定的位址來存放, 而不是以堆疊存放, 在程式編譯時便配置空間, 稱為定義 (definition)。

static auto 變數的使用例

static auto 變數的使用例

外在 (external) 變數

外在變數的視野

外在 (external) 變數 外在變數的生命週期 外在變數的優缺點

外在變數的使用例

外在變數的使用例

外在變數的使用例

外在變數的使用例 程式未完, 接下頁

外在變數的使用例 接上頁

外在變數的使用例

靜態外在 (static extern) 變數 使變數只供單一檔案使用, 即使其它檔案內也定義同樣名稱的變數, compiler 也會把它當成是另一個變數處理, 達到完全 data hiding 效果。

靜態外在變數的視野與生命期 靜態外在變數的視野只限於所定義的檔案內, 而其生命期則與一般外在變數相同。

靜態外在變數的使用例 程式未完, 接下頁

靜態外在變數的使用例 接上頁 程式未完, 接下頁

靜態外在變數的使用例 接上頁

靜態外在變數的使用例

函式也是外在個體 函式要先定義。由函式定義開始至檔案結束的區間為該函式的自然視野。 任何不在函式自然視野內的程式部份, 若想呼叫該函式, 必須先以宣告來拓展函式的視野。 函式的宣告若在呼叫函式內部, 則視野只及於呼叫者本身。

函式也是外在個體 函式的宣告若在呼叫函式外部, 則視野由宣告位置開始至檔案結束為止。 不同檔案的程式也可以透過宣告來使用在別的檔案中定義的函式。

register 變數

前置處理指令

#include 【#include 語法】 #include <標準程式庫.h> #include "其他程式.h" #include <iostream.h> #include "header1.h" #include "C:\cpp\header2.h"

#if、#if define與#if !define ... #endif 【#if !define 語法】 #if !define 識別字 // 或 #ifndef 識別字 ... #endif

#define 與 #undef 【#define 語法】 #define 識別字 識別字的替代字元或字串 ... #undef 識別字 #include <iostream.h> #define PI 3.14159 #define AREA(r) ((r)*(r)*(PI)) #define MAX(a, b) ((a > b) ? a : b) void main(void) { int r = 5; cout << "AREA(" << r << ") = " << AREA(r) << endl; cout << "MAX(88, 85) = " << MAX(88, 85) << endl; return; }

#if、#if define與#if !define // 程式名稱:10_ifndef1.cpp // 程式功能:#ifndef   #include <iostream.h> #define PI 3.14159 #ifndef AREA #include "10_area.h" #endif #define MAX(a, b) ((a > b) ? a : b) void main(void) { int r = 5; cout << "AREA(" << r << ") = " << AREA(r) << endl; cout << "MAX(88, 85) = " << MAX(88, 85) << endl; return; } // 程式名稱:10_area.h // 程式功能:#define AREA(r)   #define AREA(r) ((r)*(r)*(PI))

程式檔的分割 全域(Global)變數 私有(Private)變數 內部連結 外部連結 static 名稱空間(Namespace)

異常處理 【異常處理語法】 try{ // 判斷異常 … throw 運算式/引數/函數 // 丟出異常 } catch(處理第1種異常型態的參數){ // 補抓異常 // 異常處理 catch(處理第2種異常型態的參數){ // 補抓異常 catch(…){ // 補抓異常

異常處理 try{ if (!fin) // 檢查輸入檔fin是否成功開啟 throw "無法開啟輸入檔:"; else   cout << "此行不會被執行\n"; } catch(const char *message){ cout << message << argv[1] << endl;