C語言 數(shù)組 課件講解_第1頁
C語言 數(shù)組 課件講解_第2頁
C語言 數(shù)組 課件講解_第3頁
C語言 數(shù)組 課件講解_第4頁
C語言 數(shù)組 課件講解_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

例求一個(gè)班100個(gè)學(xué)生的平均成績,然后統(tǒng)計(jì)高于平均分的人數(shù)。使用簡單變量和循環(huán)結(jié)構(gòu)相結(jié)合的方法求平均成績:

aver=0;for(i=1;i<=100;i++){scanf(“%f”,&mark);aver=aver+mark;}aver=aver/100;2024/3/71精選ppt

若要統(tǒng)計(jì)高于平均分的人數(shù),則無法實(shí)現(xiàn)。mark是一個(gè)簡單變量,存放的是最后一個(gè)學(xué)生的成績。

用已有知識解決方法:1.再重復(fù)輸入成績,帶來兩個(gè)問題:(1)輸入數(shù)據(jù)的工作量成倍增加;(2)若本次輸入的成績與上次不同,則統(tǒng)計(jì)的結(jié)果不正確。2.使用100個(gè)變量mark1,mark2,……,mark99,mark100。2024/3/72精選ppt分析:1.此100個(gè)變量均為學(xué)生成績,表示同一類對象。2.數(shù)據(jù)類型相同。3.可以用序號區(qū)分不同的變量。

解決此問題的根本方法,引入數(shù)組,始終保持輸入的數(shù)據(jù),一次輸入,多次使用。2024/3/73精選ppt除了int、float、char等基本數(shù)據(jù)類型外,C語言還提供了構(gòu)造數(shù)據(jù)類型,來滿足不同應(yīng)用的需要。構(gòu)造數(shù)據(jù)類型是由基本數(shù)據(jù)類型按一定規(guī)則組成的,也稱作“導(dǎo)出類型”。構(gòu)造數(shù)據(jù)類型包括數(shù)組、結(jié)構(gòu)體、共用體。數(shù)組(array)能將具有相同類型的數(shù)據(jù)組合在一起,通常是用于處理批量數(shù)據(jù)。Anarrayisadatatypethatusessubscriptedvariablesandmakespossibletherepresentationofalargenumberofhomogeneousvalues.第4章數(shù)組和指針精選ppt數(shù)組的維數(shù)數(shù)組中能唯一確定數(shù)組元素的下標(biāo)的個(gè)數(shù)稱為數(shù)組的維數(shù)一維數(shù)組:只用一個(gè)下標(biāo)就能區(qū)分?jǐn)?shù)組中的不同元素的二維數(shù)組:要用兩個(gè)下標(biāo)才能區(qū)分?jǐn)?shù)組中的不同元素1×6一維數(shù)組3×4二維數(shù)組2×3×4三維數(shù)組inta[6]; intb[3][4];intc[2][3][4];精選ppt4.1一維數(shù)組

4.1.1一維數(shù)組的定義與初始化

1.一維數(shù)組定義

類型定義符

數(shù)組名[整型常量表達(dá)式];【例如】

inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a數(shù)組名表示內(nèi)存首地址,是地址常量編譯時(shí)系統(tǒng)分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=數(shù)組維數(shù)*sizeof(元素?cái)?shù)據(jù)類型)數(shù)組a在內(nèi)存占24字節(jié)(6*4字節(jié))6精選pptAone-dimensionalarraydeclarationisatypefollowedbyanidentifierwithabracketedconstantintegralexpression.Thevalueoftheexpression,whichmustbepositive,isthesizeofthearray.Itspecifiesthenumberofelementsinthearray.Thearraysubscriptscanrangefrom0tosize-1.Thelowerboundofthearraysubscriptsis0andtheupperboundissize-1.精選ppt4.1.1一維數(shù)組的定義與初始化【例如】floatscore[50];

charname[20];注意:

不能用變量定義數(shù)組的長度。

floatscore[n];×當(dāng)定義數(shù)組語句中不同時(shí)給變量賦值時(shí),方括號內(nèi)不得為空。

inta[];×數(shù)組一旦定義,數(shù)組的大小就不能再改變。常用的辦法是用符號常量來指定元素個(gè)數(shù)。

#definesize50

floatscore[size];8精選ppt4.1.1一維數(shù)組的定義與初始化2.一維數(shù)組初始化類型定義符

數(shù)組名[常量]={值1,值2,…,值n};例如:inta[6]={1,2,3,4,5,6};inta[]={1,2,3,4,5,6};兩者等價(jià)于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;例如:

inta[6]={1,2};等價(jià)于:a[0]=1;a[1]=2;a[2]=0;a[3]=0;a[4]=0;a[5]=6;intc[10]={0};//將0賦給c[0]~c[9]inta[]={1,2};//等價(jià)于:a[0]=1;a[1]=2;9精選ppt4.1.2一維數(shù)組元素的引用與操作1.數(shù)組元素的引用

數(shù)組名[下標(biāo)]注意:(1)數(shù)組元素的下標(biāo)從0開始(2)引用數(shù)組元素時(shí),只能單個(gè)引用,不能一次引用整個(gè)數(shù)組

