




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章利用數(shù)組處理批量數(shù)據(jù)問(wèn)題:給一組數(shù)排序,這組數(shù)該如何存放呢???這些數(shù)據(jù)如何存放才便于排序82945637617188888888881111111111111118888888888?這便是本章所要解決的問(wèn)題
本章要點(diǎn)掌握一維、二維數(shù)組的定義和引用方法、存儲(chǔ)結(jié)構(gòu)和初始化方法。掌握有關(guān)一維數(shù)組的有關(guān)算法掌握數(shù)組的運(yùn)算。
主要內(nèi)容6.1怎樣定義和引用一維數(shù)組6.2怎樣定義和引用二維數(shù)組6.3字符數(shù)組數(shù)組的概念:
C語(yǔ)言為這些數(shù)據(jù),提供了一種構(gòu)造數(shù)據(jù)類(lèi)型:數(shù)組。
所謂數(shù)組就是一組具有相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)的有序集合。由數(shù)組名和下標(biāo)唯一確定數(shù)組中的一個(gè)元素,數(shù)組中的每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類(lèi)型。按數(shù)組元素的類(lèi)型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等。一個(gè)班學(xué)生的學(xué)習(xí)成績(jī)一行文字一個(gè)矩陣這些數(shù)據(jù)的特點(diǎn)是:1、具有相同的數(shù)據(jù)類(lèi)型2、使用過(guò)程中需要保存原始數(shù)據(jù)如果有1000名學(xué)生,每個(gè)學(xué)生有一個(gè)成績(jī),需要求這1000名學(xué)生的平均成績(jī)。用s1,s2,s3,……,s1000表示每個(gè)學(xué)生的成績(jī),能表達(dá)內(nèi)在聯(lián)系。C語(yǔ)言用方括號(hào)中的數(shù)字表示下標(biāo),如用s[15]表示。數(shù)組名6.1怎樣定義和引用一維數(shù)組6.1.1怎樣定義一維數(shù)組6.1.2怎樣引用一維數(shù)組元素6.1.3一維數(shù)組的初始化6.1.4一維數(shù)組程序舉例6.1.1怎樣定義一維數(shù)組一維數(shù)組是數(shù)組中最簡(jiǎn)單的它的元素只需要用數(shù)組名加一個(gè)下標(biāo),就能惟一確定要使用數(shù)組,必須在程序中先定義數(shù)組定義一維數(shù)組的一般形式為:類(lèi)型符數(shù)組名[常量表達(dá)式];數(shù)組名的命名規(guī)那么和變量名相同如inta[10];數(shù)組名6.1.1怎樣定義一維數(shù)組定義一維數(shù)組的一般形式為:類(lèi)型符數(shù)組名[常量表達(dá)式];數(shù)組名的命名規(guī)那么和變量名相同如inta[10];數(shù)組長(zhǎng)度6.1.1怎樣定義一維數(shù)組定義一維數(shù)組的一般形式為:類(lèi)型符數(shù)組名[常量表達(dá)式];數(shù)組名的命名規(guī)那么和變量名相同如inta[10];10個(gè)元素:a[0],a[1],a[2],…,a[9]每個(gè)元素的數(shù)據(jù)類(lèi)型a[0]a[1]a[2]a[3]…a[7]a[8]a[9]6.1.1怎樣定義一維數(shù)組定義一維數(shù)組的一般形式為:
類(lèi)型符
數(shù)組名[常量表達(dá)式];inta[4+6];合法intn=10;inta[n];不合法6.1.1怎樣定義一維數(shù)組說(shuō)明:(1)數(shù)組名定名規(guī)那么和變量名相同,遵循標(biāo)識(shí)符定名規(guī)那么。(2)在定義數(shù)組時(shí),需要指定數(shù)組中元素的個(gè)數(shù),方括弧中的常量表達(dá)式用來(lái)表示元素的個(gè)數(shù),即數(shù)組長(zhǎng)度。(3)常量表達(dá)式中可以包括常量和符號(hào)常量,但不能包含變量。也就是說(shuō),C語(yǔ)言不允許對(duì)數(shù)組的大小作動(dòng)態(tài)定義,即數(shù)組的大小不依賴于程序運(yùn)行過(guò)程中變量的值。例如:
intn;scanf(“%d″,&n);/*在程序中臨時(shí)輸入數(shù)組的大小*/inta[n];數(shù)組說(shuō)明中其他常見(jiàn)的錯(cuò)誤:①floata[0];
/*數(shù)組大小為0沒(méi)有意義*/②intb(2)(3);/*不能使用圓括號(hào)*/③intk,a[k];
/*不能用變量說(shuō)明數(shù)組大小*/
×6.1.2怎樣引用一維數(shù)組元素在定義數(shù)組并對(duì)其中各元素賦值后,就可以引用數(shù)組中的元素注意:只能引用數(shù)組元素而不能一次整體調(diào)用整個(gè)數(shù)組全部元素的值數(shù)組元素的引用方式:數(shù)組名[下標(biāo)]下標(biāo)可以是整型常量或整型表達(dá)式。例如:a[0]=a[5]+a[7]-a[2*3]intn=5,a[10];a[n]=20;合法不合法說(shuō)明:〔1〕數(shù)組必須先定義再使用。且數(shù)組的引用只能引用單個(gè)元素,不能引用數(shù)組整體。例ch[0]=’a’;ch[1]=ch[0];a[0]=a[5]+a[7]-a[2*3];〔2〕一維數(shù)組的輸入輸出通常用一重循環(huán)完成for(i=0;i<10;i++)scanf(“%d〞,&a[i]);main(){inti,a[10];for(i=0;i<10;i++)a[i]=2*i+1;for(i=0;i<=9;i++)printf("%d",a[i]);}例:數(shù)組元素賦值和輸出例6.1
對(duì)10個(gè)數(shù)組元素依次賦值為0,1,2,3,4,5,6,7,8,9,要求按逆序輸出。解題思路:定義一個(gè)長(zhǎng)度為10的數(shù)組,數(shù)組定義為整型。要賦的值是從0到9,可以用循環(huán)來(lái)賦值。用循環(huán)按下標(biāo)從大到小輸出這10個(gè)元素。6.1.2怎樣引用一維數(shù)組元素#include<stdio.h>intmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");return0;}使a[0]~a[9]的值為0~90123456789a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]#include<stdio.h>intmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");return0;}0123456789a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]先輸出a[9],最后輸出a[0]例:輸入十個(gè)整數(shù),然后反序輸出。main(){inti,a[10];for(i=0;i<10;i++)scanf(“%d〞,&a[i]);for(i=9;i>=0;i--)printf(“%3d〞,a[i]);}main(){inti,max,sum=0;inta[10];for(i=0;i<10;i++)scanf(“%d〞,&a[i]);max=a[0];for(i=0;i<10;i++){if(a[i]>max)max=a[i];sum+=a[i];}printf(“max=%d,sum=%d\n〞,max,sum);}例:輸入10個(gè)整數(shù),求其和及其中最大的數(shù)。#defineNUM50;main(){inti,score[NUM],highest;floatsum,average;for(i=0;i<NUM;i++)/*依次讀入全班同學(xué)分?jǐn)?shù)*/scanf(“%d〞,&score[i]);printf(“全班同學(xué)成績(jī)公布如下:\n〞);/*公布全班同學(xué)分?jǐn)?shù)*/for(i=0;i<NUM;i++){printf(“%d號(hào)同學(xué):%5d〞,i+1,score[i]);if(i%10==9)printf(“\n〞);}例:求50個(gè)學(xué)生的平均成績(jī)和最高分for(i=0;i<NUM;i++)/*求平均成績(jī)并顯示出來(lái)*/sum+=score[i];average=sum/NUM;printf(“全班平均成績(jī)是:%d\n〞,average);highest=a[0];for(i=0;i<NUM;i++)if(score[i]>highest)highest=a[i];printf(“最高分是:%d\n〞,highest);}對(duì)數(shù)組元素初始化的實(shí)現(xiàn)方法:
1.在定義數(shù)組時(shí)對(duì)數(shù)組元素賦以初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};
將數(shù)組元素的初值依次放在一對(duì)花括弧內(nèi)。經(jīng)過(guò)上面的定義和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。
在聲明數(shù)組時(shí)初始化,根本格式為:類(lèi)型數(shù)組名[整形常量表達(dá)式]={初值1,初值2,…}一維數(shù)組的初始化
3.如果想使一個(gè)數(shù)組中全部元素值為0,可以寫(xiě)成:
inta[10]={0,0,0,0,0,0,0,0,0,0};
或
inta[10]={0};2.可以只給一局部元素賦值。例如:inta[10]={0,1,2,3,4};定義a數(shù)組有10個(gè)元素,但花括弧內(nèi)只提供5個(gè)初值,這表示只給前面5個(gè)元素賦初值,后5個(gè)元素值為0。4.在對(duì)全部數(shù)組元素賦初值時(shí),由于數(shù)據(jù)的個(gè)數(shù)已經(jīng)確定,因此可以不指定數(shù)組長(zhǎng)度。
例如:inta[5]={1,2,3,4,5};
也可以寫(xiě)成
inta[]={1,2,3,4,5};
inta[10]={1,2,3,4,5};
只初始化前5個(gè)元素,后5個(gè)元素為0。一維數(shù)組程序舉例例6.2用數(shù)組處理求Fibonacci數(shù)列問(wèn)題解題思路:例5.8中用簡(jiǎn)單變量處理的,缺點(diǎn)不能在內(nèi)存中保存這些數(shù)。假設(shè)想直接輸出數(shù)列中第25個(gè)數(shù),是很困難的。如果用數(shù)組處理,每一個(gè)數(shù)組元素代表數(shù)列中的一個(gè)數(shù),依次求出各數(shù)并存放在相應(yīng)的數(shù)組元素中。#include<stdio.h>intmain(){inti;intf[20]={1,1};for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf(“\n〞);printf(“%12d〞,f[i]);}printf("\n");return0;}例6.3有10個(gè)地區(qū)的面積,要求對(duì)它們按由小到大的順序排列。解題思路:排序的規(guī)律有兩種:一種是“升序〞,從小到大;另一種是“降序〞,從大到小。把題目抽象為:“對(duì)n個(gè)數(shù)按升序排序〞。采用起泡法排序。985420895420859420854920854290854209大數(shù)沉淀,小數(shù)起泡a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<4;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<3;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<2;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}204589024589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<1;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}for(i=0;i<5;i++)if(a[i]>a[i+1]){……}for(i=0;i<4;i++)if(a[i]>a[i+1]){……}for(i=0;i<1;i++)if(a[i]>a[i+1]){……}……for(i=0;i<5-j;i++)if(a[i]>a[i+1]){……}for(j=0;j<5;j++)inta[10];inti,j,t;printf("input10numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("thesortednumbers:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");例:輸入10個(gè)整數(shù),求其中的奇數(shù)之和,偶數(shù)之和。main(){inta[10],i;intsum1=0,sum2=0;for(i=0;i<10;i++)scanf(“%d〞,&a[i]);for(i=0;i<10;i++)
if(a[i]%2!=0)sum1+=a[i];elsesum2+=a[i];printf(“sum1=%d,sum2=%d〞,sum1,sum2);}例:冒泡排序〔升序〕3823171761231723616
17386117
17
786123
23
23
6138
38
38
38
178
78
78
78
78
原始數(shù)據(jù)第1輪第2輪第3輪第4輪第5輪排序方法之一:冒泡法排序冒泡法升序排序的思路是:將相鄰兩個(gè)數(shù)ai,ai+1〔i=0,1,2〕進(jìn)行比較,假設(shè)ai>ai+1,就交換此兩數(shù),這樣,大數(shù)就會(huì)逐漸往下沉,小數(shù)往上升。4個(gè)數(shù),經(jīng)過(guò)第一輪3次兩兩比較、交換,最大數(shù)就會(huì)沉到最后,存放在a[3]中。第二輪再將前面的3個(gè)數(shù)經(jīng)過(guò)2次這樣的兩兩比較、交換后,其中的最大數(shù)就會(huì)被存放在a[2]中,第三輪將剩下的2個(gè)數(shù)比較1次,大的數(shù)被換到a[1],小的數(shù)存放在a[0]中。這樣,經(jīng)過(guò)三輪比較就完成了4個(gè)數(shù)的排序。一般地,對(duì)n個(gè)數(shù)進(jìn)行排序,共需進(jìn)行n-1輪比較,在第i輪中要對(duì)n-i+1個(gè)數(shù)進(jìn)行n-i次相鄰元素的兩兩比較、交換。一般地,設(shè):n個(gè)數(shù)為a[0],a[1],a[2],……,a[n-2],a[n-1],那么n個(gè)數(shù)的冒泡排序算法可用for循環(huán)表示為:
for(i=0;i<=n-2;i++)for(j=0;j<=n-2-i;j++)if(a[j]>a[j+1])將a[j]的值與a[j+1]的值互換;冒泡法排序的程序:
用符號(hào)常量N表示元素個(gè)數(shù)
#defineN6main(){inta[N];inti,j,t;printf("Pleaseinput%dnumbers:\n",N);for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<=N-2;i++)for(j=0;j<=N-2-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf("\nThesortednumbers:\n");for(i=0;i<=N-1;i++)printf("%d,",a[i]);printf("\n");}冒泡法排序main(){inta[11],i,j,t;printf(“Input10numbers:\n");for(i=1;i<=10;i++)scanf("%d",&a[i]);printf("\n");for(i=1;i<=9;i++)for(j=1;j<=10-i;j++)if(a[j]>a[j+1]){ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }printf("Thesortednumbers:\n");for(i=1;i<=10;i++)printf("%d",a[i]);}程序流程圖如下:6.2怎樣定義和引用二維數(shù)組2456184712431600234627573045201817252020245814361427117510461976147720181分隊(duì)2分隊(duì)3分隊(duì)隊(duì)員1隊(duì)員2隊(duì)員3隊(duì)員4隊(duì)員5隊(duì)員6floatpay[3][6];怎樣定義二維數(shù)組怎樣引用二維數(shù)組的元素二維數(shù)組的初始化二維數(shù)組程序舉例6.2怎樣定義和引用二維數(shù)組二維數(shù)組定義的一般形式為:類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式][常量表達(dá)式];例如:定義a為3×4(3行4列)的數(shù)組,b為5×10(5行10列)的數(shù)組。如下:
floata[3][4],b[5][10];不能寫(xiě)成
floata[3,4],b[5,10];怎樣定義二維數(shù)組注意:我們可以把二維數(shù)組看作是一種特殊的一維數(shù)組:它的元素又是一個(gè)一維數(shù)組。例如:可以把a(bǔ)看作是一個(gè)一維數(shù)組,它有3個(gè)元素:a[0]、a[1]、a[2],每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組。怎樣定義二維數(shù)組C語(yǔ)言中,二維數(shù)組中元素排列的順序是按行存放的,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。以下圖表示對(duì)a[3][4]數(shù)組存放的順序。a00a01a02a03
a10a11a12a13a20a21a22a23怎樣定義二維數(shù)組a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]內(nèi)存中的存儲(chǔ)順序二維數(shù)組元素的表示形式為:
數(shù)組名[下標(biāo)][下標(biāo)]例如:
a[2][3]下標(biāo)可以是整型表達(dá)式,如a[2-1][2*2-1]數(shù)組元素可以出現(xiàn)在表達(dá)式中,也可以被賦值例如:b[1][2]=a[2][3]/2不要寫(xiě)成a[2,3],a[2-1,2*2-1]形式6.2.2怎樣引用二維數(shù)組的元素for(i=0;i<m;i++)printf(“%d,%d\n〞,a[i][0],a[0][i]);合法常出現(xiàn)的錯(cuò)誤有:
inta[3][4];
/*定義a為3×4的數(shù)組*/
┆a[3][4]=3;
在使用數(shù)組元素時(shí),應(yīng)該注意下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。6.2.2怎樣引用二維數(shù)組的元素可以用下面4種方法對(duì)二維數(shù)組初始化:1.分行給二維數(shù)組賦初值例如:
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2.可以將所有數(shù)據(jù)寫(xiě)在一個(gè)花括弧內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};6.2.3二維數(shù)組的初始化3.可以對(duì)局部元素賦初值例如:inta[3][4]={{1},{5},{9}};100050009000
也可以對(duì)各行中的某一元素賦初值,如:inta[3][4]={{1},{0,6},{0,0,11}};
100006000
0110100056000000也可以只對(duì)某幾行元素賦初值,如:inta[3][4]={{1},{5,6}};
4.如果對(duì)全部元素都賦初值,那么定義數(shù)組時(shí)對(duì)第一維的長(zhǎng)度可以不指定,但第二維的長(zhǎng)度不能省例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};它等價(jià)于:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};在定義時(shí)也可以只對(duì)局部元素賦初值而省略第一維的長(zhǎng)度,但應(yīng)分行賦初值。例如:inta[][4]={{0,0,3},{},{0,10}};0030000001000printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++)printf("%5d",a[i][j]);printf("\n");}}main(){inta[2][3];inti,j;printf(“Inputa[2][3]:\n〞for(i=0;i<=1;i++)for(j=0;j<=2;j++)scanf("%d〞,&a[i][j]);輸入方法輸出方法例:/*注意輸入輸出二維數(shù)組的方法*/輸入時(shí)用空格或回車(chē)分隔例6.4
將一個(gè)二維數(shù)組行和列的元素互換,存到另一個(gè)二維數(shù)組中。6.2.4二維數(shù)組程序舉例解題思路:可以定義兩個(gè)數(shù)組:數(shù)組a為2行3列,存放指定的6個(gè)數(shù)數(shù)組b為3行2列,開(kāi)始時(shí)未賦值將a數(shù)組中的元素a[i][j]存放到b數(shù)組中的b[j][i]元素中用嵌套的for循環(huán)完成6.2.4二維數(shù)組程序舉例#include<stdio.h>intmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}處理a的一行中各元素處理a中某一列元素輸出a的各元素a元素值賦給b相應(yīng)元素printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}return0;}輸出b的各元素例6.5有一個(gè)3×4的矩陣,要求編程序求出其中值最大的那個(gè)元素的值,以及其所在的行號(hào)和列號(hào)。解題思路:采用“打擂臺(tái)算法〞先找出任一人站在臺(tái)上,第2人上去與之比武,勝者留在臺(tái)上。第3人與臺(tái)上的人比武,勝者留臺(tái)上,敗者下臺(tái)。以后每一個(gè)人都是與當(dāng)時(shí)留在臺(tái)上的人比武,直到所有人都上臺(tái)比為止,最后留在臺(tái)上的是冠軍。例6.5有一個(gè)3×4的矩陣,要求編程序求出其中值最大的那個(gè)元素的值,以及其所在的行號(hào)和列號(hào)。解題思路:采用“打擂臺(tái)算法〞先把a(bǔ)[0][0]的值賦給變量max。max用來(lái)存放當(dāng)前的最大值。a[0][1]與max比較,如果a[0][1]>max,那么表示a[0][1]是已經(jīng)比過(guò)的數(shù)據(jù)中值最大的,把它的值賦給max,取代了max的原值。以后依此處理,最后max就是最大的值。fori=0to2forj=0to3max=a[i][j]row=Icolum=ja[i][j]>max真max=a[0][0]輸出:max,row,colum假記行號(hào)……inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;}printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);……記最大值記列號(hào)記行號(hào)例:一個(gè)學(xué)習(xí)小組有5個(gè)人,每個(gè)人有三門(mén)課的考試成績(jī)。求各科的平均成績(jī)和各科總平均成績(jī)。分析:可設(shè)一個(gè)二維數(shù)組a[5][3]存放五個(gè)人三門(mén)課的成績(jī)。再設(shè)一個(gè)一維數(shù)組v[3]存放所求得各科平均成績(jī)。設(shè)變量ave為總平均成績(jī)。姓名數(shù)學(xué)英語(yǔ)語(yǔ)文張807592
王616571
李596370
趙858790
周767785main(){inti,j,a[5][3];floatave,v[3],s=0;printf("inputscore\n");for(i=0;i<3;i++){for(j=0;j<5;j++){scanf("%d",&a[j][i]); s=s+a[j][i];}v[i]=s/5;s=0;}ave=(v[0]+v[1]+v[2])/3;printf(“Math:%f\nEng:%f\nLang:%f\n",v[0],v[1],v[2]);printf("total:%f\n",ave);}程序如下:6.3.1怎樣定義字符數(shù)組6.3.2字符數(shù)組的初始化6.3.3怎樣引用字符數(shù)組中的元素6.3.4字符串和字符串結(jié)束標(biāo)志6.3.5字符數(shù)組的輸入輸出6.3.6善于使用字符串處理函數(shù)6.3.7字符數(shù)組應(yīng)用舉例6.3字符數(shù)組用來(lái)存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個(gè)元素存放一個(gè)字符。定義字符數(shù)組的方法與定義數(shù)值型數(shù)組的方法類(lèi)似。怎樣定義字符數(shù)組例如:
charc[10];c[0]=′I′;c[1]=′′;c[2]=′a′;c[3]=′m′;c[4]=′′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′;怎樣定義字符數(shù)組對(duì)字符數(shù)組初始化,可逐個(gè)字符賦給數(shù)組中各元素。例如:charc[10]={‘I’,’a’,’m’,’h’,’a’,’p’,’p’,’y’}賦值形式: 數(shù)組名[]={字符串};或 數(shù)組名[]=字符串;如:aa[]={〞goodmorning!〞};或 aa[]=〞goodmorning!〞;注意:數(shù)組aa的長(zhǎng)度為14而不是13。6.3.2字符數(shù)組的初始化如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,那么只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動(dòng)定為空字符。charc[10]={′c′,′′,′p′,′r′,′o′,′g′,′r′,′a′,′m′};
如果提供的初值個(gè)數(shù)與預(yù)定的數(shù)組長(zhǎng)度相同,在定義時(shí)可以省略數(shù)組長(zhǎng)度,系統(tǒng)會(huì)自動(dòng)根據(jù)初值個(gè)數(shù)確定數(shù)組長(zhǎng)度。charc[]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′};數(shù)組c的長(zhǎng)度自動(dòng)定為10。
chardiamond[5][5]={{′′,′′,*′},{′′,′*′,′′,′*′},{′*′,′′,′′,′′,′*′},{′′,′*′,′′,′*′},{′′,′′,′*′}}定義和初始化一個(gè)二維字符數(shù)組:
例6.6輸出一個(gè)的字符串。解題思路:定義一個(gè)字符數(shù)組,并用“初始化列表〞對(duì)其賦以初值。用循環(huán)逐個(gè)輸出此字符數(shù)組中的字符。6.3.3怎樣引用字符數(shù)組中的元素#include<stdio.h>intmain(){charc[15]={'I','','a','m','','a','','s','t','u','d','e','n','t','.'};inti;for(i=0;i<15;i++)printf("%c",c[i]);printf("\n");return0;}6.3.3怎樣引用字符數(shù)組中的元素例6.7輸出一個(gè)菱形圖。解題思路:定義一個(gè)字符型的二維數(shù)組,用“初始化列表〞進(jìn)行初始化。用嵌套的for循環(huán)輸出字符數(shù)組中的所有元素。6.3.3怎樣引用字符數(shù)組中的元素#include<stdio.h>intmain(){chardiamond[][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};inti,j;for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%c",diamond[i][j]);printf("\n");}return0;}在C語(yǔ)言中,是將字符串作為字符數(shù)組來(lái)處理的。關(guān)心的是字符串的有效長(zhǎng)度而不是字符數(shù)組的長(zhǎng)度。為了測(cè)定字符串的實(shí)際長(zhǎng)度,C語(yǔ)言規(guī)定了字符串結(jié)束標(biāo)志’\0’。6.3.4字符串和字符串結(jié)束標(biāo)志’\0’代表ASCII碼為0的字符。從ASCII碼表可以查到,ASCII碼為0的字符不是一個(gè)可以顯示的字符,而是一個(gè)“空操作符〞,即它什么也不做。用它作為字符串結(jié)束標(biāo)志不會(huì)產(chǎn)生附加的操作或增加有效字符,只起一個(gè)供區(qū)分的標(biāo)志。6.3.4字符串和字符串結(jié)束標(biāo)志charc[]={〞Iamhappy〞};可寫(xiě)成charc[]=〞Iamhappy〞;相當(dāng)于charc[11]={〞Iamhappy〞};6.3.4字符串和字符串結(jié)束標(biāo)志charc[10]={〞China〞};可寫(xiě)成charc[10]=〞China〞;從c[5]開(kāi)始,元素值均為\0只顯示printf(〞%s〞,c);China\0\0\0\0\06.3.4字符串和字符串結(jié)束標(biāo)志例如:定義了如下的字符數(shù)組∶charc[]={“Pascalprogram〞};現(xiàn)在,想用一個(gè)新的字符串代替原有的字符串〞Pascalprogram〞,從鍵盤(pán)向字符數(shù)組輸入∶Hello如果不加′\0′的話,字符數(shù)組中的字符如下∶Hellolprogram6.3.4字符串和字符串結(jié)束標(biāo)志字符數(shù)組的輸入輸出可以有兩種方法:逐個(gè)字符輸入輸出〔%c〕。整個(gè)字符串一次輸入輸出〔%s〕。輸出的字符中不包括結(jié)束符’\0’。用%s輸出字符串時(shí),printf函數(shù)中的輸出項(xiàng)是字符數(shù)組名,不是數(shù)組元素名。6.3.5字符數(shù)組的輸入輸出如果一個(gè)字符數(shù)組中包含多個(gè)’\0’,那么遇第一個(gè)’\0’時(shí)輸出就結(jié)束。可以用scanf函數(shù)輸入一個(gè)字符串。scanf函數(shù)中的輸入項(xiàng)c是已定義的字符數(shù)組名,輸入的字符串應(yīng)短于已定義的字符數(shù)組的長(zhǎng)度。6.3.5字符數(shù)組的輸入輸出charc[]={″China″};printf(″%s″,c);
例如在內(nèi)存中數(shù)組c的狀態(tài)如果利用一個(gè)scanf函數(shù)輸入多個(gè)字符串,那么在輸入時(shí)以空格分隔。例如:charstrl[5],str2[5],str3[5];scanf(″%s%s%s″,str1,str2,str3);輸入數(shù)據(jù):Howareyou?數(shù)組中未被賦值的元素的值自動(dòng)置′\0′。分析圖中所示的字符數(shù)組用8進(jìn)制形式輸出數(shù)組c的起始地址
printf(″%o″,c);
printf(″%s″,c);注意:
scanf函數(shù)中的輸入項(xiàng)如果字符數(shù)組名。不要再加地址符&,因?yàn)樵贑語(yǔ)言中數(shù)組名代表該數(shù)組的起始地址。下面寫(xiě)法不對(duì):scanf(″%s″,&str);main(){charword[3][10];inti;for(i=0;i<3;i++)scanf("%s",word[i]);printf("%s",word[i-2]);}12345abcdefABCDEFG分析以下程序的運(yùn)行結(jié)果:運(yùn)行時(shí)輸入:12345\0abcdef\0ABCDEFG\0結(jié)果:abcdef1、puts函數(shù)----輸出字符串的函數(shù)其一般形式為:puts(字符數(shù)組)其作用是將一個(gè)字符串(以′\0′結(jié)束的字符序列)輸出到終端。假設(shè)已定義str是一個(gè)字符數(shù)組名,且該數(shù)組已被初始化為"China"。那么執(zhí)行puts(str);其結(jié)果是在終端上輸出China。6.3.6善于使用字符串處理函數(shù)
在C函數(shù)庫(kù)中提供了一些用來(lái)專門(mén)處理字符串的函數(shù),使用方便。使用字符串函數(shù)時(shí),在程序開(kāi)頭用#include<string.h>
用puts函數(shù)輸出的字符串中可以包含轉(zhuǎn)義字符。例如:
charstr[]={″China\nBeijing″};puts(str);輸出結(jié)果:
ChinaBeijing
在輸出時(shí),將字符串結(jié)束標(biāo)志′\0′轉(zhuǎn)換成′\n′,即輸出完字符串后換行。2、gets函數(shù)----輸入字符串的函數(shù)其一般形式為:gets(字符數(shù)組)
其作用是從終端輸入一個(gè)字符串到字符數(shù)組,并且得到一個(gè)函數(shù)值。該函數(shù)值是字符數(shù)組的起始地址。如執(zhí)行下面的函數(shù):
gets(str)從鍵盤(pán)輸入:
Computer↙將輸入的字符串“Computer〞送給字符數(shù)組str〔請(qǐng)注意送給數(shù)組的共有9個(gè)字符,而不是8個(gè)字符〕,函數(shù)值為字符數(shù)組str的起始地址。一般利用gets函數(shù)的目的是向字符數(shù)組輸入一個(gè)字符串,而不大關(guān)心其函數(shù)值。注意:用puts和gets函數(shù)只能輸入或輸出一個(gè)字符串,不能寫(xiě)成puts(str1,str2)或gets(str1,str2)3、strcat函數(shù)----字符串連接函數(shù)其一般形式為:strcat(字符數(shù)組1,字符數(shù)組2)strcat的作用是連接兩個(gè)字符數(shù)組中的字符串,把字符串2接到字符串1的后面,結(jié)果放在字符數(shù)組1中,函數(shù)調(diào)用后得到一個(gè)函數(shù)值——字符數(shù)組1的地址。例如:charstr1[30]={“People’sRepublicof〞};charstr2[]={“China〞};print(“%s〞,strcat(str1,str2));輸出:People′sRepublicofChina4、strcpy函數(shù)和strncpy函數(shù)-字符串復(fù)制strcpy一般形式為:strcpy(字符數(shù)組1,字符串2)strcpy是“字符串復(fù)制函數(shù)〞。作用是將字符串2復(fù)制到字符數(shù)組1中去。例如:charstr1[10],str2[]={″China″};strcpy(str1,str2);關(guān)于strcpy函數(shù)的幾點(diǎn)說(shuō)明〔1〕字符數(shù)組1必須定義得足夠大,以便容納被復(fù)制的字符串。字符數(shù)組1的長(zhǎng)度不應(yīng)小于字符串2的長(zhǎng)度。〔2〕“字符數(shù)組1〞必須寫(xiě)成數(shù)組名形式(如str1),“字符串2〞可以是字符數(shù)組名,也可以是一個(gè)字符串常量。如strcpy(str1,″China″);〔3〕復(fù)制時(shí)連同字符串后面的′\0′一起復(fù)制到字符數(shù)組1中。〔4〕不能用賦值語(yǔ)句將一個(gè)字符數(shù)組直接給一個(gè)字符數(shù)組。如下面是不合法的:str1=str2;而只能用strcpy函數(shù)將一個(gè)字符串復(fù)制到另一個(gè)字符數(shù)組中去。用賦值語(yǔ)句只能將一個(gè)字符賦給一個(gè)字符型變量或字符數(shù)組元素。如下面是合法的:chara[5],c1,c2;c1=′A′;c2=′B′;a[0]=′C′;a[1]=′h′;a[2]=′i′;a[3]=′n′;a[4]=′a′;〔5〕可以用strncpy函數(shù)將字符串2中前面n個(gè)字符復(fù)制到字符數(shù)組1中去。strncpy(str1,str2,n);假設(shè)n為2作用是將str2中最前面2個(gè)字符復(fù)制到str1中,取代str1中原有的最前面2個(gè)字符。復(fù)制的字符個(gè)數(shù)n不應(yīng)多于str1中原有的字符。思考以下語(yǔ)句執(zhí)行后s2的值:chars1[]=“abc\ndef\0gh\t〞;chars2[80];strcpy(s2,s1);S2=“abc\ndef\0〞5、strcmp函數(shù)----字符串比較函數(shù)其一般形式為:strcmp(字符串1,字符串2)strcmp的作用是比較字符串1和字符串2。例如:strcmp(str1,str2);strcmp(″China″,″Korea″);strcmp(str1,″Beijing″);字符串比較的規(guī)那么是:將兩個(gè)字符串自左至右逐個(gè)字符相比,直到出現(xiàn)不同的字符或遇到’\0’為止如全部字符相同,認(rèn)為兩個(gè)字符串相等假設(shè)出現(xiàn)不相同的字符,那么以第一對(duì)不相同的字符的比較結(jié)果為準(zhǔn)例:〞A〞<〞B〞〞a〞>〞A〞〞computer〞>〞compare〞〞these〞>〞that〞〞1A〞>〞$20〞〞CHINA〞>〞CANADA〞〞DOG〞<〞cat〞〞Tsinghua〞>〞TSINGHUA〞比較的結(jié)果由函數(shù)值帶回:(1)如果字符串1=字符串2,函數(shù)值為0。(2)如果字符串1>字符串2,函數(shù)值為一正整數(shù)。(3)如果字符串1<字符串2,函數(shù)值為一負(fù)整數(shù)。注意:對(duì)兩個(gè)字符串比較,不能用以下形式:if(str1>str2)printf(″yes″);而只能用if(strcmp(str1,str2)>0)printf(″yes″);例:以下語(yǔ)句執(zhí)行后n的值分別為多少?1、n=strcmp(“ABCD12〞,〞ABCD〞);2、n=strcmp(“ABcd〞,〞ABCD〞);3、n=strcmp(“12ABcd〞,〞ABCD〞);6、strlen函數(shù)----測(cè)字符串長(zhǎng)度的函數(shù)其一般形式為:strlen(字符數(shù)組)
strlen是測(cè)試字符串長(zhǎng)度的函數(shù)。函數(shù)的值為字符串中的實(shí)際長(zhǎng)度(不包括′\0′在內(nèi))。例如:charstr[10]={″China″};printf(″%d″,strlen(str));
輸出結(jié)果不是10,也不是6,而是5。也可以直接測(cè)試字符串常量的長(zhǎng)度,如strlen(″China″);
7、strlwr函數(shù)----轉(zhuǎn)換為小寫(xiě)的函數(shù)其一般形式為:strlwr(字符串)
strlwr函數(shù)的作用是將字符串中大寫(xiě)字母換成小寫(xiě)字母。
8、strupr函數(shù)----轉(zhuǎn)換為大寫(xiě)的函數(shù)其一般形式為:strupr(字符串)
strupr函數(shù)的作用是將字符串中小寫(xiě)字母換成大寫(xiě)字母。
例:chars[]=“1234\n89\r\b\0abcd〞n=strlen(s);那么n=?9例6.8輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞,單詞之間用空格分隔開(kāi)。6.3.7字符數(shù)組應(yīng)用舉例解題思路:?jiǎn)栴}的關(guān)鍵是怎樣確定“出現(xiàn)一個(gè)新單詞了〞。從第1個(gè)字符開(kāi)始逐個(gè)字符進(jìn)行檢查,判斷此字符是否是新單詞的開(kāi)頭,如果是,就使變量num的值加1,最后得到的num的值就是單詞總數(shù)。判斷是否出現(xiàn)新單詞,可以由是否有空格出現(xiàn)來(lái)決定(連續(xù)的假設(shè)干個(gè)空格作為出現(xiàn)一次空格;一行開(kāi)頭的空格不統(tǒng)計(jì)在內(nèi))。如果測(cè)出某一個(gè)字符為非空格,而它的前面的字符是空格,那么表示“新的單詞開(kāi)始了〞,此時(shí)使num累加1。如果當(dāng)前字符為非空格而其前面的字符也是非空格,那么num不應(yīng)再累加1。6.3.7字符數(shù)組應(yīng)用舉例用變量word作為判別當(dāng)前是否開(kāi)始了一個(gè)新單詞的標(biāo)志,假設(shè)word=0表示未出現(xiàn)新單詞,如出現(xiàn)了新單詞,就把word置成1。前面一個(gè)字符是否空格可以從word的值看出來(lái),假設(shè)word等于0,那么表示前一個(gè)字符是空格;如果word等于1,意味著前一個(gè)字符為非空格。6.3.7字符數(shù)組應(yīng)用舉例Yc=空格word=0Nword=0Yword=1num++Nif(c=='')word=0;elseif(word==0){word=1;num++;}當(dāng)前字符Iamaboy.是否空格否是否否是否是否否否否word原值01011010111新單詞開(kāi)始否是否是否否是否是否否否word新值10110101111num值11222334444……charstring[81],c;inti,num=0,word=0;gets(string);for(i=0;(c=string[i])!=‘\0’;i++)if(c==‘’)word=0;elseif(word==0) {word=1; num++; }printf(“%dwords\n〞,num);……一定要設(shè)初始值……charstring[81],c;inti,num=0,word=0;gets(string);for(i=0;(c=string[i])!=‘\0’;i++)if(c==‘’)word=0;elseif(word==0) {word=1; num++; }printf(“%dwords\n〞,num);……相當(dāng)于c=string[i];c!=‘\0’分析:3個(gè)字符串可以放在一個(gè)二維字符數(shù)組,如str[3][10]。C語(yǔ)言把二維數(shù)組當(dāng)成多個(gè)一維數(shù)組處理,因此str[3][10]相當(dāng)于3個(gè)一維數(shù)組〔或3個(gè)字符串〕。for(i=0;i<3;i++)gets(str[i]);例6.9有3個(gè)字符串,要求找出其中最大者
China\0\0\0\0\0str[0]Japan\0\0\0\0\0str[1]India\0\0\0\0\0str[2]經(jīng)過(guò)三次兩兩比較,就可得到值最大者,把它放在一維字符數(shù)組string中if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);else strcpy(string,str[1]);if(strcmp(str[2],string)>0)strcpy(string,str[2]);正確解法#include<stdio.h>#include<string.h>intmain(){charstr[3][10];charstring[10];inti;for(i=0;i<3;i++)gets(str[i]);
if(strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nthelargest:\n%s\n",string);return0;}考慮如果是求10個(gè)字符串中的最大值應(yīng)該如何處理?√例10:選擇法排序分析:選擇法在兩兩比較后并不馬上交換,而是找到最小數(shù)后記下其下標(biāo)。在一輪比較完畢后,再將最小的數(shù)一次交換到位。比較次數(shù)不變,交換次數(shù)減少。假設(shè)有n個(gè)數(shù)的序列,要求按遞增的次序排序。算法如下:①?gòu)膎個(gè)數(shù)中挑選出最小數(shù),并與第1個(gè)數(shù)交換位置;②除第1數(shù)外,在其余n-1個(gè)數(shù)中挑選出最小數(shù),并與第2個(gè)數(shù)交換位置;③除第1、2數(shù)外,在其余n-2個(gè)數(shù)中挑選出最小數(shù),并與第3個(gè)數(shù)交換位置;④重復(fù)步驟③n-1次,這n個(gè)數(shù)構(gòu)成遞增序列。
根據(jù)以上的步驟,數(shù)組的排序需要兩重循環(huán),內(nèi)循環(huán)表示在一組數(shù)中選擇最小數(shù)后交換位置,外循環(huán)變量表示存放最小數(shù)的位置。將23,45,11,90,49五個(gè)數(shù)按遞增次序排序,原始數(shù)據(jù):9049234511第1輪交換后:1149234590 a(1)位置為最小數(shù)第2輪交換后:1123494590 a(2)位置為最小數(shù)第3輪交換后:1123454990 a(3)位置為最小數(shù)第4輪交換后:1123454990 a(4)位置為最小數(shù)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年環(huán)保型保潔服務(wù)臨時(shí)用工合同標(biāo)準(zhǔn)文本
- 2025年白酒行業(yè)年度總代理合同模板
- 2025年白灰行業(yè)環(huán)保達(dá)標(biāo)排放合同協(xié)議范本
- 電力工程股權(quán)讓與及電力供應(yīng)擔(dān)保合同
- 人工智能股權(quán)眾籌融資協(xié)議范本
- 購(gòu)房補(bǔ)充協(xié)議內(nèi)容規(guī)范與糾紛解決策略
- 高端制造企業(yè)股權(quán)投資與股權(quán)轉(zhuǎn)讓合同
- 生物醫(yī)藥企業(yè)股權(quán)投資及研發(fā)合作合同
- 種鴿養(yǎng)殖基地技術(shù)改造及定金協(xié)議范本
- 電氣自動(dòng)化 霓虹燈廣告屏的PLC控制設(shè)計(jì)
- 穿透式管理模式在建設(shè)項(xiàng)目中的應(yīng)用與探索
- 車(chē)庫(kù)門(mén)維修合同范本
- 2025年度事業(yè)單位公開(kāi)招聘考試《綜合應(yīng)用能力(E類(lèi))公共衛(wèi)生管理》試卷真題及解析
- 2025年四川省高考物理試卷真題(含答案)
- 三市耐多藥肺結(jié)核病患者管理狀況剖析與優(yōu)化策略探究
- 風(fēng)機(jī)吊裝安全培訓(xùn)
- CJ/T 461-2014水處理用高密度聚乙烯懸浮載體填料
- 社區(qū)工作者綜合能力考試基礎(chǔ)知識(shí)試題及答案
- T/CBMCA 046-2023潔凈室用裝配式隔墻及吊頂系統(tǒng)技術(shù)要求
- 墊付醫(yī)療費(fèi)協(xié)議書(shū)
評(píng)論
0/150
提交評(píng)論