大學計算機程序設計基礎(C語言)-第8章 數組_第1頁
大學計算機程序設計基礎(C語言)-第8章 數組_第2頁
大學計算機程序設計基礎(C語言)-第8章 數組_第3頁
大學計算機程序設計基礎(C語言)-第8章 數組_第4頁
大學計算機程序設計基礎(C語言)-第8章 數組_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章數組本章要點

一維數組

二維數組字符數組數組元素作函數實參

數組是同類型數據的集合,集合中的每個數據稱為數組元素或下標變量,數組元素的類型相同、個數確定。下標變量中如果只用一個下標,則稱為一維數組,用兩個下標則稱之為二維數組,用三個下標稱之為三維數組,依此類推?;靖拍?.1一維數組8.1.1一維數組的定義定義形式為:

[存儲類別]類型標識符數組名[常量表達式],…;例如:inta[6]; floatx[100],y[100];說明:類型標識符”表明了數組元素的數據類型常量表達式是由常量、符號常量和運算符組成的表達式,它的值規(guī)定了數組中數組元素的個數(數組的長度)常量表達式中不能含有變量。intn;scanf("%d",&n);inta[n];數組在內存中占據一片連續(xù)的存儲單元,數組中的每個數組元素在這片連續(xù)的存儲單元中按序存儲。C語言規(guī)定數組名表示該連續(xù)存儲單元的首地址(首字節(jié)編號)。a

a[0]a[1]a[2]a[3]a[4] a[5]

圖8.1數組的存儲結構

數組的定義語句給每個數組元素分配了一定的存儲單元,和簡單變量一樣它們的值是不確定的、是隨機的,只有通過賦值或賦初值才能得到確定的值。同類型的數組的定義和普通變量的定義可以出現在同一個定義語句中。如: inta[6],b[20],i,j;數組初始化的一般形式為:

[存儲類別]類型標識符數組名[常量表達式]={初值表};在編譯過程中完成的,不占程序運行時間。數組初始化常見的幾種形式:對所有數組元素賦初值,此時數組定義中表示數組長度的常量表達式可以省略。

inta[6]={0,1,2,3,4,5};可以只給一部分數組元素賦初值,此時數組長度一般不省略。后面3個元素由C編譯系統(tǒng)自動賦值為0。

inta[6]={0,1,2};

8.1.2一維數組的初始化引用形式為:

數組名[下標表達式]

例如:

a[0]=123;

scanf(“%d”,&a[3]);

printf(“%d”,a[5]);

a[i++]=2*a[i+j];8.1.3一維數組元素的引用【例8.1】輸入100個整型數據,然后分別按順序和逆序的方式輸出。main(){inti,a[100];

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

scanf("%d",&a[i]);/*順序輸入*/

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

printf("%d",a[i]);/*順序輸出*/for(i=99;i>=0;i--)

printf("%d",a[i]);/*逆序輸出*/}在引用數組元素時應注意: ①引用數組元素時,下標表達式的值是確定的。 ②數組元素本身可以看作是一個普通變量,代表內存中的一個存儲單元。因此數組元素可以在任何相同類型簡單變量允許使用的位置引用。 ③數組引用時,下標值應該在已定義的數組大小范圍內。常出現的錯誤是:

inta[100];

