




已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1,C語言編程是一項(xiàng)技藝,需要多年的歷練才能達(dá)到較為完善的境界! -摘自Expert C Programming,2,第六章 數(shù)組,3,復(fù)習(xí)(數(shù)值型數(shù)組),如何定義數(shù)組? 數(shù)組如何初始化? 數(shù)組元素如何引用? 循環(huán)語句 循環(huán)三要素循環(huán)不變關(guān)系 數(shù)組元素做函數(shù)參數(shù)傳遞的是什么?,4,作業(yè)提示,7.寫一個函數(shù),它判斷一個整數(shù)(或浮點(diǎn)數(shù))是否在一個數(shù)組中出現(xiàn)。如果出現(xiàn),給出第一次出現(xiàn)的位置下標(biāo);沒出現(xiàn)時給出-1。 15.1 請寫一個程序,它輸入一個學(xué)生成績文件,輸出按照每10分一個成績段的學(xué)生人數(shù)。,5,數(shù)組的概念、定義和使用 數(shù)組程序?qū)嵗?數(shù)組作為函數(shù)參數(shù) 字符數(shù)組和字符串 兩維和多維數(shù)組 編程實(shí)例,主要內(nèi)容,一維數(shù)值型數(shù)組的重要應(yīng)用,6,一維數(shù)組上的重要操作,排序 查找 插入 刪除 元素交換,7,將計(jì)算機(jī)學(xué)院08級學(xué)生按平均分高低排序 將08的奧運(yùn)會各參賽國按英文字典序排序 搜索引擎網(wǎng)頁排序(PageRank)learning to rank 排序問題無處不在,例1 一維數(shù)組的應(yīng)用(排序),8,常用的排序算法,冒泡排序 選擇排序 插入排序 快速排序 希爾排序 堆排序 ,9,冒泡排序法 輸入n個正整數(shù)存在數(shù)組中,按由小到大的順序排序 (最大的數(shù)下沉),例,38,49,76,97,13,97,97,27,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,a0 a1 a2 a3 a4 a5 a6 a7,10,用冒泡法對10個數(shù)進(jìn)行排序(N-S圖及程序),變量、數(shù)組長度定義,for(j=0;j=N-i-1;j+),scanf ( “%d” , &ai ),for(i=0;iN;i+),for(i=0;iN;i+),ajaj+1,1,0,aj與aj+1交換,for(i=1;i=N-1;i+),printf ( “%6d”, ai ),/*冒泡法對10個數(shù)由小到大排序*/ #include #define N 10 void main() int aN , i , j , t; printf(“請輸入10個數(shù):n“); for ( i = 0 ; i aj+1) t = aj; aj = aj+1; aj+1 = t; printf(“n排序后的數(shù)據(jù)為:n“); for (i = 0; i N; i+) printf(“%6d“, ai); printf(“n“); ,11,問題,輸入十個正整數(shù),把這十個正整數(shù)按由大到小的順序排序,如何修改程序?課后作業(yè) n值如果是可變的? 如果只對部分?jǐn)?shù)據(jù)進(jìn)行排序? 某趟循環(huán)未發(fā)生交換,后面可不再循環(huán), 如何改進(jìn)冒泡排序?,12,void BubbleSort(int n, int a ) int flag, i, j; for (i = 1; i aj+1) t = ai; ai = ai+1; ai+1 = t; flag = 1; if ( !flag ) return; ,改進(jìn)的冒泡排序(函數(shù)):設(shè)標(biāo)志flag,如果某趟未發(fā)生交換,flag=0,說明排序完成,返回。,13,將數(shù)組a中的前5個數(shù)進(jìn)行排序,#include void BubbleSort(int n, int a ); int main() int a10 , i , j , t; printf(“請輸入10個數(shù):n“); for( i = 0 ; i 10 ; i+) scanf(“%d”, ,14,冒泡排序算法的復(fù)雜度分析,最壞情形下掃描數(shù)據(jù)總數(shù) n*(n+1)/2 最壞情形下數(shù)據(jù)交換的次數(shù) n*(n-1)/2,15,選擇法排序:把n個正整數(shù)按由小到大的順序排序。,例,初始: 49 38 65 97 76 13 27 ,i=1,13,49,一趟: 13 38 65 97 76 49 27 ,i=2,27,38,六趟: 13 27 38 49 65 76 97 ,16,用選擇法對10個數(shù)進(jìn)行排序(N-S圖及程序),/*選擇法對10個數(shù)由小到大排序*/ #include #define N 10 void SelectSort(int n, int a); void main() int aN, i; for (i = 0; i N; i+) scanf(“%d“, ,變量、數(shù)組長度定義,k=i for(j=i+1;jN;j+),scanf ( “%d” , &ai ),for(i=0;iN;i+),for(i=0;iN;i+),ajak,1,0,k=j,for(i=0;iN-1;i+),printf ( “%4d”, ai ),ai與ak交換,17,void SelectSort(int n, int a) int i, j, k, t; for (i = 0; i n-1; i+) k = i; for (j = i+1; j n; j+) if (aj ak) k = j; t = ak; ak = ai; ai = t; ,可否優(yōu)化?如何優(yōu)化?,18,選擇排序算法的復(fù)雜度分析,最壞情形下掃描數(shù)據(jù)總數(shù) n*(n+1)/2 最壞情形下數(shù)據(jù)交換的次數(shù) n1次,19,直接插入排序,排序方法(以排雜志為例): 1. 任取一本雜志,作為排好序的一疊雜志的開始情況; 2. 從剩余雜志中任取一本,根據(jù)月份把它插入排好序的那疊雜志里的正確位置,使插入后的這疊雜志仍有序; 3.如果還有未排好的雜志,就回到2,否則就結(jié)束;,20,a,t=8,t=77,t=66,t=55,21,void insertsort(int n, int a) /* 遞增序直接插入排序 */ int i, j; int t; /*默認(rèn)a0為已排好序*/ for( i = 1; i = 0 ,排序函數(shù)的定義:,t=55,a0,ai,ai-1,將t插入到a0到ai之間,22,插入排序的復(fù)雜度分析,最壞情形下數(shù)據(jù)移動的次數(shù) n*(n-1)/2,23,例2 一維數(shù)組的應(yīng)用(查找),int search(int b, int key, int n) int j; for(j = 0; j n; j+) if (bj = key) return j; return (-1); ,線性查找: 從頭到尾逐個查找,也稱為順序查找。,效率底! 最壞情形下的時間復(fù)雜度是O(n),#include #define N 10 int search(int b,int,int); void main() int aN, i, searchkey, element; for (i = 0; i N; i+) scanf(“%d “, ,24,先檢索中間的一個數(shù)據(jù),如果不是所需的數(shù)據(jù),則判斷這要找的數(shù)在那一邊,在所在的一邊中再看中間的數(shù)是否為所需的數(shù),依次下去。 只適用于已排好序的數(shù)列。,折半查找,10 17 20 22 31 44 51 55 68 73 89 95 120 133 137 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14,折半查找最壞情形下的復(fù)雜度是O(lgn),25,折半查找程序,#include #define N 100 void f(int , int, int); void main() int aN, j, n, x; scanf(“%d”, ,void f(int a ,int n , int x) int b = 0, t, find = 0, m; t = n - 1; do m = ( t + b) / 2; if (am = x) printf(“找到了%3d,是a%dn“,x,m); find = 1; else if (x am) t = m - 1; else b = m + 1; while( b = t ,26,例3 一維數(shù)組的應(yīng)用(插入/刪除) 將一個數(shù)插入一個有序的數(shù)列中,插入后數(shù)列仍然有序。an,有m個有序數(shù)(小-大),nm,算法:需插入x,3)插入x,1)找插入位置P,將ap到am依次后移一個位置,x=16,p,p = 0; while (x ap) /*小于或等于時插入*/,for (j = m-1; j = p; j-) aj+1 = aj;,ap = x;,如何用for改寫,if (x am-1) am = x; else for (i = 0; i = x) for (j = m-1; j= i; j-) aj+1 = aj; ai = x ; break; ,27,例4 一維數(shù)組的應(yīng)用(元素交換) 將a數(shù)組中從第m個元素起一直到最后的元素平移到數(shù)組的開頭,把a(bǔ)0到am-2中的元素向后順移。,a0,am-1,an-1,算法:1、輸入數(shù)組a ,m 2、for(j=1;jn-m+1 ;j+) 將an-1放臨時單元t; an-2a0依次后移一個位置; a0 =t; 3、輸出數(shù)組a,28,字符數(shù)組預(yù)備知識,字符常量與字符串常量有什么區(qū)別? 如何定義一個字符變量?,29,規(guī)定: 一個字符串書寫時不能跨行 多個字符串之間僅由空白分隔,系統(tǒng)會將它們連成一個長字 符串。雙引號需用轉(zhuǎn)義符:“He said: “Im ok!“。,字符串以字符數(shù)組形式保存,存儲形式是在所有字符后放0作為串結(jié)束標(biāo)志。例 “Beijing“,0不是串內(nèi)容,卻是字符串表示不可缺的部分。 標(biāo)準(zhǔn)庫的字符串處理函數(shù)都按這種表示設(shè)計(jì),寫字符串處理程序時也應(yīng)該遵守這一規(guī)則。,30,6.4 字符數(shù)組與字符串,字符數(shù)組定義方式(與其他數(shù)組一樣): char line1000; 字符數(shù)組使用方式(與其他數(shù)組一樣): i=0; /* 注意越界控制 */ while(i1000 ,字符數(shù)組初始化方式一:逐個字符賦值 char city15=B,e,i,j,i,n,g; 未指定初值的元素自動設(shè)0,編碼0的字符稱為0字符/空字符,用0表示,在C中有特殊用途(字符串結(jié)束標(biāo)志)。,31,若字符數(shù)組里存了一些字符后放0 ,就符合字符串形式,可當(dāng)作字符串使用(數(shù)組里存著字符串): char a5 = g, o, o, d, b5 = i, s, a, c5 = o, k, 0, d5 = o, k, 0, x, x5 = i,s,n,o,t; 注意:字符數(shù)組的有效長度指第一個0前的字符個數(shù)+1,32,初始化方式二:用字符串常量 char a120 = “Peking University“; 未標(biāo)元素個數(shù)時,數(shù)組大小確定為串長加1。例: char a3 = “Peking University“; 數(shù)組a3有18個字符元素。,字符數(shù)組變量中保存字符串后,可作字符串用。 例,若多個輸出語句都用同樣輸出格式描述: char outform1 = ”point: (%f, %f)n“; . printf(outform1, x, y); . printf(outform1, s, t);,33,字符數(shù)組的賦值,將一個字符串賦值給一個字符數(shù)組,只能用在初始化的情況下,不能用在賦值語句中 例如: char str11; str = “I am happy”;是錯誤的.,34,字符串的輸入輸出,逐個字符I/O: %c 數(shù)組名下標(biāo) 整個字符串I/O: %s 數(shù)組名,例 用%c main() char str5; int i; for (i = 0; i 5; i+) scanf(“%c”, ,例 用%s main() char str5; scanf(“%s”, str); printf(“%s”, str); ,輸入用字符數(shù)組名,不要加& 輸入串長度數(shù)組維數(shù) 遇空格或回車結(jié)束 自動加0,輸出用字符數(shù)組名, 遇0結(jié)束,35,int main() int i; char a5; scanf(“%s“, a); for (i = 0; i 5; i+) printf(“%c“, ai); return 0; ,運(yùn)行情況: (1)若輸入 hel , 正常 (2)若輸入 hell , 正常 (3)若輸入 hello , 用%s 輸出,會出現(xiàn)問題?,輸入字符串長度數(shù)組維數(shù),例子,36,#include main() char a15, b5, c5; scanf(“%s%s%s“, a, b, c); printf(“a=%snb=%snc=%sn“, a, b, c); scanf(“%s“, a); printf(“a=%sn“, a); ,運(yùn)行情況: 輸入:How are you? 輸出:a=How b=are c=you? 輸入:How are you? 輸出:a=How,scanf中%s輸入時,遇空格或回車結(jié)束,運(yùn)行情況: 輸入:How are you?,字符串輸入舉例,37,void str_copy (char s, const char t) int i = 0; while (ti != 0) si = ti; +i; si = 0; ,循環(huán)結(jié)束時ti的空字符正好賦給si。 void str_copy (char s, const char t) int i = 0; while (si = ti) != 0) +i; ,字符串處理程序?qū)嵗?例1,寫函數(shù)將一字符串復(fù)制到一字符數(shù)組。假定數(shù)組足以存放被 復(fù)制串及空字符。,38,字符串處理函數(shù)的典型循環(huán): for (i = 0; si != 0; +i) 用是否空字符確定對字符串的處理是否已完成。,例2,(二進(jìn)制轉(zhuǎn)換)寫函數(shù),給它一個表示二進(jìn)制數(shù)的0/1字符串,它算出這個串表示的整數(shù)值。,二進(jìn)制數(shù)bnbn-1.b2b1b0的值可以用下面公式計(jì)算: (.(bn2) +bn-1)2 +.)2 + b2)2 + b1)2 + b0 據(jù)此可寫出循環(huán),循環(huán)條件判斷二進(jìn)制數(shù)是否結(jié)束。 二進(jìn)制數(shù)位只能是0/1,只需要在遇到1時加1。,39,int bin2int(const char s) int i = 0, n = 0; while(si!=0 ,由于數(shù)字字符的編碼連續(xù)排列.函數(shù)改為: int bin2int(const char s) int i = 0, n = 0; while(si!=0 /* 這種寫法可以推廣到八進(jìn)制和其他進(jìn)制 */,40,例3 計(jì)算字符數(shù)組的有效長度,#include int strLen(const char s); int main() int len; char str10; scanf(“%s“, str); len = strLen(str); printf(“%dn“, len); printf(“%sn“, str); return 0; ,int strLen(const char s) int i=0; while(si!=0) i+; return (i+1); ,有問題嗎?,41,包含在頭文件 string.h,字符串輸出函數(shù)puts 格式:puts(字符數(shù)組) 功能:向顯示器輸出字符串(輸出完,換行) 說明:字符數(shù)組必須以0結(jié)束,字符串輸入函數(shù)gets 格式:gets(字符數(shù)組) 功能:從鍵盤輸入一以回車結(jié)束的字符串放入字符數(shù)組中, 并自動加0 說明:輸入串長度應(yīng)小于字符數(shù)組維數(shù),標(biāo)準(zhǔn)庫中常用的字符串處理函數(shù),42,例 #include main( ) char string80; printf(“Input a string:”); gets(string); puts(string); 輸入: How are you? 輸出: How are you ?,scanf(“%s”,str); gets(str); 區(qū)別是scanf取不到空格,gets()函數(shù)是個過時的函數(shù),43,標(biāo)準(zhǔn)庫中常用的字符串處理函數(shù),包含在頭文件 string.h 字符串(實(shí)際)長度函數(shù) strlen(const char s);,#include #include int main() char str10 = “China“; int n; printf(“Length=%dn“, strlen(str); n = strlen(str); printf(“n=%dn“, n); return 0; ,44,標(biāo)準(zhǔn)庫中常用字符串處理函數(shù),復(fù)制函數(shù): strcpy(char s,const char t); t應(yīng)為字符串,const說明參數(shù)值不修改。字符數(shù)組s應(yīng)足夠大,以保證復(fù)制不越界。例: char a116, a216; strcpy(a1, “programming“); strcpy(a2, a1);,限界復(fù)制函數(shù)strncpy,限制復(fù)制長度: strncpy(char s,const char t,int n); 將t中前n個字符復(fù)制到s中。,a1,45,#include #include int main() char a5 , b5 = “Power“, c1, c2; c1 = A; c2 = B; printf(“b=%sn“, b); a0 = C; a1 = h; a2 = i; a3 = n; a4 = a; printf(“a=%sn“, a); a = “Study“; printf(“a=%sn“, a); a = b; printf(“a=%sn“, a); return 0; ,程序查錯,46,#include #include int main() char a6 ,b6= “Power“,c1,c2; c1=A;c2=B; printf(“b=%sn“,b); a0=C;a1=h; a2=i; a3=n; a4=a;a5=0; printf(“a=%sn“,a); strcpy(a,“ Study “); printf(“a=%sn“,a); strcpy(a,b); printf(“a=%sn“,a); return 0; ,改正錯誤后,47,int strcmp(const char s1, const char s2) 兩字符串相同時返回值0; s1大于s2的情況下返回大于0的值; 否則返回小于0的值。 判斷字符串大小的標(biāo)準(zhǔn)是字符串的字
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025電子廠勞務(wù)合同模板
- 2025屆山東省高三下學(xué)期學(xué)業(yè)水平等級性模擬考試歷史試題(原卷版+解析版)
- 公司研發(fā)員工勞動協(xié)議書
- 數(shù)字化平臺服務(wù)推廣合同
- 商業(yè)地產(chǎn)租賃與經(jīng)營管理服務(wù)合同
- 浙江國企招聘2025臺州市黃巖交通旅游投資集團(tuán)有限公司下屬子公司招聘10人筆試參考題庫附帶答案詳解
- 2025重慶銅生人力資源服務(wù)股份有限公司招聘39人筆試參考題庫附帶答案詳解
- 2025山東日照力誠人力資源有限公司招聘外包服務(wù)人員6人筆試參考題庫附帶答案詳解
- 綠茶鑒定 測試題及答案
- 農(nóng)業(yè)科技協(xié)同攻關(guān)實(shí)施方案升級
- 2024年網(wǎng)絡(luò)安全知識競賽考試題庫400題(含答案)
- 《海上風(fēng)電場工程測量規(guī)程》(NB-T 10104-2018)
- (高清版)TDT 1075-2023 光伏發(fā)電站工程項(xiàng)目用地控制指標(biāo)
- 中國古代十大傳世名畫
- 2023年康復(fù)專科護(hù)士理論考核試題
- 南京信息工程大學(xué)畢業(yè)答辯模板
- 《重疊問題》-徐長青
- 數(shù)據(jù)治理策略與框架
- NB-T 47013.15-2021 承壓設(shè)備無損檢測 第15部分:相控陣超聲檢測
- 安全檢查表完整版本
- 加拉帕戈斯群島的生物
評論
0/150
提交評論