C程序設(shè)計(jì)復(fù)習(xí)要點(diǎn)_第1頁
C程序設(shè)計(jì)復(fù)習(xí)要點(diǎn)_第2頁
C程序設(shè)計(jì)復(fù)習(xí)要點(diǎn)_第3頁
C程序設(shè)計(jì)復(fù)習(xí)要點(diǎn)_第4頁
C程序設(shè)計(jì)復(fù)習(xí)要點(diǎn)_第5頁
已閱讀5頁,還剩228頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C程序設(shè)計(jì)技術(shù)

復(fù)習(xí)要點(diǎn)

一.基本概念部分C語言的基本概念(數(shù)據(jù)類型,常量,變量,表達(dá)式的書寫方法等)①當(dāng)兩個(gè)整數(shù)相除時(shí),得到的結(jié)果仍然是整數(shù)。既取整運(yùn)算。例如:7/5結(jié)果為1,-7/5結(jié)果為-1,3/5結(jié)果為0.②求模運(yùn)算就是求余數(shù),參加求模運(yùn)算的兩個(gè)對象必須都是整型對象,運(yùn)算結(jié)果的符號(hào)與第一個(gè)運(yùn)算對象相同。例如:7%5結(jié)果為2,-7%5結(jié)果為-2,7%(-5)=2。優(yōu)先級(jí)高(

)

函數(shù)

++、--*、/、%+、-優(yōu)先級(jí)低典型運(yùn)算符的使用(++,--,復(fù)合賦值等)復(fù)合賦值符:凡是雙目運(yùn)算符都可以與賦值運(yùn)算符一起組成復(fù)合賦值符,其結(jié)合性為右結(jié)合性。這些復(fù)合賦值符共有10個(gè),它們是:

+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=++i、--i。自增、自減運(yùn)算符的前綴形式對變量實(shí)施的運(yùn)算是“先增/減值后引用”。i++、i--。自增、自減運(yùn)算符的后綴形式對變量實(shí)施的運(yùn)算是”先引用后增/減值”。 例1-9自增、自減運(yùn)算符使用示例。

例1-14表達(dá)式混合運(yùn)算中的自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換示例。例1-15表達(dá)式混合運(yùn)算中的強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換示例。高

double←float↑long↑unsigned↑低

int←short,char圖1.4系統(tǒng)自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換規(guī)則關(guān)系運(yùn)算和邏輯運(yùn)算3)關(guān)系運(yùn)算的結(jié)果表示:在C程序設(shè)計(jì)語言中沒有邏輯數(shù)據(jù)類型,所以在進(jìn)行關(guān)系運(yùn)算時(shí):用數(shù)值“1”表示邏輯概念上的“真”,用數(shù)值“0”表示邏輯概念上的“假”;例如:5>=5 /*結(jié)果為1*/10==10 /*結(jié)果為1*/5!=5 /*結(jié)果為0*/5>3 /*結(jié)果為1*/3>5 /*結(jié)果為0*/

例2-1關(guān)系運(yùn)算示例。

該程序運(yùn)行執(zhí)行語句c=5-1>=a+2<=b-21;時(shí),首先計(jì)算其右邊的關(guān)系表達(dá)式5-1>=a+2<=b-21。關(guān)系表達(dá)式中數(shù)據(jù)對象a+2的前后各有一個(gè)同優(yōu)先級(jí)的關(guān)系運(yùn)算符>=和<=,它們的結(jié)合性為左結(jié)合性,所以數(shù)據(jù)對象a+2先與左邊的運(yùn)算符>=結(jié)合,即先計(jì)算表達(dá)式5-1>=a+2得到結(jié)果0,然后計(jì)算表達(dá)式0<=b-21的結(jié)果也為0,最后將該0值賦值給變量c。所以,該程序運(yùn)行的輸出結(jié)果為:c=0

①對邏輯表達(dá)式從左到右掃描求解;②在邏輯表達(dá)式的求解過程中,任何時(shí)候只要邏輯表達(dá)式的值已經(jīng)可以確定,則求解過程不再進(jìn)行。例如有定義:inta=1,b=2,c=0;,則邏輯表達(dá)式a++||b++&&c++的計(jì)算過程得到結(jié)論為:邏輯表達(dá)式的值為1、變量a的值為2、變量b的值為2(原值)、變量c的值為0(原值)。

例2-3關(guān)系表達(dá)式運(yùn)算和邏輯表達(dá)式運(yùn)算示例。例2-2邏輯表達(dá)式運(yùn)算示例?;究刂平Y(jié)構(gòu)(特別注意++,--運(yùn)算符進(jìn)入條件表達(dá)式)流程控制語句

⑴條件語句 if~else~⑵循環(huán)語句 for語句、while語句、do~while語句⑶提前結(jié)束本次循環(huán)語句 continue⑷循環(huán)或多分支終止語句 break⑸無條件轉(zhuǎn)移語句 goto⑹返回語句 return復(fù)合表達(dá)式語句

C語言允許把一組語句括在花括號(hào)之中構(gòu)成一個(gè)語句塊,稱之為復(fù)合語句。例如

{charch; ch=getchar(); putchar(ch);}要特別注意各控制結(jié)構(gòu)的流程2.2.6switch語句與程序的多分支結(jié)構(gòu)switch(expession)

{ caseconstand1: sentences1; break; caseconstand2: sentences2; break; … caseconstandN: sentencesN; break; default: sentencesN+1 }2)執(zhí)行過程:首先,對作為條件的表達(dá)式(expression)求值;然后,在語句結(jié)構(gòu)的花括號(hào)內(nèi)從上至下查找所有的case分支,當(dāng)找到與條件表達(dá)式值相匹配的case時(shí),將其作為控制流程執(zhí)行的入口,并從此處開始執(zhí)行相應(yīng)的語句段,直到遇到break語句或者是switch語句結(jié)構(gòu)的右花括號(hào)“}”為止。

switch(number){case1:statement1;case2:

statement2;case3:statement3;default:statement4;}statement5;?2習(xí)題:P84頁,一、6.For(i=1;i++<4;);后,循環(huán)控制變量i的值是?要特別注意該題,分析該題;理解該題的考點(diǎn)!特別注意++,--運(yùn)算符進(jìn)入條件表達(dá)式!?。?!數(shù)組的定義和數(shù)組元素的訪問例3-3用數(shù)組存放一組統(tǒng)計(jì)數(shù)據(jù),然后用“*”表示的條形圖輸出這組數(shù)據(jù)。程序輸出效果如下所示:ElementValueStriation111***********23***37*******410**********520********************例3-4打印如下所示的楊輝三角形的前10行(要求使用一維數(shù)組處理)例3-5在二維數(shù)組a[3][4]中依次選出各行最大元素值存入一維數(shù)組b[3]對應(yīng)元素中。

程序運(yùn)行結(jié)果:arraya:31687654321110810251227arrayb:87108273.3.2常用排序方法

3.3.3常用查找方法

