




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章數組掌握一維數組、二維數組的定義、初始化和引用。掌握字符串和字符數組的概念及其處理函數。掌握用數組進行編程的技術。
第一頁,共五十四頁。先看一個例子:例:給出10個兒童的體重,要求計算平均體重并打印出低于平均體重的數值。用變量來解決問題:main(){intw1,w2,w3,w4,w5,w6,w7,w8,w9,w10;intt;scanf("%d%d%d%d%d%d%d%d%d%d",&w1,&w2,&w3,w4,&w5,&w6,&w7,&w8,&w9,&w10);第二頁,共五十四頁。t=(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)/10;if(w1<t)printf("%d\n",w1); if(w2<t)printf("%d\n",w2);if(w3<t)printf("%d\n",w3);if(w4<t)printf("%d\n",w4);if(w5<t)printf("%d\n",w5);if(w6<t)printf("%d\n",w6);if(w7<t)printf("%d\n",w7);if(w8<t)printf("%d\n",w8);if(w9<t)printf("%d\n",w9);if(w10<t)printf("%d\n",w10);}第三頁,共五十四頁。用數組來解決問題:main(){intw[10]; /*定義1個整型數組存放體重*/intt,i;for(i=0;i<10;i++)scanf("%d",&w[i]);for(t=0,i=0;i<10;i++)t=t+w[i];t=t/10;for(i=0;i<10;i++)if(w[i]<t)printf("%d\n",w[i]);}第四頁,共五十四頁。數組及其相關概念
數組是一組有序的、類型相同的數據的集合,這些數據被稱為數組的元素。數組下標第五頁,共五十四頁。
每個數組都有一個名字,我們稱之為數組名。
為標識數組中的每個元素,我們需要對它們進行編號,這種編號我們稱之為數組元素的下標。
由于有了下標,元素在數組中的位置(或排列順序)就被唯一地確定下來。我們用數組名加上下標就可以準確地訪問數組中的某個元素了。如:w[0]代表數組w中的第一個元素
w[9]代表數組w中的第十個元素
注意:C語言規定下標從0開始。說明:數組名代表數組的起始地址。數組元素在內存中是連續存儲的。第六頁,共五十四頁。7.1一維數組的定義和引用一、一維數組的定義定義一維數組的一般方式:
類型說明符數組名[常量表達式];指明數組元素的數據類型指明數組所含的元素個數例如:inta[10];/*定義的整型數組a含10個元素*/
floatb[20];/*定義的實型數組b含20個元素*/第七頁,共五十四頁。說明:⑴數組名的命名規則同變量名的命名規則一樣;⑵數組名后用方括號[],不能用()⑶常量表達式必須是大于0的整型常量表達式,不
能包含變量。即C語言不允許對數組的大小作動態定義,即定義數組時,數組的長度必須是確定的,其大小不依賴程序運行過程中變量的值。inta(10);
例如:intn;inta[n]charname[0];floatweight[10.3];floatarray[-100];第八頁,共五十四頁。二、一維數組的初始化1.定義時初始化方法:將初值依此寫在花括號{}內。如:inta[5]={2,4,6,8,10};存儲形式:存儲單元第九頁,共五十四頁。說明:⑴如果在定義一維數組時給出了全部元素的初值,則數組的下標允許省略。此時編譯系統將自動根據初始化數據的個數來確定數組的長度。如:inta[]={2,4,6,8,10};inta[];╳⑵初始化的數據個數允許少于數組的長度,但不
能多于數組的長度。當初始化的數據個數(至少要有一個)少于數組的長度時,未初始化部分將被編譯系統自動用0賦值。如:inta[5]={2,4};
相當于:a[0]=2,a[1]=4,a[2]=0,a[3]=0,a[4]=0
inta[5]={1,2,3,4,5,6,7,8};╳第十頁,共五十四頁。(3)如果想使一個數組中全部元素值為0,可以寫成如:inta[5]={0,0,0,0,0};或inta[5]={0};不能寫成
inta[5]={0*10};
╳第十一頁,共五十四頁。2.使用其它方法初始化⑵利用輸入語句初始化main(){charas[26];inti;for(i=0;i<26;i++)scanf("%c",&as[i]);…...}⑴利用賦值語句初始化main(){charas[26],ch;for(ch='A';ch<='Z';ch++)as[ch-'A']=ch;…...}第十二頁,共五十四頁。三、一維數組的引用
數組元素類似于單個變量,可以自由地存取。但是,它與一般變量相比,有以下特殊之處:⑴數組元素是通過數組名加上該元素在數組中的位置(即數組元素的下標)來訪問的。
表示形式:
數組名[下標]
如:a[3]
其中,下標可以是整型常量、整型變量或整型表達式。如:inta[10]; inti=3; a[i]=10;
floati=3;a[i]=10;第十三頁,共五十四頁。⑵
數組元素的下標是從0開始的。如:inta[2];scanf(“%d,%d”,&a[1],&a[2]);第十四頁,共五十四頁。⑶
數組元素的賦值是逐個元素進行的,不允許把一個數組作為一個整體賦給另一個數組。除了數組初始化外,也不允許用在花括號中列表的方式對數組整體賦值。例1:inta[5]={2,4,6,8,10},b[5];b[5]=a[5];例2:inta[5];a[5]={2,4,6,8,10};⑷
數組名a代表的是數組a在內存中的首地址,因此,可以用數組名a來代表數組元素a[0]的地址。
等價于scanf(“%d”,&a[0]);scanf(“%d”,a);第十五頁,共五十四頁。四、一維數組應用舉例例1:從鍵盤上輸入10個實型數存入數組,然后按輸入順序的逆序輸出這10個數。main(){floata[10];inti;for(i=0;i<10;i++)scanf(“%f”,&a[i]);for(i=9;i>=0;i--)printf(“%10.2f”,a[i]);}第十六頁,共五十四頁。例7.2:用數組來處理求斐波納契數列:
1,1,2,3,5,8…的前20個數。main(){intf[20]={1,1};
for(i=2;i<20;i++)/*f[2]是數組第3個元素*/f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){printf(“%10d”,f[i]);if(i%2==0)printf(“\n”);/*每行打印2個數*/}}數學表示:f(0)=f(1)=1,f(n)=f(n-2)+f(n-1)第十七頁,共五十四頁。例7.3:用冒泡法對10個數排序(由小到大)。冒泡法的思路是:將相鄰兩個數比較,將小的調到前頭。
988888895555559444444922222290000009
第一輪排序,比較了5次,獲得第一次結果。剩數輪數
5142332415第十八頁,共五十四頁。main(){inta[11],i,j,t;printf(“Input10numbers:\n”);for(i=1;i<11;i++)scanf(“%d”,&a[i]);printf(“\n”);
for(j=1;j<=9;j++)/*控制9輪排序*/for(i=1;i<=10-j;i++)/*每輪排序比較次數*/if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}for(i=1;i<=10;i++)printf("%d",a[i]);}第十九頁,共五十四頁。7.2二維數組的定義和引用先看一個例子:某校近三年招收各專業畢業生情況如下:
計算機電子管理數學
19999040803020001005090402001954510050要把這些數據組織起來,可以有兩種選擇:
⑴按從左到右從上到下的順序存入一個一維數組中。(查詢困難)
⑵每年用一個一維數組,把這些數據分別存入三個數組中。(增加一年數據困難)第二十頁,共五十四頁。一、二維數組的定義
定義二維數組的一般方式:類型說明符數組名[常量表達式1][常量表達式2];
如:inta[3][4];這種格式是錯誤的: inta[3,4]
存儲形式:
二維數組在內存中是按行的順序存放的,即先存放第一行的元素,再存放第二行的元素。
第二十一頁,共五十四頁。說明:二維數組除了維數比一維數組多一維外,其它性質與一維數組是全部類似的。看看下面寫法是否正確?
①inta[0][3];
用于定義數組長度的常量表達式的值必須是大于0的正整數。
②inti=3,j=4;
inta[i][j];
定義數組元素的個數必須使用常量表達式,而不能使用變量。第二十二頁,共五十四頁。二、二維數組的初始化
這里主要介紹定義時初始化,其它方法初始化和一維數組類似。定義時初始化有兩種方法:⑴分行初始化
例如:inta[2][3]={{1,2,3},{4,5,6}};即把第一個花括弧內的數據給第一行的元素,第二個花括弧的數據給第二行的元素。⑵省略掉內層的花括號
即按數組元素在內存中排列的順序賦初值。
例如:inta[2][3]={1,2,3,4,5,6};這種方法效果與前相同,但以第一種方法為好,一行對一行,界限清楚。第二種方法容易遺漏。第二十三頁,共五十四頁。說明:⑴在對二維數組初始化時,也可以只對部分數組元素初始化,未被初始化的數組元素將自動賦0
。inta[2][3]={{5,6},{7,8}};inta[2][3]={5,6,7,8};如:得到的數組為:560780得到的數組為:567800⑵在對二維數組初始化時,如果對全部元素都賦初值,或分行賦初值(每行至少一個數據),則可以省略第一維數組長度。但是,第二維數組長度不允許省略。如:inta[][3]={1,2,3,4,5,6,7,8,9};inta[][4]={{1,2},{3,4,5,6},{7}};系統按3行處理floatf[2][]={1.1,2.2};第二十四頁,共五十四頁。三、二維數組的引用
與引用一維數組元素一樣,是用下標法引用二維數組元素的。表示形式:
數組名[行下標][列下標]
其中,行下標和列下標是整型常量、整型變量或整型表達式。其編號是從0開始的。例如:若有inta[2*5][3*4],i=15;
則使用a[3*3][0],a[1][i-5]都是合法的。說明:數組名a代表的是數組a在內存中的首地址,因此,可以用數組名a來代表數組元素
a[0][0]的地址。第二十五頁,共五十四頁。四、二維數組應用舉例例1:使用數組保存“九九表”,然后輸出。main(){inta99[10][10],i,j;for(i=1;i<10;i++)for(j=1;j<=i;j++)a99[i][j]=i*j;for(i=1;i<10;i++){for(j=1;j<=i;j++)printf(“%6d",a99[i][j]);printf(“\n”);}}第二十六頁,共五十四頁。例7.4:矩陣的轉置。(書中例7.4)a=123456b=142536轉換成main(){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");}printf("\narrayb:\n");for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%6d",b[i][j]);printf("\n");}}第二十七頁,共五十四頁。例7.5:求3*4數組中的最大值及其下標。main(){intmax,row,colum,i,j;
inta[][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};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];row=i;colum=j;}printf("max=%d,row=%d,colum=%d",max,row,colum);}第二十八頁,共五十四頁。7.3字符數組和字符串一、字符數組
當數組的元素類型為字符型時,被稱為字符數組。如:charc[10];則c為字符數組。
字符數組的定義、初始化和元素的引用與一般的數組相同。如:main(){charch[5]={‘c’,‘h’,‘i’,‘n’,‘a’};for(i=0;i<5;i++)printf(“%c”,ch[i]);}第二十九頁,共五十四頁。說明:⑴定義字符數組的類型說明符一般為char,如:
charc[10];由于字符型與整型的互相通用性,因此,上面定義也可改為:intc[10];⑵初始化的字符個數允許少于字符數組的長度,但不能多于字符數組的長度(按語法錯誤處理)。當初始化的字符(至少要有一個)少于字符數組的長度時,未初始化部分將被編譯系統自動用空字符‘\0’賦值。如:intc[8]={‘H’,‘e’,‘l’,‘l’,‘o’};則:c[0]=‘H’,c[1]=‘e’,c[2]=‘l’,c[3]=‘l’,c[4]=,‘o’c[5]=‘\0’,c[6]=‘\0’,c[7]=‘\0’第三十頁,共五十四頁。(3)如果提供的初值個數與預定的數組長度相同,在定義時可以省略數組長度,系統會自動根據初值個數確定數組長度。如:intc[]={‘H’,‘e’,‘l’,‘l’,‘o’};數組c的長度自動定為5。第三十一頁,共五十四頁。二、字符串與字符數組
字符串常量是用雙引號括起來的一串字符,由系統自動加上一個字符串結束標志‘\0’。它占內存,但不記入字符串長度。如:“china”
占內存6個字節,但字符串長度是5
在C語言中用字符數組來處理字符串,每個元素存放一個字符型數據。
字符型數組可用一般數組的初始化方式初始化外,還可以使用字符串常量初始化:如:charmessage[]={“Hello”};√或charmessage[]=“Hello”;√(這時,字符數組長度是6,字符串長度是5。)第三十二頁,共五十四頁。注意:它與一般初始化方式:
charmessage[]={‘H’,‘e’,‘l’,‘l’,‘o’};
初始化的結果是不同的。
用一般初始化方式結果:
‘H’‘e’‘l’‘l’‘o’用字符串常量初始化:
‘H’‘e’‘l’‘l’‘o’‘\0’說明:字符數組本身并不要求它的最后一個元素一定是‘\0’,例如:charch[2]={‘A’,‘B’};是合法的。當定義字符數組用字符串常量賦初值時,最后有一個元素其值為‘\0’。為了使處理方法一致,在字符數組中也常常人為地加上一個值為‘\0’的元素。如:charmessage[]={‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};第三十三頁,共五十四頁。
IBM\0\0\0例如 charc[6]=“IBM”;數組c的前3個元素為‘I’,‘B’,‘M’,第四個元素為’\0’,后兩個元素也為空字符。第三十四頁,共五十四頁。例7.7輸出一個鉆石圖形main(){chardiamond[][5]={{‘’,’’,’*’},{‘’,’*’,’’,’*’},{‘*’,’’,’’,’’,”*’},{‘’,’*’,’’,’*’},{‘’,’’,’*’}};inti,j;for(i=0;i<5;i++){for(j=0;j<5;j++)printf(“%c”,diamond[i][j]);printf(“\n”);}}
********第三十五頁,共五十四頁。三、字符數組的輸入輸出字符數組的輸入輸出可以有以下兩種方法:⑴逐個字符輸入輸出用格式符“%c”輸入或輸出一個字符。⑵將整個字符串一次輸入或輸出。用格式符“%s”輸入輸出字符串。例如:charc[]=“Hello”;printf(“%s”,c);注意:⑴輸出字符不包括結束符‘\0’。⑵用“%s”格式符輸出字符串時,printf函數的輸出項是字符數組名,而不是數組元素名。第三十六頁,共五十四頁。⑶輸出字符數組時,遇到第一個‘\0’,輸出就結束。如 charc[10]=“china”;printf(“%s”,c);只輸出“china”5個字符,而不是10個字符。⑷用“%s”格式符輸入字符串時,scanf函數的輸出項是字符數組名時,不要再加地址符&,因為C語言中數組名代表該數組的起始地址。如:charstr[10];scanf(“%s”,&str);第三十七頁,共五十四頁。⑸用“%s”格式符輸入字符串時,scanf函數的輸出項是字符數組名時,從鍵盤輸入的字符串應短于已定義的字符數組的長度。系統自動在后面加個‘\0’結束符。例如 scanf(“%s”,c); charc[6];
從鍵盤輸入
china系統自動在后面加一個’\0’結束符。第三十八頁,共五十四頁。⑹利用scanf函數輸入多個字符串時,是以空格、回車、跳格分隔。例如:
charstr1[5],str2[5],str3[5]; scanf(“%s%s%s”,str1,str2,str3);
輸入數據:
howareyou?輸入后str1為:how\0; str2為:are\0; str3為:you?\0如果改為 charstr[13]; scanf(“%s”,str);如果輸入以下12個字符
howareyou?實際上不是把這12個字符加上’\0’送到數組中,而只將空格前的字符”how”送到str,并在后面加上一個’\0’。所以str為:how\0第三十九頁,共五十四頁。main(){chara[5];inti=0;while(i<=4){scanf(“%c”,&a[i]);i++;}}}輸入數據:abccdgmain(){chara[5];inti=0scanf(“%s”,a);printf(“%s”,a);}a[0]a[1]a[2]a[3]a[4]abc\0\0a[1]a[2]a[3]a[4]abcc第四十頁,共五十四頁。四、字符串函數㈠、字符串輸入輸出函數1.字符串輸入gets()函數使用形式:
gets(字符數組)功能:從終端輸入一個字符串(直到回車鍵)到字符數組中。并得到一個函數值,即字符數組的起始地址例如:charstr[20];gets(str);若從鍵盤輸入:HelloWorld!則將字符串“HelloWorld!”送到字符數組str中。第四十一頁,共五十四頁。2.字符串輸出puts()函數使用形式:
puts(字符數組)功能:將一個字符串輸出到終端。在輸出時,將字符串結束標志轉換成‘\n’,即輸出完字符串后換行。例如:charstr[]={“China\nBeijing”};puts(str);輸出:ChinaBeijing注意:使用puts和gets函數前,要用預編譯命令:#include“stdio.h”。第四十二頁,共五十四頁。1.字符串連接strcat()函數使用形式:
strcat(字符數組1,字符數組2)功能:連接兩個字符串,把字符串2連接到字符串1的后面,連接后的字符串放在字符數組1中。說明:⑴字符數組1必須足夠大以便能夠容納字符串2。
⑵連接時只在新串最后保留一個‘\0’。
看書p136例子㈡、字符串處理函數注意:使用這些函數前,要用#include“string.h”第四十三頁,共五十四頁。2.字符串復制strcpy()函數使用形式:
strcpy(字符數組1,字符串2)功能:將字符串2復制到字符數組1中
(其后自動加一個‘\0’)。例如:charstr1[20],str2[10];
strcpy(str1,“helloworld”);strcpy(str2,str1);其中,字符串2可以是字符串常量或字符數組。第四十四頁,共五十四頁。說明:⑴字符數組1必須足夠大以便能夠容納被復制的字符串。⑵不能用賦值語句將一個字符串常量或字符數組直接賦值給一個字符數組。例如:charstr1[20],str2[20];str1={“hello”};str2=str1;(3)“字符數組1”必須寫成數組名形式(如str1),“字符串2”可以是字符數組名,也可以是一個字符串常量。(4)復制時連同字符串后面的’\0’一起復制到字符數組1中。第四十五頁,共五十四頁。3.字符串比較strcmp()函數使用形式:
strcmp(字符串1,字符串2)其中,字符串可以是字符串常量或字符數組。功能:比較兩個字符串。比較的原則:兩個字符串從左至右逐個對應字符按其ASCII碼值大小相比較,直到出現不同的字符或遇到‘\0’為止。如全部字符相同,則認為相等;若出現不同字符,以第一個不相同字符的比較結果為準。若設n=strcmp(字符串1,字符串2);
n>0;串1>串2
則:n=n=0;串1=串2n<0;串1<串2第四十六頁,共五十四頁。例如:charstr1[20],str2[10];
(將str1[20]和str2[10]賦初值)
if(strcmp(str1,str2)>0)puts(str1);注意:不能寫成if(str1>str2)既不能關系運算符比較字符串。strcmp(“China”,”Korea”);第四十七頁,共五十四頁。4.求字符串長度strlen()函數使用形式:
strlen(字符數組)功能:計算字符串長度,函數值是字符串中‘\0’
之前的字符個數(不包括‘\0’字符)。例如:charstr[80]={“ab\n\\012/\\\””}
;
printf(“%d”,strlen(str));輸出:10
charstr[80]={“ab\n\0y\012/\\\””}
;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年化工項目可行性研究報告及運營方案
- 2025-2030年中國能量管理系統(EMS)行業市場競爭態勢及投資前景研判報告
- 2025-2030年中國滑片壓縮機行業深度研究分析報告
- 如何設計輕型鋁合金卷簾門項目可行性研究報告技術工藝+設備選型+財務
- 2025-2030年中國進口起重機行業深度研究分析報告
- 汕尾航空設備項目可行性研究報告
- 2025-2030年中國壓榨隔膜壓濾機行業深度研究分析報告
- 2025-2030年中國長毛絲塊毯行業深度研究分析報告
- 普通鋼絲項目可行性研究報告
- 2025-2030年中國PVC塑鋼門窗行業深度研究分析報告
- 羽毛球教案36課時
- 第三章煤層氣的儲層壓力及賦存狀態
- 100以內兩位數進退位加減法測試習題(1200道)
- 六年級上冊數學圓中方方中圓經典題練習
- 住宅(小區)智能化系統檢測報告
- ansys教學算例集汽輪機內蒸汽平衡態與非平衡態仿真分析
- 安全管理機構架構
- 國際海上人命安全公約(SOLAS)介紹
- 自卸車生產過程檢驗表
- 辭退公務員審批表辭退國家公務員審批表
- 纏論纏中說禪秋葉正紅三級聯立分析報告操作系統
評論
0/150
提交評論