inta[6];a={3,4,5,6,7};×a[6]={3,4,5,6,7};×(3)下標(biāo)不要超出數(shù)組的范圍,否則導(dǎo)致錯(cuò)誤的程序結(jié)果。10精選ppt2.數(shù)組的賦值可以在定義數(shù)組時(shí)對數(shù)組中的全部變量或部分變量賦值(即數(shù)組的初始化)??梢栽谡Z句中為變量賦值。利用循環(huán)依次為每個(gè)數(shù)組元素賦值或輸入值。4.1.2一維數(shù)組元素的引用與操作main(){inti,a[5];

for(i=0;i<5;i++)a[i]=i;

//用循環(huán)結(jié)構(gòu)直接對數(shù)組賦初值for(i=0;i<5;i++)

printf("%d,",a[i]);printf("\n");}

運(yùn)行結(jié)果為:0,1,2,3,4,

精選ppt用交互的循環(huán)結(jié)構(gòu)對數(shù)組賦初值main(){

inti,a[5];

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

printf("a[%d]=",i),scanf("%d",&a[i]);

for(i=0;i<5;i++) printf("%d,",a[i]);printf("\n");}精選ppt例:定義長度為10的整型類型一維數(shù)組并完成以下功能: ⑴從鍵盤輸入10個(gè)整數(shù),分別存放在10個(gè)數(shù)組元素中;⑵輸出數(shù)組中的各元素值;⑶按逆序輸出數(shù)組中的各元素值。main(){

inti,a[10];

for(i=0;i<10;i++) printf("第%d個(gè)數(shù)據(jù):",i+1), scanf("%d",&a[i]);

for(i=0;i<10;i++)printf("%4d",a[i]);printf("\n");

for(i=9;i>=0;i--)printf("%4d",a[i]);printf("\n");}應(yīng)用舉例精選ppt下標(biāo)越界:差一錯(cuò)誤off-by-oneerror在C語言中,有N個(gè)元素的數(shù)組其元素下標(biāo)的允許取值范圍為0到N-1,不存在下標(biāo)為N的元素。例如這段代碼本意是要設(shè)置數(shù)組a中的10個(gè)元素均為0。但通常編譯器按內(nèi)存遞減方式分配內(nèi)存,使得內(nèi)存中a[9]之后的4個(gè)字節(jié)分配給i。本來計(jì)數(shù)器i的值為10,循環(huán)體內(nèi)將并不存在的a[10]設(shè)為0,實(shí)際是將i值設(shè)為0,就陷入死循環(huán)!main(){

inti,a[10];

for(i=1;i<=10;i++){ a[i]=0; printf("%d",a[i]); }}精選ppt4.1.3數(shù)組應(yīng)用

1.比較法排序由鍵盤輸入10個(gè)數(shù),按由小到大排序輸出解題方法:將10個(gè)數(shù)存入數(shù)組a將a(0)與a(1)、a(2)……a(9)依次比較,哪個(gè)元素的值比a(0)小,就將它與a(0)的值交換,這樣就將最小的數(shù)送到了a(0)中。再將a(1)與a(2)、a(3)……a(9)依次比較,哪個(gè)元素的值比a(1)小,就將它與a(1)的值交換,這樣就將最小的數(shù)送到了a(1)中。重復(fù)以上步驟。對于n個(gè)數(shù),比較排序法的總運(yùn)行次數(shù)為:

(n-1)+(n-2)+…+3+2+1=n*(n-1)/2.精選ppt1.比較法排序16精選ppt1.比較法排序#include<stdlib.h>main(){

inti,j,a[10]; srand(time(0));

for(i=0;i<10;i++){ a[i]=rand()%101; printf("%4d",a[i]); } putch('\n');

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

for(j=i+1;j<10;j++)

if(a[i]>a[j]) a[i]^=a[j]^=a[i]^=a[j]; }

for(i=0;i<10;i++) printf("%4d",a[i]);}精選ppt2.冒泡法排序是一種交換類排序方法,它是通過相鄰數(shù)據(jù)元素的交換逐步將線性表變成有序。首先將a[0]與a[1]、a[1]與a[2]、a[2]與a[3]、……a[n-2]與a[n-1]相鄰兩個(gè)數(shù)進(jìn)行比較,若為逆序(比如a[0]>a[1])則兩者交換,這樣就將將最大的數(shù)放在a[n-1]中;再將a[0]、a[1]、……a[n-2]這n-1個(gè)數(shù)進(jìn)行同樣的相鄰兩數(shù)比較,若為逆序則兩者交換,這樣就將這n-1個(gè)數(shù)中最大的數(shù)被放在a[n-2]中;重復(fù)以上步驟,經(jīng)過n-1趟比較交換完成冒泡法排序。18精選ppt用冒泡法排序?qū)?0個(gè)整數(shù)按從小到大的次序排列出來。2.冒泡法排序19精選ppt#include<stdio.h>#defineN10//數(shù)據(jù)的個(gè)數(shù)