例3-9編程序?qū)崿F(xiàn)冒泡排序算法,對隨機(jī)生成的20個(gè)整數(shù)按升序進(jìn)行排序并輸出。上面程序中用變量flag作為標(biāo)志,每一趟排序開始時(shí)將其設(shè)置為0,當(dāng)本趟排序過程中有數(shù)據(jù)交換時(shí)將flag設(shè)置為1,表示數(shù)據(jù)還沒有排序完成;當(dāng)本趟排序過程中沒有一次數(shù)據(jù)交換時(shí),flag保持為0值,表示被排序的數(shù)據(jù)已經(jīng)完全滿足排序的要求,沒有必要再繼續(xù)進(jìn)行以后的排序過程,程序中用break語句退出排序循環(huán)。程序的一次執(zhí)行結(jié)果為:Beforesorting...29331365849867166487826487775331630294524213695312384965Aftersorting...53165123136166242293294331365487487630775826849849867953例3-10編程序?qū)崿F(xiàn)選擇排序算法,對隨機(jī)生成的20個(gè)整數(shù)按升序進(jìn)行排序并輸出。程序的一次運(yùn)行結(jié)果為:Beforesorting...341745454988096269134335675601304795059596143851634830665Aftersorting...7495961301433414334794985055455605676266346658098308519131.順序查找(Linearsearch)順序查找又稱為線性查找。其基本過程是:從待查表中的第一個(gè)記錄開始,將給定的關(guān)鍵字值與表中每一個(gè)記錄的關(guān)鍵字值逐個(gè)進(jìn)行比較。如果找到相符合的記錄時(shí),查找成功,如果查找到標(biāo)得末端都未找到相符合的記錄時(shí),查找失敗。順序查找法適應(yīng)于被查找集合無序的場合。例3-11編程序?qū)崿F(xiàn)順序查找算法,在隨機(jī)生成的20個(gè)整數(shù)中查找指定值,要求程序能夠顯示出查找進(jìn)行比較的次數(shù)以及本次查找成功與否。程序的一次運(yùn)行結(jié)果為:請輸入被查找的整數(shù)值:43被查找數(shù)據(jù)集合如下...155704364171045896395155167049561212查找'43'成功,共進(jìn)行了4次比較。例3-12編程序?qū)崿F(xiàn)折半查找算法,在隨機(jī)生成的20個(gè)整數(shù)中查找指定值,要求程序能夠顯示出查找進(jìn)行比較的次數(shù)以及本次查找成功與否。程序中首先輸出隨機(jī)產(chǎn)生、未經(jīng)排序的查找數(shù)據(jù)集合,執(zhí)行結(jié)果中用數(shù)組元素形式顯示出來的是排序后與查找關(guān)鍵字key值相同的元素。程序的一次執(zhí)行結(jié)果如下所示:下面是未排序的查找數(shù)據(jù)集合...412891838662969341577947129436345636297請輸入被查找的關(guān)鍵字值:91查找a[15]成功,共進(jìn)行了4次比較。函數(shù)的定義,聲明和調(diào)用C程序的一般結(jié)構(gòu)C程序源文件1…源文件i源文件n函數(shù)1預(yù)處理語句函數(shù)m說明/定義部分執(zhí)行語句部分圖4.1C程序的一般結(jié)構(gòu)……宏代換(不帶參,帶參)宏定義分為代參數(shù)的宏定義和不代參數(shù)的宏定義兩種。1.不代參數(shù)的宏定義不代參數(shù)的宏定義編譯預(yù)處理語句的一般形式是:

#define 宏標(biāo)識(shí)符字符串宏調(diào)用的格式為: 宏標(biāo)識(shí)符宏調(diào)用的作用是:在宏定義的作用范圍之內(nèi),將所有的宏標(biāo)識(shí)符用指定的字符串替換。式中,宏標(biāo)識(shí)符也稱為宏名或常量標(biāo)識(shí)符,習(xí)慣上使用大寫字母書寫。在C程序的設(shè)計(jì)中,正確地理解宏定義的關(guān)鍵在于理解宏調(diào)用僅僅就是一個(gè)替換而不會(huì)進(jìn)行任何的合并、計(jì)算等等操作。在閱讀理解包含宏調(diào)用問題的C程序時(shí)一定要做到先將宏替換完成、然后操作宏替換完成后的表達(dá)式例4.25宏調(diào)用替換問題的理解示例。/*Name:ex04-25.cpp*/#include<stdio.h>#defineN2#defineMN+2#defineMN2*Mvoidmain(){ intx=MN; printf("x=%d\n",x); }錯(cuò)誤的理解方式是:N←2、M←4(2+2)、MN←8(2*4),從而認(rèn)為上面程序的輸出結(jié)果是x=8。正確理解的方式應(yīng)為:MN←2*N+2、MN←2*2+2,因而程序執(zhí)行的正確結(jié)果:x=6。帶參數(shù)的宏定義在C程序設(shè)計(jì)過程中如果有需要,也可以使用帶參數(shù)的宏定義。定義代參數(shù)的宏定義的一般形式如下:

#define宏標(biāo)識(shí)符(形參表)表達(dá)式樣式字符串 宏調(diào)用的格式為: 宏標(biāo)識(shí)符(實(shí)參表) 宏調(diào)用的作用是:在宏定義的作用范圍之內(nèi),將所有的宏標(biāo)識(shí)符用指定的表達(dá)式樣式字符串替換,然后用宏調(diào)用中的實(shí)際參數(shù)代替通過替換形成的表達(dá)式中的形式參數(shù)。在程序設(shè)計(jì)中使用帶參數(shù)宏定義時(shí),為了避免當(dāng)實(shí)際參數(shù)本身是表達(dá)式時(shí)引起的宏調(diào)用錯(cuò)誤,在定義代參數(shù)的宏定義時(shí)最好將宏定義中表達(dá)式的形式參數(shù)用括號(hào)括起來,下面的例4.26展示了這方面的問題。例4.26代參數(shù)宏定義使用示例(不能正確處理表達(dá)式樣式實(shí)際參數(shù))。/*Name:ex04-26.cpp*/#include<stdio.h>#definePI3.145926#defineS(r)PI*r*rvoidmain(){ doublea,b,area1,area2; a=3.3; b=3.2; area1=S(a); area2=S(a+b); printf("area1=%f\narea2=%f\n",area1,area2);}例4.27宏調(diào)用替換問題的理解示例。/*Name:ex04-27.cpp*/#include<stdio.h>#defineMin(x,y)(x)<(y)?(x):(y)voidmain(){ inta=1,b=2,c=3,d=4,t; t=Min(a+b,c+d)*1000; printf("t=%d\n",t);}正確結(jié)果為:t=3返回指針函數(shù)和指向函數(shù)指針的定義和簡單應(yīng)用例5-1編程序計(jì)算下面公式,其中n從鍵盤輸入,并要求在程序中使用指向函數(shù)的指針變量。FFTT圖5.1例5.1程序流程圖開始n>=1n%=0fp=f1fp=f2使用(*fp)調(diào)用函數(shù)結(jié)束輸入n值輸出結(jié)果值輸出數(shù)據(jù)錯(cuò)誤信息結(jié)合”關(guān)于指針的復(fù)習(xí)PPT”復(fù)習(xí)求解高階方程的根在對高階方程的討論中知道,高階方程都是類似的,其形式可以用f(x)=0來表示,也就是說被求根的函數(shù)用C語言都可表示成為如下所示結(jié)構(gòu)C函數(shù):doublef(doublex){ …}因而指向被求根函數(shù)的指針變量的一般形式為:

double(*fp)(doublex);對于使用牛頓迭代法的通用求根函數(shù)而言,在函數(shù)的參數(shù)表中應(yīng)該包含三個(gè)形式參數(shù):一個(gè)是求根時(shí)指定的根的初始值,另外兩個(gè)是用于接受外界傳遞進(jìn)來的函數(shù)實(shí)參以及導(dǎo)函數(shù)實(shí)參的指向函數(shù)的指針變量。例5-2二分法求高階方程根的通用函數(shù)。例5-3利用已有的通用函數(shù)按給定條件求下面高階方程的根。指向函數(shù)的指針與函數(shù)型參數(shù)的實(shí)現(xiàn)被積函數(shù)的形式均為有一個(gè)實(shí)型自變量且所積結(jié)果是實(shí)型數(shù)據(jù),所以在求定積分的通用函數(shù)的返回值數(shù)據(jù)類型應(yīng)為double,通用函數(shù)的參數(shù)有下面四個(gè):與被積函數(shù)對應(yīng)的指向函數(shù)的指針:

double(*p)(floatx)積分區(qū)間的下限:floata積分區(qū)間的上限:floatb按精度所需的積分區(qū)間等分?jǐn)?shù):intn

函數(shù)與指針返回指針值的函數(shù)例5-6求#include<stdio.h>long*fac(longnvoidmain(){ longn,i,sum=0,*pi; printf("Inputn:");for(i=1;i<=n;i++) sum+=*fac(i); scanf("%ld",&n); for(i=1;i<=n;i++) { pi=fac(i sum=sum+*pi; } printf("Sun=%ld\n",sum}long*fac(longn)//函數(shù)的定義{ staticlongp=1; p*=n; return&p;}用指針引用數(shù)組元素的方式結(jié)合“關(guān)于指針復(fù)習(xí).ppt”復(fù)習(xí)!二.重點(diǎn)知識(shí)點(diǎn)整型數(shù)據(jù)的拆分以及特定數(shù)碼的統(tǒng)計(jì)注意模運(yùn)算及如何提取一個(gè)整型數(shù)據(jù)的每一位字符串的常見操作(在字符串中刪除指定字符,統(tǒng)計(jì)字符串中的特定字符功能的實(shí)現(xiàn))在字符串中刪除指定的字符

