C語(yǔ)言-數(shù)組教程_第1頁(yè)
C語(yǔ)言-數(shù)組教程_第2頁(yè)
C語(yǔ)言-數(shù)組教程_第3頁(yè)
C語(yǔ)言-數(shù)組教程_第4頁(yè)
C語(yǔ)言-數(shù)組教程_第5頁(yè)
已閱讀5頁(yè),還剩125頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言-數(shù)組教程數(shù)組的定義和初始化

數(shù)組的賦值、輸入和輸出

字符數(shù)組

向函數(shù)傳遞一維數(shù)組和二維數(shù)組常用算法:排序、查找、求最大最小值等使用字符串處理函數(shù)處理字符串C的數(shù)據(jù)類型:

◎基本類(簡(jiǎn)單類)—字符型/整型/實(shí)型/枚舉型◎構(gòu)造類(組合類)—數(shù)組/結(jié)構(gòu)體/共用體◎指針類◎空類型(void)元素編號(hào)從0開(kāi)始,a[0]表示第1個(gè)元素,a[4]表示第5個(gè)元素(最后一個(gè))對(duì)于變量基本類型——單個(gè)出現(xiàn)的變量,每個(gè)變量可以代表一個(gè)確定的數(shù)據(jù)(變量值)如intx,y;但變量間不存在確定的相互關(guān)系。構(gòu)造類型——由基本類型按一定規(guī)則組成。其中:數(shù)組:由一組有序數(shù)據(jù)(數(shù)組元素)組成。每個(gè)元素:有相同類型,統(tǒng)一數(shù)組名;用下標(biāo)確定其順序;但可以取各自值。

如inta[5];

其中:[]表示a是個(gè)數(shù)組,而不是一個(gè)簡(jiǎn)單變量a。

5表示該數(shù)組共有5個(gè)元素?cái)?shù)組的用處很多。簡(jiǎn)單例子:要讀入某班全體50位同學(xué)某科學(xué)習(xí)成績(jī),然后進(jìn)行簡(jiǎn)單處理(求平均成績(jī)、最高分、最低分……)若用簡(jiǎn)單變量,需50個(gè)不同變量名,要用很多個(gè)scanf命令。如

intscore1,score2,…score50;scanf(“%d,%d,%d”,&score1,&score2,&score3);scanf(“%d,%d,%d”,&score4,&score5,&score6);而用數(shù)組,可共用一個(gè)scanf命令,并利用循環(huán)結(jié)構(gòu)讀取。

intscore[50],i;for(i=0;i<50;i++)scanf(“%d”,&score(i));數(shù)組是一組有序的同類型數(shù)據(jù)。數(shù)據(jù)稱為數(shù)組的元素。數(shù)組保存大量同類型的相關(guān)數(shù)據(jù)如矩陣運(yùn)算,表格數(shù)據(jù)等

數(shù)組的用處快速地隨機(jī)訪問(wèn)一旦定義,不能改變大小數(shù)組的特點(diǎn)數(shù)組的定義:數(shù)組在使用前要進(jìn)行定義:名稱、類型、維數(shù)、大小定義格式:

其中:(1)常量表達(dá)式可為常數(shù)、符號(hào)常數(shù)。但不包含變量,值必須是大于0的整數(shù)。(2)表達(dá)式的個(gè)數(shù)表明數(shù)組的維數(shù)。類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]……§6.1數(shù)組的定義與初始化如:inta[10];floatb[15];charc[30];×

inta[0][3];inti=3,j=4;inta[i][j];×

數(shù)組元素的引用:

數(shù)組元素是通過(guò)數(shù)組名加上該元素在數(shù)組中的位置(下標(biāo))來(lái)訪問(wèn)的。

引用格式:數(shù)組名[表達(dá)式]說(shuō)明:1、下標(biāo)從0開(kāi)始。如:數(shù)組A[n]的元素個(gè)數(shù)為n。下標(biāo)取值范圍是0——n-1.2、數(shù)組名代表該數(shù)組在內(nèi)存中的首地址。因此可用數(shù)組名代表數(shù)組中0號(hào)元素的地址。

數(shù)組的存儲(chǔ)結(jié)構(gòu):數(shù)組一經(jīng)定義,系統(tǒng)則根據(jù)數(shù)組的數(shù)據(jù)類型為每一個(gè)元素安排相同長(zhǎng)度的、連續(xù)的存儲(chǔ)單元。同時(shí)根據(jù)其存儲(chǔ)類型確定將其安排在內(nèi)存數(shù)據(jù)區(qū)或寄存器。①一維數(shù)組:從左到右順序存放。

如有數(shù)組inta[5];其中數(shù)據(jù)為:2、4、23、6、78則存放情況如下:

……..

4的高位字節(jié)4的低位字節(jié)2的高位字節(jié)2的低位字節(jié)20002002200420062008a[0]a[1]a[2]a[3]a[4]數(shù)組在內(nèi)存中的首地址即a=2000inta[5]={2,4,23,6,78};

a00

a01…….

a0n-1

a10

a11……..

a1n-1……….

am-10

am-11……..

am-1n-1②二維數(shù)組:按行的順序存放。

200020022004……….

am-10am-11……am-1n-1

a00a01……..a0n-1

a10a11……..a1n-1

….

按行優(yōu)先順序存放A[m][n]=則存放情況如下:若有數(shù)組b[2][3];其中數(shù)據(jù)為:111213

212223

111213212223

b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]

200020022004……二維數(shù)組可看成數(shù)組的數(shù)組A=(s0,

s2,

……..

,

sm-1)(0<=i<=m-1)

a00a01……..a0n-1

a10a11……..a1n-1