main(){

inta[N]={5,12,29,47,9,18,13,50,38,2};

inti,j,k,t;

for(i=0;i<N-1;i++){

for(j=0;j<N-i;j++)

if(a[j]>a[j+1]){

t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } printf("\n最后的排序結(jié)果:\n");

for(i=0;i<N;i++) printf("%5d",a[i]);}2.冒泡法排序20精選ppt數(shù)組應(yīng)用II--插入向一個(gè)有序數(shù)組中插入一個(gè)數(shù)字,插入后不改變原有順序a[0]1a[1]2a[2]3a[3]4a[4]6a[5]7a[6]8a[7]9a[8]10a[9]0a[0]1a[1]2a[2]3a[3]4a[4]5a[5]6a[6]7a[7]8a[8]9a[9]10插入數(shù)字前插入數(shù)字后精選ppt方法1:找到插入點(diǎn)后再移位。從前向后循環(huán),從第1個(gè)元素開始依次將數(shù)組元素與要插入的數(shù)x比較,當(dāng)x<a[i]時(shí),將a[i]~a[8]依次向后移動,這時(shí)a[i]就可以存放x了。for(i=0;i<9;i++) {

//將要插入的數(shù)與每個(gè)元素比較,找插入的位置if(x<a[i]){

//依次將插入點(diǎn)后的元素向后移位for(j=8;j>=i;j--)a[j+1]=a[j];a[i]=x;

//插入數(shù)據(jù)后退出整個(gè)循環(huán)break;}}數(shù)組應(yīng)用II--插入22精選ppt方法2:邊找插入點(diǎn)邊移位。從后向前循環(huán),直接從最后1個(gè)元素開始,將其與要插入的數(shù)x比較,如果x<a[i],說明x要插在a[i]的前面,那么a[i]元素就要向后移位;再將下標(biāo)i--,做同樣的比較,直到找到插入點(diǎn)退出循環(huán),這時(shí)的a[i]>x,因此x要賦值給a[i+1]。//從最后1個(gè)元素開始,依次將要插入的數(shù)與每個(gè)元素比較for(i=8;i>=0;i--){

//如果要插入的數(shù)比元素值小,則該元素直接向后移位

if(x<a[i]) a[i+1]=a[i];

elsebreak;//表示找到插入點(diǎn),退出循環(huán)}a[i+1]=x;

//插入數(shù)據(jù)數(shù)組應(yīng)用II--插入23精選ppt數(shù)組應(yīng)用III:不改變順序,刪除指定的數(shù)字main(){

inti,j,del=0,

inta[10]={1,2,3,4,5,6,7,8,9,10},x=5;for(i=0;i<10;i++) printf("%4d",a[i]);putch('\n');for(i=0;i<10-del;i++){//刪除后數(shù)組的容量減小一

if(x==a[i]){

for(j=i;j<10;j++) a[j]=a[j+1]; i--;//還原到刪除位置,以處理連續(xù)刪除

del++; }}for(i=0;i<10-del;i++) printf("%4d",a[i]);}刪除前:12345578910刪除后:123478910精選ppt二分法檢索(在序列x[]中檢索y的位置)前提:有序數(shù)列(以遞增序?yàn)槔┰恚?/p>

等分區(qū)間;

若y小于中間數(shù),則取左半邊,否則取右半邊。再等分,再比較…例:對于區(qū)間[a,b]等分為若y==x[k]則位置為k若y<x[k]則取新區(qū)間[a,k-1](即b=k-1)若y>x[k]則取新區(qū)間[k+1,b](即a=k+1)數(shù)組應(yīng)用IV–二分查找(檢索)精選ppt二分法查找遞增序列main(){

intx[10]={34,56,78,87,88,90,101,112,520,888};

inty,i,k,a=0,b=9;

for(i=0;i<10;i++) printf("%d",x[i]); scanf("%d",&y);

while(a<=b){//二分法查找

k=(b+a)/2; printf("x[%d]=%d\n",k,x[k]);

if(y==x[k])break;

if(y<x[k])b=k-1; elsea=k+1; }

if(a>b)printf("ERROR");

elseprintf("\nx[%d]=%d\n",k,x[k]);getch();}精選ppt4.2二維數(shù)組

4.2.1

二維數(shù)組的定義和初始化1.定義需要兩個(gè)下標(biāo)才能標(biāo)識數(shù)組中某個(gè)元素的位置,也稱為矩陣。Useatwo-dimensionalarrayiftwootheridentifiersareneededtodeterminethevalueofinterest.定義格式為:

類型定義符

數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]列數(shù)行數(shù)inta[2][3];邏輯結(jié)構(gòu)存儲結(jié)構(gòu)27精選ppt4.2.1

二維數(shù)組的定義和初始化2.二維數(shù)組的初始化和引用兩種初始化方式:按行初始化:每一對花括號對應(yīng)一行的元素。按存放順序初始化:按內(nèi)存中的存放順序?qū)⒊跏贾捣謩e賦值給對應(yīng)的元素。inta[2][3]={{1,2,3},{4,5,6}};inta[2][3]={1,2,3,4,5,6};inta[][3]={1,2,3,4,5,6};

28精選ppt4.2.1

二維數(shù)組的定義和初始化intd[3][4]={{1},{2,3},{4,5,6}};intd[][4]={{1},{2,3},{4,5,6}};intd[3][4]={1,0,0,0,2,3,0,0,4,5,6};intd[][4]={1,0,0,0,2,3,0,0,4,5,6};inte[3][4]={{0,0,0,1},{0,0,2,3},{0,4,5,6}};inte[][4]={{0,0,0,1},{0,0,2,3},{0,4,5,6}};inte[3][4]={0,0,0,1,0,0,2,3,0,4,5,6}};29精選ppt4.2.1

二維數(shù)組的定義和初始化3.二維數(shù)組在內(nèi)存中的存放M行N列的二維數(shù)組a,a[i][j]的位置公式為:i*N+j+1數(shù)組元素a[i][j]存儲映射關(guān)系為:a[i][j]