在字符串中刪除指定字符操作的基本思想是:首先在字符串中查找指定字符的位置,若找到則將字符串中自該位置以后所有字符依次向前移動(dòng)一個(gè)字符位置即可。

例7-18函數(shù)原型為:voiddeletechr(chars[],charc);,其功能是在字符串中刪除指定字符,若指定字符不存在則顯示相應(yīng)提示信息。請編制該函數(shù)并用相應(yīng)主函數(shù)進(jìn)行測試。字符串中字符的查找

所謂字符串中字符的查找就是按照指定的方向?qū)ふ抑付ㄗ址谝淮卧谧址谐霈F(xiàn)的位置。在字符串中查找指定的字符從查找方向上可以分為正向查找(從串首部至串尾)和反向查找(從串尾部至串首),從獲取被查找字符位置信息上可以分為返回下標(biāo)序號(hào)方式和返回字符存放地址方式。統(tǒng)計(jì)字符串中的特定字符的個(gè)數(shù)時(shí),需要先查找到特定字符,然后計(jì)數(shù)字符串中正向查找指定字符 在字符串中正向查找指定字符第一次出現(xiàn)位置的基本思想是:從被操作字符串的第一個(gè)字符開始循環(huán)依次取出被操作字符串當(dāng)前位置的字符與指定的字符相比較,若比較相符合則返回該字符的位置;否則進(jìn)行下一輪比較直到被處理的字符串中所有字符取完為止。例7-13編制函數(shù)實(shí)現(xiàn)功能:在字符串中正向查找指定的字符,若被查找字符存在則返回字符在字符串中的下標(biāo)序號(hào);若指定的字符在被查找的字符串中不存在,則返回-1;并用相應(yīng)主函數(shù)進(jìn)行測試。 例7-14編程序?qū)崿F(xiàn)功能:利用上面設(shè)計(jì)的字符查找函數(shù)求兩個(gè)字符串中共同具有的字符并將這些字符組成第三個(gè)字符串,注意相同字符只能取一次。 例7-15重寫例7.14程序,要求使用標(biāo)準(zhǔn)庫函數(shù)strchr在字符串中查找指定字符。字符串中反向查找指定字符 在字符串中反向查找指定字符第一次出現(xiàn)位置的基本思想是:從被操作字符串的最后一個(gè)字符開始循環(huán)依次取出被操作字符串當(dāng)前位置的字符與指定的字符相比較,若比較相符合則返回該字符的位置;否則進(jìn)行下一輪比較直到被處理的字符串中所有字符取完為止。例7-16編制函數(shù)實(shí)現(xiàn)功能:在字符串中反向查找指定的字符,若被查找字符存在則返回字符在字符串中的下標(biāo)序號(hào);若指定的字符在被查找的字符串中不存在,則返回-1;并用相應(yīng)主函數(shù)進(jìn)行測試。函數(shù)的指針參數(shù)(利用指針參數(shù)返回多個(gè)值)結(jié)合”關(guān)于指針復(fù)習(xí).ppt”復(fù)習(xí)數(shù)組的定義,初始化,數(shù)組元素的引用;數(shù)組做函數(shù)的參數(shù)使用方法在C程序設(shè)計(jì)中,既可以用數(shù)組的元素作為函數(shù)的參數(shù),也可以將數(shù)組看成一個(gè)整體作為函數(shù)的參數(shù)。使用數(shù)組元素作為參數(shù)傳遞,其用法都與普通變量用法一樣,實(shí)現(xiàn)的是函數(shù)間的傳值調(diào)用。/*Name:ex04-07.cpp*/#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5voidmain(){ voidmyprint(intx); inta[N],b[N][N],i,j; srand(time(NULL)); printf("下面是數(shù)組a的數(shù)據(jù)...\n"); for(i=0;i<N;i++) { a[i]=rand()%100; myprint(a[i]); }printf("\n下面是數(shù)組b的數(shù)據(jù)...\n"); for(i=0;i<N;i++) { for(j=0;j<N;j++) { b[i][j]=rand()%100;

myprint(b[i][j]); } printf("\n"); }}voidmyprint(intx){ printf("%4d",x);}將數(shù)組看成一個(gè)整體作為函數(shù)參數(shù)時(shí),用數(shù)組名作為函數(shù)的形式參數(shù)或?qū)嶋H參數(shù),實(shí)現(xiàn)的是函數(shù)間的傳地址值調(diào)用,下面分別討論一維數(shù)組和二維數(shù)組作為函數(shù)參數(shù)的問題。數(shù)組參數(shù)傳遞函數(shù)調(diào)用

1.一維數(shù)組名作為函數(shù)參數(shù)實(shí)現(xiàn)的是“傳地址值調(diào)用”,其本質(zhì)是將它的全部存儲(chǔ)區(qū)域或者部分存儲(chǔ)區(qū)域提供給形式參數(shù)數(shù)組共享,即形參數(shù)組與實(shí)參數(shù)組是同一存儲(chǔ)區(qū)域或者形參數(shù)組是實(shí)參數(shù)組存儲(chǔ)區(qū)域的一部分。存儲(chǔ)關(guān)系如下圖:實(shí)參數(shù)組a…形參數(shù)組b[]注:形參數(shù)組b本質(zhì)上是指針變量圖4.6數(shù)組存儲(chǔ)區(qū)域全部共享時(shí)形參數(shù)組與實(shí)參數(shù)組的關(guān)系需要把實(shí)參數(shù)組中從某個(gè)元素值后的部分傳遞給被調(diào)函數(shù)中的形參數(shù)組,則使用實(shí)參數(shù)組某個(gè)元素的地址(參見4.7)。實(shí)參數(shù)組&a[2]…形參數(shù)組b[]注:形參數(shù)組b本質(zhì)上是指針變量圖4.7數(shù)組存儲(chǔ)區(qū)域部分共享時(shí)形參數(shù)組與實(shí)參數(shù)組的關(guān)系例4.8編制求和函數(shù)并通過該函數(shù)求數(shù)組的元素值和。intsum(intv[],intn){ inti,s=0; for(i=0;i<n;i++) s+=v[i]; returns;}/*Name:ex04-08.cpp*/#include<stdio.h>#defineN10voidmain(){ intsum(intv[],intn); inta[N]={1,2,3,4,5,6,7,8,9,10},total; total=sum(a,N); printf("total=%ld\n",total);}例4.9編制求和函數(shù)并通過該函數(shù)求數(shù)組自某一元素后的所有元素值和,起始點(diǎn)元素序號(hào)從鍵盤上輸入。/*Name:ex04-09.cpp*/#include<stdio.h>#defineN10voidmain(){intsum(intv[],intn);inta[N]={1,2,3,4,5,6,7,8,9,10},total,pos;printf("請輸入求和起始元素序號(hào):");scanf("%d",&pos);total=sum(&a[pos],N-pos);printf("total=%ld\n",total);}intsum(intv[],intn){ inti,s=0; for(i=0;i<n;i++) s+=v[i]; returns;}比較例4.8和例4.9的程序,可以發(fā)現(xiàn)函數(shù)sum沒有任何改變,程序中有所改變的是主調(diào)函數(shù)中的調(diào)用表達(dá)式:sum(&a[pos],N-pos),其中,參數(shù)&a[pos]表示將數(shù)組a自a[pos]元素以后的元素全部提供給形參數(shù)組共享,N-pos是傳遞到函數(shù)add中共享的數(shù)組元素個(gè)數(shù)。2.二維數(shù)組作函數(shù)的參數(shù)數(shù)組a的起始地址數(shù)組的起始地址表示方法a 表示平面的起始地址(二級(jí)地址)&a[0][0]表示線性的起始地址(一級(jí)地址)a[0]表示線性的起始地址(一級(jí)地址)*a表示線性的起始地址(一級(jí)地址)圖4.8二維數(shù)組起始地址的表示方法示意

二維數(shù)組在存儲(chǔ)時(shí)也是有序地占用一片連續(xù)的內(nèi)存區(qū)域,數(shù)組的名字表示這段存儲(chǔ)區(qū)域的首地址。需要特別注意的是,二維數(shù)組起始地址有多種表示方法,而且這些表示方法在物理含義上還有表示平面起始地址和表示線性起始地址之分,所以在使用二維數(shù)組的起始地址使必須注意區(qū)分需要用哪一種起始地址。