a[100]=4;8.1.4一維數組應用【例8.2】從鍵盤輸入10個整數存放在數組中,輸出其中最大的一個數和它在數組中的位序。main(){inta[10],i,max,id;printf("Enterdata:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);max=a[0];id=0;for(i=1;i<10;i++)if(a[i]>max) {max=a[i];id=i;}printf(“最大數是%d,位序為:%d\n",max,id);}【例8.4】已知一個一維數組中的各個元素值均不相同,編寫程序查找數組中是否有值為x的數組元素。如果有,輸出相應的下標;如果沒有,輸出“該值在數組中不存在”字樣信息。main(){intnum[10]={1,32,14,56,74,3,56,6,9,12},x,i,j;printf(“inputx:”);scanf("%d",&x);for(i=0;i<10;i++)if(num[i]==x)break;if(i==10)printf(“該數在數組中不存在");elseprintf(“該數在數組中的下標是%d”,i);}【例8.5】編寫程序,利用選擇法對10個整數進行遞增排序,并輸出排序后的結果。選擇法排序的思路是:先從全體待排序的n個數據中找出最大的數,把它放到數組的第0個位置上,完成第1趟選擇排序;接著再在剩余的n-1個數據中找出最大的數放到數組的第1個位置上,完成第2趟選擇排序,……,如此反復,經過n-1趟選擇排序后,原始數組已經有序。main(){inti,j,k,temp,a[10];for(i=0;i<10;i++)scanf(“%d”,&a[i]);for(i=0;i<9;i++){k=i;

for(j=k+1;j<10;j++)if(a[k]<a[j])k=j;

temp=a[i];a[i]=a[k];

a[k]=temp;}for(i=0;i<10;i++)printf(“%4d”,a[i]);}交換:199763第4趟查找:19976

3交換:1997

63第3趟查找:199673交換:199673第2趟查找:193679交換:19

3679第1趟查找:736199排序前:736199【例8.6】編寫程序,利用冒泡法對10個整數進行遞增排序?!谝惶?/p>

124156

341215634

121563412

615341263

15第二趟

463

12第三趟

43

6main(){inta[10],i,j,temp;

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]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}printf("thesortednumbers:\n");for(i=0;i<10;i++)printf("%d",a[i]);}8.2二維數組例:求一個矩陣的轉置矩陣356768292456245668293567定義二維數組的一般形式為:[存儲類別]類型標識符數組名[常量表達式1][常量表達式2],…;例如:inta[2][3];說明:①二維數組定義中的第1個下標表示該數組具有的行數,第2個下標表示該數組具有的列數,兩個下標之積是組成該數組的元素的個數,即二維數組的長度。②二維數組在內存中占據一片連續(xù)的存儲單元。aa[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]8.2.1二維數組的定義③在C語言中,一個二維數組可以看作是一個特殊的一維數組,其中一維數組中的每個元素又是一個一維數組,即二維數組是由元素類型為數組類型的一維數組構成的一維數組。因此C系統(tǒng)就把a[0]、a[1]看作是一維數組的數組名。a[0]a[1]aa[0][0]a[0][2]a[0][1]a[1][1]a[1][2]a[1][0]inta[2][3];二維數組初始化的幾種常見形式:

(1)按行給二維數組元素賦初值。如:

inta[2][3]={{1,2,3},{6,7,8}};

(2)將所有數據寫在一個花括弧內,按數組在內存中的排列順序對各數組元素賦初值。如:

inta[2][3]={1,2,3,6,7,8};

(3)給二維數組所有元素賦初值,二維數組第一維的長度可以省略。如:inta[2][3]={1,2,3,6,7,8};等價于:

inta[][3]={1,2,3,6,7,8};

(4)在定義時也可以只對部分元素賦初值而省略第一維的長度,但應按行賦初值。如:

inta[][3]={{0,2},{6}};8.2.2二維數組的初始化二維數組元素的引用形式為:

數組名[下標表達式1][下標表達式2]數組元素的行列下標都從0開始??梢詫ΧS數組元素進行與普通變量相同的操作,因為它們的本質就是一個普通變量,如運算、賦值等。如:a[0][0]=a[0][2]/3-30;

printf(“%d”,a[1][1]);區(qū)分在定義數組時使用的維數和各維大小與引用數組元素時下標值的不同。如:

inta[3][5];

