版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1第第 4 4 章章 數(shù)組數(shù)組 2本章學習重點 一維數(shù)組、二維數(shù)組、字符數(shù)組的定義、引用及一維數(shù)組、二維數(shù)組、字符數(shù)組的定義、引用及初始化初始化 常用算法:冒泡排序、選擇排序、順序查找、折常用算法:冒泡排序、選擇排序、順序查找、折半查找、最大最小值、歐幾里德算法等半查找、最大最小值、歐幾里德算法等 用字符數(shù)組處理字符串用字符數(shù)組處理字符串 使用字符串處理函數(shù)處理字符串使用字符串處理函數(shù)處理字符串3問題: 中秋佳節(jié),有貴客來到草原,主人要從羊群中選中秋佳節(jié),有貴客來到草原,主人要從羊群中選一只肥羊宴請賓客,當然要選最重者。這樣就要一只肥羊宴請賓客,當然要選最重者。這樣就要記錄每只羊的重量,如果有
2、成千上萬只羊,不可記錄每只羊的重量,如果有成千上萬只羊,不可能用一般變量來記錄能用一般變量來記錄(sheep0,.sheep12304?)。 給一個班給一個班50個學生一門課的成績排序,這組成績個學生一門課的成績排序,這組成績該如何存放呢?該如何存放呢? 帶有下標的變量,也就是這里要講的帶有下標的變量,也就是這里要講的數(shù)組數(shù)組。這些數(shù)據(jù)的特點是:這些數(shù)據(jù)的特點是:1、具有相同的數(shù)據(jù)類型、具有相同的數(shù)據(jù)類型2、使用過程中需要保留原始數(shù)據(jù)、使用過程中需要保留原始數(shù)據(jù) 4什么是數(shù)組?什么是數(shù)組? 在程序設計中,為了處理方便,把具有相同類型的若干變在程序設計中,為了處理方便,把具有相同類型的若干變量按
3、有序的形式組織起來。這些量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素按序排列的同類數(shù)據(jù)元素的集合的集合稱為數(shù)組。稱為數(shù)組。 在語言中,數(shù)組屬于在語言中,數(shù)組屬于構造數(shù)據(jù)類型構造數(shù)據(jù)類型。一個數(shù)組可以分解。一個數(shù)組可以分解為多個數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是為多個數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構造類型。構造類型。 因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結構數(shù)組等各種類別。符數(shù)組、指針數(shù)組、結構數(shù)組等各種類別。 max = 0.0; 將記錄最重的羊的重量置 0 for ( i=0; i
4、10; i=i+1 ) 提示輸入第 i 只羊的重量; 鍵入第 i 只羊的重量 max 第 i 只羊的重量 是 否 max =第 i 只羊的重量; k = i; 存重者,記錄第 i 只。 輸出 max ( 最重的羊的重量 ) 輸出 k ( 最重的羊是第 k 只 ) float sheep0,sheep1,sheep2,sheep7,sheep8,sheep9;scanf(“%f%f%f”,&sheep0,&sheep1,&sheep2);scanf(“%f%f%f”,&sheep3,&sheep4,&sheep5);scanf(“%f%f%f”,&
5、amp;sheep6,&sheep7,&sheep8);scanf(“%f”,&sheep9);float sheep;int i=0;for (i=0; i10;i+)scanf(“%f”,&sheep);float sheep10;int i=0;for (i=0; i10;i+)scanf(“%f”,&sheepi);我們先看例子:用鍵盤輸入我們先看例子:用鍵盤輸入1010只羊的重量存放到一個只羊的重量存放到一個名為名為sheepsheep的數(shù)組中的數(shù)組中#include main() / /* * 主函數(shù)主函數(shù)* */ /float sheep1
6、0;/ /* * 數(shù)組,有數(shù)組,有1010個浮點類型元素個浮點類型元素* */ / /* *用于存用于存1010只羊每一只的重量只羊每一只的重量* */ /float max; int i, k;max = 0.0; / /* * 賦初值賦初值0 0* */ /for ( i=0; i10; i=i+1 ) / /* * 計數(shù)循環(huán)計數(shù)循環(huán)* */ / / /* * 循環(huán),開始循環(huán),開始* */ /printf(“請輸入羊的重量請輸入羊的重量sheep%d=”,sheep%d=”, i);scanf(“%f”, &sheepi);if ( max sheepi )max = sheepi
7、;/ /* * 讓第讓第i i只羊為當前最肥羊只羊為當前最肥羊* */ /k=i;/ /* *紀錄第紀錄第i i只羊只羊* */ / / /* * 循環(huán)結束循環(huán)結束* */ /printf(“max=%fn”, max); / /* * 輸出最肥羊的重量輸出最肥羊的重量* */ /printf(“number=%dn”, k); / /* * 輸出最肥羊的編號輸出最肥羊的編號* */ /74.1 一維數(shù)組 一維數(shù)組的定義方式一維數(shù)組的定義方式一維數(shù)組元素的引用一維數(shù)組元素的引用 一維數(shù)組一維數(shù)組的存儲形式的存儲形式一維數(shù)組的初始化一維數(shù)組的初始化一維數(shù)組程序舉例一維數(shù)組程序舉例84.1 一維數(shù)
8、組一維數(shù)組一維數(shù)組的定義一維數(shù)組的定義v定義方式:定義方式: 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名 常量表達式常量表達式 ; 合法標識符合法標識符表示元素個數(shù)表示元素個數(shù)下標從下標從0開始開始 :數(shù)組運算符數(shù)組運算符單目運算符單目運算符優(yōu)先級優(yōu)先級(1)左結合左結合不能用不能用( )a00145a1a2a3a4a523a編譯時分配連續(xù)內(nèi)存編譯時分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)內(nèi)存字節(jié)數(shù)=數(shù)組維數(shù)數(shù)組維數(shù)* sizeof(元素數(shù)據(jù)類型元素數(shù)據(jù)類型)數(shù)組名表示內(nèi)存首地址,數(shù)組名表示內(nèi)存首地址,是是地址常量地址常量9一維數(shù)組的引用一維數(shù)組的引用v數(shù)組必須數(shù)組必須先定義先定義,后使用后使用v只能逐個引用數(shù)組元素,不能
9、一次引用整個數(shù)組只能逐個引用數(shù)組元素,不能一次引用整個數(shù)組v數(shù)組元素表示形式:數(shù)組元素表示形式: 數(shù)組名數(shù)組名下標下標其中:下標可以是常量或整型表達式其中:下標可以是常量或整型表達式例例 int i=15; int datai; ( 不能用變量定義數(shù)組維數(shù)不能用變量定義數(shù)組維數(shù))例例 int a10; printf(“%d”,a); ( )必須必須 for(j=0;j10;j+) printf(“%dt”,aj); ( )例例 int data5; data5=10; /C語言對數(shù)組不作越界檢查,使用時要語言對數(shù)組不作越界檢查,使用時要 注意注意10 數(shù)組名數(shù)組名 下標下標1 1 下標越界是下
10、標越界是大忌大忌!編譯程序不檢查是否越界編譯程序不檢查是否越界下標越界,將訪問數(shù)組以外的空間下標越界,將訪問數(shù)組以外的空間那里的數(shù)據(jù)是未知的,不受我們掌控,可能帶來嚴重那里的數(shù)據(jù)是未知的,不受我們掌控,可能帶來嚴重后果后果11如果下標值小于0或超過數(shù)組長度時會出現(xiàn)什么情況?運行程序或單步執(zhí)行觀察變量變化情況可以看到,運行程序或單步執(zhí)行觀察變量變化情況可以看到,變量變量c c和和a a的值因數(shù)組越界而被悄悄破壞了的值因數(shù)組越界而被悄悄破壞了123456120789101112一維數(shù)組的初始化一維數(shù)組的初始化v初始化方式初始化方式 在定義數(shù)組時,為數(shù)組元素賦初值在定義數(shù)組時,為數(shù)組元素賦初值(在編
11、譯階段使之得到初值)在編譯階段使之得到初值) int a5=1,2,3,4,5;等價于:等價于:a0=1; a1=2; a2=3; a3=4; a4=5;v說明:說明:l數(shù)組不初始化,其元素值為隨機數(shù)數(shù)組不初始化,其元素值為隨機數(shù)l對對static數(shù)組元素不賦初值,系統(tǒng)會自動賦以數(shù)組元素不賦初值,系統(tǒng)會自動賦以0值值l當全部數(shù)組元素賦初值時,可不指定數(shù)組長度當全部數(shù)組元素賦初值時,可不指定數(shù)組長度如如 int a5=6,2,3; 等價于:等價于: a0=6; a1=2;a2=3; a3=0; a4=0;如如 int a3=6,2,3,5,1; ( )static int a5;等價于:等價于:
12、a0=0; a1=0; a2=0; a3=0; a4=0;l只給部分數(shù)組元素賦初值只給部分數(shù)組元素賦初值 int a=1,2,3,4,5,6;編譯系統(tǒng)根據(jù)初值個數(shù)確定數(shù)組維數(shù)編譯系統(tǒng)根據(jù)初值個數(shù)確定數(shù)組維數(shù)134.1 一維數(shù)組 4.1.1 一維數(shù)組定義一維數(shù)組定義【存儲類型存儲類型】 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名常量表達式常量表達式 int age40; float f6*6; 例如:以下是合法的數(shù)組定義語句:int i;i=10;int datai; 以下是不合法的數(shù)組定義語句:144.1.3 一維數(shù)組元素的引用一維數(shù)組元素的引用數(shù)組定義之后,就可以在程序中引用元素。數(shù)組定義之后,就可以在
13、程序中引用元素。引用格式為:引用格式為:數(shù)組名數(shù)組名下標表達式下標表達式說明:說明:下標表達式是整型常量或整型變量表達式。下標表達式是整型常量或整型變量表達式。 例如定義:例如定義: int b,c,a5;數(shù)組數(shù)組a可引用的元素有:可引用的元素有:a0,a1,a2,a3,a4。 給元素賦值方法給元素賦值方法: a0=0; a1=1;a2=2;a3=3 ; a4=4 ; for(i=0;i100A16怎么讓兩個數(shù)組相等?main() int i,a4,b4; for(i=0;i=0;i-) printf(“%d ”,bi); b0=a0;b1=a1;b2=a2;b3=a3;for(i=0;i=3
14、;i+) bi=ai;方法方法1:逐個元素賦值;方法:逐個元素賦值;方法2:循環(huán)賦值:循環(huán)賦值17【例例4.1】讀入一維數(shù)組,并按相反順序輸出各元素。讀入一維數(shù)組,并按相反順序輸出各元素。算法分析:算法分析: (1)設數(shù)組)設數(shù)組a含有含有10個元素,下標為個元素,下標為09。(2)以下標作為循環(huán)控制變量)以下標作為循環(huán)控制變量for(i=0;i=9;i+) 在循環(huán)體內(nèi)進行數(shù)組元素在循環(huán)體內(nèi)進行數(shù)組元素ai的引用的引用 18 #include using namespace std;#include void main() int i,a10; for(i=0;iai; for(i=9;i=0
15、;i-) coutsetw(6)max,則則max=ai 、position=i;2325213 82794936010max:position:513 827949360100246i24程序清單程序清單void main() int a10; int i,max,position; for(i=0;iai; position=0; max=a0; for(i=1;imax) max=ai;position=i; coutmax=max position=position=3)算法分析:算法分析:fibonacci數(shù)列的特點是:數(shù)列的特點是:1,1,2,3,5,8.從第從第3項開始其值為項開
16、始其值為前兩項之和前兩項之和;為什么使用數(shù)組?為什么使用數(shù)組? 可將各數(shù)據(jù)作為數(shù)組元素保留下來可將各數(shù)據(jù)作為數(shù)組元素保留下來 對比對比f1,f2簡單變量考慮簡單變量考慮26#include using namespace std;#include main() int i,f20=1,1; /給數(shù)列第一和第二個元素賦值給數(shù)列第一和第二個元素賦值 for(i=2;i20;i+) fi=fi-2+fi-1; /數(shù)組當前元素的值是其前兩項的和數(shù)組當前元素的值是其前兩項的和 for(i=0;i20;i+) /每行輸出每行輸出5個元素個元素 if(i%5=0) coutendl; /每行輸出每行輸出5個
17、元素個元素 coutsetw(10)fi; 運行結果為:運行結果為: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 676527【例4.4】使用冒泡法將6個數(shù)據(jù)從小到大排序。算法分析:算法分析: 排序是將一組隨機排放的數(shù)按從小到大排序是將一組隨機排放的數(shù)按從小到大(升序升序)或從大到小或從大到小(降降序序)重新排列。重新排列。排序方法采用多的有:冒泡法、選擇法和插入法等。排序方法采用多的有:冒泡法、選擇法和插入法等。冒泡法的思路是:冒泡法的思路是: 將相鄰兩個數(shù)將相鄰兩個數(shù)ai和和ai+1比較,將大數(shù)調(diào)到后頭,小數(shù)調(diào)
18、到比較,將大數(shù)調(diào)到后頭,小數(shù)調(diào)到前頭前頭;第一輪比較下來,將最大值放入第一輪比較下來,將最大值放入a6;第二輪比較下來,次大數(shù)放入了第二輪比較下來,次大數(shù)放入了a5;如此循環(huán)如此循環(huán)n-1輪,則將輪,則將6個數(shù)按從小到大分別存在個數(shù)按從小到大分別存在a1,a2,a6中。中。28冒泡法圖示 交換 5 2 6 4 1 3 不交換 交換 交換 交換 2 5 6 4 1 3 2 5 6 4 1 3 2 5 4 6 1 3 2 5 4 1 6 3 2 5 4 1 3 6 最大值 圖4.2 冒泡排序法圖示 29void main() int a7,i,j,t; coutinput 6 numbers:n;
19、 for(i=1;iai; for(i=1;i6;i+) for(j=1;jaj+1) t=aj; aj=aj+1; aj+1=t; for (i=1;i=6;i+) coutai“ ”;a0a1a2a3a4a5a6可省略可省略itj _5 2 6 4 1 3 526413input 6 numbers:1 152552226654 46 416 61136 63 633 4 5 621 154234 531 4133 441 2132 351226 1 2 3 4 5 6 _main() int a7,i,j,t,flag=1; for(i=1;iai; for(i=1;i6;i+) fla
20、g=0; for(j=1;jaj+1) t=aj; aj=aj+1; aj+1=t; flag=1; if ( flag = 0) break; 冒泡排序方法的改進31例例 用用簡單選擇法簡單選擇法對對10個數(shù)排序(從小到大)個數(shù)排序(從小到大)排序過程:排序過程:(1)首先通過)首先通過n-1次比較,從次比較,從n個數(shù)中找出最小的個數(shù)中找出最小的元元素位置素位置, 將將這個元素這個元素與第一個數(shù)交換與第一個數(shù)交換第一趟選擇第一趟選擇排序排序,結果,結果最小最小的數(shù)被安置在的數(shù)被安置在第一個第一個元素位置上元素位置上;(2)再通過)再通過n-2次比較,從剩余的次比較,從剩余的n-1個數(shù)中找出關
21、個數(shù)中找出關鍵字鍵字次小次小的記錄,將它與的記錄,將它與第二個數(shù)第二個數(shù)交換交換第二趟選擇第二趟選擇排序排序(3)重復上述過程,共經(jīng)過)重復上述過程,共經(jīng)過n-1趟排序后,排序結束趟排序后,排序結束例例初始:初始: 49 38 65 97 76 13 27 kji=11349一趟:一趟: 13 38 65 97 76 49 27 i=22738二趟:二趟: 13 27 65 97 76 49 38 三趟:三趟: 13 27 38 97 76 49 65 四趟:四趟: 13 27 38 49 76 97 65 五趟:五趟: 13 27 38 49 65 97 76 六趟:六趟: 13 27 38
22、 49 65 76 97 kkkkjjjjjjjjjj33一維數(shù)組的輸入和輸出#define#define N 10 N 10 main() main() intint aN+1,i,j,temp; aN+1,i,j,temp; forfor(i=(i=1 1;i=;i=N N;i+) ;i+) scanf(“%d”,&ai);scanf(“%d”,&ai); / /* *排序排序* */ / forfor(i=1;i=N;i+) (i=1;i=N;i+) printf(“%d”,ai); printf(“%d”,ai); printf(“n”); printf(“n”); 總
23、共有總共有N+1個數(shù)據(jù),數(shù)個數(shù)據(jù),數(shù)組元素從組元素從a0aN此處此處a0不用,只不用,只將輸入的數(shù)據(jù)放入將輸入的數(shù)據(jù)放入a1aN34選擇法排序for(i=1;i=N-1;i+) min=i; for(j=i+1;j=10;j+) if(ajamin) min=j; if(i!=min) x = ai; ai = amin; amin = x; 循環(huán)體用來完成單循環(huán)體用來完成單趟排序,確定當前趟排序,確定當前最小數(shù)的位置最小數(shù)的位置外層循環(huán)用來完外層循環(huán)用來完成成N-1趟排序,趟排序,趟號趟號i:1N-135共 43 頁 第 35 頁 假設:已經(jīng)存在一個長度為假設:已經(jīng)存在一個長度為N N的有序
24、的有序( (從小到大排列從小到大排列) )的數(shù)據(jù)序列,要將一個新的數(shù)插入到該序列中,要的數(shù)據(jù)序列,要將一個新的數(shù)插入到該序列中,要求插入后的新序列求插入后的新序列( (長度為長度為N+1)N+1)仍然保持有序。仍然保持有序。 算法的關鍵是要確定新數(shù)據(jù)插入的合適位置。算法的關鍵是要確定新數(shù)據(jù)插入的合適位置。 對于一個有序序列,對于一個有序序列,從后向前從后向前進行比較,若序列中進行比較,若序列中的數(shù)大于要的數(shù)大于要插入的數(shù)插入的數(shù),則將數(shù)列中的數(shù)向后移動;,則將數(shù)列中的數(shù)向后移動;否則,完成插入操作。否則,完成插入操作。插入排序法的基本思想3637插入法排序 for for (i=1;iN; i
25、+) (i=1;i=1 & ajtemp; j-) (j=i-1; j=1 & ajtemp; j-) a aj+1j+1=a=aj j; ; aaj+1j+1=temp;=temp; 將已排序的數(shù)將已排序的數(shù)據(jù)和據(jù)和temp比較,比較,大于大于temp的所的所有數(shù)組元素往有數(shù)組元素往后挪動一個位后挪動一個位置置找到合適位找到合適位置安放當前置安放當前元素元素384.2 二維數(shù)組及多維數(shù)組 用用2個下標區(qū)分具體元素的數(shù)組稱為二維數(shù)組。個下標區(qū)分具體元素的數(shù)組稱為二維數(shù)組。 用用3個及個及3個以上下標表示的數(shù)組稱為多維數(shù)組。個以上下標表示的數(shù)組稱為多維數(shù)組。4.2.1 二維數(shù)組及
26、多維數(shù)組定義二維數(shù)組及多維數(shù)組定義二維數(shù)組定義的一般形式為:二維數(shù)組定義的一般形式為: 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名常量常量常量常量; int a23,b5l0;同理定義一個三維數(shù)組:同理定義一個三維數(shù)組: int c234;394.2.2 二維數(shù)組及多維數(shù)組的存儲形式二維數(shù)組中元素的排列順序是按行連續(xù)存放的,二維數(shù)組中元素的排列順序是按行連續(xù)存放的,即在內(nèi)存中先順序存放完第一行元素,即在內(nèi)存中先順序存放完第一行元素,再繼續(xù)存放第二行元素,再繼續(xù)存放第二行元素,直到最后一行。直到最后一行。例如:例如:int a23;二維數(shù)組二維數(shù)組a中元素排列順序中元素排列順序 a00 a
27、01 a02 a10 a11 a12二維數(shù)組二維數(shù)組a在內(nèi)存中的存儲格式在內(nèi)存中的存儲格式 a00 a01 a02 a10 a10 a11 2000 2004 2008 200C 2010 2014 多維數(shù)組元素在內(nèi)存中的存放規(guī)律與二維數(shù)組相同,多維數(shù)組元素在內(nèi)存中的存放規(guī)律與二維數(shù)組相同,元素最左邊的下標變化最慢,最右邊的下標變化最快。元素最左邊的下標變化最慢,最右邊的下標變化最快。 404.2.3 二維數(shù)組元素的引用數(shù)組不能對其整體引用,只能對具體元素進行引用。數(shù)組不能對其整體引用,只能對具體元素進行引用。格式:格式: 數(shù)組名數(shù)組名下標表達式下標表達式下標表達式下標表達式 說明:說明:(1
28、)下標表達式可是整型常量或變量表達式。)下標表達式可是整型常量或變量表達式。 例如:例如: int a23;合法引用:合法引用: a01, aij,a3*2-56%3等。等。(2)同樣在數(shù)組引用中要特別注意下標越界問題。)同樣在數(shù)組引用中要特別注意下標越界問題。 414.2.4 二維數(shù)組的初始化 二維數(shù)組初始化方式有兩種方式二維數(shù)組初始化方式有兩種方式1按行對二維數(shù)組初始化。按行對二維數(shù)組初始化。例如:例如: int a23=1,2,3,4,5,6;2按數(shù)組元素存放順序?qū)Τ跏蓟?。按?shù)組元素存放順序?qū)Τ跏蓟?。例如,例如?int a23=l,2,3,4,5,6;42說明:說明:(1)初始化時可對
29、數(shù)組全部元素初始化,也可以只對部)初始化時可對數(shù)組全部元素初始化,也可以只對部分元素初始化。分元素初始化。 例如:例如: int a341,2,3; 它的作用是只對各行第一列的元素賦初值,其余元素它的作用是只對各行第一列的元素賦初值,其余元素值自動為值自動為0。 0123012 i jaij12300000000043說明:說明:也可以只對某幾行賦初值,也可以只對某幾行賦初值,例如例如:int a34=1,2,3; 0123012 i jaij12003000000044說明:說明:(2)對全部元素初始化時,可以省略數(shù)組第一維的對全部元素初始化時,可以省略數(shù)組第一維的長度,但第二維的長度不能省
30、略。長度,但第二維的長度不能省略。例如:例如: int a 3=1,2,3,4,5,6;01201 i jaij142536 由于未指定數(shù)組第一維的長度,由于未指定數(shù)組第一維的長度,C C編譯程序?qū)⒕幾g程序?qū)⒏鶕?jù)數(shù)組第二維的長度以及初始化數(shù)據(jù)的個數(shù),確根據(jù)數(shù)組第二維的長度以及初始化數(shù)據(jù)的個數(shù),確定數(shù)組第一維的長度為定數(shù)組第一維的長度為2 2,保證數(shù)組大小足夠存放,保證數(shù)組大小足夠存放全部初始化數(shù)據(jù)。全部初始化數(shù)據(jù)。45說明:說明:(3)按行初始化時,對全部或部分元素初始化均可省略數(shù)組)按行初始化時,對全部或部分元素初始化均可省略數(shù)組第一維的長度,第一維的長度,例如:例如: int a32=1,
31、2,0,3;還可寫成:還可寫成: int a 2=1,2,0,3;系統(tǒng)能根據(jù)初始值分行情況自動確定該數(shù)組第一維的長度為系統(tǒng)能根據(jù)初始值分行情況自動確定該數(shù)組第一維的長度為3。 01012 i jaij10320046二維數(shù)組的輸入和輸出#define ROW_NUMS 39#define COL_NUMS 6int scoreROW_NUMSCOL_NUMS, i, j;for (i=0;iROW_NUMS; i+) for (j=0;jCOL_NUMS; j+) scanf (%d, &scoreij);for (i=0;iROW_NUMS; i+) for (j=0;jCOL_NU
32、MS; j+) printf(%d, scoreij);逐個輸入二維數(shù)組元素,逐個輸入二維數(shù)組元素,從從score00scoreROW_NUMS-1COL_NUMS-1逐個輸出二維數(shù)逐個輸出二維數(shù)組元素組元素,不換行不換行for (i=0;iROW_NUMS; i+) for (j=0;jCOL_NUMS; j+) printf(%d, scoreij); printf(“n”);逐個輸出二維數(shù)逐個輸出二維數(shù)組元素組元素,每行行尾每行行尾換行換行47b4.2.5 二維數(shù)組程序設計舉例【例4.5】將一個二維數(shù)組的行和列元素互換(即矩陣的轉(zhuǎn)置),將結果存到另一個數(shù)組中。 矩陣的轉(zhuǎn)置算法:矩陣的轉(zhuǎn)置
33、算法: aij=bji123456456a123b123456456a123bij=aji ijij48#include void main() int a23=1,2,3,4,5,6,b32; int i,j; coutarray a is:endl; for (i=0;i2;i+) for (j=0;j3;j+) coutsetw(10)aij; coutendl; array a is:123456abij12345649 coutarray b is:endl; for(i=0;i3;i+) for(j=0;j2;j+) bij=aji; coutsetw(10)bij; couten
34、dl; abarray b is:iij123j45641123456236514253650void main() int a4=3,16,87,65,4,32,11,108,10,25,12,27; int b3,i,j,rowmax; for(i=0;i=2;i+) rowmax=ai0; for(j=1;jrowmax) rowmax=aij; bi=rowmax; 16 87 6532 11 108a3425 12 2710browmaxij6512874 32 11108108103 16 87252727【例4.6】在二維數(shù)組a中選出各行最大的元素組成一個一維數(shù)組b。51 cou
35、tarray a is:endl; for(i=0;i=2;i+) for(j=0;j=3;j+) coutsetw(10)aij; coutendl; coutarray b is:endl; for(i=0;i=2;i+) coutsetw(10)bi; coutendl; 8710827b16 87 6532 11 108a3425 12 2710316 87 65432 11 10810 25 12 278710827array a is:array b is:_例例 已知一個班有已知一個班有4個學生,學習個學生,學習3門課。求各個學生的總成績,門課。求各個學生的總成績,每門課的總成績
36、及班級所有成績之和。每門課的總成績及班級所有成績之和。52 34 7645 57 3 928 23 6 332 75 5752 34 76 16245 57 39 14128 23 63 11432 75 57 164157 189 235 581數(shù)據(jù)需求數(shù)據(jù)需求1.#define STU_NUMS 42.#define GDE_NUMS 33.int i;/*記錄學生的序號記錄學生的序號,范圍范圍: 0STU_NUMS-1*/4.int j;/*記錄成績的序號記錄成績的序號, ,范圍范圍: 0GDE_NUMS-1 */5.int scoreSTU_NUMS+1GDE_NUMS+1; 其中的數(shù)
37、據(jù)分布:其中的數(shù)據(jù)分布: 從從score00到到scoreSTU_NUMS-1GDE_NUMS-1 存放各個學生的成績存放各個學生的成績 scoreiGDE_NUMS 存放第存放第i個學生的總成績,個學生的總成績,i:0STU_NUMS-1 scoreSTU_NUMSj 存放第存放第j門課的總成績,門課的總成績, j:0GDE_NUMS-1*/ scoreSTU_NUMSGDE_NUMS 存放所有的成績之和存放所有的成績之和 算法設計算法設計 s1:逐個輸入逐個輸入4個學生個學生3門課的成績門課的成績scoreij s2:將記錄各學生總成績、各課程總成績及總成績對應的:將記錄各學生總成績、各課
38、程總成績及總成績對應的元素清元素清0 s3:while i4 while j3累加單個學生成績的總成績累加單個學生成績的總成績scorei3累加單門課程的學生成績累加單門課程的學生成績score4j累加所有學生成績進入總成績累加所有學生成績進入總成績score43 s4:逐個輸出:逐個輸出4個學生個學生3門課的所有總成績門課的所有總成績 程序?qū)崿F(xiàn)程序?qū)崿F(xiàn) for(i=0;i5;i+) scorei3=0; for(j=0;j3;j+) score4j=0;for(i=0;i4;i+) for(j=0;j3;j+) scorei3 += scoreij; score4j += scoreij;
39、score43 += scoreij; 52 34 76 045 57 39 028 23 63 032 75 57 00 0 0 0554.3 字符數(shù)組與字符串所謂所謂“字符串字符串”是指若干有效字符的序列。是指若干有效字符的序列。C程序中的字符串可以包括字母、數(shù)字、專用字符、轉(zhuǎn)義字程序中的字符串可以包括字母、數(shù)字、專用字符、轉(zhuǎn)義字符等。符等。 例如,下列字符串都是合法的。例如,下列字符串都是合法的。HelloC program35.29ChinatBeijingnC語言中沒有字符串變量,字符串不是存放在一個變量中,語言中沒有字符串變量,字符串不是存放在一個變量中,而是存放在一個字符型的數(shù)組
40、中。而是存放在一個字符型的數(shù)組中。在在C語言中,字符串被作為字符數(shù)組來處理。語言中,字符串被作為字符數(shù)組來處理。564.3.1 4.3.1 字符數(shù)組與字符串字符數(shù)組與字符串 用于存放字符串數(shù)據(jù)的數(shù)組是字符數(shù)組,用于存放字符串數(shù)據(jù)的數(shù)組是字符數(shù)組,字符數(shù)組中的一個元素存放一個字符。字符數(shù)組中的一個元素存放一個字符。定義一維字符數(shù)組的一般格式為:定義一維字符數(shù)組的一般格式為: char 數(shù)組名數(shù)組名常量表達式常量表達式;例如,例如, char str10;由于字符型與整型是相互通用的,因此由于字符型與整型是相互通用的,因此上面定義還可以改為:上面定義還可以改為: int str10;1. 字符數(shù)組
41、的定義字符數(shù)組的定義str10合法合法引用引用越界越界 str0 str1 str2 str3 str4 str5 str6 str7 str8 str9str572. 字符數(shù)組的初始化字符數(shù)組的初始化 字符數(shù)組的初始化有兩種方式。字符數(shù)組的初始化有兩種方式。(1)逐個給數(shù)組中的各元素賦初值,即將字符常量依次放在花括逐個給數(shù)組中的各元素賦初值,即將字符常量依次放在花括號中。號中。 char str15=C, ,p,r,o,g,r,a,m;cprogram 0 0 0 0 0 0注意:注意:0在在C語言中是字符串結束標志。即使初始化語言中是字符串結束標志。即使初始化時時0后面還有其他字符,系統(tǒng)也
42、會認為后面還有其他字符,系統(tǒng)也會認為0之前的字之前的字符才是字符串中的字符。例如:符才是字符串中的字符。例如:char str15=C, ,p,r,o,g,r,a,m,0,&,C,+,+; 58(2)直接使用字符串常量初始化,字符串常量加不加花直接使用字符串常量初始化,字符串常量加不加花括號都可以。括號都可以。例如,例如,char str15=C program; 或者或者 char str15=C program; C編譯程序會自動在字符串的末尾增加編譯程序會自動在字符串的末尾增加1個個0字符。字符。注意:注意:初始化時,一定要使定義的數(shù)組的大小至少比初始化時,一定要使定義的數(shù)組的大
43、小至少比所賦的字符串長度大所賦的字符串長度大1。(3) 初始化時也可以不指定數(shù)組的大小,上面初始化初始化時也可以不指定數(shù)組的大小,上面初始化的語句也可寫成:的語句也可寫成: char str =C program;這時,系統(tǒng)會根據(jù)實際字符串的長度決定數(shù)組的大小。這時,系統(tǒng)會根據(jù)實際字符串的長度決定數(shù)組的大小。 594.3 字符數(shù)組和字符串字符數(shù)組和字符串字符數(shù)組字符數(shù)組v定義定義 v字符數(shù)組的初始化字符數(shù)組的初始化l逐個字符賦值逐個字符賦值l用字符串常量用字符串常量v字符數(shù)組的引用字符數(shù)組的引用例例 char fruit10, ch34; 例例 char ch5=H,e,l,l,o;ch0He
44、llo逐個字符賦值逐個字符賦值ch1ch2ch3ch4 例例 char ch5=B,o,y;ch0Boy00逐個字符賦值逐個字符賦值ch1ch2ch3ch4 例例 char ch5=“Boy”;ch0Boy00用字符串常量用字符串常量ch1ch2ch3ch4 例例 char ch6=“Hello”; char ch6=“Hello”; char ch=“Hello”;用字符串常量用字符串常量ch0Helloch1ch2ch3ch40ch560 例例 char diamond5=., .,*,.,*,.,*, *, ., ., . ,*,.,*, .,*,., .,*;二維字符數(shù)組初始化二維字符
45、數(shù)組初始化.*00.*.*0*.*.*.*0.*00diamond0diamond1diamond2diamond3diamond4 例例 char fruit7=“Apple”,”O(jiān)range”, ”Grape”,”Pear”,”Peach”;二維字符數(shù)組初始化二維字符數(shù)組初始化fruit0fruit1fruit2fruit3fruit4Apple00Orange0Grape00Pear000Peach0061例例 輸出一個字符串輸出一個字符串#include main() char c10=I, ,a, m, ,a, ,b o,y; int i; for(i=0;i10;i+) print
46、f(%c,ci); printf(n);Iamaboy0123456789字符串字符串v字符串及其結束標志字符串及其結束標志l無字符串變量,用字符數(shù)組處理字符串無字符串變量,用字符數(shù)組處理字符串l字符串結束標志字符串結束標志:0例例 “hello”共共5個字符,在內(nèi)存占個字符,在內(nèi)存占6個字節(jié)個字節(jié) 字符串長度字符串長度5 h e l l o h e l l o 00104 101 108 108 111 0104 101 108 108 111 0內(nèi)存存放字符內(nèi)存存放字符ASCII碼碼v字符串的輸入輸出字符串的輸入輸出l逐個字符逐個字符I/O: %cl整個字符串整個字符串I/O: %s例例
47、用用%c %c main() char str5; int i; for(i=0;i5;i+) scanf(“%c”, &stri); for(i=0;i5;i+) printf(“%c”, stri);例例 用用%s %s main() char str5; scanf(“%s”, str); printf(“%s”,str);用字符數(shù)組名用字符數(shù)組名,不要加不要加&輸入串長度輸入串長度數(shù)組維數(shù)數(shù)組維數(shù)遇空格或回車結束遇空格或回車結束自動加自動加0用字符數(shù)組名用字符數(shù)組名,遇遇0結束結束64例例 main( ) char a5=H,e,l,l,o; printf(“%s”,a
48、);例例 main( ) char a =“Hello”; printf(“%s”,a); 結果:結果:Hello#-=* h e l l o02314結果:結果:Hello用用“%s%s”輸出時,遇輸出時,遇00結束結束65main() char a=h,e,l,0,l,o,0; printf(%s,a);例輸出:輸出:hel h e l 0 l o 0數(shù)組中有多個數(shù)組中有多個00時時, ,遇第一個結束遇第一個結束66main() int i; char a5; scanf(%s,a); for(i=0;i5;i+) printf(%d,ai);運行情況:運行情況:(1)若輸入)若輸入 he
49、l , 正常正常(2)若輸入)若輸入 hell , 正常正常(3)若輸入)若輸入 hello , 用用%s 輸出時,輸出時,會出現(xiàn)問題會出現(xiàn)問題 h e l 0 h e l l 0 h e l l o輸入字符串長度輸入字符串長度 數(shù)數(shù)組維數(shù)組維數(shù)! !67例例 字符串輸入舉例字符串輸入舉例 H o w 0 a r e 0 y o u ? 0 #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);運行情況:運行情況:輸入:輸入
50、:How are you?輸出:輸出:a=How b=are c=you?輸入:輸入:How are you?輸出:輸出:a=Howscanfscanf中中% %s s輸入時輸入時, ,遇空格遇空格或回車結束或回車結束運行情況:運行情況:輸入:輸入:How are you?68單個字符串輸入/輸出(一維字符數(shù)組 %c) char str5;for(i=0; i5; i+) scanf(“%c”,&stri); for(i=0; i5;i+) printf(“%c”,stri);for(i=0; i stri; for(i=0; i5; i+) cout str;cout str;70多
51、個字符串輸入輸出多個字符串輸入輸出( (二維字符數(shù)組二維字符數(shù)組) ) 方法一:兩層方法一:兩層for循環(huán)結合循環(huán)結合%c實現(xiàn)實現(xiàn) 例如:例如: char str210; for(i=0;i2;i+) for(j=0;j10;j+) scanf(%c,&strij); for(i=0;i2;i+) for(j=0;j10;j+) printf(%c,strij);71多個字符串輸入輸出多個字符串輸入輸出( (二維字符數(shù)組二維字符數(shù)組) ) 方法二:一層方法二:一層for循環(huán)結合循環(huán)結合%s實現(xiàn)實現(xiàn) 例如:例如: char str210; for(i=0;i2;i+) scanf(%s,
52、stri); /stri代表行首地址代表行首地址 for(i=0;i2;i+) printf(%s,stri);二維數(shù)組可當作一維數(shù)組來處理,二維數(shù)組可當作一維數(shù)組來處理,因此,一個二維數(shù)組可存儲多個字符串。因此,一個二維數(shù)組可存儲多個字符串。對二維數(shù)組輸入對二維數(shù)組輸入/輸出多個字符串時,可用循環(huán)完成。輸出多個字符串時,可用循環(huán)完成。724.3.3 常用的字符串處理函數(shù)包含在頭文件包含在頭文件cstring.h中中字符串輸入輸出函數(shù)字符串輸入輸出函數(shù)gets/puts字符串連接函數(shù)字符串連接函數(shù)strcat字符串復制函數(shù)字符串復制函數(shù)strcpy字符串比較函數(shù)字符串比較函數(shù)strcmp字符串
53、長度函數(shù)字符串長度函數(shù)strlen1. 大小寫字母轉(zhuǎn)換函數(shù)大小寫字母轉(zhuǎn)換函數(shù)strlwr/strupr73字符串輸入輸出函數(shù)gets/puts 字符串輸入函數(shù)字符串輸入函數(shù)gets 格式:格式:gets(字符數(shù)組字符數(shù)組) 功能:從鍵盤輸入一功能:從鍵盤輸入一以回車結束的字符串以回車結束的字符串放入字放入字符數(shù)組中,并自動加符數(shù)組中,并自動加0 返回值:返回值:即為該字符數(shù)組的首地址即為該字符數(shù)組的首地址 說明:說明:輸入串長度應小于字符數(shù)組維數(shù)輸入串長度應小于字符數(shù)組維數(shù) 字符串輸出函數(shù)字符串輸出函數(shù)puts 格式:格式:puts(字符數(shù)組字符數(shù)組) 功能:向顯示器輸出字符串(輸出完,換行)
54、功能:向顯示器輸出字符串(輸出完,換行) 說明:說明:字符數(shù)組必須以字符數(shù)組必須以0結束結束地址值,常為數(shù)地址值,常為數(shù)組名組名74字符串輸入輸出函數(shù)gets/puts main( ) char string80; printf(“Input a string:”); gets(string); puts(string); 輸入輸入: How are you? 輸出輸出: How are you ? puts(string+5);75注意兩個函數(shù)的操作方向注意兩個函數(shù)的操作方向字符串連接函數(shù)strcat 格式:格式:strcat(字符數(shù)組字符數(shù)組1,字符數(shù)組字符數(shù)組2) 功能:功能:把字符數(shù)組
55、把字符數(shù)組2連連接接到字符數(shù)組到字符數(shù)組1后面后面 返值:返回字符數(shù)組返值:返回字符數(shù)組1的首地址的首地址 說明:說明: 字符數(shù)組字符數(shù)組1必須足夠大必須足夠大 連接前連接前,兩串均以兩串均以0結束結束;連接后連接后,串串1的的0取消取消,新串最后加新串最后加076字符串連接函數(shù)strcat 例如,例如, 有程序段:有程序段: char str130=Your native language is ; char str210=Chinese; strcat(str1,str2); 執(zhí)行后執(zhí)行后: 字符串字符串str1的值為的值為: Your native language is Chinese
56、 注意注意: 字符數(shù)組字符數(shù)組1應定義足夠的長度。應定義足夠的長度。77字符串拷貝函數(shù)strcpy 格式:格式:strcpy(字符數(shù)組字符數(shù)組1,字符串字符串2) 功能:將字符串功能:將字符串2,拷貝拷貝到字符數(shù)組到字符數(shù)組1中去中去 返值:返值:返回字符數(shù)組返回字符數(shù)組1的首地址的首地址 說明:說明:字符數(shù)組字符數(shù)組1必須足夠大必須足夠大 拷貝時拷貝時0一同拷貝一同拷貝 不能使用賦值語句為一個字符數(shù)組賦值不能使用賦值語句為一個字符數(shù)組賦值例例 char str120,str220; str1=“Hello!”; ( ) str2=str1; ( )78例例 strcpy與與strcat舉例舉
57、例#include #include main() char destination25; char blank = , c= C+, turbo = Turbo; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf(%sn, destination);Turbo C+TrboC+0123456789u024.Trbo0123456789u024.Trbo00123456789u24.79字符串比較函數(shù)strcmp 格式:格式:strcmp(字符串字符串1,字符串字符串2)
58、 功能:比較兩個字符串功能:比較兩個字符串 比較規(guī)則:比較規(guī)則: 對兩串從左向右逐個字符比較(對兩串從左向右逐個字符比較(ASCII碼),直碼),直到遇到不同字符或到遇到不同字符或0為止為止 返值:返回返值:返回int型整數(shù),型整數(shù),a. 若字符串若字符串1 字符串字符串2, 返回返回正整數(shù)正整數(shù) c. 若字符串若字符串1= 字符串字符串2, 返回返回零零 說明:說明:字符串比較不能用字符串比較不能用“=”,必須用必須用strcmpif (strl=str2) printf(yesn); /錯誤錯誤80字符串長度函數(shù)strlen 格式:格式:strlen(字符字符串串) 舉例舉例:strlen
59、(string) 返值:返回字符串實際長度返值:返回字符串實際長度,(不包括不包括0在內(nèi)在內(nèi)) 例如:例如: strlen(C language)=10 strlen(C0language)=1例例 對于以下字符串,對于以下字符串,strlen(s)的值為:的值為:(1)char s10=A,0,B,C,0,D;(2)char s =“tv0willn”;(3)char s =“x69082n”; 答案:1 3 1#include main() char str1 = ”Hello!, str2 = ”How are you?”, str20; int len1,len2,len3; len1
60、=strlen(str1); len2=strlen(str2); if(strcmp(str1, str2)0) strcpy(str,str1); strcat(str,str2); else if (strcmp(str1, str2)0) strcpy(str,str2); strcat(str,str1); else strcpy(str,str1); len3=strlen(str); puts(str); printf(”Len1=%d,Len2=%d,Len3=%dn”,len1,len2,len3);例例 strcmp與與strlen舉例舉例How are you?Hello!Len1=6,Len2=12,Len3=1882大小寫字母轉(zhuǎn)換函數(shù)strlwr/strupr strlwr(x)調(diào)用形式調(diào)用形式: strlwr(x);功能功能: 把地址為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水世界安全培訓
- 小橋涵課程設計四川
- 一個項目的課程設計
- 日本食農(nóng)教育課程設計
- 分類閱讀理解課程設計
- 提升漢字教學實效的理論基礎
- 人工智能給外語專業(yè)人才培養(yǎng)帶來的機遇和挑戰(zhàn)
- 幼兒園大班勞動節(jié)安全教育
- 判斷冠脈狹窄是否造成心肌缺血的“金標準”方法
- 幼兒昆蟲標本課程設計
- 精益生產(chǎn)工廠調(diào)研報告及改善方案案例解析課件
- 繃縫系列使用說明書V10
- 影視理論基礎知識
- 中考復習-初中英語單詞表大全(2182個帶音標)
- 腹主動脈瘤護理查房課件(PPT 55頁)
- 農(nóng)業(yè)比較效益低的成因及應對
- 生產(chǎn)部績效手冊ppt課件
- 藍色唯美創(chuàng)意潑水節(jié)主題宣傳PPT模板課件
- 小學一年級上冊數(shù)學20以內(nèi)進位加法單元測試卷1
- 直觀教具在小學英語詞匯教學中的運用初探
- 《制冷設備原理與維修》期末試卷試題及參考答案
評論
0/150
提交評論