例4.10編制求二維矩陣最大元素的函數(shù)(假定矩陣為3行4列),用相應(yīng)主函數(shù)進(jìn)行測試。/*Name:ex04-10.cpp*/#include<stdio.h>#defineM3#defineN4voidmain(){ intmax(intv[][N]); inta[M][N]={38,23,56,9,56,2,789,45,76,7,45,34}; printf("Maxvalueis:%d\n",max(a));}intmax(intv[][N]) //注意數(shù)組參數(shù)只能省略最高為的長度指定{ inti,j,maxv; maxv=v[0][0]; for(i=0;i<M;i++) for(j=0;j<N;j++) if(v[i][j]>maxv) maxv=v[i][j]; returnmaxv;}(1)用二維數(shù)組名字作為實(shí)際參數(shù)實(shí)參用a,形參用b[][5]圖4.9實(shí)際參數(shù)為二維數(shù)組名字,用二維數(shù)組名作為函數(shù)參數(shù)實(shí)現(xiàn)的是“傳地址值調(diào)用”,其本質(zhì)仍然是在函數(shù)調(diào)用期間實(shí)際參數(shù)數(shù)組將它的全部存儲(chǔ)區(qū)域提供給形式參數(shù)數(shù)組共享,即形參數(shù)組與實(shí)參數(shù)組是同一存儲(chǔ)區(qū)域。實(shí)參用a形參用b[][5]圖4.9實(shí)際參數(shù)為二維數(shù)組名字例4.10程序的函數(shù)max中使用了二維數(shù)組樣式的形式參數(shù)接收從主調(diào)函數(shù)中傳遞過來的二維數(shù)組首地址,使得形參數(shù)組v共享實(shí)參數(shù)組a的存儲(chǔ)區(qū)域;然后通過對形參數(shù)組v的操作達(dá)到操作是參數(shù)a的目的,即在形參數(shù)數(shù)組v中尋找最大值實(shí)質(zhì)上是在實(shí)參數(shù)組a中尋找最大值,程序執(zhí)行的結(jié)果為:Maxvalueis:789。(2)用二維數(shù)組起始地址的一級(jí)地址形式作為實(shí)際參數(shù)在實(shí)際計(jì)算機(jī)應(yīng)用的程序設(shè)計(jì)中有時(shí)需要能夠處理任意行列大小的二維數(shù)組的函數(shù)(例如要求上例中的函數(shù)max能夠查找任意二維數(shù)組中的最大元素),此時(shí)直接用二維數(shù)組作為形式參數(shù)的設(shè)計(jì)形式就不太適合。

為了編制較通用的函數(shù),可以借助一維數(shù)組作為形式參數(shù)時(shí)可以不指定長度的特點(diǎn),使用一維數(shù)組樣式的形式參數(shù)接收二維數(shù)組實(shí)參,數(shù)組存儲(chǔ)區(qū)域全部共享或部分共享時(shí)形參數(shù)組與實(shí)參數(shù)組的關(guān)系如圖4.10所示。實(shí)參數(shù)組a…形參數(shù)組b[]注:形參數(shù)組b本質(zhì)上是指針變量圖4.6數(shù)組存儲(chǔ)區(qū)域全部共享時(shí)形參數(shù)組與實(shí)參數(shù)組的關(guān)系在實(shí)現(xiàn)這種參數(shù)傳遞時(shí)還須注意以下兩點(diǎn):①函數(shù)調(diào)用時(shí)的實(shí)際參數(shù)必須是一級(jí)地址形式(參見圖4.8中列出的3種以及地址方式),同時(shí)將二維數(shù)組的行數(shù)和列數(shù)傳遞到被調(diào)函數(shù)中。②由于在被調(diào)函數(shù)中只知道被處理得二維數(shù)組的起始地址,所以在處理過程中二維數(shù)組每一行的長度由程序員根據(jù)參數(shù)表中傳遞過來信息自己控制。例4.11重新編制例4.10中的函數(shù)max,使其能夠處理任意行列的二維數(shù)組。/*Name:ex04-11.cpp*/#include<stdio.h>#defineM3#defineN4voidmain(){ intmax(intv[],intm,intn); inta[M][N]={38,23,56,9,56,2,789,45,76,7,45,34}; printf("Maxvalueis:%d\n",max(a[0],M,N));}intmax(intv[],intm,intn){ inti,j,maxv; maxv=v[0]; for(i=0;i<m;i++) for(j=0;j<n;j++) if(v[i*n+j]>maxv) maxv=v[i*n+j]; returnmaxv;}程序中函數(shù)max用一維數(shù)組樣式的形式參數(shù)v來接收從主調(diào)函數(shù)中傳遞過來的二維數(shù)組首地址,注意到二維數(shù)組的名字表示的是二級(jí)地址,所以被傳遞的二維數(shù)組的首地址不能直接用二維數(shù)組名表示而應(yīng)該使用3種一級(jí)地址形式,本示例中使用的是a[0],還可以使用&a[0][0]和*a形式。在被調(diào)函數(shù)中將傳遞過來的二維數(shù)組當(dāng)作一維數(shù)組處理,其元素對應(yīng)關(guān)系應(yīng)該是:a[i][j]→v[i*n+j]。程序執(zhí)行的結(jié)果為:Maxvalueis:789?;究刂平Y(jié)構(gòu)的使用(字符圖形的輸出,最大公約數(shù)最小公倍數(shù),素?cái)?shù),窮舉法,迭代法的簡單實(shí)用)例2-20編程序輸出如下所示由字符構(gòu)成的圖形。

例2-21編程序在屏幕上打印出如下所示的乘法九九表。*12345678911224336944812165510152025661218243036771421283542498816243240485664991827364554637281復(fù)習(xí)這些例題例2-25求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)。

2.5.2窮舉思想及程序?qū)崿F(xiàn)窮舉方法的實(shí)現(xiàn)主要依賴于以下兩個(gè)基本要點(diǎn):①搜尋可能值的范圍如何確定。②被搜尋可能值的判定方法。對于被搜索的可能值,一般都是問題中所要查找的對象或者是要查找對象應(yīng)該滿足的條件,因而在問題中都會(huì)有清晰的描述。但對于搜尋范圍,在有些問題是比較確定的,而在另外一些問題則是不確定的。

例2-26編程序找出所有的“水仙花數(shù)”?!八苫〝?shù)”是指一個(gè)3位數(shù),其各位上數(shù)字的立方之和等于這個(gè)數(shù)本身。例如153=13+53+33,所以153是“水仙花數(shù)”。

例2-22編制程序?qū)崿F(xiàn)功能:從鍵盤輸入兩個(gè)正整數(shù)a(a>2)和b,求a與b之間的全部素?cái)?shù)。

例2-27搬磚問題:36塊磚,36人搬,男搬4,女搬3,兩個(gè)小孩抬1磚。要求將所有的磚一次搬完,問需要男、女、小孩各多少?

例2-28愛因斯坦階梯問題。設(shè)有一階梯,每步跨2階,最后余1階;每步跨3階,最后余2階;每步跨5階,最后余4階;每步跨6階,最后余5階;只有每步跨7階時(shí),正好到階梯頂。問共有多少步階梯?

2.5.3迭代思想及程序?qū)崿F(xiàn)迭代就是一個(gè)不斷地由變量的舊值按照一定的規(guī)律推出變量的新值的過程,迭代亦稱為遞推。迭代一般與三個(gè)因素有關(guān),它們是:①初始值,②迭代公式,③迭代結(jié)束條件(迭代次數(shù))。

例2-29裴波那契(Fibonacci)數(shù)列問題。裴波那契數(shù)列的前兩個(gè)數(shù)據(jù)項(xiàng)都是1,從第3個(gè)數(shù)據(jù)項(xiàng)開始,其后的每一個(gè)數(shù)據(jù)項(xiàng)都是其前面的兩個(gè)數(shù)據(jù)項(xiàng)之和。例題分析:設(shè)f1、f2和f3表示相鄰的3個(gè)裴波那契數(shù)據(jù)項(xiàng),據(jù)題意有f1、f2的初始值為1,即迭代的初始條件為:f1=f2=1;迭代的公式為:f3=f1+f2。有初始條件和迭代公式只能描述前3項(xiàng)之間的關(guān)系,為了反復(fù)使用迭代公式,可以在每一個(gè)數(shù)據(jù)項(xiàng)求出后將f1、f2和f3順次向后移動(dòng)一個(gè)數(shù)據(jù)項(xiàng),即將f2的值賦給f1,f3的值賦給f2,從而構(gòu)成如下的迭代語句序列:f3=f1+f2;、f1=f2;、f2=f3;,反復(fù)使用該語句序列就能夠求出所要求的裴波那契數(shù)列。