a[3][5]=6;8.2.3二維數組元素的引用【例8.8】輸入12個整型數據形成一個具有3行4列的二維數組,然后按數組的邏輯排列形式輸出。main(){inti,j,a[3][4];

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

for(j=0;j<4;j++)scanf("%d",&a[i][j]);/*按行順序輸入*/for(i=0;i<2;i++)

{for(j=0;j<3;j++) printf("%2d",a[i][j]);/*按行順序輸出*/printf(“\n”);/*一行輸出完后,要換行*/}}#defineM2#defineN3main(){inta[M][N]={{1,2,3},{4,5,6}},b[N][M],i,j;for(i=0;i<M;i++){for(j=0;j<N;j++){b[j][i]=a[i][j];}

}for(i=0;i<N;i++){for(j=0;j<M;j++)printf(“%5d”,b[i][j]);}}8.2.4二維數組應用舉例【例8.10】將一個二維數組的行和列元素互換,存到另一個二維數組中。a=b=【例8.11】已知一個小組5個學生的4門課成績,要求分別求每門課的平均成績和每個學生的平均成績。

cour1cour2cour3cour4stud187699862stud259926877stud378884560stud489629794stud572997564main(){inti,j;

floatscore[6][5]={{87,69,98,62},{59,92,68,77},

{78,88,45,60},{89,62,97,94},{72,99,75,64}}for(i=0;i<5;i++)/*統(tǒng)計每個學生的平均成績*/{for(j=0;j<4;j++)

score[i][4]+=score[i][j];

score[i][4]=score[i][4]/4;

}}for(j=0;j<4;j++)/*統(tǒng)計每門課程的平均成績*/{for(i=0;i<5;i++)score[5][j]+=score[i][j];

score[5][j]=score[5][j]/5;}求一個矩陣所有靠外側的元素的和#defineM3#defineN4main(){inta[3][4]={{3,5,6,7},{6,8,2,9},{2,4,5,6}};intk,j,sum=0;

for(j=0;j<N;j++)sum+=a[0][j]+a[M-1][j]

for(i=1;i<M-1;i++)sum+=a[i][0]+a[i][N-1];printf(“%d”,sum);} 3567682924568.3字符數組字符數組是存放字符型數據的數組。其中每個數組元素的值都是字符型數據(單個字符或轉義字符)。常用的字符數組為一維字符數組和二維字符數組。8.3.1字符數組的定義charstr1[5];charstr2[3][10];用賦值語句可以對字符數組元素逐個賦初值。例如:

str1[0]='C';str1[1]='h';str1[2]='i';

str1[3]='n';str1[4]='a';China字符數組的存儲狀態(tài)

字符串常量在內存中占用一串連續(xù)的空間,相當于字符數組,可以按照字符數組的方式訪問字符串。對字符串的處理常常采用一維字符數組實現。不能通過賦值語句把字符串常量或其它字符數組中的字符串直接賦給字符數組8.3.2字符串與字符數組hello\0逐個字符對字符數組初始化(不會自動在最后一個字符后加’\0’)

例如:

charstr1[5]={‘C’,‘h’,‘i’,‘n’,‘a’};

charstr2[2][3]={‘W’,‘i’,‘n’,‘d’,‘o’,‘w’};如果初值個數小于數組長度,C編譯系統(tǒng)將其余的元素自動定為空字符(即‘\0’)用字符串常量對字符數組初始化(系統(tǒng)會自動在最后一個字符后加’\0’)例如:

charc1[13]={"Goodmorning"};

charc2[2][10]={"Hello","World"};8.3.3字符數組的初始化不可以用賦值語句給字符數組整體賦一串字符如:charc1[13];c1=“Goodmorning”;逐個字符輸入輸出scanf()和printf()函數中用格式符“%c”,循環(huán)8.3.4字符數組的輸入輸出charstr[5];for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=4;i>=0;i--)printf(“%c”,str[i]);