am-10am-1……..am-1n-1

….A[m][n]=

s0……..

sm數(shù)組的初始化定義數(shù)組時(shí)把數(shù)據(jù)賦予該數(shù)組。(用一對(duì)大花括號(hào)括起來(lái))intdata[10]={50,30,82,12,23,34,123,55,567,10};說(shuō)明:(1)若初始化列表中初值個(gè)數(shù)少于數(shù)組元素個(gè)數(shù),則自動(dòng)以0補(bǔ)充。1、一維數(shù)組的初始化(3)可隱含定義數(shù)組大小。如:inta[]={0,1,2,3,4,5,0};

注:初始化列表中必須列出全部初值(4){}號(hào)中的初值可以省略,但逗號(hào)不能省,缺省的部分被視為0。如:floatarray[5]={,2,3,4,};(2)若初始化列表中初值個(gè)數(shù)多于數(shù)組元素個(gè)數(shù),則給出錯(cuò)誤信息。2、二維數(shù)組的初始化如:inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};等效于:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};將全部的值放在一對(duì){}中(以行為準(zhǔn))。每一行的數(shù)據(jù)又可以分別放在一對(duì){}號(hào)中。(1)可以對(duì)數(shù)組進(jìn)行部分初始化,未初始化部分自動(dòng)清0。(注:不能省略對(duì)數(shù)組長(zhǎng)度的說(shuō)明)比較下面兩種初始化情況,有何不同:inta[2][3]={{5,6},{7,8}};與inta[2][3]={5,6,7,8};(2)可以省略第一維長(zhǎng)度,但第二維長(zhǎng)度不可省略。如:inta[][4]={{1,2,3,4},{5,6,7,8}};說(shuō)明:數(shù)組的賦值:數(shù)組的賦值不同于數(shù)組初始化。只能對(duì)數(shù)組元素進(jìn)行賦值而不能對(duì)數(shù)組名實(shí)施整體賦值。賦值的方法:(1)無(wú)規(guī)律的,各元素分別賦值。(2)有規(guī)律的,利用循環(huán)進(jìn)行賦值。一維數(shù)組用單循環(huán)、二維數(shù)組用雙重循環(huán)即可。§6.2數(shù)組的賦值、輸入和輸出數(shù)組常用的循環(huán)形式法一inti,a[100];for(i=0;i<100;i++)a[i]=i;法二inti,a[100];for(i=0;i<=99;i++)a[i]=i;C程序中常用的是第一種方法。此法中,循環(huán)變量的終值是“小于”而非“等于”數(shù)組長(zhǎng)度!否則將導(dǎo)致“越界”的發(fā)生。例1:inta[5],i;for(i=0;i<5;i++)a[i]=(i+1)*100;×

inta[5],i;a={100,200,300,400,500};不可寫(xiě)成:/*錯(cuò)誤編程*/main(){inta[4]={1,2,3,4],b[4];a=b;}解決方法法1:逐個(gè)元素賦值

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];法2:通過(guò)循環(huán)賦值

inti;for(i=0;i<4;i++)b[i]=a[i];原因:數(shù)組名表示數(shù)組的首地址,其值不可改變!如何使兩個(gè)數(shù)組的值相等:應(yīng)用示例:下列程序的功能是顯示如下圖形,請(qǐng)?zhí)羁铡?000021000321004321054321main(){inta[5][5],i,j;

for(i=0;i<5;i++){for(j=0;j<5;j++){if(

【1】

)a[i][j]=0;elsea[i][j]=【2】;printf("%3d",a[i][j]);}printf("\n");}}【分析】這類題的元素值排列很有規(guī)律,一般要從分析行列數(shù)i、

j與元素值的關(guān)系著手.當(dāng)i<j

時(shí)的各元素值均為0;而i>=j時(shí),元素值隨行數(shù)i增加而增加,隨列數(shù)j

增加而減小,這樣就很容易得出其元素值與i,j

的關(guān)系是i+1-j。1000021000321004321054321a[5][5]分析:a00a01a02a03a04a10a11a12a13a14a20a21a22a23a24a30a31a32a33a34a40a41a42a43a44main(){inta[5][5],i,j;

for(i=0;i<5;i++){for(j=0;j<5;j++){if(

【1】

)a[i][j]=0;elsea[i][j]=【2】;printf("%3d",a[i][j]);}printf("\n");}}i<ji+1-ja[5][5]分析:a00a01a02a03a04a10a11a12a13a14a20a21a22a23a24a30a31a32a33a34a40a41a42a43a441000021000321004321054321矩陣運(yùn)算

【例】有一3×4矩陣,編程求其元素最大值并輸出其行、列號(hào)。main(){inti,j,x,y,max;inta[][4]={3,5,8,1,6,9,7,12,-6};

max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max){max=a[i][j];x=i;y=j;}printf("maxisa[%d][%d]=%d\n",x,y,max);}358169712-6000要點(diǎn):用兩重循環(huán)遍歷所有元素。【討論】如果求最小值?例2:建立一個(gè)2*3的數(shù)組b,要求其各元素值是行、列下標(biāo)之和。注意:條件判斷時(shí)不可寫(xiě)成i<=2、j<=3,這樣將造成下標(biāo)超界。intb[2][3],i,j;for(i=0;i<2;i++)for(j=0;j<3;j++)b[i][j]=i+j;只能逐個(gè)對(duì)數(shù)組元素進(jìn)行操作(字符數(shù)組例外)輸入方法:inta[10],i;輸入第i個(gè)數(shù)組元素:scanf("%d",&a[i]);輸入整個(gè)數(shù)組元素:for(i=0;i<10;i++)scanf("%d",&a[i]);輸出方法:輸出第i個(gè)數(shù)組元素:printf("%d",a[i]);輸出整個(gè)數(shù)組元素:for(i=0;i<10;i++)printf("%d",a[i]);一維數(shù)組的輸入和輸出兔子生崽問(wèn)題1,2,3,5,8,13,21,34,55,89,144,233,…