例2-30用牛頓迭代法求方程x4-4x3+6x2-8x-8=0在0附近的根。例2-31用二分迭代法求方程2x3-4x2+3x-6=0在(-10,10)之間的根。例2-32用割線法求方程2x3-4x2+3x-6=0在(-10,10)之間的根。

函數(shù)的遞歸調(diào)用一個(gè)函數(shù)直接地或間接地自己調(diào)用自己,稱為函數(shù)的遞歸調(diào)用。函數(shù)的遞歸調(diào)用可以看成是一種特殊的函數(shù)嵌套調(diào)用,它與一般的嵌套調(diào)用相比較有幾個(gè)不同的特點(diǎn):(1)遞歸調(diào)用中每次嵌套調(diào)用的函數(shù)都是該函數(shù)本身;(2)遞歸調(diào)用不會(huì)無限制進(jìn)行下去,即這種特殊的自己對自己的嵌套調(diào)用總會(huì)在某種條件下結(jié)束。例4.14編程序使用遞歸方式求n!。/*Name:ex04-14.cpp*/#include<stdio.h>voidmain(){ longfac(longn); longn,result; printf("Inputthen:"); scanf("%ld",&n); result=fac(n); printf("%ld!=%ld\n",n,result);}longfac(longn){ if(n<=1) return1; else returnfac(n-1)*n;}fac(5)等于120fac(5)→5*fac(4)fac(4)→4*fac(3)fac(3)→3*fac(2)fac(2)→2*fac(1)fac(1)→1遞歸壓棧方向fac(2)→2*fac(1)→2*1→2fac(3)→3*fac(2)→3*2→6fac(4)→4*fac(3)→4*6→24fac(5)→5*fac(4)→5*24→120遞歸回溯方向圖4.12函數(shù)遞歸調(diào)用過程示意圖執(zhí)行如下:遞歸是程序設(shè)計(jì)中一種非常重要的技術(shù),與程序設(shè)計(jì)中其它控制方法策略相比較,遞歸程序設(shè)計(jì)的難度在于遞歸在人類社會(huì)的現(xiàn)實(shí)生活中沒有直接對應(yīng)的概念存在,而必須通過推理分析才能理解遞歸思想進(jìn)而實(shí)現(xiàn)遞歸程序設(shè)計(jì)。在實(shí)際設(shè)計(jì)遞歸函數(shù)程序時(shí),我們可以將重點(diǎn)放在分析遞推公式和遞歸終止條件上,可以忽略系統(tǒng)的具體執(zhí)行過程,只要算法和遞推公式正確,結(jié)論一定是正確的。遞歸的實(shí)質(zhì)是一種簡化復(fù)雜問題求解的方法,它將問題逐步簡化直至趨于已知條件。在簡化的過程中必須保證問題的性質(zhì)不發(fā)生變化,即在簡化的過程中必須保證兩點(diǎn):一是問題簡化后具有同樣的形式;二是問題簡化后必須趨于比原問題簡單一些。具體使用遞歸技術(shù)時(shí),必須能夠?qū)栴}簡化分解為遞歸方程(即問題的形式)和遞歸結(jié)束條件(即最簡單的解)兩個(gè)部分。如例4.14求n的階乘,可以分解得到遞歸方程:n*(n-1)!和遞歸結(jié)束條件:n<=1時(shí)階乘為1。例4.16編程序用遞歸方法求兩個(gè)正整數(shù)的最大公約數(shù)。 可以分析得出如下遞歸關(guān)系:r=m%n=0gcd(n)retuannreturngcd(n,r)TF圖4.14最大公約數(shù)的遞歸算法/*Name:ex04-16.cpp*/#include<stdio.h>voidmain(){ intGcd(intm,intn); intnum1,num2; printf("請輸入兩個(gè)正整數(shù):"); scanf("%d,%d",&num1,&num2); if(num1<num2) num1=num1+num2,num2=num1-num2,num1=num1-num2; printf("%d與%d的最大公約數(shù)是:%d\n",num1,num2,Gcd(num1,num2));}intGcd(intm,intn){ intr; if((r=m%n)==0) returnn; else returnGcd(n,r);}通過上面兩個(gè)示例的分析,遞歸方式的實(shí)現(xiàn)也是基于語言的條件控制結(jié)構(gòu)。遞歸函數(shù)設(shè)計(jì)的基本框架是相對固定的,其一般形式可以描述如下:

if遞歸結(jié)束條件成立

Return已知結(jié)果

else

將問題轉(zhuǎn)化為同性質(zhì)的較簡單子問題;以遞歸方式求解子問題(遞歸方程);例4.15求菲波拉契數(shù)列。已知一對小兔出生一個(gè)月后變成一對成兔,兩個(gè)月后這對成兔就會(huì)生出一對小兔,三個(gè)月后這對成兔將生出第二對小兔,而第一對小兔又長大變成一對成兔,即一月成熟,二月生育,如此類推。請用計(jì)算機(jī)求解一對小兔經(jīng)n月后將繁衍成多少對兔子?可以分析出如下遞歸關(guān)系:

按照上面分析得到的遞歸方程和結(jié)束條件,求菲波拉契數(shù)列的遞歸算法可以設(shè)計(jì)為如圖4.13所示。n=0或者n=1fib(n)retuan1returnfib(n-1)+fib(n-2)TF圖4.13菲波拉契數(shù)列的遞歸算法/*Name:ex04-15.cpp*/#include<stdio.h>voidmain(){ intm; floatfib(intn); printf("請輸入月份數(shù)"); scanf("%d",&m); printf("經(jīng)過%d個(gè)月后,兔子有%.0f對。\n",m,fib(m));}floatfib(intn){ if(n==0||n==1) return1; else returnfib(n-1)+fib(n-2);}全局變量和局部靜態(tài)變量的簡單使用

1.全局變量所謂全局變量,是指定義在C程序中所有函數(shù)外部的變量,全局變量也稱為外部變量。C程序中全局變量的作用域(作用范圍)從其在源程序文件中定義處開始到其所在的源程序文件結(jié)束為止。C語言中全局變量定義的一般形式如下:

[extern]<數(shù)據(jù)類型符>變量表;

在全局變量的定義形式中,關(guān)鍵字extern類型符是C語言中全局變量默認(rèn)的存儲(chǔ)類型,在定義全局變量時(shí)一般將其省略。在C程序中,如果對于全局變量使用了關(guān)鍵字extern,目的是對程序中定義的全局變量進(jìn)行重新聲明,這種聲明方法的意義和使用方法牽涉到多源程序文件C程序,將在4.5節(jié)中予以討論。在定義全局變量時(shí),也可以對其進(jìn)行初始化工作。如果在定義全局變量時(shí)沒有顯式初始化,C的編譯系統(tǒng)會(huì)自動(dòng)將其初始化為0(若是字符類數(shù)據(jù)則初始化為’\0’)。例4.18全局變量的作用域示例(為了討論方便加上行號(hào))。1 /*Name:ex04-18.cpp*/2 #include<stdio.h>3 voidincrea();4 voidincreb();5 intx;6 voidmain()7 { x++;8 increa();9 increb();10 printf("x=%d\n",x); 11 }12 voidincrea()13 {14 x+=5;15 }16 voidincreb()17 {18 x-=2;19 }

程序在第5行定義了整型變量,由于變量x定義在所有函數(shù)的外面,所以變量x是全局變量,其作用范圍(作用域)從第5行開始至第19行結(jié)束。同時(shí)由于在定義全局變量x時(shí)沒有對其顯式初該程序運(yùn)行的結(jié)果為:x=4。3.同名全局變量與局部變量作用域重疊問題在C程序中,全局變量與局部變量的作用域有可能出現(xiàn)重疊的情形。即在某些特定的情況下,可能會(huì)出現(xiàn)全局變量、在函數(shù)內(nèi)部定義的局部變量乃至于在復(fù)合語句中定義的局部變量名字相同的現(xiàn)象,這樣在程序中的某些區(qū)域內(nèi)勢必會(huì)出現(xiàn)若干個(gè)同名變量都起作用的情形.靜態(tài)局部變量定義的一般形式是:static<數(shù)據(jù)類型符>變量表;