必須在接受到“回車”時,scanf()才開始讀取數據。如果按“回車”時,輸入的字符少于scanf()循環(huán)讀取的字符,scanf()繼續(xù)等待用戶將剩下字符輸入;否則,scanf()循環(huán)只將前面的字符讀入。逐個讀入字符結束后,不會自動在末尾加’\0’。字符串整體輸入輸出scanf()函數中用格式符“%s”整體輸入例如:從鍵盤上讀入5個字符并輸出:charstr[6];scanf("%s",str);printf("%s",str);①用“%s”輸入輸出字符串,以上函數的第二個參數都要求是字符數組的首地址,如字符數組名。②按照“%s”格式輸入字符串時,輸入的字符串中不能有空格(由空格鍵或Tab鍵產生,空格或是輸入數據的結束標志),否則空格后面的字符不能讀入,這時scanf()函數認為輸入的是兩個字符串。

如輸入:Iamhappy

則輸出:Iprintf()函數中用格式符“%s”整體輸出printf("%s",str);

輸出項是一個地址值??梢允亲址麛到M名、字符指針或字符數組元素的地址。函數從這一地址開始依次輸出,直至遇到第一個’\0’。

‘\0’是結束標志,不在輸出字符之列,輸出結束后不自動換行。1.字符串輸入和輸出函數 (1)字符串輸出函數puts()函數的調用形式為:

puts(str);功能:從str指定的地址開始,一次將存儲單元中的各個字符輸出到顯示器,直到遇到'\0'。例如下列程序段:

charstr[]=“China”;puts(str);注意:在輸出時將字符串結束標志轉換成'\n',即輸出完字符串后換行。8.3.5字符串(字符數組)處理函數(2)字符串輸入函數gets()函數的調用形式:

gets(str);功能:從鍵盤輸入一個字符串(可包含空格),直到遇到回車符,并將字符串存放到由str指定的字符數組(或內存區(qū)域)中。換行符讀入后,不作為字符串的內容,系統(tǒng)自動用’\0’代替。函數調用完成后,輸入的字符串存放在str開始的內存空間中。2.字符串連接函數strcat()函數調用形式為:

strcat(str1,str2)功能:將以str2為首地址的字符串連接到str1字符串的后面。從str1原來的字符串結束標志’\0’處開始連接。例如:

charstrl[13]={“Ilove”};

charstr2[]={“China”};

printf("%s",strcat(str1,str2)); 輸出結果為:

IloveChinastr1必須足夠大格式:strcpy(字符數組1,字符數組2);功能:將字符數組2拷貝到字符數組1中;

例如:charstr1[10],str2[]={“Computer”}; strcpy(str1,str2);

執(zhí)行后str1中的內容為:Computer;注意:字符數組1的長度應大到足夠容納字符串2.

字符數組2的形式可以是字符數組名也可以是字符串常量. 如:strcpy(str1,“Computer”);3.字符串拷貝函數strcpy()

格式:strcmp(字符串1,字符串2);功能:對兩個字符串從左到右逐個字符進行比較,直到相應位置上的字符不一樣或遇到‘\0’,比較結果由函數返回

(1)如果字符串1=字符串2,函數返回值為0(2)如果字符串1>字符串2,函數返回值為正整數

(3)如果字符串1<字符串2,函數返回值為負整數4、字符串比較函數strcmp()格式:strlen(字符串);功能:測試字符串的實際長度(不包括‘\0’)

如:charstr[15]={“Ilovechina”}; printf(“%d”,strlen(str));

結果:125、測字符串長度函數strlen()8.3.6字符數組應用【例8.13】編寫程序求一個字符串的逆串。如:字符串”abcdefg”的逆串為:”gfedcba”。main(){charstr[50];intc,i,j,n;

printf("Pleaseinputthestring:\n");

scanf("%s",str);

for(n=0;str[n]!=‘\0’;n++);

for(i=0,j=n-1;i<j;i++,j--){c=str[i];str[i]=str[j];str[j]=c;}printf("Reversedstring:\n%s",str);}gets(str);n=strlen(str);【例8.14】編寫程序將輸入的兩個字符串連接起來,以實現strcat()函數的功能。#include"string.h"main(){charstr1[50],str2[20];

inti,j=0;

printf("PleaseinputthestringNo.1:\n");

gets(str1);

printf("Pleaseinpu

溫馨提示

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

評論

0/150

提交評論