版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第一章數(shù)據(jù)結(jié)構(gòu)實現(xiàn)基礎(chǔ)引子數(shù)據(jù)存儲基礎(chǔ)流程控制基礎(chǔ)第2章實現(xiàn)基礎(chǔ)§2.1引子還是為每個具體應(yīng)用都編一個程序?
從不同的應(yīng)用中抽象出共性的數(shù)據(jù)組織與操作方法?[例2.1]在日常數(shù)據(jù)處理中經(jīng)常碰到的問題是需要對一組數(shù)據(jù)進行基本的統(tǒng)計分析。比如,分析一個課程班學(xué)生的平均成績、最高成績、最低成績、中位數(shù)、標(biāo)準(zhǔn)差等。同樣的統(tǒng)計要求也可能發(fā)生在其他領(lǐng)域。如統(tǒng)計家庭每月的開支情況、生產(chǎn)線上各位員工計件任務(wù)的完成情況……如何利用程序設(shè)計語言實現(xiàn)上述抽象類型?第2章實現(xiàn)基礎(chǔ)§2.1引子1.數(shù)據(jù)存儲C語言(包括其他高級語言)提供了數(shù)組、結(jié)構(gòu)、鏈表等。數(shù)據(jù)結(jié)構(gòu)的存儲實現(xiàn)跟所需要實現(xiàn)的操作密切相關(guān)。在數(shù)據(jù)結(jié)構(gòu)里,是利用數(shù)組和鏈表方式來實現(xiàn)的,包括很復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如圖、樹等。2.操作實現(xiàn)流程控制語句,即分支控制語句(如if-else、switch語句)、循環(huán)控制語句(如for、while、do-while語句)。
此外,還有模塊化的程序設(shè)計方法——函數(shù)ElementTypeAverage(ElementTypeS[],intN){/*求集合元素的平均值。集合元素存放在數(shù)組S中,數(shù)組大小為N*/
inti;ElementTypeSum=0;
for(i=0;i<N;i++)Sum+=S[i];/*將數(shù)組元素累加到Sum中*/
returnSum/N;}第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)
變量是數(shù)據(jù)存儲的基本單位。變量的類型決定了存儲和操作。幾種基本的數(shù)據(jù)類型:整型、實型(浮點型)、字符型等。提供了構(gòu)造數(shù)據(jù)類型:數(shù)組、結(jié)構(gòu)、指針等。數(shù)組數(shù)組是最基本的構(gòu)造類型,它是一組相同類型數(shù)據(jù)的有序集合。數(shù)組中的元素在內(nèi)存中連續(xù)存放,用數(shù)組名和下標(biāo)可以唯一地確定數(shù)組元素。(1)一維數(shù)組定義:類型數(shù)組名[數(shù)組長度]如:inta[10];數(shù)組定義時數(shù)組長度必須確定,即常量表達(dá)式中不能包含變量。數(shù)組元素引用:數(shù)組名[下標(biāo)]如:a[5]附初值:類型名數(shù)組名[數(shù)組長度]={初值表};如intb[4]={1,2,3,4};第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)
變量是數(shù)據(jù)存儲的基本單位。變量的類型決定了存儲和操作。幾種基本的數(shù)據(jù)類型:整型、實型(浮點型)、字符型等。提供了構(gòu)造數(shù)據(jù)類型:數(shù)組、結(jié)構(gòu)、指針等。數(shù)組數(shù)組是最基本的構(gòu)造類型,它是一組相同類型數(shù)據(jù)的有序集合。數(shù)組中的元素在內(nèi)存中連續(xù)存放,用數(shù)組名和下標(biāo)可以唯一地確定數(shù)組元素。(1)一維數(shù)組定義:類型數(shù)組名[數(shù)組長度]如:inta[10];數(shù)組定義時數(shù)組長度必須確定,即常量表達(dá)式中不能包含變量。數(shù)組元素引用:數(shù)組名[下標(biāo)]如:a[5]2022/12/186注意:(1)數(shù)組元素是存儲在連續(xù)的一段內(nèi)存空間內(nèi),每個元素所在單元的地址可通過如下公式計算:
&a[i]=&a[0]+i*length
其中l(wèi)ength為每個單元的長度(字節(jié)數(shù))。(2)若數(shù)組長度為N,則數(shù)組元素下標(biāo)范圍為:
0~N1
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]…………2022/12/187一維數(shù)組的初始化(1)inta[10]={0,1,2,3,4,5,6,7,8,9};(2)可以只給一部分元素賦值:
inta[10]={0,1,2,3,4};(4)在對全部數(shù)組元素賦初值時,可以不定義數(shù)組長度。例如:inta[5]={1,2,3,4,5};
等價于:
inta[]={1,2,3,4,5};2022/12/188定義二維數(shù)組類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式];
例如:floatpay[3][6],a[3][4],b[5][10];可將二維數(shù)組看成是一維數(shù)組的一維數(shù)組!二維數(shù)組在內(nèi)存中按行存儲a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]aa[0]---------a[1]---------a[2]---------a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]
a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]a[1]a[2]2022/12/189怎樣引用二維數(shù)組也同樣注意數(shù)組元素下標(biāo)不要越界。對于定義的數(shù)組:inta[M][N];引用數(shù)組元素——a[i][j]則應(yīng)0<=i<=M1,0<=j<=N1二維數(shù)組的初始化inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};可以對部分元素賦初值inta[3][4]={{1},{5},{9}};inta[3][4]={{1},{0,6},{0,0,11}};inta[3][4]={{1},{5,6}};inta[3][4]={{1},{},{9}};2022/12/1810二維數(shù)組的初始化如果對全部元素都賦初值,則初始化時可省略第一維的長度(即行數(shù)),但第二維的長度不能省略。inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};實際上二維數(shù)組元素是存儲在連續(xù)的一段內(nèi)存空間內(nèi),每個元素所在單元的地址可通過如下公式計算:
&a[i][j]=&a[0][0]+(i*N+j)*length
其中N為二維數(shù)組的列數(shù)(第二維的長度),length為每個單元的長度(字節(jié)數(shù))。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)指針第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)
指針是C語言中一個非常重要的概念。使用指針可以對復(fù)雜數(shù)據(jù)進行處理,能對計算機的內(nèi)存進行分配控制,在函數(shù)調(diào)用中使用指針還可以返回多個值。⑴指針的基本運算
取地址運算符&
間接訪問運算符*指針的加、減操作。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)(2)指針與數(shù)組
數(shù)組名是數(shù)組中第1個元素(下標(biāo)為0)的地址,可以看作是常量指針,不能改變指針常量(數(shù)組名)的值。(3)用指針實現(xiàn)內(nèi)存動態(tài)分配分配函數(shù)void*malloc(unsigned
size)。該函數(shù)分配了size個字節(jié),并返回了指向這塊內(nèi)存的指針。如果分配失敗,則返回一個空指針(NULL)。分配失敗的原因有多種,如空間不足。釋放函數(shù)voidfree(void*ptr)。該函數(shù)是將之前用malloc分配的空間還給程序或者是操作系統(tǒng),也就是釋放了這塊內(nèi)存,讓它重新得到自由。注意事項:A、申請了內(nèi)存空間后,必須檢查是否分配成功。B、當(dāng)不需要再使用申請的內(nèi)存時,記得釋放;釋放后應(yīng)該把原本指向這塊內(nèi)存的指針變量指向NULL,防止程序后面不小心使用了該指針。(釋放的是內(nèi)存,不是指針變量)C、這兩個函數(shù)應(yīng)該是配對使用。如果申請后不釋放就是內(nèi)存泄露;如果無故釋放(還未使用就釋放)那就是什么也沒有做。釋放只能一次,如果釋放兩次及兩次以上會出現(xiàn)錯誤(釋放空指針例外,釋放空指針其實也等于啥也沒做,所以釋放空指針釋放多少次都沒有問題)。D、雖然malloc()函數(shù)的類型是(void*),任何類型的指針都可以轉(zhuǎn)換成(void*),但是最好還是在前面進行強制類型轉(zhuǎn)換,因為這樣可以躲過一些編譯器的檢查。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)(4)用指針實現(xiàn)動態(tài)順序存儲結(jié)構(gòu)
int*p;p=(int*)malloc(10*sizeof(int));if(p==NULL)return;
第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)結(jié)構(gòu)結(jié)構(gòu)類型定義的一般形式為:struct
結(jié)構(gòu)名{
類型名結(jié)構(gòu)成員名1;
類型名結(jié)構(gòu)成員名2;
……
類型名結(jié)構(gòu)成員名n;};第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)【定義】結(jié)構(gòu)類型把一些可以是不同類型的數(shù)據(jù)分量聚合成一個整體。同時,結(jié)構(gòu)又是一個變量的集合,可以單獨使用其變量成員。7/25structstudent//學(xué)生信息結(jié)構(gòu)體{intnum;//學(xué)號
charname[20];//姓名
chargender;//性別
intage;//年齡}stu={97001,"LinLin",'F',19};structstudent//學(xué)生信息結(jié)構(gòu)體{intnum;//學(xué)號
……
intage;//年齡};structstudentsu1,stu2;第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)結(jié)構(gòu)數(shù)組:結(jié)構(gòu)與數(shù)組的結(jié)合結(jié)構(gòu)指針:指向結(jié)構(gòu)的指針(1)用*方式訪問,形式:(*結(jié)構(gòu)指針變量名).結(jié)構(gòu)成員名(2)用指向運算符“->”訪問指針指向的結(jié)構(gòu)成員,形式:結(jié)構(gòu)指針變量名->結(jié)構(gòu)成員名對結(jié)構(gòu)數(shù)組元素成員的引用是通過使用數(shù)組下標(biāo)與結(jié)構(gòu)成員操作符“.”相結(jié)合的方式來完成的,其一般格式為:結(jié)構(gòu)數(shù)組名[下標(biāo)].結(jié)構(gòu)成員名7/25結(jié)構(gòu)變量的使用使用結(jié)構(gòu)變量就是對其成員進行操作。格式為:結(jié)構(gòu)變量名.結(jié)構(gòu)成員名。此外,結(jié)構(gòu)變量不僅可以作為函數(shù)參數(shù),也可以作為函數(shù)的返回值。共用體【定義】共用體類型是指將不同的數(shù)據(jù)項組織成一個整體,它們在內(nèi)存中占用同一段存儲單元。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)共用體類型定義的一般形式為:union共用體名{
類型名成員名1;
類型名成員名2;
……
類型名成員名n;};各個成員變量在內(nèi)存中都使用同一段存儲空間,因此共用體變量的長度等于最長的成員的長度。共用體的訪問方式同結(jié)構(gòu)體類似。intmain(){
unionkey{
intk;
charch[2];}u;u.k=258;printf(“%d%d\n”,u.ch[0],u.ch[1]);return0;}0000001000000001u.k=258的二進制表示:u.ch[0]=2u.ch[1]=18/25枚舉類型的聲明形式如下:enum枚舉類型名{變量值列表};⑤枚舉類型【定義】將需要的變量值一一列舉出來,便構(gòu)成了一個枚舉類型例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};枚舉類型應(yīng)用說明:
對枚舉元素按常量處理,不能對它們賦值。如,不能寫:sun=0;
枚舉元素具有缺省值,它們依次為:0,1,2,......。也可以在聲明時另行指定枚舉元素的值,如:enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};枚舉值可以進行關(guān)系運算。如:weekdaytoday;
if(today==tue);整數(shù)值不能直接賦給枚舉變量,如需要將整數(shù)賦值給枚舉變量,應(yīng)進行強制類型轉(zhuǎn)換。如:today=(weekday)3;鏈表
鏈表是一種重要的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),也是實現(xiàn)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的重要手段。它不是順序存儲數(shù)據(jù),而是由若干個同一結(jié)構(gòu)類型的“結(jié)點”依次串接而成的,即每一個結(jié)點里保存著下一個結(jié)點的地址(指針)。
鏈表又分單向鏈表,雙向鏈表以及循環(huán)鏈表等。單向鏈表的結(jié)構(gòu)使用結(jié)構(gòu)的嵌套來定義單向鏈表結(jié)點的數(shù)據(jù)類型。如:structNode{ElementTypeData;
structNode*Next;};第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)structNode*p;p=(structNode*)malloc(sizeof(structNode));9/25head……(1) 插入結(jié)點(p之后插入新結(jié)點t)單向鏈表的常見操作(2) 刪除結(jié)點第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)ptt->Next=p->Next;//先p->Next=t;
head……pt=p->Next;//先p->Next=t->next;
10/25(3)單向鏈表的遍歷p=head;while(p!=NULL){……處理p所指的結(jié)點信息;
……p=p->Next;}(4) 鏈表的建立
有兩種常見的插入結(jié)點方式:(4.1)在鏈表的頭上不斷插入新結(jié)點;(4.2)在鏈表的尾部不斷插入新結(jié)點。如果是后者,一般需要有一個臨時的結(jié)點指針一直指向當(dāng)前鏈表的最后一個結(jié)點,以方便新結(jié)點的插入。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)11/25(4.1)頭插入法建表
從一個空表開始,重復(fù)讀入數(shù)據(jù),生成新結(jié)點,將讀入數(shù)據(jù)存放到新結(jié)點的數(shù)據(jù)域中,然后將新結(jié)點插入到當(dāng)前鏈表的表頭之后,直到讀入結(jié)束標(biāo)志為止。即每次插入的結(jié)點都作為鏈表的第一個結(jié)點。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)算法描述structNode*create_LinkList(void)
/*頭插入法創(chuàng)建單鏈表,鏈表的頭結(jié)點head作為返回值*/
{intdata;structNode*head,*p;head=(structNode*)malloc(sizeof(structNode));head->Next=NULL;/*創(chuàng)建鏈表的表頭結(jié)點head*/while(1)//一直執(zhí)行{scanf(“%d”,&data);if(data==32767)break;p=(structNode*)malloc(sizeof(structNode));p->Data=data;/*數(shù)據(jù)域賦值*/p->Next=head->Next;head->Next=p;
/*鉤鏈,新創(chuàng)建的結(jié)點總是作為第一個結(jié)點*/}return(head);}返回值是表頭結(jié)點head,實際就是所創(chuàng)建的鏈表。此時主函數(shù)中只要建一個structNode*類型的變量,即可調(diào)用該函數(shù)。如structNode*head;head=create_LinkList();算法描述intcreate_LinkList(structNode*head)
/*頭插入法創(chuàng)建單鏈表,成功返回1,失敗返回0*/
{intdata;structNode*p;while(1)//一直執(zhí)行{scanf(“%d”,&data);if(data==32767)break;p=(structNode*)malloc(sizeof(structNode));if(p==NULL)return0;p->Data=data;/*數(shù)據(jù)域賦值*/p->Next=head->Next;head->Next=p;
/*鉤鏈,新創(chuàng)建的結(jié)點總是作為第一個結(jié)點*/}return1;}此時表頭結(jié)點head是作為函數(shù)的參數(shù),即需要在主函數(shù)中定義一個頭結(jié)點,然后在調(diào)用時將參數(shù)傳過來!即structNode*head;
head=(structNode*)malloc(sizeof(structNode
));head->Data=0;head->Next=NULL;success=create_LinkList(head);
(2)尾插入法建表
頭插入法建立鏈表雖然算法簡單,但生成的鏈表中結(jié)點的次序和輸入的順序相反。若希望二者次序一致,可采用尾插法建表。該方法是將新結(jié)點插入到當(dāng)前鏈表的表尾,使其成為當(dāng)前鏈表的尾結(jié)點。structNode*create_LinkList(void)
/*尾插入法創(chuàng)建單鏈表,鏈表的頭結(jié)點head作為返回值*/
{intdata;structNode*head,*p,*q;head=p=(structNode*)malloc(sizeof(structNode));p->Next=NULL;/*創(chuàng)建單鏈表的表頭結(jié)點head*/while(1){scanf(“%d”,&data);if(data==32767)break;q=(struct
Node*)malloc(sizeof(struct
Node));q->Data=data;/*數(shù)據(jù)域賦值*/q->Next=p->Next;p->Next=q;p=q;
/*鉤鏈,新創(chuàng)建的結(jié)點總是作為最后一個結(jié)點*/}return(head);}算法描述雙向鏈表如果將雙向鏈表最后一個單元的Next指針指向鏈表的第一個單元,而第一個單元的Previous指針指向鏈表的最后一個單元,這樣構(gòu)成的鏈表稱為雙向循環(huán)鏈表。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)structNode{ElementTypeData;
structNode*Next;
structNode*
Previous;};12/25雙向鏈表的插入、刪除和遍歷基本思路與單向鏈表相同,但需要同時考慮前后兩個指針。A1A2A3AN…h(huán)eadpt第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)structDNode{ ElementTypeData;
structDNode*Next;
structDNode*Previous;}*p,*t;指針操作順序:①t->Previous=p;②t->Next=p->Next;③p->Next->Previous=t;④p->Next=t;①②③④13/25[例2.4]給定一個單鏈表L,請設(shè)計函數(shù)Reverse將鏈表L就地逆轉(zhuǎn),即不需要申請新的結(jié)點,將鏈表的第一個元素轉(zhuǎn)為最后一個元素,第二個元素轉(zhuǎn)為倒數(shù)第二個元素,……?!痉治觥炕舅悸肥牵豪醚h(huán),從鏈表頭開始逐個處理。如何把握住循環(huán)不變式。(循環(huán)不變式表示一種在循環(huán)過程進行時不變的性質(zhì),不依賴于前面所執(zhí)行過程的重復(fù)次數(shù)的斷言。)在每輪循環(huán)開始前我們都面臨兩個序列,其中p是一個待逆轉(zhuǎn)的序列,而q是一個已經(jīng)逆轉(zhuǎn)好的序列,如下圖。每輪循環(huán)的目的是把p中的第一個元素插入到q的頭上,使這輪循環(huán)執(zhí)行好后,p和q還是分別指向新的待逆轉(zhuǎn)序列和已經(jīng)逆轉(zhuǎn)好的序列。第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)p->Next=q;q=p;t……qpt=p->Next;p->Next=q;q=p;p=t;
14/25structNode*Reverse(structNode*L){structNode*p,*q,*t;
p=L;q=NULL;
while(p!=NULL){t=p->Next;p->Next=q;q=p;p=t;}
returnq;}……qpt=p->Next;p->Next=q;q=p;p=t;
類型定義typedef第2章實現(xiàn)基礎(chǔ)§2數(shù)據(jù)存儲基礎(chǔ)除了使用C語言提供的標(biāo)準(zhǔn)類型和自己定義的一些結(jié)構(gòu)體、枚舉等類型外,還可以用typedef語句來建立已經(jīng)定義好的數(shù)據(jù)類型的別名。typedef
原有類型名
新類型名typedef
structNode*Linklist;這樣,Reverse函數(shù)頭就可以寫成:LinklistReverse(LinklistL)LinklistReverse(LinklistL)/*structNode*Reverse(structNode*L)*/{structNode*p,*q,*t;
p=L,q=NULL;
while(p!=NULL){t=p->Next;p->Next=q;q=p;p=t;}returnq;}15/25第2章實現(xiàn)基礎(chǔ)§3流程控制基礎(chǔ)順序結(jié)構(gòu)是一種自然的控制結(jié)構(gòu),通過安排語句或模塊的順序就能實現(xiàn)。C語言為分支控制提供了if-else和switch兩類語句,為循環(huán)控制提供了for、while和do-while三類語句。三種基本的控制結(jié)構(gòu)是順序、分支和循環(huán)。函數(shù)定義函數(shù)調(diào)用函數(shù)遞歸語句級控制單位級控制16/25If語句:switch語句:
執(zhí)行過程當(dāng)switch后面“表達(dá)式”的值,與某個case后面的“常量表達(dá)式”的值相同時,就執(zhí)行該case后面的語句(組);當(dāng)執(zhí)行到break語句時,跳出switch語句,轉(zhuǎn)向執(zhí)行switch語句的下一條。while語句:1.while語句特點是“先判斷,后執(zhí)行”,如果表達(dá)式的值非0時,執(zhí)行while語句中的內(nèi)嵌語句,執(zhí)行完循環(huán)體語句后再返回循環(huán)的開始部位,判斷表達(dá)式的值,決定是否執(zhí)行循環(huán),當(dāng)循環(huán)的條件為0時,退出循環(huán)。2.循環(huán)體語句如果是多條語句,采用復(fù)合語句的形式,即采用符號{}把語句包含進來。
3.在循環(huán)體內(nèi)應(yīng)該包含改變循環(huán)條件表達(dá)式值的語句,否則會導(dǎo)致“死”循環(huán)。
do-while語句:1.do-while語句特點是“先執(zhí)行,后判斷”,先執(zhí)行一次指定的循環(huán)體,當(dāng)表達(dá)式的值為非0時,即為真時,返回繼續(xù)執(zhí)行循環(huán)體,否則當(dāng)表達(dá)式的值為0時,退出循環(huán)。因此,不論最初表達(dá)式的值是否為1都執(zhí)行一次循環(huán)體。2.循環(huán)體語句如果是多條語句,采用復(fù)合語句的形式,即采用符號{}把語句包含進來。3.在循環(huán)體內(nèi)應(yīng)該包含改變循環(huán)條件表達(dá)式值的語句,否則會導(dǎo)致“死”循環(huán)。for語句:表達(dá)式1:循環(huán)體變量賦初值;表達(dá)式2:循環(huán)退出條件;表達(dá)式3:循環(huán)變量增值。三個表達(dá)式都可以省略,但是省略的表達(dá)式要在其他位置以語句形式出現(xiàn),否則可能導(dǎo)致死循環(huán)。break語句、continue語句:Break強制循環(huán)結(jié)束;用于swich語句。Contunue跳過本次循環(huán),執(zhí)行下一次循環(huán)。循環(huán)嵌套:指大循環(huán)中嵌套小循環(huán)3種循環(huán)(for、while、do-while)可以相互嵌套[例2.5]求100到200之間的所有素數(shù)。[分析]可以設(shè)定兩重循環(huán):大循環(huán)(外層循環(huán))控制整數(shù)i在100到200之間變化(用for語句),而小循環(huán)(內(nèi)層循環(huán))則用來判別i是否是素數(shù)(用while語句)。第2章實現(xiàn)基礎(chǔ)§3流程控制基礎(chǔ)intmain(){
inti,j;
for(i=100;i<=200;i++){/*外層循環(huán)*/j=2;
while(j<i&&i%j!=0)j++;
/*內(nèi)層循環(huán),判別i是否是素數(shù)*/
if(j==i)printf(“%d”,i);
/*j==i說明在上面的while循環(huán)中i都不能被j整除,因此i是素數(shù)*/}return0;}17/25函數(shù)與遞歸比如:C語言提供了實數(shù)和整數(shù)的加法運算符號“+”來完成運算;但是“+”不能對復(fù)數(shù)做加法運算;可以寫一個函數(shù)來實現(xiàn)這個功能。第2章實現(xiàn)基礎(chǔ)§3流程控制基礎(chǔ)【定義】函數(shù)是一個完成特定工作的獨立程序模塊。只需定義一次,就可以多次調(diào)用。
函數(shù)包括庫函數(shù)和自定義函數(shù)兩種。例如,scanf、printf等庫函數(shù)由C語言系統(tǒng)提供定義,編程時只要直接調(diào)用即可。
在程序設(shè)計中,往往根據(jù)模塊化程序設(shè)計的需要,用戶可以自己定義函數(shù),屬于自定義函數(shù)。先定義復(fù)數(shù)類型ImgType,以約定何為復(fù)數(shù):structImage{doubler;doublei;};typedefstructImageImgType;再定義復(fù)數(shù)的加法函數(shù):ImgTypeImgAdd(ImgTypea,ImgTypeb){ImgTypec;c.r=a.r+b.r;c.i=a.i+b.i;/*實部和虛部分別相加*/
returnc;}有了這個函數(shù),以后可以在任何需要計算復(fù)數(shù)加法的地方調(diào)用它!18/25在設(shè)計函數(shù)時,注意掌握以下原則:第2章實現(xiàn)基礎(chǔ)§3流程控制基礎(chǔ)(1)函數(shù)功能的設(shè)計原則:結(jié)合模塊的獨立性原則,函數(shù)的功能要單一,不要設(shè)計多用途的函數(shù),否則會降低模塊的聚合度;(2)函數(shù)規(guī)模的設(shè)計原則:函數(shù)的規(guī)模要小,盡量控制在50行代碼以內(nèi),這樣可以使得函數(shù)更易于維護;(3)函數(shù)接口的設(shè)計原則:結(jié)合模塊的獨立性原則,函數(shù)的接口包括函數(shù)的參數(shù)(入口)和返回值(出口),不要設(shè)計過于復(fù)雜的接口,合理選擇、設(shè)置并控制參數(shù)的數(shù)量,盡量不要使用全局變量,否則會增加模塊的耦合度。19/25遞歸函數(shù)【定義】一個函數(shù)除了可以調(diào)用其他函數(shù)外,C語言還支持函數(shù)直接或間接調(diào)用自己。這種函數(shù)自己調(diào)用自己的形式稱為函數(shù)的遞歸調(diào)用,帶有遞歸調(diào)用的函數(shù)也稱為遞歸函數(shù)。兩個關(guān)鍵點:(1) 遞歸出口:即遞歸的結(jié)束條件,到何時不再遞歸調(diào)用下去;第2章實現(xiàn)基礎(chǔ)§2.3流程控制基礎(chǔ)(2) 遞歸式子:當(dāng)前函數(shù)結(jié)果與準(zhǔn)備調(diào)用的函數(shù)結(jié)果之間的關(guān)系,如求階乘函數(shù)的遞歸式子:
Factorial(n)=n*Factorial(n-1)。longintFactorial(intn){if(n==0)return1;else
returnn*Factorial(n-1);}注意:程序代碼不能寫成上述式子?。∵f歸調(diào)用20/256.1指針的引出一.地址與指針
1.地址與取地址運算
C程序中的變量在內(nèi)存中占有一個可標(biāo)識的存儲區(qū),
每一個存儲區(qū)是由若干個字節(jié)組成,每一個字節(jié)都有自己的地址,而一個存儲區(qū)的地址是指該存儲區(qū)中第一個字節(jié)的地址C語言允許在程序中使用變量的地址(通過地址運算符&可得到)
如:floatx;
變量x的地址----&x
inta[10];
數(shù)組變量a的地址----數(shù)組名a
2.指針與指針變量(1)變量的訪問方式①直接訪問:通過變量名或地址訪問變量的存儲區(qū)
例:scanf(“%d”,&x);
x=sqrt(x);printf(“%d”,x);②間接訪問:將一個變量的地址存放在另一個變量中.
如將變量x的地址存放在變量p中,訪問x時先找到p,
再由p中存放的地址找到xpx201210101010(2)指針:一個變量的指針就是該變量的地址(指針就是地址)(3)指針變量:存放變量地址的變量,它用來指向另一個變量
二、指針變量的定義1.格式:數(shù)據(jù)類型
*指針變量名;
例int*p1;char*p2;2.說明:(1)在變量定義時,*號表示該變量是指針變量
(注意:指針變量是p1,p2,不是*p1,*p2)(2)定義指針變量后,系統(tǒng)為其分配存儲空間,用以存放其他變量的地址,但在對指針變量賦值前,它并沒有確定的值,也不指向一個確定的變量例:intx,*p;x=5;px2012101051234注:指針變量p的值是隨機值,
此時p和x并無關(guān)聯(lián)(3)使指針變量指向一個確定的變量必須進行賦值intx,*p;x=5;p=&x;px201210105
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 思考引領(lǐng)方向青春奮進新時代
- 工程合同到期如何移交資料
- 二零二五年度二手房買賣合同糾紛仲裁協(xié)議3篇
- 2025版杭州租賃市場房屋租賃保險合作協(xié)議3篇
- 【模板】員工培訓(xùn)小故事課件
- 二零二五年共享托盤供應(yīng)鏈金融合作協(xié)議3篇
- 商業(yè)地產(chǎn)合作協(xié)議書(2篇)
- 二零二五年度房產(chǎn)析產(chǎn)及財產(chǎn)分配執(zhí)行合同3篇
- 二零二五年度房地產(chǎn)開發(fā)項目安全消防治安環(huán)保保障合同3篇
- 二零二五年度BIM技術(shù)在建筑項目運營維護中的應(yīng)用合同樣本2篇
- 民用無人駕駛航空器運行安全管理規(guī)則
- 車輛維修技術(shù)方案
- 中考古詩詞鑒賞情感篇(田霞)課件
- 卵巢癌診斷和治療課件
- 物業(yè)公司內(nèi)部承包協(xié)議(掛靠協(xié)議)
- 輸煤系統(tǒng)設(shè)備安裝施工方案
- 江蘇省宿遷市2022-2023學(xué)年高一上學(xué)期期末數(shù)學(xué)試題
- 管轄權(quán)異議仲裁申請書
- 2022神經(jīng)外科手術(shù)分級目錄
- 電氣傳動自動控制系統(tǒng)課程設(shè)計報告書
- T-CERDS 3-2022 企業(yè)ESG評價體系
評論
0/150
提交評論