一維數(shù)組的應(yīng)用——例6.1#include<stdio.h>#defineYEAR_MONTH12main(){

intf[YEAR_MONTH+1]={0,1,1};

intmonth;

for(month=3;month<=YEAR_MONTH;month++) { f[month]=f[month-1]+f[month-2]; }

for(month=1;month<=YEAR_MONTH;month++) {

printf("%d\t",f[month]); }

printf("\nsum=%d\n",f[YEAR_MONTH]);}例6.1例6.2從鍵盤(pán)輸入某班學(xué)生一門(mén)課的成績(jī)(人數(shù)不超過(guò)40人),打印出最高分及其學(xué)生學(xué)號(hào)從鍵盤(pán)輸入學(xué)生人數(shù)n;從鍵盤(pán)輸入所有學(xué)生的學(xué)號(hào)和成績(jī)分別存入數(shù)組num和score假設(shè)其中的一個(gè)學(xué)生成績(jī)?yōu)樽罡撸瑫r(shí)記錄其學(xué)號(hào),即令

maxScore=score[0] maxNum=num[0];對(duì)所有學(xué)生成績(jī)進(jìn)行比較,即

for(i=0;i<n;i++){

若score[i]>maxScore, 則修改maxScore值為score[i], 并記錄其學(xué)號(hào)maxNum=num[i];

}打印最高分maxScore及其學(xué)號(hào)maxNum;#include<stdio.h>#defineARR_SIZE40main(){

floatscore[ARR_SIZE],maxScore;

intn,i;

longmaxNum,num[ARR_SIZE];

printf("Pleaseentertotalnumber:");

scanf("%d",&n);

printf("Pleaseenterthenumberandscore:\n");

for(i=0;i<n;i++) {

scanf("%ld%f",&num[i],&score[i]); } maxScore=score[0]; maxNum=num[0];

for(i=1;i<n;i++) {

if(score[i]>maxScore) { maxScore=score[i]; maxNum=num[i]; } }

printf("maxScore=%.0f,maxNum=%ld\n",maxScore,maxNum);}數(shù)組的輸出#include<stdio.h>main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};for(i=0;i<10;i++){printf("

%2d",a[i]);if(i==4||i==9)printf("\n");}}例:將含有10個(gè)元素的a數(shù)組分兩行輸出。例2:按矩陣形式輸出二維數(shù)組b[3][4](部分程序):for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%6.2f",b[i][j]);printf(“\n”;)}..數(shù)組定義后的初值仍然是隨機(jī)數(shù),一般需要我們來(lái)初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};數(shù)組大小最好用宏來(lái)定義,以適應(yīng)未來(lái)可能的變化#defineSIZE10

inta[SIZE];數(shù)組大小定義好后,將永遠(yuǎn)不變總結(jié)——關(guān)于數(shù)組數(shù)組的下標(biāo)都是從0開(kāi)始對(duì)數(shù)組每個(gè)元素的使用與普通變量無(wú)異可以用任意表達(dá)式作為下標(biāo),動(dòng)態(tài)決定訪問(wèn)哪個(gè)元素for(i=0;i<SIZE;i++)

a[i]=2*i;下標(biāo)越界是大忌!使用大于最大下標(biāo)的下標(biāo),將訪問(wèn)數(shù)組以外的空間。那里的數(shù)據(jù)是未知的,可能帶來(lái)嚴(yán)重后果sizeof可以用來(lái)獲得數(shù)組大小關(guān)于數(shù)組討論:

如果下標(biāo)值小于0或超過(guò)數(shù)組長(zhǎng)度時(shí)會(huì)出現(xiàn)什么情況?例:main(){inta=1,b[5],c=2,i;for(i=0;i<=5;i++)b[i]=i+1;……}運(yùn)行程序或單步執(zhí)行觀察變量變化情況可以看到,變量c的值因數(shù)組越界而被悄悄破壞了(可能產(chǎn)生嚴(yán)重的錯(cuò)誤后果!)1234560123456數(shù)組名做函數(shù)參數(shù)1、傳址方式:實(shí)參將自己的地址傳遞給形參,可理解為實(shí)參與形參共用一個(gè)地址單元。因此,對(duì)形參的操作就是對(duì)實(shí)參的操作2、傳值方式:系統(tǒng)將實(shí)參中的數(shù)值復(fù)制一份給形參,實(shí)參與形參分別有各自的存儲(chǔ)單元,被調(diào)過(guò)程中的操作是在形參自己的存儲(chǔ)單元中進(jìn)行,過(guò)程調(diào)用結(jié)束后,形參的存儲(chǔ)單元被系統(tǒng)回收。回顧:函數(shù)參數(shù)傳遞的兩種方式

用數(shù)組名作參數(shù),就是將數(shù)組的首地址傳遞給函數(shù)實(shí)參數(shù)組與形參數(shù)組占用同一段內(nèi)存在函數(shù)中對(duì)形參數(shù)組元素修改的結(jié)果,會(huì)影響主調(diào)函數(shù)中的實(shí)參數(shù)組數(shù)組名做函數(shù)參數(shù)簡(jiǎn)單變量作函數(shù)參數(shù)

數(shù)組作函數(shù)參數(shù)