a[0][N*i+j]Realcomputermemoryhasonlyonedimension,i.e.eachlocationisidentifiedwithonlyonecomponentofaddress.因此,二維數(shù)組元素可用它相對數(shù)組首元素[0][0]位置的偏移量來表示(稱為存儲映射關(guān)系storagemapping)。對二維數(shù)組元素的操作除了用二重循環(huán)外,還可以用一重循環(huán)實(shí)現(xiàn)。InC,oranyotherlanguagesupportingarrayswithdimensionsizesgreaterthanone,two-dimensionalarrayssimulatetheeffectofusingtwocomponentsofaddress.Todothis,thearrayismappedintoconsecutivememorywithrow0’svaluesfirst,thenrowone’svalues,etc.Youcanthinkofthisasasetofonedimensionalarraysholdingthecolumnvaluesasasinglevalueintherow’svalues.30精選ppt二維數(shù)組元素的引用對二維數(shù)組inta[3][4]中各元素的輸出操作① for(i=0;i<3;i++)

for(j=0;j<4;j++) printf("%4d",a[i][j]);② for(i=0;i<3;i++)

for(j=0;j<4;j++)

//用相對a[0][0]位置的偏移量來表示printf("%4d",a[0][4*i+j]);③ for(i=0;i<12;i++)

//用相對a[0][0]位置的偏移量

printf("%4d",a[0][i]);31精選ppt求矩陣特征值之和#defineN3main(){

inti,j,s=0,a[N][N]={{1,1,1},{2,1,1},{2,2,1}};

//顯示矩陣a[3][3] printf("對于矩陣a[%d][%d]\n",N,N);

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

for(j=0;j<N;j++) printf("%4d",a[i][j]); putch('\n'); } //主對角線元素之和

for(i=0;i<N;i++) s+=a[i][i]; printf("\n主對角線元素之和s=%d\n\n",s);二維數(shù)組的應(yīng)用舉例——矩陣精選ppt

//副對角線元素之和

s=0;

for(i=0;i<N;i++) s+=a[i][N-1-i]; printf("副對角線元素之和s=%d\n\n",s); //上△元素之和

s=0;

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

for(j=i;j<N;j++) s+=a[i][j]; printf(“上△元素之和s=%d\n\n",s);

二維數(shù)組的應(yīng)用舉例——矩陣(續(xù)1)精選ppt//下△元素之和

s=0;

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

for(j=0;j<=i;j++) s+=a[i][j]; printf("下△元素之和s=%d\n\n",s); //周邊元素之和

s=0;

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

for(j=0;j<N;j++)

if(i==0||i==N-1||j==0||j==N-1) s+=a[i][j]; printf("周邊元素之和s=%d\n\n",s); getch();}二維數(shù)組的應(yīng)用舉例——矩陣(續(xù)2)精選pptTips:對于int型一維數(shù)組a和二維數(shù)組b

sizeof(a)/sizeof(int)

得到數(shù)組a的大??;

用sizeof(b)/sizeof(b[0])二維數(shù)組b的行數(shù)

sizeof(b[0])/sizeof(int)二維數(shù)組b的列數(shù)

【例】顯示二維數(shù)組b的各元素#include<stdio.h>main(){

intb[][4]={0,1,0,0,1,0,0,0,2,6,4},i,j;

for(i=0;i<sizeof(b)/sizeof(b[0]);i++){

for(j=0;j<sizeof(b[0])/sizeof(int);j++) printf("%5d",b[i][j]);printf("\n");;

}}二維數(shù)組的應(yīng)用舉例——sizeof的使用精選pptmain(){

intx[4][3]={{1,2,3},{2,3,4},{3,4,5},{0,0,1}};

inti,j,k,row=0,column=0,min,m=4,n=3;

for(i=0;i<m;i++){//按行查找 max=x[i][0];

for(j=1;j<n;j++)//查找第i行的最大值

if(x[i][j]>max) max=x[i][j],row=i,column=j;

for(k=0;k<m;k++)//接下來判斷max是否本列最小值

if(x[k][column]<max)//如果不是則標(biāo)記 { row=column=-1;break;}

if(row>-1&&column>-1){ printf("鞍點(diǎn)是該行上的最大值該列上的最小值\n");

printf("鞍點(diǎn)是x[%d][%d]=%d\n",row,column,max); }

} }應(yīng)用舉例:求二維數(shù)組的鞍點(diǎn)saddlepoint,即該位置上的元素是該行上的最大值,是該列上的最小值。鞍點(diǎn)可能不存在精選pptmain(){ inta[5][3]={1,2,3,2,3,4,3,4,5,4,5,6,5,6,7}; inti,j,max[5],min[3]; //先把每行第1個(gè)數(shù)當(dāng)最大值每列第1個(gè)數(shù)當(dāng)最小值

for(i=0;i<5;i++)max[i]=a[i][0]; for(j=0;j<3;j++)min[j]=a[0][j];

//比對找出每行最大值和每列最小值 for(i=0;i<5;i++) for(j=0;j<3;j++){ if(a[i][j]>max[i])max[i]=a[i][j]; if(a[i][j]<min[j])min[j]=a[i][j];

}

//如最大值最小值是同1個(gè)數(shù),找到鞍點(diǎn) for(i=0;i<5;i++)

for(j=0;j<3;j++)

if(max[i]==min[j]) printf("a[%d][%d]=%d是鞍點(diǎn)\n",i,j,a[i][j]);}尋找鞍點(diǎn)方法二:直接找出所有行的最大值所有列的最小值。一比對,若該行的最大值與該列的最小值相等,該位置的數(shù)就是鞍點(diǎn)。精選ppt4.2.3多維數(shù)組當(dāng)需要用多個(gè)下標(biāo)來確定數(shù)組元素時(shí),數(shù)組稱為多維數(shù)組。Thereisnolimitinthelanguageastothenumberofdimensionsthatanarraymaybegiven.Eachdimensionrequiresasizespecifierwithinapairofbrackets.1. 多維數(shù)組的定義類型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]…[常量表達(dá)式n];【例如】定義一個(gè)整型三維數(shù)組:intb[2][3][4];b[0][0][0]b[0][0][1]b[0][0][2]b[0][0][3]

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

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