在C語言中,靜態(tài)局部變量具有如下特點(diǎn):⑴靜態(tài)局部變量的存儲(chǔ)位置。編譯系統(tǒng)在編譯時(shí)就為靜態(tài)局部變量在系統(tǒng)靜態(tài)存儲(chǔ)區(qū)域中分配存儲(chǔ)空間,靜態(tài)局部變量的存儲(chǔ)空間在程序的整個(gè)運(yùn)行期間是固定的。因而靜態(tài)局部變量的生存期是整個(gè)程序的運(yùn)行周期。⑵靜態(tài)局部變量的初始化。靜態(tài)局部變量的初始化是在源程序被編譯時(shí)進(jìn)行的。如果在定義靜態(tài)局部變量時(shí)沒有對它進(jìn)行顯式的初始化,編譯系統(tǒng)會(huì)自動(dòng)將其初始化為0(若是字符類數(shù)據(jù)則初始化為’\0’)。⑶靜態(tài)局部變量的作用域(作用范圍)。靜態(tài)局部變量也是局部變量,它的值也只能定義它的局部范圍內(nèi)使用,即靜態(tài)局部變量作用域界定方法與自動(dòng)局部變量作用域的界定方法是相同的。離開靜態(tài)局部變量的作用域后,該靜態(tài)局部變量雖然存在,但不能對它進(jìn)行訪問(操作)。⑷靜態(tài)局部變量具有繼承性。在某個(gè)函數(shù)中定義的靜態(tài)局部變量值在函數(shù)的多次調(diào)用中具有可繼承性,即對于某函數(shù)中的靜態(tài)局部變量而言,在函數(shù)被多次調(diào)用時(shí)該靜態(tài)變量是同一變量。例4.23靜態(tài)局部變量與自動(dòng)變量的比較示例(為了討論方便加上行號(hào))。1 /*Name:ex04-23.cpp*/2 #include<stdio.h>3 voidmain()4 { voidf1();5 f1();6 f1();7 }8 voidf1()9 { inta=10;10 staticintb=10;11 a+=100;12 b+=100;13 printf("a=%d,b=%d\n",a,b);14 }上面程序的f1函數(shù)中,在第9行定義了自動(dòng)變量a,初始值為10;在第10行定義了靜態(tài)局部變量b,初始值為10。程序在執(zhí)行時(shí),第5行第一次調(diào)用函數(shù)f1,此時(shí)系統(tǒng)會(huì)為自動(dòng)變量a分配存儲(chǔ)(即創(chuàng)建該變量)并初始化為10;對于靜態(tài)局部變量b而言,在程序編譯時(shí)就分配了存儲(chǔ),即此時(shí)該變量已經(jīng)是存在的;第11行和第12行分別對變量a和變量b增加值100,使得變量a和b的值都為110,程序輸出:a=110,b=110;輸入完結(jié)果后函數(shù)f1執(zhí)行完成,程序的控制流程返回到主函數(shù)中的第6行,注意此時(shí)在函數(shù)f1中定義的變量a被系統(tǒng)自動(dòng)撤銷;根據(jù)靜態(tài)局部變量的特點(diǎn),變量b仍然存在,但由于此時(shí)控制流程在主函數(shù)中,已經(jīng)離開了靜態(tài)局部變量b的作用域,所以靜態(tài)局部變量b雖然存在但在主函數(shù)不能使用。程序在第6行第二次調(diào)用了函數(shù)f1,對于自動(dòng)變量a系統(tǒng)重新為其分配存儲(chǔ)(即重新創(chuàng)建該變量)并初始化為10,但對于靜態(tài)局部變量b則不會(huì)重新創(chuàng)建,使用的就是上一次調(diào)用時(shí)使用的變量b(此時(shí)變量b的值為上一次操作后的結(jié)果110);所以在第二次f1函數(shù)的調(diào)用中程序輸出的結(jié)果為:a=110,b=210。數(shù)組,指針數(shù)組,二級(jí)指針變量的結(jié)合使用結(jié)合“關(guān)于指針復(fù)習(xí).ppt”和”指針與數(shù)組復(fù)習(xí)(教材).ppt”復(fù)習(xí)結(jié)構(gòu)體變量做函數(shù)參數(shù)以及結(jié)構(gòu)體變量的引用形式例8-5結(jié)構(gòu)體變量引用和輸入輸出示例。結(jié)構(gòu)體變量作為函數(shù)參數(shù)結(jié)構(gòu)體類型變量可以作為函數(shù)的參數(shù)在函數(shù)之間進(jìn)行傳遞。使用結(jié)構(gòu)體類型變量作為函數(shù)參數(shù)時(shí),數(shù)據(jù)的傳遞仍然是“值傳遞方式”;實(shí)現(xiàn)方式:函數(shù)調(diào)用時(shí)系統(tǒng)為形參變量開辟一段內(nèi)存單元(按照結(jié)構(gòu)體變量所需要的存儲(chǔ)單元數(shù))以存放從實(shí)參傳遞過去的各結(jié)構(gòu)體變量成員分量的值。

例8-6結(jié)構(gòu)體變量作為函數(shù)參數(shù)使用示例。文件的簡單應(yīng)用(統(tǒng)計(jì)指定數(shù)據(jù),寫入和讀出指定數(shù)據(jù),查詢特定的數(shù)據(jù)和文本行等)

例9-5編程序?qū)崿F(xiàn)統(tǒng)計(jì)文本文件中單詞個(gè)數(shù)的功能,要求被統(tǒng)計(jì)文件名從命令行上帶入。FILE*fp;intcount=0; /*記錄單詞的個(gè)數(shù)*/intspace=1; /*空格標(biāo)志*/charc;if(argc!=2){ printf("Using:commandfilename<CR>\n"); return;}if((fp=fopen(argv[1],"r"))==NULL){ printf("不能打開文件%s\n",argv[1]); return;}while((c=fgetc(fp))!=EOF)switch(c){ case'': case'\t': case'\n': space=1; break; default: if(space) { space=0; count++; }}fclose(fp);printf("文件'%s'中含有%d個(gè)單詞。\n",argv[1],count);空白字符(空格鍵、制表鍵以及換行符)例9-7按每次讀入一行的方式讀入例9.1的源程序文件,并在屏幕上顯示其內(nèi)容。FILE*fp;charstr[100];if((fp=fopen("Ex09-01.cpp","r"))==NULL){ printf("Cannotopenfile...\n"); return;}while(fgets(str,100,fp)!=NULL) printf("%s",str);fclose(fp);例9-9以10度為間隔,求出0~360度之間的所有正弦函數(shù)值、余弦函數(shù)值并將它們寫入指定文件,然后再將這些數(shù)據(jù)讀出并顯示到屏幕上。for(dec=0;dec<=90;dec+=10){ x=dec*3.14159/180; fprintf(f,"%5d:%f,%f\n",dec,sin(x),cos(x));}for(i=0;i<=9;i++){ fscanf(f,"%d:%lf,%lf",&dec,&sinx,&cosx); printf("%5d:%f,%f\n",dec,sinx,cosx);}例9-10將某磁盤文件的所有行加上行號(hào)寫入指定文件,兩個(gè)文件的名字均從命令行帶入。

if((fp1=fopen(argv[1],"r"))==NULL) { printf("Can'topenfile.\n"); return; } if((fp2=fopen(argv[2],"w"))==NULL) { printf("Can'tcreatefile.\n"); return; } line=1; while(fgets(buffer,SIZE,fp1)!=NULL) fprintf(fp2,"%4d:%s",line++,buffer);MagneticResonanceImaging磁共振成像發(fā)生事件作者或公司磁共振發(fā)展史1946發(fā)現(xiàn)磁共振現(xiàn)象BlochPurcell1971發(fā)現(xiàn)腫瘤的T1、T2時(shí)間長Damadian1973做出兩個(gè)充水試管MR圖像Lauterbur1974活鼠的MR圖像Lauterbur等1976人體胸部的MR圖像Damadian1977初期的全身MR圖像

Mallard1980磁共振裝置商品化1989

0.15T永磁商用磁共振設(shè)備中國安科