數(shù)組名做函數(shù)的實(shí)參和形參在主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義數(shù)組。實(shí)參數(shù)組和形參數(shù)組類型應(yīng)一致。實(shí)參數(shù)組和形參數(shù)組大小不一定一致,形參數(shù)組可以不指定大小,但形參數(shù)組名后面的方括號(hào)不能省略。

由于數(shù)組名代表數(shù)組的起始地址,故數(shù)組名做函數(shù)的實(shí)參和形參時(shí)不是“值傳遞”,而是“地址傳遞”。因此,形參數(shù)組各元素的值如果發(fā)生變化,會(huì)使實(shí)參數(shù)組各元素的值發(fā)生同樣的變化。1、傳值10

實(shí)參a20實(shí)參b

只是x,y的值互換10形參x20形參yx形參y2010形參x子函數(shù)內(nèi)部main(){…….inta=10,b=20;jh(a,b);……..}jh(intx,inty){intz;z=x;x=y;y=z;}2、傳址

1020

p[0]p[1]

a[0]a[1]

起始地址ffd4main(){…….inta[2]={10,20};jh(a);……..}ffd4實(shí)參數(shù)組名a形參數(shù)組名pffd4jh(intp[]){intz;z=p[0];p[0]=p[1];p[1]=z;}2010p[0]p[1]20p[0]10p[1]函數(shù)體內(nèi)一維數(shù)組名做函數(shù)參數(shù)(傳址方式)例:現(xiàn)有兩個(gè)整數(shù),編寫(xiě)一個(gè)函數(shù)實(shí)現(xiàn)二者交換分別用傳值和傳址兩種方式實(shí)現(xiàn)見(jiàn)實(shí)例jh1.c,jh2.cmain()jh1.c{inta=10,b=20;printf("theadressofais:%x\n",&a);printf("theadressofbis:%x\n",&b);printf(“beforeexchangea,bis:a=%d,b=%d\n",a,b);jh(a,b);printf(“afterexchangea,bis:a=%d,b=%d\n",a,b);}jh(intx,inty){intz;printf("theadressofxis:%x\n",&x);printf("theadressofyis:%x\n",&y);printf(“beforeexchangex,yis:x=%d,y=%d\n",x,y);z=x;x=y;y=z;printf(“afterexchangex,yis:x=%d,y=%d\n",x,y);}main()

jh2.c{

inta[2];a[0]=10;a[1]=20;printf("theadressofais:a=%x\n",a);printf(“beforeexchange:a[0]=%d,a[1]=%d\n",a[0],a[1]);jh(a);printf(“afterexchange:a[0]=%d,a[1]=%d\n",a[0],a[1]);}jh(intp[]){intz;printf("theaddresofpis:p=%x\n",p);z=p[0];p[0]=p[1];p[1]=z;printf("p[0]=%d,p[1]=%d\n",p[0],p[1]);}數(shù)組作函數(shù)參數(shù)1號(hào)2號(hào)swap(intx,inty){intp;p=x;x=y;y=p;}main(){inta,b;scanf(“%d,%d”,&a,&b);

if(a<b)swap(a,b);printf(“%d,%d\n”,a,b);}交換形參變量值普通變量作函數(shù)參數(shù)運(yùn)行情況:5,95,9普通變量作函數(shù)參數(shù)1號(hào)2號(hào)3號(hào)4號(hào)#include<stdio.h>#defineARR_SIZE40floatFindMax(floatarr,intn);main(){

floatscore[ARR_SIZE],maxScore;

intn,i;

printf("Pleaseentertotalnumber:");

scanf("%d",&n);

printf("Pleaseenterthescore:\n");

for(i=0;i<n;i++) {

scanf("%f",&score[i]); } maxScore=FindMax(score,n);

printf("maxScore=%.0f\n",maxScore);}floatFindMax(floatarr[],intn){

floatmax;

inti;

max=arr[0];

for(i=1;i<n;i++) {

if(arr[i]>max)max=arr[i]; } returnmax;}例—打印出最高分一維數(shù)組名做函數(shù)參數(shù)二維數(shù)組名做函數(shù)參數(shù)voidTotal(int

score[][COURSE],

intsum[],

floataver[],intn){

inti,j;

for(j=0;j<COURSE;j++) { sum[j]=0;

for(i=0;i<n;i++) { sum[j]=sum[j]+score[i][j]; } aver[j]=(float)sum[j]/n; }}例6.7、6.8計(jì)算總分和平均分設(shè)有矩陣1234要求編程實(shí)現(xiàn):

5678(1)將其存入數(shù)組(2)并以以下矩陣形式15存入另一數(shù)組

263748(3)分別輸出兩數(shù)組例1、定義數(shù)組a[2][4]、b[4][2]2、將數(shù)據(jù)送入a數(shù)組3、根據(jù)數(shù)據(jù)排列的情況將a數(shù)組數(shù)據(jù)賦予b數(shù)組

a、b數(shù)組間關(guān)系為:

a的行=b的列

a的列=b的行

b[j][i]=a[i][j]4、分別輸出a、b數(shù)組數(shù)據(jù)問(wèn)題分析:main(){inta[2][4]={1,2,3,4,5,6,7,8},b[4][2],i,j;for(i=0;i<2;i++){for(j=0;j<4;j++)printf("%4d",a[i][j]);printf("\n");}for(i=0;i<2;i++){for(j=0;j<4;j++){b[j][i]=a[i][j];}printf("\n");}for(j=0;j<4;j++){for(i=0;i<2;i++)printf("%4d",b[j][i]);printf("\n");}}例:設(shè)有矩陣0123451234562345673456784567895678910(1)將矩陣存入一個(gè)二維數(shù)組要求:(2)將二維數(shù)組中的數(shù)據(jù)送入一個(gè)一維數(shù)組(3)分別輸出兩個(gè)數(shù)組問(wèn)題分析:1、定義數(shù)組2、將數(shù)據(jù)送入a數(shù)組