以下標(biāo)0、1為變量i,下標(biāo)0、1、2為變量j,下標(biāo)0、1、2、3為變量k,就可以用三重循環(huán)結(jié)構(gòu)對數(shù)組的每一個(gè)元素進(jìn)行處理了。精選ppt多維數(shù)組初始化對于三維數(shù)組,可將其看作多個(gè)二維表格,即可以把它看成是由多個(gè)二維數(shù)組構(gòu)成的。依此類推,一個(gè)n維數(shù)組可以看成是由多個(gè)n-1維數(shù)組構(gòu)成的。前面數(shù)組b有24個(gè)元素,它們在內(nèi)存中排列順序跟二維數(shù)組類似:先變化第三個(gè)下標(biāo),然后變化第二個(gè)下標(biāo),最后變化第一個(gè)下標(biāo)。

【例如】以三維數(shù)組初始化為例:

intb[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},

{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};由第一維為2,可認(rèn)為b數(shù)組由兩個(gè)二維數(shù)組組成,每個(gè)二維數(shù)組為3行4列。初始化時(shí),對每個(gè)二維數(shù)組以按行初始化的方法,分別用花括號把各行元素值括起來,并且將三行的初值再用花括號括起來。精選ppt多維數(shù)組的一維表示多維數(shù)組元素也可用它相對數(shù)組首元素位置的偏移量來表示。三維數(shù)組b[L][M][N]的數(shù)組元素b[i][j][k]的存儲映射關(guān)系為:b[i][j][k]

b[0][0][M*N*i+N*j+k]Example:intb[2][3][4];causesthecompilertoreservespacefor2arraysof3arraysof4integersincontiguousmemory.Thus24contiguousintegersarereserved.Astoragemappingfunctionisusedtotranslateanarrayreferenceintoapointerreference.Inthiscase,thestoragemappingfunctionmaps:

b[i][j][k]

*(b[0][0][0]+3*4*i+4*j+k)精選ppt4.3字符型數(shù)組在C語言中,存儲字符串必須使用類型為char的字符型數(shù)組。字符型數(shù)組的每個(gè)數(shù)組元素存放一個(gè)字符的ASCII碼。字符串的結(jié)束標(biāo)志是'\0'。在存儲一個(gè)字符串時(shí),系統(tǒng)自動在其末尾添加一個(gè)結(jié)束標(biāo)志'\0'(數(shù)字0)。'\0'不包括在字符串長度內(nèi)。ThestringinCprogramminglanguageisactuallyaone-dimensionalarrayofcharacterswhichisterminatedbyanullcharacter'\0'.例如,對于定義的字符數(shù)組chara[10]="Hello";Hello\0\0\0\0\0字符串結(jié)束符其余元素自動賦值為'

\0'精選ppt通常,一個(gè)字符串用一維字符型數(shù)組來存放,

多個(gè)字符串用二維字符型數(shù)組來存放。如果要將三個(gè)字符串置于字符數(shù)組s中"Howareyou"

"Goodmorning""Goodbye"

可定義為:chars[3][13];s[0]s[1]s[2]4.3字符型數(shù)組How

are

you\0\0Good

morning\0Good

bye\0\0\0\0\0精選ppt4.3.1字符數(shù)組的初始化chara[]="abcde";charc[][5]={"Boy","Girl"};以下賦值語句也是合法的:chara[6]="abcde";chara[6]={"abcde"};chara[6]={'a','b','c','d','e'};chara[]={'a','b','c','d','e','\0'};charc[2][5]={"Boy","Girl"};charc[][5]={{"Boy"},{"Girl"}};charc[2][5]={{"Boy"},{"Girl"}};·精選ppt注意

(1)字符數(shù)組的長度應(yīng)該大于實(shí)際存儲的字符串長度。否則按語法錯(cuò)誤處理。(2)使用字符常量初始化時(shí),如果字符末尾沒有'\0',則字符數(shù)組不能按字符串處理,只能對字符逐個(gè)進(jìn)行處理。比如,數(shù)組a[]用單個(gè)字符來初始化,chara[5]={'a','b','c','d','e'};最后一個(gè)元素不是’\0’,它就不是字符串,就不能用字符串方法(如gets()、puts()、scanf()或printf()中%s格式)來操作。(3) 一維字符數(shù)組在初始化時(shí),可以省略其長度,默認(rèn)長度為初始化字符串的長度加1。如果沒有初始化賦值,則必須說明數(shù)組的長度。(4) 單引號是字符常量定界符,雙引號是字符串常量定界符。(5) 不能使用賦值語句將一個(gè)字符串常量或字符數(shù)組直接賦給一個(gè)字符數(shù)組。chara[5];a[]="abcde";//是錯(cuò)誤的。4.3.1字符數(shù)組的初始化精選ppt字符數(shù)組的輸入─從鍵盤輸入的三種方法1、用gets函數(shù)輸入整個(gè)字符串

能輸入含空格字串并把回車轉(zhuǎn)成\0

2、在scanf函數(shù)中用格式符%s輸入整個(gè)字串

只能輸入不含空格符的字符串

chara[10];

scanf("%s",a);3、在scanf函數(shù)中用格式符%c逐個(gè)輸入字符

chara[12];inti;

for(i=0;i<12;i++)scanf("%c",&a[i]);a[12]=’\0’;chara[12];

