《C語言程序設(shè)計(jì)》第4章數(shù)組.ppt
《《C語言程序設(shè)計(jì)》第4章數(shù)組.ppt》由會員分享,可在線閱讀,更多相關(guān)《《C語言程序設(shè)計(jì)》第4章數(shù)組.ppt(78頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第四章 數(shù) 組,在實(shí)際的應(yīng)用中,經(jīng)常會遇到某些類型相同并相互具有聯(lián)系的 數(shù)據(jù)。該類數(shù)據(jù),經(jīng)常要作相關(guān)的處理。如,一個班30個人的一門 課程的成績,求平均成績、最高或最低成績。處理這類數(shù)據(jù)的最好 辦法是將其定義成為一個具有共同特征的集合,這種同類型相關(guān)數(shù) 據(jù)的集合稱為數(shù)組。,Chapter 4 Array,4.1 數(shù)組的基本概念,C 語言可以根據(jù)用戶需要,用基本數(shù)據(jù)類型定義特殊性質(zhì)的數(shù) 據(jù)類型,稱為構(gòu)造類型。構(gòu)造類型有:數(shù)組、結(jié)構(gòu)、聯(lián)合。,數(shù)組:相同數(shù)據(jù)類型變量的有序集合。有序表現(xiàn)在數(shù)組元素在 內(nèi)存中連續(xù)存放。,數(shù)組用一個名字作為標(biāo)識。為區(qū)分各元素,每個元素有一個用 整型表示的序號,稱之為下
2、標(biāo)。下標(biāo)可以有多個,下標(biāo)的個數(shù)稱為 數(shù)組的維數(shù)。,如:十個整型變量 k0,k1, k9,一個下標(biāo)。,數(shù)組名。,三個學(xué)生三門課程的成績,97.5 80.5 94.5 76.5 81.4 90.0 60.0 64.5 75.0,學(xué)號 0 1 2,0 1 2 課程,下標(biāo)一:行,下標(biāo)二:列,,,數(shù)組元素:a11,/* example 4-1(b) 計(jì)算平均成績 */ #include void main(void) int i; float math,ave; ave = 0.0; /* 平均成績初值為0 */
3、for(i=0;i<10;i++) /* 循環(huán)10次 */ scanf(%f, ,【例4-1】學(xué)生分?jǐn)?shù)的處理問題。有10個學(xué)生參加數(shù)學(xué)考試,考試成績由鍵盤輸入,計(jì)算平均成績。,/* example 4-1(b) 計(jì)算平均成績 */ #include void main(void) int i; float math,ave; ave = 0.0; /* 平均成績初值為0 */ for(i=0;i=ave) printf(%fn,math); /* 大于平均成績則打印 */
4、 ,【例4-1(b)】,/* example 4-1(c) 計(jì)算平均成績 */ #include void main(void) int i; float math10,ave; ave = 0.0; /* 平均成績初值為0 */ for(i=0;i=ave) printf(%fn,mathi); /* 大于平均成績則打印 */ ,【例4-1(c)】,數(shù)組必須先說明后使用。說明的目的如下:,說明數(shù)組的名字(標(biāo)識)。 說明數(shù)組的類型。 說明數(shù)組的維數(shù)。 確定各維下標(biāo)的變化范圍。,編譯系統(tǒng)將根據(jù)說明
5、,開辟內(nèi)存單元按特有的順序和相應(yīng)的類 型為各元素分配內(nèi)存單元。,4.2 一維數(shù)組,一維數(shù)組的說明,說明方式:,type array1常量表達(dá)式, , arrayn常量表達(dá)式;,類型說明符,根據(jù)需要可加修飾說明。說明數(shù)組的類型。,數(shù)組名,用標(biāo)識符命名。,用 包含的常量表達(dá)式。數(shù)組的下標(biāo)從0變化到常量達(dá)式的值減一。,int id5, iyear10; float fScore36;,當(dāng)說明數(shù)組后,編譯時(shí)系統(tǒng)會根據(jù)定義的類型分配連續(xù)的一段 內(nèi)存單元給數(shù)組的各元素。,,,,,,id0,id1,id2,id3,id4,系統(tǒng)為數(shù)組分配的連續(xù)內(nèi)存單元,每個單元占兩個BYTE。首地址用數(shù)組名id表示。,2.
6、一維數(shù)組的引用,數(shù)組是一組數(shù),它們公用一個數(shù)組名,這是它們公有的屬性,但它們在數(shù)組中的位置不同,這是它們私有的屬性,為表明數(shù)組中的一個元素,既要指出其來自于哪個數(shù)組,這就需要數(shù)組名;又要聲明其在這個數(shù)組中的位置,這就需要下標(biāo) 。,一維數(shù)組中元素引用的一般形式為: 數(shù)組名下標(biāo)值,說明: 下標(biāo)通常為整型,如果為實(shí)型,系統(tǒng)自動取整; 下標(biāo)常常巧妙的和循環(huán)變量相結(jié)合,隨著循環(huán)變量的變化而變化,可以達(dá)到事半功倍的效果; C語言不做下標(biāo)越界的檢查,即語法上對越界的下標(biāo)不報(bào)錯。,3. 一維數(shù)組的存儲,計(jì)算機(jī)系統(tǒng)中有著大量的存儲單元,為區(qū)別各個存儲單元,每一個存儲單元都有一個唯一的代表這個存儲單元的地址,就好
7、像我們每一個人都有一個唯一的代表自己的身份證號一樣。計(jì)算機(jī)系統(tǒng)中,存儲單元的地址的編碼規(guī)則是線性的,以十六進(jìn)制表示,并且從0開始計(jì)數(shù),因此存儲單元的地址為:0、1、2、...9、A、B、C、D、E、F、10H、... ...,如果說明的是一個數(shù)組,如:int math10; 計(jì)算機(jī)開辟20個地址連續(xù)的存儲單元(TC環(huán)境下整型占2個字節(jié),共有10個數(shù)組元素),用于存放數(shù)組中的10個數(shù)組元素,且這20個存儲單元的首地址標(biāo)記為:數(shù)組名math或 /*說明數(shù)組,同時(shí)初始化全部元素。*/,float fValue10=1.0,2.0,3.0; /*說明數(shù)組,給部分元素初值,其余元素為0。*/,unsig
8、ned a =0 x0000,0 x0001,0 x0002; /*當(dāng)數(shù)組元素全部賦初值時(shí),可以不指定長度*/,/* example 4-2 數(shù)組的初始化 */ #include void main(void) int i; int a5=1,2,3,4,5; int b5=1,2; int c =1,2,3; for(i=0;i<5;i++) /* 循環(huán)5次 */ printf(a%d=%d ,i,ai); /* 輸出a數(shù)組元素 */ printf(n); /* 換行 */ for
9、(i=0;i<5;i++) /* 循環(huán)5次 */ ,【例4-2】數(shù)組的初始化示例。編寫代碼4-2如下,其執(zhí)行結(jié)果如圖4-3所示。,printf(b%d=%d ,i,bi); /* 輸出b數(shù)組元素 */ printf(n); /* 換行 */ for(i=0;i<5;i++) /* 循環(huán)5次 */ printf(c%d=%d ,i,ci); /* 輸出c元素,注意有危險(xiǎn) */ printf(n); /* 換行 */ ,5.一維數(shù)組的應(yīng)用,【例4-3】兔子繁殖問題。,/
10、* example 4-3 Fibonacci數(shù)列 */ #include void main(void) int month; int f13=1,1; for(month=2;month<13;month++) /* 循環(huán)遞推 */ fmonth = fmonth-1+fmonth-2; /* 計(jì)算數(shù)列 */ for(month=0;month<13;month++) printf(%d ,fmonth); /* 輸出數(shù)列 */ ,【例4-4】由鍵盤輸入n個學(xué)生(設(shè)人數(shù)
11、不超過50人)的數(shù)學(xué)成績,分別統(tǒng)計(jì)優(yōu)、良、中、及格、不及格的人數(shù)。,/* example 4-4 分別統(tǒng)計(jì)成績 */ #include void main(void) int i,n; int a=0,b=0,c=0,d=0,e=0; /* 表示各段人數(shù) */ float math50; printf(“n=?”); /* 輸入人數(shù) */ scanf(“%d”,i++) /* 循環(huán)n次 */ ,if(mathi=90) a++; /* 分別統(tǒng)計(jì) */ else if(mathi=80) b++; else
12、 if(mathi=70) c++; else if(mathi=60) d++; else e++; printf(%dt%dt%dt%dt%dn,a,b,c,d,e); /* 打印 */ ,例:,求10個學(xué)生一門課程的平均分,并輸出低于平均成績的分?jǐn)?shù)。,#include void main(void) float fScore10,aver=0; int i; for(i=0;i<10;i++) scanf(“%f”, ,說明數(shù)組。,循環(huán)輸入各元素的值并累加。,循環(huán)判斷條件,滿足條件輸出。,4.3 二 維 數(shù) 組,在實(shí)際應(yīng)用中,經(jīng)常會遇到一
13、些用多維索引的數(shù)據(jù)。如:四個 學(xué)生三門課的成績。可以用下表表示:,顯然,該表的每一項(xiàng)需要有兩個索引項(xiàng)。表現(xiàn)為數(shù)組的兩個下 標(biāo)。超過一個下標(biāo)的數(shù)組稱為多維數(shù)組。,行:代表某個學(xué)生。,列:代表某門課程。,二維數(shù)組的說明,說明方式: type array常量表達(dá)式1常量表達(dá)式n,;,n個整型常量表達(dá)式,數(shù)組元素的個數(shù)?,int a23 , b452;,多維數(shù)組在內(nèi)存中的順序,int a33;,二維結(jié)構(gòu): a00 a01 a02 a10 a11 a12 a20 a21 a22,排列順序:先行后列。,a00,a01,a02,a10,a11,a12,a20,a21,a22,下 標(biāo) 為 0 的 行,總原
14、則:最后一個下標(biāo)先變化,變化一個周 期后,倒數(shù)第二個開始變化,如此類推。,a為數(shù)組在內(nèi)存中的首地址。,int b234;,內(nèi)存中的排列?,二維數(shù)組的初始化,數(shù)組可以在說明時(shí)初始化。,全部賦初值,int a23=1,2,3,4,5,6;,下標(biāo)為0的一行,下標(biāo)為1的一行,int b23=1,2,3,4,5,6;,按內(nèi)存順序賦初值。,部分賦初值,int a23= 1 , 2 ;,0行的0列的元素賦初值。0行其余值為0。,int a23=1,2;,對全體數(shù)組元素賦初值,第一維下標(biāo)可以省略。,int a 3=1, 2, 3, 4, 5, 6;,二維數(shù)組元素的引用,數(shù)組定義后,具備簡單變量的一切性質(zhì),可以
15、作為表達(dá)式的運(yùn) 算對象,也可以被賦值。引用時(shí),只能引用數(shù)組元素,方式如下:,arrayexp1expn,int a1010 ,y,i=2; ai+26=20; y=ai+26*100/30; a1011=34;,對4行6列的元素賦值。,參加表達(dá)式運(yùn)算。,C語言不作下標(biāo)檢查,語法正確,但使用危險(xiǎn),可能造成程序的錯誤!,整型表達(dá)式。,5.二維數(shù)組的應(yīng)用,【例4-5】下三角矩陣。,/* example 4-5 下三角矩陣 */ #include void main(void) int i,j; int a44; for(i=0;i=j) aij = 1; /*
16、 下三角 */ else aij = 0; /* 上三角 */ for(i=0;i<4;i++), for(j=0;j<4;j++) printf(“%4d”,aij); /* 輸出數(shù)列 */ printf(“n”); /* 換行 */ ,【例4-6(a)】二維數(shù)組的轉(zhuǎn)置 。,/* example 4-6(a)二維數(shù)組的轉(zhuǎn)置 */ #include void main(void) int i,j; int a33=1,2,3,4,5,6,7,8,9; /* 定義原數(shù)組
17、*/ int b33; /* 定義新數(shù)組 */ for(i=0;i<3;i++) /* 外循環(huán)遍歷行 */ for(j=0;j<3;j++) /* 內(nèi)循環(huán)遍歷列 */ bij = aji ; /* 計(jì)算新元素 */ for(i=0;i<3;i++) for(j=0;j<3;j++) printf(“%4d,aij); /* 輸出原數(shù)組 */ printf(“n”); /* 換行 */, printf(“n”); /* 換行 */ for(i=0;i<3;i++) f
18、or(j=0;j<3;j++) printf(%4d,bij); /* 輸出新數(shù)組 */ printf(“n”); /* 換行 */ ,/* example 4-6(b) 二維數(shù)組的轉(zhuǎn)置 */ #include void main(void) int i,j,t; int a33=1,2,3,4,5,6,7,8,9; /* 定義原數(shù)組 */ for(i=0;i<3;i++) for(j=0;j<3;j++) printf(%4d,aij); /* 輸出原數(shù)組 */ printf(n);
19、/* 換行 */ for(i=0;i<3;i++) /* 外循環(huán)遍歷行 */ for(j=0;j
20、元素存放一 個字符,從而達(dá)到存放字符串的目的。,字符數(shù)組的說明,char charrayconst exp1const expn,; char a10,b212;,字符數(shù)組的初始化,一維數(shù)組賦初值,char str16= h, e, l, l, o,0; char str2 =”hello ”;,用單個字符對每一個元素賦值。,用字符串對數(shù)組賦初值。,可以指定長度,也可不指定長度。,系統(tǒng)會在字串的結(jié)尾加0,表示字符串結(jié)束。因此,說明數(shù)組 時(shí),長度指定應(yīng)至少比實(shí)際長度大1,保證賦初值正確。,0,存儲結(jié)構(gòu):,h,e,l,l,o,0,二維數(shù)組賦初值,二維數(shù)組的每一行可以存放一個字符串。,char st
21、r36=”wang”,”zhang”,”liu”;,str數(shù)組在內(nèi)存中的首地址。,存儲結(jié)構(gòu),字符數(shù)組的輸入輸出,格式輸入輸出函數(shù),輸出: for(i=0;i 22、Hefei 結(jié)果a數(shù)組的內(nèi)容是:China0,為了解決這個問題,系統(tǒng)定義如下專用于字符數(shù)組的i/o函數(shù)。,gets( )字符串輸入函數(shù),用法:,char str 80; gets(str);,作用: 讀入一個以換行符為終結(jié)符的字符串到str中,用0代替換行符。,數(shù)組名作為函數(shù)的參數(shù)。,puts( )字符串輸出函數(shù),用法:,char string =”China”; puts(string);,數(shù)組名作為函數(shù)的參數(shù)。,作用: 輸出以NULL 即0結(jié)尾的字符串string,自動加上換行符。,【例4-7】用格式符%c逐個輸入和輸出示例。,/* example 4-7 用格式符c逐個輸入和輸出 */ 23、 #include void main(void) int i; char a12; for(i=0;i<12;i++) scanf(%c, ,【例4-8】用格式符s整體輸入和輸出示例。,/* example 4-8 用格式符s整體輸入和輸出 */ #include void main(void) char a12; scanf(%s,a); /* 輸入a數(shù)組元素 */ printf(“%s”,a); /* 輸出a數(shù)組元素 */ printf(n); ,【例4-9】字符輸入輸出舉例,#include vo 24、id main(void) char str80; int i; gets(str); for(i=0 ; str i !=0; i++) if(stri=a ,判斷字符串結(jié)束。,常用的字符處理函數(shù),C語言定義了一系列的字符處理函數(shù)用于字符串的處理,該類 函數(shù)的原型定義在string.h中。因此,在使用該類函數(shù)時(shí),應(yīng)在程 序的開始處,加#include ,字符串拷貝函數(shù)strcpy(str1,str2),作用:將str2拷貝到str1中。,用法: char str110, str2 =”Computer”; strcpy(str1,str2); /*str1的內(nèi)容是“Compute 25、r”*/ strcpy(str2,”Program”); /*str2的內(nèi)容是“Program”*/,說明:,str1的長度要足夠長; str1只能是字符數(shù)組名,str2可以是字符數(shù)組或字符串常量。,字符串連接函數(shù)strcat(str1, str2),作用:將str2連接到str1后(去掉str1的0)。,用法: char str115=“Anhui ”, str2 =”Hefei”; strcat(str1,str2); puts(str1); /*輸出結(jié)果為 Anhui Hefei */,說明:,str1的長度要足夠長; str1只能是字符數(shù)組名,str2可以是字符數(shù)組或字符串常量。,測試 26、字符串長度函數(shù)strlen(str),作用:測試字符串的實(shí)際長度。函數(shù)運(yùn)算得到整型值,該值是 字符串的長度!,int iLenStr; char str =“China”; iLenStr=strlen(str); printf(“%d”,iLenStr);,結(jié)果?,字符串的比較 strcmp(str1,str2),作用:對str1和str2 進(jìn)行逐位無符號字符(ASCII碼)比較, 直到對應(yīng)位字符能夠確定關(guān)系或到串尾為止。返回整型比較結(jié)果。,字符的數(shù)值關(guān)系也就是字符的ASCII碼值的數(shù)值關(guān)系。,比較結(jié)果如下:,char str1 =”abcd”; char str2 =“abcd”; int 27、 iRe1,iRe2,iRe3; iRe1=strcmp(str1,”abdc”); iRe2=strcmp(str1,str2); iRe3=strcmp(”abcde”,str2);,,abcd,abdc,,,,,c,d,c-d -1 結(jié)果小于0。,strlwr(str)將str中的大寫字母轉(zhuǎn)換成小寫字母。,strupr(str)將str中的小寫字母轉(zhuǎn)換成大寫字母,#include #include void main(void) char str1 =c programming! 123,str2=Computer; strlwr(str2); strupr(str1); puts(st 28、r1); puts(str2); ,C PROGRAMMING! 123 computer,【例4-10】字符處理函數(shù)示例1,/* example 4-10 字符處理函數(shù) */ #include #include void main(void) int k; char a20=Hello; char b20=world; char c20; k = strlen(a); /* 測a串長度 */ printf(k=%dn,k); printf(“%d n”,strcmp(a,b)); /* 比較a串和b串 */ strcat(a,b); 29、 /* 連接b串到a串 */ strcpy(c,b); /* 復(fù)制b串到c串 */ puts(a); /* 輸出a串 */ puts(b); /* 輸出b串 */ puts(c); /* 輸出c串 */ ,【例4-11】從鍵盤任意輸入5個學(xué)生的姓名,找出按ASCII碼的順序排在最前面的學(xué)生姓名。,/* example 4-11 找出排在最前面的學(xué)生姓名 */ #include #include void main(void) int i; char name20,minname20; pri 30、ntf(please enter 1 name:); gets(name); /* 輸入第1個姓名 */ strcpy(minname,name); /* 設(shè)第1個姓名為最前面的姓名 */ for (i=2;i<=5;i++) printf(please enter %d name:,i); gets(name); /* 輸入第i個姓名 */ if(strcmp(name,minname)<0) /* 比較第i個姓名 */ strcpy(minname,name); /* 修正最前面的姓名 */ puts(minname); 31、/* 輸出最前面的學(xué)生姓名 */ ,例:統(tǒng)計(jì)一行文字中大寫字母、小寫字母及數(shù)字的個數(shù)。,#include #include void main(void) char str80; int i, iAnum=0, ianum=0,i0num=0; gets(str); for(i=0; i=A ,4.5 數(shù)組的應(yīng)用舉例,數(shù)組是同類型數(shù)據(jù)的集合。便于整體處理數(shù)據(jù),數(shù)組操作的主 要算法有:,求極值 排序 查找 4.倒序,求極值及其位置,算法演示,一維數(shù)組的極值,#include void main(void) int a10=1,6,-2,5,4,32,47,-66,13,14; int iMax 32、, iPos, i; iPos=0; iMax=a0; for(i=1; iiMax) iMax = ai; iPos = i; printf(“Max=%5d Position=%5d”,iMax,iPos); ,假定最大值及其位置。,,循環(huán)比較,當(dāng)前元素比最大值大,將其 賦值為新的最大值并記錄其位置。,二維數(shù)組求極值,#include void main(void) float a34= 1.0, 3.0, 5.2, 7.4, 4.6, 5.5, 4.2, 1.2, 10.5, 0.23,1.3, 0.5; int i, j, iRow=0, 33、iCol=0; for(i=0; i<3; i++) for(j=0;j<4;j++) if(aij 34、intf(please enter:); for(i=0;i<10;i++) /* 循環(huán) */ scanf(“%f”,i++) /* 循環(huán)依次與后面的數(shù)比較 */,【例4-12】已知10個學(xué)生的數(shù)學(xué)成績,由鍵盤輸入,問最高分是多少?, if(mathi maxmath) /* 如果后面的數(shù)大于假設(shè)的最大 */ kmax = i; /* 修改位置 */ maxmath = mathi; /* 修改最大 */ printf(k=%d,max=%fn,kmax,maxmath); /* 輸出 */ ,【例4- 35、13】已知10個學(xué)生的數(shù)學(xué)成績,由鍵盤輸入,問最低分是多少?解題分析:解決了最高分問題,不能發(fā)現(xiàn),只要將比賽規(guī)則,稍加修改即可。找最高分是找分?jǐn)?shù)高的,而找最低分是找分?jǐn)?shù)低的,將上述代碼4-12中的大于號改為小于號即可,當(dāng)然表示最小數(shù)和其位置的變量名也應(yīng)作適當(dāng)?shù)男薷?如最小數(shù)用minmath表示、最小數(shù)位置用kmin表示),在此不再敘述代碼。,/* example 4-14 計(jì)算最高分和最低分 */ #include void main(void) int i,kmax,kmin; float math10,maxmath,minmath; printf( 36、please enter:); for(i=0;i<10;i++) /* 循環(huán) */ scanf(“%f”,i++) /* 循環(huán)依次與后面的數(shù)比較 */,【例4-14】已知10個學(xué)生的數(shù)學(xué)成績,由鍵盤輸入,問最高分和最低分各是多少?, if(mathi maxmath) /* 如果后面的數(shù)大于假設(shè)的最大 */ kmax = i; maxmath = mathi; /* 修改最大 */ else if(mathi < minmath) /* 如果后面的數(shù)小于假設(shè)的最小 */ kmin 37、 = i; minmath = mathi; /* 修改最小 */ printf(kmax=%d,max=%fn,kmax,maxmath);/* 輸出最大 */ printf(kmin=%d,min=%fn,kmin,minmath);/* 輸出最小 */ ,/* example 4-15 計(jì)算最高分 */ #include void main(void) int i,j,k1max,k2max; float score103,maxsco; printf(please enter:); for(i=0;i<1 38、0;i++) /* 循環(huán) */ for(j=0;j<3;j++) scanf(%f,i++) /* 外循環(huán)遍歷行 */,【例4-15】已知10個學(xué)生的數(shù)學(xué)、物理、化學(xué)成績,由鍵盤輸入,問最高分是多少?, for(j=0;j maxsco) /* 如果后面的數(shù)大于假設(shè)的最大 */ k1max = i; /* 修改位置 */ k2max = j; maxsco = scoreij; /* 修改最大 */ printf(k1=%d,k2=%d,max=%fn,k1max,k2max,maxsco); 39、 ,查 找,查找是在一組數(shù)中,尋找一個特定的數(shù),并顯示結(jié)果。,順序查找,順序查找算法:構(gòu)造循環(huán),使循環(huán)的變量遍歷數(shù)組每個元素的 下標(biāo)。循環(huán)的過程中讓特定的數(shù)和每個元素比較,相等則表示找到 該數(shù),并輸出其下標(biāo)(位置)。,程序設(shè)計(jì)中標(biāo)志的設(shè)置和應(yīng)用:,在程序設(shè)計(jì)中,經(jīng)常要記錄一些狀態(tài),作為判斷的條件。因此 需要在程序中設(shè)置一些標(biāo)志,通常標(biāo)志是整型變量。,如查找問題,可以先設(shè)置一個整型變量iFlag=0表示沒有找到, 在查找的過程中一旦找到后,將iFlag賦值為1,結(jié)束查找后,可以 由iFlag值所代表的邏輯狀態(tài),確定是否已找到特定的數(shù)。,標(biāo)志設(shè)置框圖,int iFlag;,,iFlag=0;,,是 40、否找到?,,iFlag=1;,yes,no,,,,,順序查找程序,#include void main(void) int i,j,iFlag,a10=4,3,5,1,10,12,2,6,7,9; iFlag=0; scanf(“%d”, ,設(shè)置標(biāo)志為沒找到。,,循環(huán)遍歷所有元素,比較設(shè)置標(biāo)志輸出位置。,chp4ex7,/* example 4-16 順序查找 */ #include #include void main(void) int i; int flag=0; /* 設(shè)置標(biāo)志 */ float math10=85,84,75,74,92,90, 41、68,55,66,94; float score; printf(“please enter:”); /* 輸入待查找數(shù)據(jù) */ scanf(%f, /* 循環(huán)繼續(xù)向后進(jìn)行 */,【例4-16】已知10個學(xué)生的數(shù)學(xué)成績,由鍵盤任意輸入1個成績,查找是否有此成績。, if(flag==1) printf(%f in %dn,score,i); /* 輸出找到的位置 */ else printf(not found n); /* 輸出沒有找到 */ ,折半查找適用于在有序數(shù)組中查找,在一個有序的一維數(shù)組中查找某一個數(shù)。已知某數(shù)組按升序排 列,給定一個數(shù),找出 42、該數(shù)在數(shù)組中的位置。 可以通過將區(qū)間折半,快速縮小查找區(qū)間,提高效率!,折半查找算法演示,/* example 4-17 折半查找 */ #include #include void main(void) int low,high,mid; int flag=0; /* 設(shè)置標(biāo)志 */ float math10=55,65,68,72,75,83,86,88,90,95; /* 有序表 */ float score; printf(“please enter:”); /* 輸入待查找數(shù)據(jù) */ scanf(%f, /* 修改標(biāo)志 * 43、/ else if(score 44、求前十名,如何高效率地排序?,方法一:對400個元素排完序后,取前10個。次數(shù)為80000次。,方法二:選擇10個最大值。次數(shù)為4000次。,假如一次循環(huán)需要1ms 方法一需要80s 方法二需要4s,如何構(gòu)造400取前十名的算法?,折半查找程序,#include void main(void) int iTop,iBot,iMid,iS,iFlag,a10=1,2,3,5,6,8,9,10,11,12; iFlag=0; iTop=0; iBot=9; scanf(“%d”, ,初始化查找標(biāo)志及頂、底。,,查找循環(huán),折半。,找到。,沒找到,調(diào)整iTop或iBot,chp4ex8, 排 序,排序 45、的概念,排序是將一組隨機(jī)排放的數(shù)按下標(biāo)順序從大到小或從小到大重 新排列。,1 ,5,4,6,7,9,,9,7,6,5,4,1,,1,4,5,6,7,9,降序,升序,冒泡排序算法,冒泡排序算法演示,冒泡排序程序如下:,#include void main(void) int i, j, a10=4,3,5,1,10,12,2,6,7,9, iTemp; for(i=0; i<9 ;i++) for( j=i+1;j<10;j++) if(ai 46、or(i=0;i<10; i++) printf(”%4d”,ai); ,,外層循環(huán)i變化,,內(nèi)層循環(huán)j變化,,比較交換,chp4ex5,/* example 4-18 冒泡排序 */ #include void main(void) int i,j; float math10,temp; printf(please enter:); for(i=0;i mathj+1) temp = mathj; mathj = mathj+1; mathj+1 = temp; /* 交換 */ 47、 for(i=0;i<10;i++) /* 循環(huán) */ printf(%5.1f ,mathi); /* 輸出 */ ,【例4-18】已知10個學(xué)生的數(shù)學(xué)成績,對其按升序排列。,思考題,升序的條件如何構(gòu)造?,聯(lián)合排序問題 已知一個班有36個同學(xué),a數(shù)組存放一門課的成績,m數(shù)組存放 其學(xué)號。要求將成績從大到小排序。,提示:應(yīng)考慮的問題是當(dāng)a數(shù)組元素比較交換時(shí),m數(shù)組如何處 理?,a 5 89.5 m 5 1005 a 7 90.0 m 7 1007,,,被動排序方。,選擇排序,冒泡排序在內(nèi)層循環(huán)的比較中,滿足條件的每次都需要交換。 其中一些交換是無效的,交換算法 48、會占用系統(tǒng)時(shí)間,從而降低算法 效率。,選擇排序算法的基本思路,每輪排序?qū) i 假定為極值,每次 在a i 到 aMAX中找出個極值,記錄其位置,最后讓極值位置的 元素與a i 交換。 選擇排序保證每輪排序只有一次交換,且為有效的交換!,選擇排序算法演示,選擇排序程序,#include void main(void) int i, j,iMax,a10=4,3,5,1,10,12,2,6,7,9, iTemp; for(i=0; i<9 ;i++) iMax=i; for( j=i+1;j<10;j++) if(aiMax 49、 iTemp=ai; ai=aiMax; aiMax=iTemp; for(i=0;i<10; i++) printf(”%4d”,ai); ,,排序循環(huán),假定最大值位置。,循環(huán)比較找出最大值的位置。,與本次比較的第一個元素交換。,chp4ex6,升序如何構(gòu)造?,/* example 4-19 選擇排序 */ #include void main(void) int i,j,k; float math10,temp; printf(please enter:); for(i=0;i mathj) k = j; /* 修正最 50、小數(shù)位置 */ if(k!=i),【例4-19】已知10個學(xué)生的數(shù)學(xué)成績,利用選擇排序?qū)ζ浒瓷蚺帕小? temp = mathi; mathi = mathk; mathk = temp; /* 將最小數(shù)交換到前面 */ for(i=0;i<10;i++) /* 循環(huán) */ printf(%5.1f ,mathi); /* 輸出 */ ,4. 倒序,【例4-20】利用循環(huán)以實(shí)現(xiàn)反向輸出。,/* example 4-20 反向輸出 */ #include void main(void) 51、int i; int math10; printf(please enter:); for(i=0;i=0;i--) /* 循環(huán) */ printf(%d ,mathi); /* 從后向前輸出 */ ,【例4-21】用另一個數(shù)組 。,/* example 4-21 利用輔助數(shù)組 */ #include void main(void) int i; int math110,math210; printf(please enter:); for(i=0;i<10;i++) /* 循環(huán) */ 52、scanf(%d, /* 從前向后輸出 */ ,【例4-21】就地逆置 。,/* example 4-22 就地逆置 */ #include void main(void) int i,temp; int math10; printf(please enter:); for(i=0;i<10;i++) /* 循環(huán) */ scanf(“%d”, /* 從前向后輸出 */ ,4.6 算法與效率,通過上述一些例子,可以發(fā)現(xiàn)同一個問題往往存在幾種不同的算法,多種算法都可以解決問題,每一種算法都有它的特點(diǎn),當(dāng)然每一種算法都有它的開銷, 53、究竟如何評價(jià)這些算法的好壞呢?,算法首先必須是正確的,即算法都能解決問題,得到了正確的結(jié)果,除此之外,還需考慮以下幾個方面的問題:,(1)執(zhí)行算法所耗費(fèi)的時(shí)間; (2)執(zhí)行算法所耗費(fèi)的存儲空間; (3)算法應(yīng)該易于理解、易于調(diào)試、易于維護(hù)等等。,1.算法所耗費(fèi)的時(shí)間,一個算法所耗費(fèi)的時(shí)間應(yīng)該是算法中每條語句的執(zhí)行時(shí)間之和,而每條語句的執(zhí)行時(shí)間是該語句的執(zhí)行次數(shù)與該語句的執(zhí)行時(shí)間之乘積。每條語句的執(zhí)行時(shí)間與所使用的計(jì)算機(jī)系統(tǒng)有關(guān),同樣的語句在不同的計(jì)算機(jī)系統(tǒng)中其執(zhí)行時(shí)間不一定相同,這給精確度量算法的時(shí)間帶來困難。,為此我們拋開具體的軟硬件環(huán)境,假設(shè)每一條語句的執(zhí)行時(shí)間是相同的,為一個標(biāo)準(zhǔn)單位時(shí)間 54、,這樣算法的執(zhí)行時(shí)間就是所有語句的執(zhí)行次數(shù)之和,一條語句的執(zhí)行次數(shù)與其是否在循環(huán)中以及循環(huán)的次數(shù)有關(guān)。 可見語句的執(zhí)行次數(shù)在很大程度上依賴于循環(huán)的次數(shù),降低循環(huán)的次數(shù)以及循環(huán)的層數(shù)就可以降低算法的時(shí)間。,2.算法所耗費(fèi)的空間,一個算法所耗費(fèi)的存儲空間來自于3個方面:,(1)算法自身在計(jì)算機(jī)系統(tǒng)中占有的空間; (2)算法運(yùn)行過程中各種數(shù)據(jù)占有的空間; (3)算法運(yùn)行過程中所需要的輔助空間。,算法運(yùn)行過程中所需要的輔助空間是度量算法空間性能的主要指標(biāo)。,3.算法的可讀性、可調(diào)性、可維護(hù)性,算法的可讀性、可調(diào)性、可維護(hù)性是衡量現(xiàn)代程序性能的一個重要的指標(biāo),一個結(jié)構(gòu)清晰、接口簡單、易于閱讀的程序,不 55、僅大大減少程序的調(diào)試和維護(hù)成本,也增加程序的穩(wěn)定性和可靠性。,【例4-23】求1100以內(nèi)的偶數(shù)之和。 以下列出3種解法,都可以解決1100以內(nèi)的偶數(shù)之和。,/* example 4-23(a) 求1-100以內(nèi)的偶數(shù)之和 */ #include void main(void) int i; int sum=0; /* 初始化和 */ for(i=2; i<=100; i=i+2) /* 循環(huán)變量的變化就是偶數(shù) */ sum = sum+i; /* 求和 */ printf(sum=%d ,sum); /* 輸出偶數(shù)之和 * 56、/ ,/* example 4-23(b) 求1-100以內(nèi)的偶數(shù)之和 */ #include void main(void) int i; int sum=0; /* 初始化和 */ for(i=1; i<=100; i=i+1) /* 循環(huán)變量的變化是所有數(shù) */ if (i%2==0) sum = sum+i; /* 求偶數(shù)之和 */ printf(sum=%d ,sum); /* 輸出偶數(shù)之和 */ ,/* example 4-23(c) 求1-100以內(nèi)的偶數(shù)之和 */ #include void main(void) int i; int sum=0; /* 初始化和 */ for(i=1; i<=100; i=i+1) /* 循環(huán)變量的變化是所有數(shù) */ if (i%2!=0) continue; /* 奇數(shù)跳過 */ else sum = sum+i; /* 求偶數(shù)之和 */ printf(sum=%d ,sum); /* 輸出偶數(shù)之和 */ ,
- 溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案