a[6][6]、b[36]

b[k]=a[i][j]4、分別輸出a、b數(shù)組數(shù)據(jù)3、將a數(shù)組數(shù)據(jù)賦予b數(shù)組a數(shù)組的數(shù)據(jù)可自動(dòng)生成

a[i][j]=i+j

for(i=0;i<36;i++)

main()

inta[6][6],b[36];

for(i=0;i<6;i++)for(j=0;j<6;j++)

printf(“\n”);{}printf(“%d”,b[i]);

inti,jk=0;K++;}{{}a[i][j]=i+j;b[k]=a[i][j];printf(“%d\t”,a[i][j]);

printf(“\n”);§6.3字符數(shù)組

字符數(shù)組是每個(gè)元素存放一個(gè)字符型數(shù)據(jù)的數(shù)組。字符數(shù)組的定義形式和元素的引用方法與一般數(shù)組相同。

說(shuō)明:C語(yǔ)言中沒(méi)有專門(mén)的字符串變量,因此利用字符型數(shù)組來(lái)處理字符串。3.字符串常量是用雙引號(hào)包圍的字符序列。如:

“china”,作為字符串的結(jié)束標(biāo)志的‘\0’可以不顯式寫(xiě)出.2.C語(yǔ)言中約定用‘\0’作為字符串的結(jié)束標(biāo)志,它占內(nèi)存空間,但不計(jì)入串的實(shí)際長(zhǎng)度。即“china”

“china\0”兩種用法:(1)作為字符(單個(gè)字符操作)(2)作為字符串(整體操作)一、字符數(shù)組的初始化The\0\0【注意】如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,則多余的數(shù)組元素自動(dòng)為空字符(’\0’)

charrat[5]={‘T’,‘h’,‘e’,‘

’};1、用字符型數(shù)據(jù)對(duì)字符數(shù)組初始化2、用字符串常量對(duì)字符數(shù)組初始化

charpanic[6]={"HELLO"};HELLO\0注意:數(shù)組中的字符除了H,E,L,L,O之外,系統(tǒng)自動(dòng)加入結(jié)束標(biāo)志‘\0’。為了用一個(gè)字符數(shù)組來(lái)存儲(chǔ)長(zhǎng)度為N的字符串,要求字符數(shù)組的大小至少為N+1.初始化時(shí)也可省略花括號(hào)。

charpanic[]="HELLO";×

HELLO\0系統(tǒng)自動(dòng)加入下面的初始化是錯(cuò)誤的:charneg[5]="doublearrow";【例】比較以下字符數(shù)組長(zhǎng)度是否相同:

chara[]=”ABCD”;charb[]={“ABCD”};charc[]={‘A’,’B’,’C’,’D’};字符常量與字符串常量的區(qū)別

字符常量字符串常量

單引號(hào)雙引號(hào)1個(gè)字符多個(gè)字符字符變量字符數(shù)組一個(gè)字節(jié)

字符串中字節(jié)數(shù)+1(\0結(jié)束標(biāo)志)

引用形式:存放內(nèi)容:賦值對(duì)象:占用空間:例如:‘a(chǎn)’“a”不同1個(gè)字節(jié)2個(gè)字節(jié)

回顧——應(yīng)用舉例:例1:作為普通數(shù)組處理

main(){charary1[10]={‘P’,’L’,’O’,’T’},ary2[10];charch;inti,j;for(i=0;i<4;i++)printf(“%c”,ary1[i]);

printf(“請(qǐng)輸入一行字符\n”);for(i=0;i<10;i++){scanf(“%c”,&ch);if(ch==‘\n’)break;ary2[i]=ch;}for(j=0;j<i;j++)printf(“%c”,ary2[j]);}例2:作為字符串處理

main(){charary1[10]=“PLOT”,ary2[10];printf(“%s”,ary1);printf(“請(qǐng)輸入一行字符\n”);scanf(“%s”,ary2);printf(“%s”,ary2);}注意:Printf、scanf處理字符串?dāng)?shù)組時(shí)可使用數(shù)組名作為函數(shù)參數(shù)。對(duì)于一個(gè)二維數(shù)組,C編譯程序?qū)⑵湟暈橐粋€(gè)一維數(shù)組,這個(gè)一維數(shù)組中每個(gè)元素又是一個(gè)一維數(shù)組。這一概念對(duì)字符型數(shù)組仍適用。3、二維字符數(shù)組的初始化aa\0\0bbb\0c\0\0\0charch[3][4]={″aa″,″bbb″,″c″};第一維的長(zhǎng)度代表要存儲(chǔ)的字符串的個(gè)數(shù),可以省略。第二維的長(zhǎng)度不能省略,且應(yīng)按最長(zhǎng)的字符串長(zhǎng)度設(shè)定二、字符數(shù)組的輸入輸出1、按C格式符一個(gè)字符一個(gè)字符地單獨(dú)輸入輸出例:main(){inti;charstr[10];for(i=1;i<10;i++)scanf(“%c”,&str[i]);for(i=1;i<10;i++)printf(“%c”,str[i]);}2、按S格式符將字符串作為一個(gè)整體輸入輸出①用scanf函數(shù)加%s實(shí)現(xiàn)字符串輸入注意:(1)輸入的字符串中不能有空格、回車(chē)或跳格符(Tab),因?yàn)橄到y(tǒng)遇到這些分隔符時(shí),會(huì)認(rèn)為輸入結(jié)束。上例中若輸入:helloworld則實(shí)際存入str的只有"hello"例如:charstr[10];scanf("%s",str);②用printf函數(shù)加%s實(shí)現(xiàn)字符串輸出