2003諾貝爾獎(jiǎng)金LauterburMansfierd時(shí)間MR成像基本原理實(shí)現(xiàn)人體磁共振成像的條件:人體內(nèi)氫原子核是人體內(nèi)最多的物質(zhì)。最易受外加磁場的影響而發(fā)生磁共振現(xiàn)象(沒有核輻射)有一個(gè)穩(wěn)定的靜磁場(磁體)梯度場和射頻場:前者用于空間編碼和選層,后者施加特定頻率的射頻脈沖,使之形成磁共振現(xiàn)象信號(hào)接收裝置:各種線圈計(jì)算機(jī)系統(tǒng):完成信號(hào)采集、傳輸、圖像重建、后處理等

人體內(nèi)的H核子可看作是自旋狀態(tài)下的小星球。自然狀態(tài)下,H核進(jìn)動(dòng)雜亂無章,磁性相互抵消zMyx進(jìn)入靜磁場后,H核磁矩發(fā)生規(guī)律性排列(正負(fù)方向),正負(fù)方向的磁矢量相互抵消后,少數(shù)正向排列(低能態(tài))的H核合成總磁化矢量M,即為MR信號(hào)基礎(chǔ)ZZYYXB0XMZMXYA:施加90度RF脈沖前的磁化矢量MzB:施加90度RF脈沖后的磁化矢量Mxy.并以Larmor頻率橫向施進(jìn)C:90度脈沖對磁化矢量的作用。即M以螺旋運(yùn)動(dòng)的形式傾倒到橫向平面ABC在這一過程中,產(chǎn)生能量

三、弛豫(Relaxation)回復(fù)“自由”的過程

1.

縱向弛豫(T1弛豫):

M0(MZ)的恢復(fù),“量變”高能態(tài)1H→低能態(tài)1H自旋—晶格弛豫、熱弛豫

吸收RF光子能量(共振)低能態(tài)1H高能態(tài)1H

放出能量(光子,MRS)T1弛豫時(shí)間:

MZ恢復(fù)到M0的2/3所需的時(shí)間

T1愈小、M0恢復(fù)愈快T2弛豫時(shí)間:MXY喪失2/3所需的時(shí)間;T2愈大、同相位時(shí)間長MXY持續(xù)時(shí)間愈長MXY與ST1加權(quán)成像、T2加權(quán)成像

所謂的加權(quán)就是“突出”的意思

T1加權(quán)成像(T1WI)----突出組織T1弛豫(縱向弛豫)差別

T2加權(quán)成像(T2WI)----突出組織T2弛豫(橫向弛豫)差別。

磁共振診斷基于此兩種標(biāo)準(zhǔn)圖像磁共振常規(guī)h檢查必掃這兩種標(biāo)準(zhǔn)圖像.T1的長度在數(shù)百至數(shù)千毫秒(ms)范圍T2值的長度在數(shù)十至數(shù)千毫秒(ms)范圍

在同一個(gè)馳豫過程中,T2比T1短得多

如何觀看MR圖像:首先我們要分清圖像上的各種標(biāo)示。分清掃描序列、掃描部位、掃描層面。正?;虍惓5乃诓课?--即在同一層面觀察、分析T1、T2加權(quán)像上信號(hào)改變。絕大部分病變T1WI是低信號(hào)、T2WI是高信號(hào)改變。只要熟悉掃描部位正常組織結(jié)構(gòu)的信號(hào)表現(xiàn),通常病變與正常組織不會(huì)混淆。一般的規(guī)律是T1WI看解剖,T2WI看病變。磁共振成像技術(shù)--圖像空間分辨力,對比分辨力一、如何確定MRI的來源(一)層面的選擇1.MXY產(chǎn)生(1H共振)條件

RF=ω=γB02.梯度磁場Z(GZ)

GZ→B0→ω

不同頻率的RF

特定層面1H激勵(lì)、共振

3.層厚的影響因素

RF的帶寬↓

GZ的強(qiáng)度↑層厚↓〈二〉體素信號(hào)的確定1、頻率編碼2、相位編碼

M0↑--GZ、RF→相應(yīng)層面MXY----------GY→沿Y方向1H有不同ω

各1H同相位MXY旋進(jìn)速度不同同頻率一定時(shí)間后→→GX→沿X方向1H有不同ω沿Y方向不同1H的MXYMXY旋進(jìn)頻率不同位置不同(相位不同)〈三〉空間定位及傅立葉轉(zhuǎn)換

GZ----某一層面產(chǎn)生MXYGX----MXY旋進(jìn)頻率不同