gets(a);chars[3][13];inti;for(i=0;i<3;i++)

gets(s[i]);精選ppt對于二維字符數(shù)組,可看成若干個(gè)一維字符數(shù)組(每個(gè)一維字符數(shù)組是一個(gè)字符串),使用時(shí)用二維字符數(shù)組行下標(biāo)來表示二維字符數(shù)組中各個(gè)字符串的首地址。

main(){

char

s[3][13];

inti;

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

gets(s[i]);

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

printf("%s",s[i]);

}執(zhí)行時(shí)輸入:Howareyou

Goodmorning

Goodbye

程序中的s[i]

是一維數(shù)組名,它是一個(gè)地址常量。二維字符數(shù)組的輸入精選ppt字符數(shù)組的輸出─從屏幕輸出的三種方法1、puts函數(shù)輸出整個(gè)字符串

這種輸出方式遇到\0就自動換行

2、printf函數(shù)格式符%s輸出整個(gè)數(shù)組遇到遇到\0不換行

3、printf函數(shù)格式符%c逐個(gè)輸出數(shù)組元素chara[12]=“Howareyou”;puts(a);

chars[2][5]={"Boy","Girl"};

puts(s[0]);puts(s[1]);chara[12]="Howareyou";

printf("%s",a);chars[3][13]={"Howareyou","Goodmorning","Goodbye"};

printf("%s\n",s[0]);

printf("%s\n",s[1]);

printf("%s\n",s[2]);

chars[12]="Howareyou";inti;

for(i=0;i<13;i++)printf("%c",s[i]);精選ppt

例:輸入0--99數(shù)字,顯示讀法(由于漢字為雙字節(jié)碼,所以不能用一維數(shù)組,要用二維數(shù)組。)main(){

intx,i,j,k;

char

a[11][3]={"零","壹","貳","叁","肆","伍","陸","柒",

"捌","玖","拾"}; scanf("%d",&x); i=x/10;//十位 j=x%10;//個(gè)位

if(i==0) printf("%s",a[j]);//個(gè)位數(shù)直接顯示

else

if(j==0) printf("%s%s",a[i],a[10]);//個(gè)位為0的十位數(shù)

else printf("%s%s%s",a[i],a[10],a[j]); getch();}

字符數(shù)組的應(yīng)用舉例精選ppt4.3.4字符串函數(shù)在C語言中,由于字符串的處理通常要用字符數(shù)組,而字符數(shù)組名是地址常量不是變量(不能出現(xiàn)在賦值號的左邊),所以對字符串的連接、復(fù)制、比較等操作就比較麻煩。C語言提供了一些專門用于字符串處理的函數(shù),以方便用戶的使用。Csupportsawiderangeoffunctionsthatmanipulatenull-terminatedstrings,suchasstrlen(),strcat(),strcpy(),strcmp(),strlow()andstrupr().精選ppt常用的字符串處理函數(shù)1、測字串長度函數(shù)stringlengthstrlen()2、字串連接函數(shù)stringcaststrcat()3、字串復(fù)制函數(shù)stringcopystrcpy()

strncpy()4、字串比較函數(shù)stringcomparestrcmp()5、小寫轉(zhuǎn)換函數(shù)stringlowerstrlwr()6、大寫轉(zhuǎn)換函數(shù)stringupperstrupr()

因?yàn)樽址幚砗瘮?shù)不是C語言的組成部分而是系統(tǒng)提供的公共函數(shù),因此調(diào)用字符串處理函數(shù)前,通常要加預(yù)編譯命令:

#include

<string.h>精選pptstrlen(字符數(shù)組)

測試字符串長度,不包含“\0”在內(nèi)。

例如:#include<string.h>main(){

chars[]="Howdoyoudo";

intc;c=strlen(s);printf("%d\n",c);}

運(yùn)行結(jié)果是:13

改為

s[30]="Howdoyoudo\0"

運(yùn)行結(jié)果也是13常用的字符串處理函數(shù)----求字符串長度精選ppt例:顯示一個(gè)字串中的大寫字母main(){

charc,s[30],i; printf("輸入一個(gè)字串:"); gets(s);

for(i=0;i<strlen(s);i++){

if(s[i]>='A'&&s[i]<='Z') printf("%c",s[i]); }}

常用的字符串處理函數(shù)--求字符串長度函數(shù)舉例精選ppt例:指針表示法顯示一個(gè)字串中的大寫字母main(){

charc,s[30],*p; printf("輸入一個(gè)字串:"); gets(s);

for(p=s;p-s<strlen(s);p++){

if(*p>='A'&&*p<='Z') printf("%c",*p); }}精選ppt連接兩個(gè)字符數(shù)組中的字符串:

把字符數(shù)組2接在字符數(shù)組1的后面,放到字符數(shù)組1中,并得到一個(gè)函數(shù)值,該函數(shù)值是字符數(shù)組的起始地址。注1:字符數(shù)組1必須足夠大;注2:字符數(shù)組2也可以是一個(gè)字符串常量。常用的字符串處理函數(shù)----字符串連接strcat(字符數(shù)組1,字符數(shù)組2)

精選ppt例如

#include<string.h>main(){

charc[30]="abcde\n",s[20]="Howdoyoudo";

strcat(c,s);

/*將S接在C的后邊*/

printf("%s\n",c);}運(yùn)行結(jié)果是:

abcdeHowdoyoudostrcat(c,"Howdoyoudo");

printf("%s\n",c);}