printf("%s",str);(2)要保證字符數(shù)組的長(zhǎng)度足夠大。(3)數(shù)組名前不用加&符號(hào),因?yàn)閿?shù)組名本身代表該數(shù)組的首地址。數(shù)組名【例】下列程序段的運(yùn)行結(jié)果是:

chara[5]={‘a(chǎn)’,’b’,’\0’,’d’,’\0’};printf(“%s”,a);說(shuō)明:%s的作用是輸出一個(gè)字符串,直到遇到’\0’為止。3、用字符串處理函數(shù)gets或puts輸入輸出一個(gè)字符串

gets()函數(shù)——專門(mén)用于輸入字符串一般形式是:gets(字符數(shù)組名);

其中:函數(shù)參數(shù)只能使用數(shù)組名而不能是字符串常量與scanf函數(shù)的不同是:

gets()函數(shù)將用戶鍵入的換行符之前的所有字符(包括‘\t’和‘’)存入字符數(shù)組,然后加上‘\0’,但換行符被丟掉與scanf函數(shù)相同的是:

gets()函數(shù)也不檢查用戶輸入字符串長(zhǎng)度是否超過(guò)了字符數(shù)組的容納能力,因此編程者要確保數(shù)組足夠大。gets()函數(shù)——#include<stdio.h>/*必須加上*/#defineLATH80main(){charname[LATH];printf("你好,請(qǐng)輸入姓名:\n");gets(name);printf("真是個(gè)好名字:%s\n",name);}例:#include<stdio.h>#defineLEN80main(){charname1[LEN];printf(“請(qǐng)輸入一個(gè)姓名:\n");scanf("%s",name1);printf("讀入的名字是%s\n",name1);}輸入:于航輸出:于1.輸入多個(gè)數(shù)據(jù)時(shí),格式控制串中沒(méi)有非格式字符,則輸入時(shí)數(shù)據(jù)間的分隔符可用空格、TAB鍵、回車(chē)鍵。

2.輸入字符數(shù)據(jù)時(shí),若格式控制符中無(wú)非格式符,則認(rèn)為所有輸入的字符均為有效字符。

scanf(“%c%c%c”,&a,&b,&c);printf(“a=%c,b=%c,c=%c”,a,b,c);

輸入:A,B,C

輸出:a=A,b=,,c=B

Scanf函數(shù)的%c格式小結(jié):

Scanf函數(shù)的%s格式輸入的字符串中不能有空格、回車(chē)或跳格符(Tab),因?yàn)橄到y(tǒng)遇到這些分隔符時(shí),會(huì)認(rèn)為輸入結(jié)束。不檢查用戶輸入字符串長(zhǎng)度是否超過(guò)了字符數(shù)組的容納能力例如:charstr[10];scanf("%s",str);若輸入:helloworld則實(shí)際存入str的只有"hello"

gets()函數(shù)將用戶鍵入的換行符之前的所有字符(包括‘\t’和‘

’)存入字符數(shù)組,然后加上‘\0’,但換行符被丟掉不檢查用戶輸入字符串長(zhǎng)度是否超過(guò)了字符數(shù)組的容納能力容易引起緩沖區(qū)溢出

scanf()不能讀入帶空格的字符串,gets()可以其中:函數(shù)參數(shù)可以是字符串常量,也可以是字符串變量。

puts()函數(shù)——專門(mén)用于輸出字符串一般形式是:puts(字符串);與printf()的不同:

Puts()函數(shù)打印字符串的全部?jī)?nèi)容,直至遇到'\0'為止,然后自動(dòng)多打印一個(gè)'\n',起到換行的作用。而printf函數(shù)無(wú)此功能。#include<stdio.h>#definePREDEF"這是預(yù)定義字符串"main(){charstr[]=“這是初始化字符串”;puts("這是直接使用字符串常量");puts(PREDEF);puts(str);}例:建議:當(dāng)多種類型的混合輸入輸出時(shí),選用scanf和printf;

當(dāng)大量文字信息輸入輸出時(shí),使用gets和puts。這些函數(shù)的原型存放在string.h文件中。

strlen()函數(shù)——測(cè)試字符串的長(zhǎng)度

strcat()函數(shù)——字符串連結(jié)

strcmp()函數(shù)——字符串比較

strcpy()函數(shù)——字符串的拷貝三、字符串處理函數(shù)1、strlen()函數(shù)功能:測(cè)試字符串的長(zhǎng)度。一般形式是:length=strlen(字符串)其中:函數(shù)參數(shù)可以是字符串常量,或者字符變量。整型變量length用于保存函數(shù)的返回值。字符串的長(zhǎng)度是包圍在雙引號(hào)內(nèi)的有效字符數(shù),不包括雙引號(hào)和‘\0’。如:"ABC"長(zhǎng)度為3。"abc\n"長(zhǎng)度為4""長(zhǎng)度為0例:#include<stdio.h>#include<string.h>main(){charmsg[]="RockandRoll";intlnth;lnth=strlen(msg);printf("字符串:%s的長(zhǎng)度是:%d\n",msg,1nth);printf(“空字符串的長(zhǎng)度是:%d\n",strlen(""));}2、strcat()函數(shù)功能:用于連結(jié)兩個(gè)字符串。一般形式:strcat(字符串1,字符串2);

