freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

從問題到程序ppt課件-資料下載頁

2025-10-25 16:54本頁面
  

【正文】 述與解讀 類型描述可能變得很復(fù)雜 ( C語言的缺點(diǎn) ) 。 應(yīng)盡量不寫復(fù)雜描述 。 用 typedef分解 , 易理解 /少出錯 。 定義后可多次使用 /節(jié)省時間 /方便維護(hù) 。 讀程序時可能遇到復(fù)雜類型描述。應(yīng)了解類型描述的一般構(gòu)造及解讀方式。描述類型時也能更清楚,知道怎樣寫,什么地方需要加括號等。 類型描述中可出現(xiàn):已定義類型名,被定義標(biāo)識符,構(gòu)造符號(三個(組)運(yùn)算符): * [] () 指針 數(shù)組 函數(shù) 可加圓括號改變結(jié)合關(guān)系。又增加了理解難度。 解讀方式 :符號意義不變,優(yōu)先級和結(jié)合關(guān)系按運(yùn)算符規(guī)定 。 []和 ()結(jié)合性強(qiáng), *結(jié)合力弱; []和 ()從左到右結(jié)合, *從右向左結(jié)合。 首先辨認(rèn)被說明(定義)的標(biāo)識符,從它向外分析。這個標(biāo)識符常出現(xiàn)在描述中間,被其他符號包圍。 一些例子: 1) int *f(int)。 被說明的是 f, f是一個函數(shù) 。 2) int (*fp)(int)。 說明的是 fp。 fp是一個指針 , 指向 ... 3) char **argv。 argv是個指針 , 指向 (char*) 4) int (*dp)[16]。 dp是指針 , 它指向有 16個元素的整型數(shù)組 。 5) int *dp1[16]。 dp1是個 16個元素的數(shù)組 , 其元素是整型指針 。 6) int (*(*g(int))[4])(double)。 被說明的是函數(shù) g,有一整型參數(shù),返回指針,指針指向 4個元素的數(shù)組,數(shù)組元素是指向函數(shù)的指針,被指函數(shù)有一個雙精度參數(shù)并返回整數(shù)值。 類型描述就是用 三種構(gòu)造符號 及表示結(jié)合性的 括號 ,逐層構(gòu)造起來 。 很復(fù)雜的類型描述非常少見 。 有些構(gòu)造不合法:函數(shù)不能返回數(shù)組 , 函數(shù)不能返回函數(shù) , 函數(shù)不能作數(shù)組元素等 。 利用 typedef能更清晰地描述復(fù)雜類型 。 下面以例 6)為例 。 實際分解應(yīng)該根據(jù)需要 , 看哪個 ( 哪些 ) 層次的類型有邏輯意義 , 有用處 。 原描述: int (*(*g(int))[4])(double)。 先定義函數(shù)指針類型和函數(shù)指針數(shù)組類型: typedef int (*funp)(double)。 typedef funp fparray[4]。 有這兩個類型 , g的類型可以簡單地說明為: fparray *g(int)。 g是函數(shù) , 有一個 int參數(shù) , 返回指向 fparray的指針 上面定義的兩個類型也可以用于定義變量等 。 指向函數(shù)的指針 例:設(shè)需要定義求數(shù)學(xué)函數(shù)的根。 前面定義過一個函數(shù),但那只是玩具,只能當(dāng)作練習(xí)答案,實際中沒什么用。 原因:求根函數(shù)規(guī)定了被求根數(shù)學(xué)函數(shù)的名字。規(guī)定函數(shù)名則使求根函數(shù)不能用于多個函數(shù),只能對一個特定的函數(shù)求根。 程序可能需要求多個函數(shù)的根,應(yīng)只寫一個求根函數(shù)。 提高函數(shù)通用性方法: 引進(jìn)新參數(shù) 。 要使求根函數(shù)能處理不同的數(shù)學(xué)函數(shù),必須為它引進(jìn) 與函數(shù)有關(guān) 的參數(shù)。 其他許多語言也支持函數(shù)的 “ 函數(shù)參數(shù) ” , 但采用的方式可能與 C語言不同 。 C采用函數(shù)指針是為簡化語言 , 同時又能提供最大靈活性 , 可以支持其他程序設(shè)計技術(shù) 。 C語言里的函數(shù)指針也有類型 , 一個函數(shù)指針只能指向某種特定類型 ( 具有特定原型 ) 的函數(shù) C允許指向函數(shù)的指針 ( 函數(shù)指針 ) , 可通過這種參數(shù)傳遞被處理函數(shù) , 對不同調(diào)用可傳遞不同函數(shù) 。 函數(shù)指針是 C語言里指針的另一重要用途 要定義帶有函數(shù)指針參數(shù)的函數(shù) , 最好是首先定義函數(shù)指針類型 。 指向數(shù)學(xué)函數(shù)的指針類型: typedef double (*MFP)(double)。 這里假定數(shù)學(xué)函數(shù)都是有一個雙精度參數(shù) 、 返回雙精度值的 。 注意類型 MFP的定義形式 。 (* MFP)的括號不能少 , 去掉后意義就變了 。 下面定義的 FUNP是另一函數(shù)指針類型 , 指向有兩個int參數(shù) , 返回 double指針值的函數(shù): typedef double*(*FUNP)(int, int)。 函數(shù)指針變量的定義和使用 用函數(shù)指針類型定義指針變量: MFP p1, p2。 沒定義指針類型時定義必須寫 ( 不提倡 ) : double (*p1)(double),(*p2)(double)。 給函數(shù)指針變量賦值 : 對函數(shù)名求值 , 得到的是指向該函數(shù)的指針值 , 可以賦給類型合適的函數(shù)指針變量 。 無論是庫函數(shù) , 還是自己定義的函數(shù) , 都可以賦給類型合適的函數(shù)指針變量 例,(設(shè)已經(jīng)包含 )函數(shù)指針賦值: p1 = sin。 賦過值的函數(shù)指針可直接當(dāng)作函數(shù)使用 , 調(diào)用被指函數(shù) 。 在上面賦值之后 , 寫 x = p1()。 相當(dāng)于寫 x = sin()。 寫間接也可以 ( 注意括號 ) : x = (*p1)()。 通過函數(shù)指針調(diào)用函數(shù) , 被調(diào)函數(shù)由函數(shù)指針當(dāng)時的值決定 。 同樣語句在不同時刻可能調(diào)用不同函數(shù) 。 為程序提供了新的靈活性 。 絕不能調(diào)用懸空的函數(shù)指針 ! 函數(shù)指針作為函數(shù)的參數(shù) 求根問題:以函數(shù)指針作為求根函數(shù)的參數(shù)。重新定義弦線法求函數(shù)根的函數(shù): double cross(MFP fp, double x1, double x2) { double y1 = fp(x1), y2 = fp(x2)。 return (x1 * y2 x2 * y1)/(y2 y1)。 } double root(MFP fp, double x1, double x2) { double x, y, y1 = fp(x1)。 do { x = cross(fp, x1, x2)。 y = fp(x)。 if (y * y1 ) { y1 = y。 x1 = x。 } else x2 = x。 } while (y = 1E6 || y = 1E6)。 return x。 } 函數(shù)使用實例(設(shè) fun是類型合適的函數(shù)): x = root(sin, , )。 y = root(fun, , )。 可以在函數(shù)頭部直接描述函數(shù)指針參數(shù) , 如: double root(double(*fp)(double),...)... 采用先定義類型的寫法 , 程序更清晰易讀 , 也有利于一致性的維護(hù)和程序的修改 。 在任何時候 , 只要程序里需要用函數(shù)指針 , 都應(yīng)該定義相應(yīng)的函數(shù)指針類型 有些書上可看到下面形式的函數(shù)指針 /函數(shù)指針參數(shù): double (*p1)(), (*p2)()。 int f(double (*fp)(), ...) ... 這是過時形式 , 屬不良方式 。 絕對不要用 ! 沒有函數(shù)指針的完整類型描述,編譯程序無法做類型檢查,實際程序容易隱藏錯誤,極難發(fā)現(xiàn)。例如: int f(double (*fp)() ... ) { ... x = fp(3)。 ... } ... x = f(sin, ...)。 ... ... y = f(pow, ...)。 ... ... 數(shù)值積分和數(shù)值積分函數(shù) 這個函數(shù)應(yīng)有 3個參數(shù):對應(yīng)被積函數(shù)的一個函數(shù)指針參數(shù),表示積分限的兩個 double,返回雙精度值: double numInt(MFP fp, double a, double b)。 用區(qū)域分割法逼近積分值(矩形法 /梯形法等)。分割長度趨于 0時有共同極限。用等長分割和矩形法: enum { DIVN = 30 }。 double numInt(MFP fp, double a, double b) { double res = , step = (b a) / DIVN。 int i。 for (i = 0。 i DIVN。 ++i) res += fp(a + i * step) * step。 return res。 } numInt不完善。 ? 數(shù)學(xué)函數(shù)千差萬別,統(tǒng)一劃分方式不能滿足各種情況 ? 可以通過增加劃分提高結(jié)果精度(例如將劃分?jǐn)?shù)作為參數(shù)) ,但使用者很難確定合適的劃分?jǐn)?shù)。 一種方法:多次計算積分值。逐次加細(xì)劃分再算。若函數(shù)可積,這一系列結(jié)果將逐漸逼近實際積分值。 反復(fù)計算不能無限進(jìn)行下去。合理的處理方法是在兩次結(jié)果很接近時結(jié)束。 下面以兩次積分值的差小于 106為結(jié)束條件 。 double numInt(MFP fp, double a, double b) { long i, divn = 10。 double step, dif, res0, res。 res = (fp(b)+fp(a))*(ba)/2。 for (dif=。 fabs(dif)1E6。 divn*=2) { res0 = res。 step = (b a) / divn。 for (res=, i=0。 idivn。 ++i) res += fp(a + i*step) * step。 dif = res res0。 } return res。 } 請考慮:這個函數(shù)能應(yīng)付各種數(shù)學(xué)函數(shù)的積分嗎?什么情況可能出問題?出什么問題?這些問題有解決方案嗎?其中有沒有很困難,以至根本無法解決的問題? 以函數(shù)指針為參數(shù)的數(shù)組操作實用函數(shù) 在介紹指針與數(shù)組的關(guān)系時,給出過一些利用指針操作數(shù)組的函數(shù)?,F(xiàn)在有了函數(shù)指針,可以給這類函數(shù)加一個操作函數(shù),寫出一批操作數(shù)組的實用函數(shù)。 數(shù)組元素變換函數(shù) 對整個數(shù)組或其中一段元素 做“變換”,將 各元素修改為從它們算出的某個值。用函數(shù)指針可以寫出通用變換函數(shù),將 元素 操作 提升 為序列操作: void tran_int(int *b, int *e, int (*fp)(int)){ for ( 。 b != e。 ++b) *b = fp(*b)。 } 也可以為 double類型寫出類似操作 void tran_double(double *b,double *e,MFP fp) { for ( 。 b != e。 ++b) *b = fp(*b)。 } 例:將 double數(shù)組 a前 20個元素改為對應(yīng)的 平方根 : tran_double(a, a+20, sqrt)。 找“不匹配” 想逐個比較兩個 int數(shù)組的元素,找出第一對 “ 不匹配” 元素。為了通用,可把 元素匹配 標(biāo)準(zhǔn)參數(shù)化。 定義 “ 不匹配 ” 查找函數(shù),它返回前一數(shù)組里不匹配元素的位置(指針),找不到就返回 end的 值。 假定參數(shù) fp(匹配判斷函數(shù)) 在匹配時返回非 0值。 int* mismatch(int *b1, int *e1, int *b2, int (*fp)(int, int)) { for ( 。 b1 != e1。 ++b1, ++b2) if (fp(*b1, *b2) == 0) break。 return b1。 } 這里假定 b2所指數(shù)組至少與 [b1,e1)一樣大,函數(shù)不會越界(要求使用者保證)。 使用實例: 假定要找第一對不等元素,只要定義一個相等函數(shù): int equal(int m, int n) { return m == n。 } 假定 a和 b是數(shù)組 , 要考慮前 20個元素: int *p。 p = mismatch(a, a+20, b, equal)。 假設(shè)需要找兩個數(shù)組前 30個元素中第一對奇偶性不同的元素 , 只需定義下面函數(shù): int parity(int m, int n) { return m%2==n%2。 } 調(diào)用: p = mismatch(a, a+30, b, parity)。 本章要點(diǎn): ? 指針的概念、定義和基本操作 ? 以指針為參數(shù)的函數(shù)。特別是通過指針參數(shù)從函數(shù)里向外傳遞信息(三個要素) ? 指針與數(shù)組的關(guān)系,指針運(yùn)算(指針?biāo)阈g(shù)) ? 動態(tài)存儲分配的基本技術(shù) ? 指向函數(shù)的指針 此外: ? 類型的描述和解讀, typedef ? 指針數(shù)組和命令行參數(shù)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1