常用的字符串處理函數(shù)----字符串連接舉例精選pptstrcpy(t,a);strcpy(a,b);strcpy(b,t);常用的字符串處理函數(shù)----字符串拷貝將字符數(shù)組2拷貝到字符數(shù)組1中。復(fù)制后的結(jié)果放在字符數(shù)組1中,字符數(shù)組2不變。函數(shù)值是字符數(shù)組1的地址。

字符數(shù)組1必須寫成數(shù)組名形式,如s。字符數(shù)組2可以是字符數(shù)組名,也可以是一個(gè)字符串常量。說明:

(1)字符數(shù)組1定義時(shí)其長度要大于等于字符數(shù)組2的長度。

(2)復(fù)制時(shí)連同字串2中的’\0’一起被復(fù)制到字串1中。

(3)若字符數(shù)組1中原存有字符,則原有字符不再存在。字串間的賦值不能用a=b;只能用strcpy(a,b)strcpy(字符數(shù)組1,字符數(shù)組2)

精選pptstrncpy(字符數(shù)組1,字符數(shù)組2,n)將字符數(shù)組2的前n個(gè)字符拷貝到字符數(shù)組1中。復(fù)制后的結(jié)果放在字符數(shù)組1中,字符數(shù)組2不變。函數(shù)值是字符數(shù)組1的地址。

例如:

main(){

chara[]="helloworld!"; strncpy(a,"HELLOWORLD!",2); puts(a); getch(); }顯示:HElloworld!常用的字符串處理函數(shù)----字符串拷貝精選pptstrcmp(字符串1,字符串2)

如果兩個(gè)字符串一樣大,函數(shù)值為0;

如果字符串1大,函數(shù)值為一正整數(shù);

如果字符串2大,函數(shù)值為負(fù)整數(shù)。對于字符數(shù)組a和b而言:

strcmp(a,b)==0a、b兩字串相等

strcmp(a,b)>0a字串>b字串

strcmp(a,b)<0a字串<b字串(字符串比大小,按ASCII碼比較,先比第1個(gè)字符。)

常用的字符串處理函數(shù)----字符串比較精選ppt#include<string.h>main(){

charc[7]="abcdef",s[4]="abc",t[]="acb";inta,b;a=strcmp(c,s);b=strcmp(c,s);printf("%d\n%d",a,b);}

常用的字符串處理函數(shù)----字符串比較舉例在TC2.0中的運(yùn)行結(jié)果:

100-1在VC++中的運(yùn)行結(jié)果:

1-1精選ppt數(shù)據(jù)比較時(shí)應(yīng)注意判斷兩個(gè)字符串是否相等時(shí):

不能使用if(a==b)

應(yīng)使用if(strcmp(a,b)==0)

相等比較的總結(jié)字符串strcmp(a,b)==0整數(shù)

a==b實(shí)數(shù)fabs(a-b)<1e-6精選ppt例如main(){

inti=0;

chara[]="abcd",b[]="abcd";

if(a==b)printf("Yes");

elseprintf("No");}結(jié)果居然是No,將if語句改為:if(strcmp(a,b)==0)后,結(jié)果就為Yes。

字符串比較時(shí)應(yīng)注意精選pptstrlwr(字符串)

將字符串中的大寫字母轉(zhuǎn)換成小寫字母strupr(字符串)

將字符串中的小寫字母轉(zhuǎn)換成大寫字母

例:大小寫轉(zhuǎn)換函數(shù)應(yīng)用main(){

char

s[100];gets(s);strupr(s);puts(s);strlwr(s);puts(s);}常用的字符串處理函數(shù)----字母大小寫轉(zhuǎn)換精選ppt#include<string.h>main(){

chara[]="wang",b[]="1234",user[100],psw[100];

do{ system("cls"); printf("請輸入用戶名"); gets(user);strlwr(user); printf("請輸入密碼"); gets(psw); }while(strcmp(a,user)!=0||strcmp(b,psw)!=0); printf("\n歡迎您:%s",user);}字符串應(yīng)用舉例:用戶名和密碼的驗(yàn)證I精選ppt#include<string.h>main(){

chara[]="wang",b[]="1234",user[100],psw[100];inti; do{

system("cls"); printf("請輸入用戶名"); gets(user);strlwr(user); printf("請輸入密碼"); i=-1; do{ i++; psw[i]=getch(); putch('*'); }while(psw[i]!=13); psw[i]='\0'; }while(strcmp(a,user)!=0||strcmp(b,psw)!=0); printf("\n歡迎您:%s",user);}字符串應(yīng)用舉例:用戶名和密碼的驗(yàn)證II精選ppt#include<string.h>main(){

chara[10][20]={"廣州","武漢","上海","北京","成都","太原","鄭州","南京","石家莊","天津"},t[20];

inti,j;

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

for(j=i+1;j<10;j++)

if(strcmp(a[i],a[j])>0) strcpy(t,a[i]), strcpy(a[i],a[j]), strcpy(a[j],t);

for(i=0;i<10;i++) printf("%s\t",a[i]);}字符串應(yīng)用舉例:字符串的排序精選ppt4.4指針和數(shù)組指針的應(yīng)用與數(shù)組是密不可分的。數(shù)組a的指針是指數(shù)組a的起始地址,即&a[0],數(shù)組元素的指針就是該數(shù)組元素的地址。

inta[6];

int*p=a;

&a[0]&a[1]&a[2]&a[3]&a[4]&a[5]a+0a+1a+2a+3a+4a+5p+0p+1p+2p+3p+4p+5a[0]a[1]a[2]a[3]a[4]a[5]實(shí)際上,下標(biāo)表達(dá)式a[i]就是按照指針表達(dá)式*(a+i)定義的。精選ppt指向數(shù)組的指針變量的賦值方法