將字符串2連結(jié)到字符串1的后面注意:(1)strcat函數(shù)不檢查字符串1的空白位置是否裝得下字符串2。連結(jié)前應(yīng)用strlen函數(shù)進(jìn)行檢驗(yàn),確保不發(fā)生溢出。(2)長(zhǎng)度加1,為新字符串的結(jié)束符‘\0’留一個(gè)位置。其中:參數(shù)1必須是字符串變量,而參數(shù)2可以是字符串常量或變量。例:#include<stdio.h>#include<string.h>#defineSIZE30main(){charbook[SIZE];

charmsg[]="的確是本好書(shū)!";puts("你喜歡什么書(shū)?");gets(book);

if(strlen(book)+strlen(msg)+1<=SIZE){/*長(zhǎng)度加1,為新串的'\0'留一個(gè)位置*/strcat(book,msg);puts(book);}elseputs("字符數(shù)組空間不夠,無(wú)法進(jìn)行連結(jié)!");}示例#include"string.h"main(){chara[80]=”AB”,b[80]=”LMNP”;inti=0;strcat(a,b);while(a[i++]!=’\0’)b[i]=a[i];puts(b);}結(jié)果:LBLMNP【注意】

b[i]=a[i]是從i=1開(kāi)始3、strcmp()函數(shù)功能:比較兩個(gè)字符串的大小。一般形式:i=strcmp(字符串1,字符串2);比較方法:從左至右逐個(gè)比較其ASCII碼值大小其中:(1)字符串1、字符串2均可為字符串常量或變量.(2)i是用于存放比較結(jié)果的整型變量。比較結(jié)果的規(guī)定:①字符串1<字符串2,函數(shù)返回一個(gè)負(fù)值。②字符串1=字符串2,函數(shù)返回零。③字符串1>字符串2,函數(shù)返回一個(gè)正值。#include<stdio.h>#include<string.h>main(){inti;

i=strcmp("A","A");printf("%d\n",i);

i=strcmp("A","B");printf("%d\n",i);printf("%d\n",strcmp("B","A"));printf("%d\n",strcmp("C","A"));printf("%d\n",strcmp("disk","disks"));}例正確的做法是用strcmp函數(shù)進(jìn)行比較。

if(strcmp("ABC","DEF")字符串的比較是比較字符串中各對(duì)字符的ASCII碼。因此無(wú)論兩個(gè)字符串是什么樣,strcmp函數(shù)最多比較到其中一個(gè)字符串遇到結(jié)束符'\0'為止。×

如:if(“ABC”>“DEF”)注意:字符串是數(shù)組類型而非簡(jiǎn)單類型,不能用關(guān)系運(yùn)算進(jìn)行大小比較。#include<stdio.h>#include<string.h>#defineSIZE80#definePASSWORD"zhang"#defineTIMES3main(){inttry;charinput[SIZE];try=0;/*猜測(cè)次數(shù)變量清0*/

puts("請(qǐng)輸入密碼");

do{gets(input);if(strcmp(input,PASSWORD)!=0)puts("密碼輸入錯(cuò),請(qǐng)?jiān)僭囈淮?);

elsebreak;

}while(++try<TIMES);

/*如果少于TIMES次,允許再試*/

if(try<TIMES)/*在規(guī)定次數(shù)內(nèi)輸入正確*/

puts("密碼正確,請(qǐng)繼續(xù)運(yùn)行程序...");

elseputs("非法用戶,不能使用本程序");}例:密碼檢查程序4、strcpy()函數(shù)功能:用于實(shí)現(xiàn)兩個(gè)字符串的拷貝。一般形式:strcpy(字符串1,字符串2)

將字符串2拷貝到字符串1中

其中:字符串1必須是字符串變量,不能是字符串常量。注意:由于字符串是數(shù)組類型,所以兩個(gè)字符串復(fù)制不能通過(guò)賦值運(yùn)算進(jìn)行。如:t=s;——錯(cuò)誤的字符串復(fù)制*/

strcpy(t,s);——正確的字符串復(fù)制例10:#include<stdio.h>#include<string.h>#defineSIZE80main(){chars[]="Chinese";chart[SIZE];printf("原字符串是%s\n",s);strcpy(t,s);printf("拷貝的字符串是%s\n",t);printf("拷貝后原字符串是%s\n",s);}如果只需考貝字符串的一部分…

如果是考貝字符串的一部分,可用函數(shù)strncpy(目的字符數(shù)組,源字符串,考貝字符數(shù))

#include“string.h”main(){chars[]=”Thisisasourcestring.”,b[20];strncpy(b,s,16);b[16]=’\0’;printf(“%s\n”,b);}結(jié)果:Thisisasource例6.9從鍵盤(pán)任意輸入5個(gè)學(xué)生的姓名,編程輸出按字典順序排在最前面的學(xué)生姓名等價(jià)于求最小字符串#include<stdio.h>#include<string.h>#defineARRA_SIZE80main(){

intn,num;

charstr[ARRA_SIZE],min[ARRA_SIZE];

printf("Pleaseenterfivenames:\n"); gets(str); strcpy(min,str);

for(n=1;n<5;n++) { gets(str);

if(strcmp(str,min)<0) { strcpy(min,str); } } printf("Theminis:"); puts(min);}morestringfunctions…strupr()和strlwr()

大小寫(xiě)轉(zhuǎn)換函數(shù)

strupr(字符串)

小寫(xiě)→大寫(xiě)

strlwr(字符串)

大寫(xiě)→小寫(xiě)數(shù)據(jù)分檔(分類)、數(shù)據(jù)排序、數(shù)據(jù)檢索§5.4

幾個(gè)常用算法