GY----MXY旋進(jìn)相位不同(不影響MXY大?。?/p>

↓某一層面不同的體素,有不同頻率、相位

MRS(FID)第三節(jié)、磁共振檢查技術(shù)檢查技術(shù)產(chǎn)生圖像的序列名產(chǎn)生圖像的脈沖序列技術(shù)名TRA、COR、SAGT1WT2WSETR、TE…….梯度回波FFE快速自旋回波FSE壓脂壓水MRA短TR短TE--T1W長TR長TE--T2W增強(qiáng)MR最常用的技術(shù)是:多層、多回波的SE(spinecho,自旋回波)技術(shù)磁共振掃描時(shí)間參數(shù):TR、TE磁共振掃描還有許多其他參數(shù):層厚、層距、層數(shù)、矩陣等序列常規(guī)序列自旋回波(SE),快速自旋回波(FSE)梯度回波(FE)反轉(zhuǎn)恢復(fù)(IR),脂肪抑制(STIR)、水抑制(FLAIR)高級(jí)序列水成像(MRCP,MRU,MRM)血管造影(MRA,TOF2D/3D)三維成像(SPGR)彌散成像(DWI)關(guān)節(jié)運(yùn)動(dòng)分析是一種成像技術(shù)而非掃描序列自旋回波(SE)必掃序列圖像清晰顯示解剖結(jié)構(gòu)目前只用于T1加權(quán)像快速自旋回波(FSE)必掃序列成像速度快多用于T2加權(quán)像梯度回波(GE)成像速度快對出血敏感T2加權(quán)像水抑制反轉(zhuǎn)恢復(fù)(IR)水抑制(FLAIR)抑制自由水梗塞灶顯示清晰判斷病灶成份脂肪抑制反轉(zhuǎn)恢復(fù)(IR)脂肪抑制(STIR)抑制脂肪信號(hào)判斷病灶成分其它組織顯示更清晰血管造影(MRA)無需造影劑TOF法PC法MIP投影動(dòng)靜脈分開顯示水成像(MRCP,MRU,MRM)含水管道系統(tǒng)成像膽道MRCP泌尿路MRU椎管MRM主要用于診斷梗阻擴(kuò)張超高空間分辨率掃描任意方位重建窄間距重建技術(shù)大大提高對小器官、小病灶的診斷能力三維梯度回波(SPGR) 早期診斷腦梗塞

彌散成像MRI的設(shè)備一、信號(hào)的產(chǎn)生、探測接受1.磁體(Magnet):靜磁場B0(Tesla,T)→組織凈磁矩M0

永磁型(permanentmagnet)常導(dǎo)型(resistivemagnet)超導(dǎo)型(superconductingmagnet)磁體屏蔽(magnetshielding)2.梯度線圈(gradientcoil):

形成X、Y、Z軸的磁場梯度功率、切換率3.射頻系統(tǒng)(radio-frequencesystem,RF)

MR信號(hào)接收二、信號(hào)的處理和圖象顯示數(shù)模轉(zhuǎn)換、計(jì)算機(jī),等等;MRI技術(shù)的優(yōu)勢1、軟組織分辨力強(qiáng)(判斷組織特性)2、多方位成像3、流空效應(yīng)(顯示血管)4、無骨骼偽影5、無電離輻射,無碘過敏6、不斷有新的成像技術(shù)MRI技術(shù)的禁忌證和限度1.禁忌證

體內(nèi)彈片、金屬異物各種金屬置入:固定假牙、起搏器、血管夾、人造關(guān)節(jié)、支架等危重病人的生命監(jiān)護(hù)系統(tǒng)、維持系統(tǒng)不能合作病人,早期妊娠,高熱及散熱障礙2.其他鈣化顯示相對較差空間分辨較差(體部,較同等CT)費(fèi)用昂貴多數(shù)MR機(jī)檢查時(shí)間較長1.病人必須去除一切金屬物品,最好更衣,以免金屬物被吸入磁體而影響磁場均勻度,甚或傷及病人。2.掃描過程中病人身體(皮膚)不要直接觸碰磁體內(nèi)壁及各種導(dǎo)線,防止病人灼傷。3.紋身(紋眉)、化妝品、染發(fā)等應(yīng)事先去掉,因其可能會(huì)引起灼傷。4.病人應(yīng)帶耳塞,以防聽力損傷。掃描注意事項(xiàng)顱腦MRI適應(yīng)癥顱內(nèi)良惡性占位病變腦血管性疾病梗死、出血、動(dòng)脈瘤、動(dòng)靜脈畸形(AVM)等顱腦外傷性疾病腦挫裂傷、外傷性顱內(nèi)血腫等感染性疾病腦膿腫、化膿性腦膜炎、病毒性腦炎、結(jié)核等脫髓鞘性或變性類疾病多發(fā)性硬化(MS)等先天性畸形胼胝體發(fā)育不良、小腦扁桃體下疝畸形等脊柱和脊髓MRI適應(yīng)證1.腫瘤性病變椎管類腫瘤(髓內(nèi)、髓外硬膜內(nèi)、硬膜外),椎骨腫瘤(轉(zhuǎn)移性、原發(fā)性)2.炎癥性疾病脊椎結(jié)核、骨髓炎、椎間盤感染、硬膜外膿腫、蛛網(wǎng)膜炎、脊髓炎等3.外傷骨折、脫位、椎間盤突出、椎管內(nèi)血腫、脊髓損傷等4.脊柱退行性變和椎管狹窄癥椎間盤變性、膨隆、突出、游離,各種原因椎管狹窄,術(shù)后改變,5.脊髓血管畸形和血管瘤6.脊髓脫髓鞘疾?。ㄈ鏜S),脊髓萎縮7.先天性畸形胸部MRI適應(yīng)證呼吸系統(tǒng)對縱隔及肺門區(qū)病變顯示良好,對肺部結(jié)構(gòu)顯示不如CT。胸廓入口病變及其上下比鄰關(guān)系縱隔腫瘤和囊腫及其與大血管的關(guān)系其他較CT無明顯優(yōu)越性心臟及大血管大血管病變各類動(dòng)脈瘤、腔靜脈血栓等心臟及心包腫瘤,心包其他病變其他(如先心、各種心肌病等)較超聲心動(dòng)圖無優(yōu)勢,應(yīng)用不廣腹部MRI適應(yīng)證主要用于部分實(shí)質(zhì)性器官的腫瘤性病變肝腫瘤性病變,提供鑒別信息胰腺腫瘤,有利小胰癌、胰島細(xì)胞癌顯示宮頸、宮體良惡性腫瘤及分期等,先天畸形腫瘤的定位(臟器上下緣附近)、分期膽道、尿路梗阻和腫瘤,MRCP,MRU直腸腫瘤骨與關(guān)節(jié)MRI適應(yīng)證X線及CT的后續(xù)檢查手段--鈣質(zhì)顯示差和空間分辨力部分情況可作首選:1.累及骨髓改變的骨?。ㄔ缙诠侨毖詨乃?,早期骨髓炎、骨髓腫瘤或侵犯骨髓的腫瘤)2.結(jié)構(gòu)復(fù)雜關(guān)節(jié)的損傷(膝、髖關(guān)節(jié))3.形狀復(fù)雜部位的檢查(脊柱、骨盆等)軟件登錄界面軟件掃描界面圖像瀏覽界面膠片打印界面報(bào)告界面報(bào)告界面2合理應(yīng)用抗菌藥物預(yù)防手術(shù)部位感染概述外科手術(shù)部位感染的2/3發(fā)生在切口醫(yī)療費(fèi)用的增加病人滿意度下降導(dǎo)致感染、止血和疼痛一直是外科的三大挑戰(zhàn),止血和疼痛目前已較好解決感染仍是外科醫(yī)生面臨的重大問題,處理不當(dāng),將產(chǎn)生嚴(yán)重后果外科手術(shù)部位感染占院內(nèi)感染的14%~16%,僅次于呼吸道感染和泌尿道感染,居院內(nèi)感染第3位嚴(yán)重手術(shù)部位的感染——病人的災(zāi)難,醫(yī)生的夢魘

預(yù)防手術(shù)部位感染(surgicalsiteinfection,SSI)

手術(shù)部位感染的40%–60%可以預(yù)防圍手術(shù)期使用抗菌藥物的目的外科醫(yī)生的困惑★圍手術(shù)期應(yīng)用抗生素是預(yù)防什么感染?★哪些情況需要抗生素預(yù)防?★怎樣選擇抗生素?★什么時(shí)候開始用藥?★抗生素要用多長時(shí)間?定義:指發(fā)生在切口或手術(shù)深部器官或腔隙的感染分類:切口淺部感染切口深部感染器官/腔隙感染一、SSI定義和分類二、SSI診斷標(biāo)準(zhǔn)——切口淺部感染

指術(shù)后30天內(nèi)發(fā)生、僅累及皮膚及皮下組織的感染,并至少具備下述情況之一者:

1.切口淺層有膿性分泌物

2.切口淺層分泌物培養(yǎng)出細(xì)菌

3.具有下列癥狀體征之一:紅熱,腫脹,疼痛或壓痛,因而醫(yī)師將切口開放者(如培養(yǎng)陰性則不算感染)

4.由外科醫(yī)師診斷為切口淺部SSI

注意:縫線膿點(diǎn)及戳孔周圍感染不列為手術(shù)部位感染二、SSI診斷標(biāo)準(zhǔn)——切口深部感染

指術(shù)后30天內(nèi)(如有人工植入物則為術(shù)后1年內(nèi))發(fā)生、累及切口深部筋膜及肌層的感染,并至少具備下述情況之一者:

1.切口深部流出膿液

2.切口深部自行裂開或由醫(yī)師主動(dòng)打開,且具備下列癥狀體征之一:①體溫>38℃;②局部疼痛或壓痛

3.臨床或經(jīng)手術(shù)或病理組織學(xué)或影像學(xué)診斷,發(fā)現(xiàn)切口深部有膿腫

4.外科醫(yī)師診斷為切口深部感染

注意:感染同時(shí)累及切口淺部及深部者,應(yīng)列為深部感染

二、SSI診斷標(biāo)準(zhǔn)—器官/腔隙感染

指術(shù)后30天內(nèi)(如有人工植入物★則術(shù)后1年內(nèi))、發(fā)生在手術(shù)曾涉及部位的器官或腔隙的感染,通過手術(shù)打開或其他手術(shù)處理,并至少具備以下情況之一者:

1.放置于器官/腔隙的引流管有膿性引流物

2.器官/腔隙的液體或組織培養(yǎng)有致病菌

3.經(jīng)手術(shù)或病理組織學(xué)或影像學(xué)診斷器官/腔隙有膿腫

4.外科醫(yī)師診斷為器官/腔隙感染

★人工植入物:指人工心臟瓣膜、人工血管、人工關(guān)節(jié)等二、SSI診斷標(biāo)準(zhǔn)—器官/腔隙感染

不同種類手術(shù)部位的器官/腔隙感染有:

腹部:腹腔內(nèi)感染(腹膜炎,腹腔膿腫)生殖道:子宮內(nèi)膜炎、盆腔炎、盆腔膿腫血管:靜脈或動(dòng)脈感染三、SSI的發(fā)生率美國1986年~1996年593344例手術(shù)中,發(fā)生SSI15523次,占2.62%英國1997年~2001年152所醫(yī)院報(bào)告在74734例手術(shù)中,發(fā)生SSI3151例,占4.22%中國?SSI占院內(nèi)感染的14~16%,僅次于呼吸道感染和泌尿道感染三、SSI的發(fā)生率SSI與部位:非腹部手術(shù)為2%~5%腹部手術(shù)可高達(dá)20%SSI與病人:入住ICU的機(jī)會(huì)增加60%再次入院的機(jī)會(huì)是未感染者的5倍SSI與切口類型:清潔傷口 1%~2%清潔有植入物 <5%可染傷口<10%手術(shù)類別手術(shù)數(shù)SSI數(shù)感染率(%)小腸手術(shù)6466610.2大腸手術(shù)7116919.7子宮切除術(shù)71271722.4肝、膽管、胰手術(shù)1201512

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論