方法1:在定義指針變量時(shí)賦值。inta[10],*p=a;方法2:在定義指針變量后賦值。inta[10],*p;p=a;結(jié)果:p是數(shù)組a的指針,指向a

數(shù)組的第一個(gè)元素a[0]的首地址

main(){

inti,a[6]={0,1,2,3,4,5},*p; p=a;

for(i=0;i<6;i++) printf("%d",a[i]);}可替換為*(a+i)或*(p+i)精選ppt在程序中使用指針變量時(shí)應(yīng)當(dāng)注意

指針的變化

++--

使指針按它所指向的類型所規(guī)定的字節(jié)數(shù)在內(nèi)存區(qū)中移動(跳動而不是滑動)。

指針變量的運(yùn)算

++和*是同優(yōu)先級,從右至左的結(jié)合方向。

*p++和*(p++)等價(jià)*++p和*(++p)等價(jià)③

(*p)++表示p所指向的元素值加1。精選ppt通過指針的算術(shù)運(yùn)算引用數(shù)組元素指向數(shù)組的指針可以指向數(shù)組中的其它元素。main(){inta[10]={2,4,5,8};

int*p=a;//p指向a[0]printf(“%4d”,*p++);//輸出a[0],p指向a[1]printf(“%4d”,*p++);//輸出a[1],p指向a[2]printf(“%4d”,*p++);//輸出a[2],p指向a[3]printf(“%4d”,*p++);//輸出a[3],p指向a[4]}運(yùn)行結(jié)果是:2458

精選ppt用*p++遍歷整個(gè)數(shù)組main(){

inta[]={9,8,7,6,5,4,3,2,1,0},*p=a,i;

for(i=0;i<sizeof(a)/sizeof(int);i++) printf("%d",*p++); getch();}注意:

這種方法造成了指針p的移動。精選ppt同樣,可以用p++和地址偏移量遍歷整個(gè)數(shù)組main(){

inta[10]={9,8,7,6,5,4,3,2,1,0},*p;

for(p=a;p-a<10;p++) printf(“%d,",*p);}運(yùn)行結(jié)果:9,8,7,6,5,4,3,2,1,

其中p中存放的是地址,p-a<10表示p單元中的值減去數(shù)組a的首地址所得的單元數(shù)不超過10。注意:

這種方法也造成了指針p的移動用p++與地址偏移量遍歷整個(gè)數(shù)組精選ppt通過帶下標(biāo)的指針變量引用數(shù)組元素指向數(shù)組的指針變量也可以帶下標(biāo)定義了:inta[10],*p=a;

后:

可以使用a[i]

或 p[i]

或 *(a+i)

或 *(p+i)這4種方法引用a數(shù)組中的第i個(gè)元素。注意:這些方法都不造成指針p的移動。精選ppt輸出數(shù)組元素四種方法main(){

inta[10]={10,9,8,7,6,5,4,3,2,1},*p,i; p=a;

for(i=0;i<10;i++) printf("%d",a[i]); putch('\n');

for(i=0;i<10;i++) printf("%d",p[i]); putch('\n');

for(i=0;i<10;i++) printf("%d",*(a+i)); putch('\n');

for(i=0;i<10;i++) printf("%d",*(p+i));}精選ppt利用指針變量對數(shù)組元素賦值通過指針變量p實(shí)現(xiàn)數(shù)組元素的賦值:inta[5],*p=a,i;

for(i=0;i<5;i++){ printf("a[%d]=",i); scanf("%d",&a[i]); }

可替換成&p[i]或a+i或p+i或p++利用p++和地址偏移量p-a實(shí)現(xiàn)數(shù)組元素的賦值for(p=a;p-a<5;p++){printf("a[%d]=",p-a);scanf("%d",p);}精選ppt總結(jié):數(shù)組遍歷的6種方法造成指針p的移動的2種方法(p必須初始化)*p++p++配合*p不造成指針p的移動的4種方法*(p+i)p[i]*(a+i)a[i]

數(shù)組在C語言中是個(gè)二等公民:不能作為整體操作數(shù)組。但將指針變量指向一個(gè)數(shù)組后,就可以用對指針變量的操作去整體操作一個(gè)數(shù)組了。精選ppt在程序中使用指針變量時(shí)應(yīng)當(dāng)注意

常見的指針變量運(yùn)算*(++p) 先移指針,取出下一個(gè)單元的值。*(p++) 先取出當(dāng)前單元的值,再移指針。

(*p)++ 先取出當(dāng)前單元值,再使當(dāng)前單元加1。

不移指針。

++(*p) 先使前單元的值加1,再取出。不移指針。注意:*p++和*(p++)是等價(jià)的。

數(shù)組和指針的統(tǒng)一性是C語言的長處之一。用指針可以很方便地訪問數(shù)組和模擬動態(tài)分配的數(shù)組。但是,說數(shù)組和指針等價(jià)并不表示它們相同,甚至也不能互換?!暗葍r(jià)”的意思是:指針?biāo)阈g(shù)和數(shù)組下標(biāo)運(yùn)算等價(jià),指針和數(shù)組是不同的。(WayneThroop)精選ppt遍歷數(shù)組時(shí)指針的移動在用指針變量遍歷數(shù)組時(shí),要特別注意指針是否移動。main(){

int*p,i,x[10]={10,9,8,7,6,5,4,3,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論