一、數(shù)據(jù)分檔缺點(diǎn):程序冗長(zhǎng)、占機(jī)時(shí)多常用數(shù)據(jù)分類的方法利用if語(yǔ)句利用switch語(yǔ)句例:隨機(jī)輸入一組數(shù)據(jù),數(shù)據(jù)在1~4之間,輸入結(jié)束統(tǒng)計(jì)出各類數(shù)據(jù)的個(gè)數(shù)。分析問(wèn)題給出算法一:1、輸入數(shù)據(jù)到x2、判斷該數(shù)據(jù)屬于那類,分別記數(shù)4、分別輸出a、b、c、d的值3、反復(fù)執(zhí)行1、2步驟直到數(shù)據(jù)輸完為1記入a中為2記入b中為3記入c中為4記入d中編程方法一:(用基本數(shù)據(jù)類型)

main(){Loop:scanf(“%d”,&x);if(x==1)a+=1;if(x==2)b+=1;if(x==3)c+=1;if(x==4)d+=1;gotoloop;

intx,a,b,c,d;

a=b=c=d=0;

if(x==9999)gotoend;

if(x>=5||x<1)gotoloop;}

end:printf(“1的個(gè)數(shù)為:%d”,a);printf(“2的個(gè)數(shù)為:%d”,b);printf(“3的個(gè)數(shù)為:%d”,c);printf(“4的個(gè)數(shù)為:%d”,d);下標(biāo)標(biāo)量的引進(jìn),為分檔問(wèn)題提供了一種巧妙的方法,使程序明顯簡(jiǎn)化。分析問(wèn)題給出算法二:2、輸入數(shù)據(jù)到x3、判斷該數(shù)據(jù)屬于那類,分別記數(shù)5、分別輸出a[1]~a[4]的值4、反復(fù)執(zhí)行2、3步驟直到數(shù)組輸完

a[1]中記1的個(gè)數(shù)1、設(shè)定一個(gè)數(shù)組a存放統(tǒng)計(jì)結(jié)果

a[5]

a[4]中記4的個(gè)數(shù)

a[3]中記3的個(gè)數(shù)

a[2]中記2的個(gè)數(shù)

a[X]+=1main(){inta[5]={0,0,0,0,0},x,i,j;scanf("%d",&x);while(x<=4&&x>=1){a[x]=a[x]+1;scanf("%d",&x);}for(i=1;i<5;i++)printf("\na[%d]=%d",i,a[i]);}編程方法二:(用數(shù)組)二、數(shù)據(jù)排序數(shù)據(jù)排序又稱為排隊(duì)問(wèn)題。所謂排序就是對(duì)一個(gè)數(shù)值大小不規(guī)則的數(shù)列按從小到大(從大到小)的順序重新組成一個(gè)新的數(shù)列。

內(nèi)部排序:插入~、選擇~、交換~、歸并~排序的分類

外部排序1、交換排序——“冒泡”排序法特點(diǎn):逐個(gè)對(duì)數(shù)組中每相鄰二數(shù)進(jìn)行比較,若條件滿足,則互相交換,否則保持原位置不變。若有n個(gè)數(shù)據(jù),需要進(jìn)行i=n-1輪比較。每輪中比較的次數(shù)為j=n-i+1次。排序過(guò)程:(設(shè)數(shù)據(jù)存于A數(shù)組中,n個(gè)數(shù)據(jù),按遞增次序排序)A[0]與A[1]比較A[0]<A(1)不換,否則對(duì)調(diào)A[1]與A[2]比較A[1]<A[2]不換,否則對(duì)調(diào):A[n-2]與A[n-1]比較A[n-2]<A[n-1]不換,否則對(duì)調(diào)交換排序:倆倆比較待排序記錄的鍵值,若逆序,則交換,直到全部滿足為止4936416511第六趟排序后第五趟排序后第四趟排序后第三趟排序后第二趟排序后第一趟排序后初始關(guān)鍵字7836653641563641654136415611783636414911564925252511494956111111252525251、冒泡排序例:教材193頁(yè)例6.32、選擇排序——簡(jiǎn)單選擇排序法簡(jiǎn)單選擇排序:從1到n選出鍵值最(大)小的記錄,交換到第一個(gè)位置上,然后從2到n選出鍵值最(大)小的記錄,交換到第二個(gè)位置上,….5471582931547158293154715829315471582931i=0初態(tài)k=0數(shù)組下標(biāo)01234j=1k=0j=2k=0j=3k=3j=4k!=i,交換第一趟互換i=0判斷a[j]<a[k]?用選擇法對(duì)數(shù)組inta[5]={54,71,58,29,31}進(jìn)行升序排序k=jk=1j=2i=12971585431j=3k=2i=1第二趟29715854312971585431i=1k=3j=42971585431i=1k=4k!=i,交換互換29

31585471判斷a[j]<a[k]?k=jk=jk=j29

31585471i=2k=2j=329

31

58

5471i=2k=3j=429

31

545871互換第三趟k!=i,交換i=3k=3j=4k=i,不交換第四趟判斷a[j]<a[k]?三、查找查找的方法很多。如:順序查找、二分法查找、散列法等等。1、順序查找:最簡(jiǎn)單的查找方法,基本思想是利用循環(huán)順序掃描整個(gè)數(shù)組,依次將每個(gè)元素與待查找值比較,直至找到或找不到。對(duì)于無(wú)序數(shù)組,順序查找是唯一可行的辦法對(duì)大批量數(shù)據(jù)用順序查找占機(jī)器時(shí)間較多。intSearch(longa[],intn,longx){

inti;

for(i=0;i<n;i++){

if(a[i]==x){

return(i);}}

return(-1);}2、二分法查找/折半查找:二分法查找的條件:必須

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論