C程序設(shè)計(jì)及工程案例分析-第6章數(shù)組_第1頁
C程序設(shè)計(jì)及工程案例分析-第6章數(shù)組_第2頁
C程序設(shè)計(jì)及工程案例分析-第6章數(shù)組_第3頁
C程序設(shè)計(jì)及工程案例分析-第6章數(shù)組_第4頁
C程序設(shè)計(jì)及工程案例分析-第6章數(shù)組_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章

數(shù)組C程序設(shè)計(jì)及工程案例分析XX大學(xué):XX學(xué)習(xí)目標(biāo)理解并能正確選擇數(shù)組數(shù)據(jù)結(jié)構(gòu)會(huì)熟練定義數(shù)組,初始化數(shù)組以及引用數(shù)組中的單個(gè)元素會(huì)使用數(shù)組對一組值進(jìn)行存儲(chǔ)、排序和查找會(huì)運(yùn)用數(shù)組作為參數(shù)傳遞會(huì)熟練定義和使用多維數(shù)組了解字符數(shù)組與字符串的關(guān)系,熟悉字符串的基本操作C語言里,一維數(shù)組元素的下標(biāo)是從0開始的。TFAB提交單選題10分目錄6.1一維數(shù)組6.2二維數(shù)組6.3字符串6.4綜合應(yīng)用實(shí)例---篩法求素?cái)?shù)6.5工程案例分析---利用數(shù)組存儲(chǔ)傳感器特性數(shù)據(jù)一維數(shù)組6.16.1.1一維數(shù)組的定義、引用和初始化C語言給我們提供了數(shù)組這種數(shù)據(jù)結(jié)構(gòu),幫助我們完成同時(shí)定義多個(gè)同類型變量的工作。定義數(shù)組的語法:數(shù)組元素類型數(shù)組名[數(shù)組元素個(gè)數(shù)];例如:inta[100];//定義含100個(gè)整型元素的數(shù)組adoubleb[30];//定義含30個(gè)雙精度型元素的數(shù)組bcharc[256]; //定義含256個(gè)字符型元素的數(shù)組c數(shù)組數(shù)組是一組位置相鄰的內(nèi)存單元,它們都具有相同的名稱和類型。要引用數(shù)組中的特定位置的元素,需要指定數(shù)組的名稱和數(shù)組中特定元素的位置編號(下標(biāo))。數(shù)組一組相關(guān)的內(nèi)存位置具有相同的名稱和類型對數(shù)組元素的使用必須指明:數(shù)組名位置編號語法:數(shù)組名[位置編號]數(shù)組第一個(gè)元素編號為0數(shù)組中的n個(gè)元素名為:c[0],c[1]...c[n–1]Nameofarray(Notethatallelementsofthisarrayhavethesamename,c)Positionnumberoftheelementwithinarraycc[6]-4560721543-89062-31645378c[0]c[1]c[2]c[3]c[11]c[10]c[9]c[8]c[7]c[5]c[4]假定double類型變量在內(nèi)存中占用8個(gè)字節(jié),且數(shù)組定義如下,則數(shù)組a在內(nèi)存中所占字節(jié)數(shù)是(

)。doublea[10];8801040ABCD提交單選題10分?jǐn)?shù)組元素的使用數(shù)組元素的使用和普通變量一樣c[3]=125c[5]=c[1]+c[2]c[8]=c[4]*c[7]數(shù)組下標(biāo)可以是一個(gè)表達(dá)式c[5–2]=100數(shù)組下標(biāo)可以是一個(gè)變量或表達(dá)式intx=1;c[x]=100;intx=7,y=3;c[y–x]=100;數(shù)組使用示例:

定義一個(gè)數(shù)組并使用循環(huán)來給數(shù)組中的元素賦值。#include<stdio.h>intmain(void){inta[5];for(inti=0;i<5;i++){a[i]=i*10;}for(inti=0;i<5;i++){printf("%d\t",a[i]);}return0;}注意:C語言編譯器不檢查數(shù)組越界問題,需要程序員自己注意避免出現(xiàn)數(shù)組越界的錯(cuò)誤?!纠?.1】整型數(shù)組的應(yīng)用定義一個(gè)含10個(gè)元素的整型數(shù)組,從鍵盤輸入這10個(gè)元素的值,然后輸出到屏幕上。#include<stdio.h>intmain(void){

inta[10],i;

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

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

return0;}下列說法正確的是(

)。有定義語句“inta[10];”,則數(shù)組名a代表&a[1]數(shù)組元素的下標(biāo)必須為整型常量在定義一維數(shù)組時(shí),數(shù)組長度可以用任意類型的表達(dá)式表示若有定義語句“inti=10,a[10];”,則可以用a[i/3+3]表達(dá)數(shù)組元素ABCD提交單選題10分在C語言中,引用數(shù)組元素時(shí),其數(shù)組下標(biāo)的數(shù)據(jù)類型允許是(

)。整型常量整型表達(dá)式整型常量或整型表達(dá)式任何類型的常量或表達(dá)式ABCD提交單選題10分8.1.2數(shù)組的初始化用初始值初始化數(shù)組intn[5]={1,2,3,4,5};如果初始值少于數(shù)組中的元素,則剩余元素被初始化為0

inta[5]={1,2,3}intn[5]={0}如果初始值多于數(shù)組中的元素,則為語法錯(cuò)誤。

inta[3]={1,2,3,4}如果在帶有初始值列表的定義語句中忽略了數(shù)組大小,則數(shù)組元素的個(gè)數(shù)就是初始值列表中元素的個(gè)數(shù)。intn[]={1,2,3,4,5};

數(shù)組元素求和:

有一個(gè)數(shù)組被初始化如下:

inta[12]={1,3,5,4,7,2,99,16,45,67,89,45}

寫一段程序求這個(gè)數(shù)組所有元素的和。#include<stdio.h>intmain(){

inta[12]={1,3,5,4,7,2,99,16,45,67,89,45};

ints=0,i;

for(i=0;i<12;i++) { s+=a[i]; } printf("s=%d\n",s);

return0;}以下能對一維數(shù)組a進(jìn)行初始化的語句是(

)。inta[5]=(0,1,2,3,4,);inta(5)={};inta[3]={0,1,2};inta{5}={10*1};ABCD提交單選題10分假定int類型變量占用2個(gè)字節(jié),其有定義intx[10]={0,2,4};則數(shù)組x在內(nèi)存中所占字節(jié)數(shù)是(

)。361020ABCD提交單選題10分6.1.2最大值、最小值與所有數(shù)的和【例6.4】已知一個(gè)含10個(gè)元素的整型數(shù)組,求該數(shù)組的最大值、最小值與所有數(shù)的和。求最大值的算法:假設(shè)第一個(gè)數(shù)是最大數(shù),將max賦值為第一個(gè)數(shù)。將max與下一個(gè)數(shù)比較,如果max小于這個(gè)數(shù),則將max賦值為該數(shù)。重復(fù)第二步,直到?jīng)]有下一個(gè)數(shù)。同理,求最小值的算法:假設(shè)第一個(gè)數(shù)是最小數(shù),將min賦值為第一個(gè)數(shù)。將min與下一個(gè)數(shù)比較,如果min大于這個(gè)數(shù),則將min賦值為該數(shù)。重復(fù)第二步,直到?jīng)]有下一個(gè)數(shù)。求和的算法:將sum賦值為第一個(gè)數(shù)。將sum和下一個(gè)數(shù)相加,結(jié)果放到sum中。重復(fù)第二步,直到?jīng)]有下一個(gè)數(shù)。程序6.4求數(shù)組的最大值,最小值和平均值。#include<stdio.h>#defineSIZE10intmain(void){ /*定義并初始化含個(gè)元素的數(shù)組*/

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

intmax,min,sum,i; max=min=sum=a[0];

for(i=1;i<=SIZE-1;++i) { if(max<a[i]) max=a[i]; if(min>a[i]) min=a[i]; sum+=a[i]; } printf("Themaxis%d\n",max); printf("Theminis%d\n",min); printf("Thesumis%d\n",sum);

return0;}6.1.3一維數(shù)組作為函數(shù)的參數(shù)要把一個(gè)數(shù)組作為參數(shù)傳遞給一個(gè)函數(shù),那么只要指定不帶方括號的數(shù)組名就可以了?!纠?.5】寫一個(gè)函數(shù),用來輸出整型數(shù)組的各個(gè)元素。#include<stdio.h>voiddisplay(inta[],intsize);intmain(void){

inta[5]={10,20,30,40,50}; display(a,5);

return0;}voiddisplay(inta[],intsize){

inti;

for(i=0;i<size;++i) printf("%d\t",a[i]);}函數(shù)原型中用“數(shù)組類型數(shù)組名[]”表示數(shù)組作為形參函數(shù)調(diào)用時(shí)只需以函數(shù)名作為實(shí)參即可6.1.4數(shù)組排序【例6.7】定義一個(gè)函數(shù),用來對一個(gè)整型數(shù)組作選擇排序。選擇排序(Selectionsort)是一種簡單直觀的排序算法。它的工作原理是:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后再從剩余未排序元素中繼續(xù)尋找最小元素,然后放到排序序列末尾。以此類推,直到所有元素均排序完畢。直接選擇排序的基本思想:n個(gè)記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果:(1)初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空。(2)第1趟排序在無序區(qū)R[1..n]中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個(gè)記錄R[1]交換,使R[1..1]和R[2..n]分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū)?!?3)第i趟排序第i趟排序開始時(shí),當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當(dāng)前無序區(qū)中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個(gè)記錄R[i]交換,使R[1..i]和R[i+1..n]分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū)。這樣,n個(gè)記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果選擇排序#include<stdio.h>#include<stdlib.h>#include<time.h>#defineLEN10voidSelectionSort(inta[],intsize);voiddisplay(inta[],intsize);intmain(void){ inta[LEN],i; srand(time(NULL));/*初始化隨機(jī)數(shù)函數(shù)*/ /*將數(shù)組元素隨機(jī)設(shè)置為~之間的整數(shù)*/ for(i=0;i<=LEN-1;++i) { a[i]=rand()%100; } display(a,LEN); SelectionSort(a,LEN);/*調(diào)用Selectionsort函數(shù)對數(shù)組排序*/ display(a,LEN); return0;}voidSelectionSort(inta[],intsize){ intmin,k,i,j,temp; for(i=0;i<=size-2;++i) { min=a[i]; k=i; for(j=i+1;j<=size-1;++j) { if(min>a[j]) { min=a[j]; k=j; } } if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } }}voiddisplay(inta[],intsize){ inti; for(i=0;i<=size-1;++i) { printf("%d\t",a[i]); } printf("\n");}【例6.8】定義一個(gè)函數(shù),用來對一個(gè)整型數(shù)組作冒泡排序。冒泡排序(BubbleSort)的基本過程是:依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,最大的數(shù)移動(dòng)到了最后。在第二趟:仍從第一對數(shù)開始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再小于第2個(gè)數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個(gè)數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個(gè)新的最大數(shù)(其實(shí)在整個(gè)數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過程,直至最終完成排序。由于在排序過程中總是小數(shù)往前放,大數(shù)往后放,類似于輕的氣泡往上升重的石頭往下沉,因此得名冒泡排序。冒泡排序的算法描述如下:(1)比較相鄰的元素,如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。(2)對每一對相鄰元素作同樣的操作,從開始第一對到結(jié)尾的最后一對。這一步完成后,最后的元素應(yīng)該會(huì)是最大的數(shù)。(3)針對所有的元素重復(fù)以上的步驟,除了最后一個(gè)。(4)持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。冒泡排序#include<stdio.h>#include<stdlib.h>#include<time.h>#defineLEN10voidBubbleSort(inta[],intsize);voiddisplay(inta[],intsize);intmain(void){ inta[LEN],i; srand(time(NULL));/*初始化隨機(jī)數(shù)函數(shù)*/ /*將數(shù)組元素隨機(jī)設(shè)置為~之間的整數(shù)*/ for(i=0;i<=LEN-1;++i) { a[i]=rand()%100; } display(a,LEN); BubbleSort(a,LEN); display(a,LEN); return0;}voidBubbleSort(inta[],intsize){ inti,j,temp; for(i=1;i<=size-1;++i) { for(j=0;j<=size-i-1;++j) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }

}voiddisplay(inta[],intsize){ inti; for(i=0;i<=size-1;++i) { printf("%d\t",a[i]); } printf("\n");}【例6.8】定義一個(gè)函數(shù),用來對一個(gè)整型數(shù)組作插入排序。插入排序的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序在實(shí)現(xiàn)上,通常在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間。插入排序的算法描述如下:(1)從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序。(2)取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描。(3)如果該元素(已排序)大于新元素,將該元素移到下一位置。(4)重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置;找不到時(shí),第一個(gè)位置即新元素位置。(5)將新元素插入到該位置中。(6)重復(fù)執(zhí)行n-1次步驟2~5(n為數(shù)組元素個(gè)數(shù))。插入排序#include<stdio.h>#include<stdlib.h>#include<time.h>#defineLEN10voidInsertionSort(inta[],intsize);voiddisplay(inta[],intsize);intmain(void){ inta[LEN],i; srand(time(NULL));/*初始化隨機(jī)數(shù)函數(shù)*/ /*將數(shù)組元素隨機(jī)設(shè)置為~之間的整數(shù)*/ for(i=0;i<=LEN-1;++i) { a[i]=rand()%100; } display(a,LEN); InsertionSort(a,LEN);/*調(diào)用Selectionsort函數(shù)對數(shù)組排序*/ display(a,LEN); return0;}voidInsertionSort(intarray[],intsize){inti,j,temp;for(i=1;i<=size-1;i++){temp=array[i];for(j=i;j>0&&temp<array[j-1];j--){array[j]=array[j-1];array[j-1]=temp;}}

}voiddisplay(inta[],intsize){ inti; for(i=0;i<=size-1;++i) { printf("%d\t",a[i]); } printf("\n");}使用數(shù)組來匯總調(diào)查結(jié)果問題:要求40名學(xué)生對學(xué)生餐廳的飯菜質(zhì)量按照1~10(1意味著非常糟糕,10意味著非常好)進(jìn)行打分。將40個(gè)反饋意見安排在一個(gè)整數(shù)數(shù)組中,要求寫程序匯總民意調(diào)查的結(jié)果。#include<stdio.h>intmain(void){intresponse[40]={2,8,5,1,10,5,9,9,3,5,8,7,6,9,10,3,8,10,6,5};intf[11]={0};

for(inti=0;i<40;i++){f[response[i]]++;}

for(inti=1;i<11;i++){

printf("%2d:%2d",i,f[i]);for(intj=1;j<=f[i];j++){printf("*");}printf("\n");}return0;}

從鍵盤輸入一個(gè)正整數(shù),判斷這個(gè)正整數(shù)中是否有重復(fù)的數(shù)字。#include<stdio.h>#include<stdbool.h>intmain(void){booldigit_seen[10]={false};intdigit;longn;printf("Enteranumber:");scanf("%ld",&n);while(n>0){digit=n%10;if(digit_seen[digit])break;digit_seen[digit]=true;n/=10;

}if(n>0)printf("repeateddigit\n");elseprintf("Norepeateddidigt\n");return0;}6.1.5數(shù)組查找在很多情況下,程序員面對的是存儲(chǔ)了大量數(shù)據(jù)的數(shù)組,有時(shí)候需要確定數(shù)組中是否包含了匹配某個(gè)關(guān)鍵值的數(shù)值,搜尋數(shù)組中特定元素的過程稱為查找。本節(jié)將討論兩種查找技術(shù):簡單的順序查找技術(shù)以及更有效率的折半查找技術(shù)?!纠?.10】順序查找:在一個(gè)整型數(shù)組中查找是否包含特定值。順序查找將數(shù)組中的每個(gè)元素和要查找的關(guān)鍵值進(jìn)行比較。比較數(shù)組的第1個(gè)元素,第2個(gè)元素......直到最后一個(gè)元素。因?yàn)閿?shù)組并沒有特定的順序,所以匹配值與第1個(gè)元素相同或者與最后一個(gè)元素的可能性是一樣的。因此,在平均情況下,程序需要查找一半的數(shù)組元素。算法描述如下:從表中的第一個(gè)記錄開始,逐個(gè)進(jìn)行記錄的關(guān)鍵字與給定值進(jìn)行比較,若某個(gè)記錄的關(guān)鍵字與給定值相等,則查找成功,找到所查的記錄;反之,若直到最后一個(gè)記錄,其關(guān)鍵字和給定值比較都不相等,則表明表中沒有所查的記錄,查找失敗。程序6.10順序查找#include<stdio.h>#defineSIZE100/*函數(shù)原型*/intlinearSearch(inta[],intkey,intsize);intmain(void){ inta[SIZE];/*創(chuàng)建數(shù)組a*/ intx;/*初始化數(shù)組a中元素的計(jì)數(shù)器*/ intsearchKey;/*需要在數(shù)組a中查找的數(shù)值*/ intelement;/*與searchKey相等的元素的下標(biāo)或-1*/ /*創(chuàng)建數(shù)據(jù)*/ for(x=0;x<=SIZE-1;x++) a[x]=2*x; printf("請輸入要查找的數(shù)值:\n"); scanf("%d",&searchKey); /*在數(shù)組中查找searchKey*/ element=linearSearch(a,searchKey,SIZE); /*輸出結(jié)果*/ if(element!=-1) printf("下標(biāo)為%d的元素匹配關(guān)鍵字\n",element); else printf("沒有找到匹配值\n"); return0;}intlinearSearch(inta[],intkey,intsize){ inti;/*計(jì)數(shù)器*/ /*遍歷數(shù)組*/ for(i=0;i<=size-1;++i) { if(a[i]==key) returni; } return-1;}【例6.11】在一個(gè)已經(jīng)按從小到大排好序的整型數(shù)組中使用折半查找法查找是否包含特定值。折半查找的算法思想是將數(shù)列按有序化(遞增或遞減)排列,查找過程中采用跳躍式方式查找,即先以有序數(shù)列的中點(diǎn)位置為比較對象,如果要找的元素值小于該中點(diǎn)元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查找區(qū)間縮小一半。折半查找是一種高效的查找方法,它可以明顯減少比較次數(shù),提高查找效率,但是,折半查找的先決條件是查找表中的數(shù)據(jù)元素必須有序。折半查找的算法描述如下:(1)首先確定整個(gè)查找區(qū)間的中間位置mid=(left+right)/2(2)用待查關(guān)鍵字值與中間位置的關(guān)鍵字值進(jìn)行比較;若相等,則查找成功;若大于,則在后(右)半個(gè)區(qū)域繼續(xù)進(jìn)行折半查找;若小于,則在前(左)半個(gè)區(qū)域繼續(xù)進(jìn)行折半查找。(3)對確定的縮小區(qū)域再按折半公式,重復(fù)上述步驟。最后,得到結(jié)果:要么查找成功,要么查找失敗。程序6.10順序查找#include<stdio.h>#defineSIZE15/*函數(shù)原型*/intbinarySearch(inta[],intsearchKey,intlow,inthigh);intmain(void){ inta[SIZE];/*創(chuàng)建數(shù)組a*/ inti;/*初始化數(shù)組a中元素的計(jì)數(shù)器*/ intkey;/*要在數(shù)組a中查找的數(shù)值*/ intresult;/*已經(jīng)找到的數(shù)值的下標(biāo)或-1*/ /*創(chuàng)建數(shù)據(jù)*/ for(i=0;i<=SIZE-1;++i) a[i]=2*i; printf("請輸入需要查詢的數(shù)字\n"); scanf("%d",&key); /*在數(shù)組中查找*/ result=binarySearch(a,key,0,SIZE-1); /*輸出結(jié)果*/ if(result!=-1) printf("%d在數(shù)組中的下標(biāo)是%d\n",key,result); else printf("%d不在數(shù)組中\(zhòng)n",key); return0;}/*函數(shù)binarySearch對數(shù)組進(jìn)行折半查找*/intbinarySearch(inta[],intsearchKey,intlow,inthigh){ intmiddle;/*存儲(chǔ)數(shù)組中間元素的變量*

while(low<=high) { middle=(high+low)/2; if(a[middle]==searchKey) returnmiddle; if(a[middle]<searchKey) low=middle+1; if(a[middle]>searchKey) high=middle-1; } return-1;}關(guān)于數(shù)組,以下說法正確的是:對數(shù)組進(jìn)行初始化時(shí),只能通過初值表對數(shù)組元素賦初值在定義數(shù)組時(shí),數(shù)組長度不可以省略可以通過給指定下標(biāo)的數(shù)組元素進(jìn)行初始化將數(shù)組長度用變量表示即可實(shí)現(xiàn)變長數(shù)組ABCD提交單選題10分若有定義:inta[5]={1,3,5,7,9};則語句a[2]=a[1]+a[2+2]-a[4-1];運(yùn)行后a[2]的值為(

)。6537ABCD提交單選題10分二維數(shù)組6.26.2.1二維數(shù)組的定義、初始化和使用C數(shù)組可以有多個(gè)下標(biāo)。有多個(gè)下標(biāo)的數(shù)組稱為多維數(shù)組。例如inta[2][4]intb[3][5]intc[3][4][5]ANSI標(biāo)準(zhǔn)聲明,ANSIC系統(tǒng)必須能夠支持至少12個(gè)數(shù)組下標(biāo)。通常,只會(huì)用到2維數(shù)組。inta[3][4]Row0Row1Row2Column0Column1Column2Column3a[0][0]a[1][0]a[2][0]a[0][1]a[1][1]a[2][1]a[0][2]a[1][2]a[2][2]a[0][3]a[1][3]a[2][3]RowsubscriptArraynameColumnsubscript二維數(shù)組初始化intb[

2

][

2

]

=

{

{

1,

2

},

{

3,

4

}

};

初始值用大括號按行分組如果給定的行沒有足夠的初始值,則那行剩余的元素被初始化為0intb[

2

][

2

]

=

{

{

1

},

{

3,

4

}

};

數(shù)組元素的引用必須指明行號、列號。printf(

"%d",

b[

0

][

1

]

);問題:輸出一個(gè)二維數(shù)組所有元素。#include<stdio.h>intmain(void){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};for(inti=0;i<3;i++){for(intj=0;j<4;j++){printf("%3d",a[i][j]);}printf("\n");}return0;}問題:已知兩個(gè)3×3的矩陣,求這兩個(gè)矩陣的和。

#include<stdio.h>intmain(void){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};ints=0;for(inti=0;i<3;i++){for(intj=0;j<4;j++){printf("%d\t",a[i][j]);s+=a[i][j];}printf("\n");}printf("Thesumofthearrayis%d\n",s);return0;}問題:矩陣轉(zhuǎn)置:從鍵盤輸入一個(gè)3行4列的矩陣,把它轉(zhuǎn)置為一個(gè)4行3列的矩陣并輸出。#include<stdio.h>intmain(void){inta[3][4],b[4][3];/*讀入一個(gè)3行4列的二維數(shù)組*/for(inti=0;i<3;i++){for(intj=0;j<4;j++){scanf("%d",&a[i][j]);}}/*輸出原數(shù)組*/printf("原矩陣:\n");for(inti=0;i<3;i++){for(intj=0;j<4;j++){printf("%d\t",a[i][j]);}printf("\n");}/*矩陣轉(zhuǎn)置*/for(inti=0;i<3;i++){for(intj=0;j<4;j++){b[j][i]=a[i][j];}}/*輸出轉(zhuǎn)置矩陣*/printf("轉(zhuǎn)置矩陣:\n");for(inti=0;i<4;i++){for(intj=0;j<3;j++){printf("%d\t",b[i][j]);}printf("\n");}return0;}6.2.3二維數(shù)組本質(zhì)上是一維數(shù)組的數(shù)組二維數(shù)組本質(zhì)上是一維數(shù)組的數(shù)組,而一維數(shù)組的名稱就是數(shù)組在內(nèi)存中的位置。例如,數(shù)組inta[3][4]這個(gè)二維數(shù)組本質(zhì)上是由a[0]、a[1]和a[2]這3個(gè)一維數(shù)組組成。a[0]、a[1]和a[2]均是含4個(gè)整型元素的一維數(shù)組。若有語句inta[][3]={1,2,3,4,5,6,7};,則a數(shù)組高維的大小是(

)。234無確定值A(chǔ)BCD提交單選題10分按如下方式定義二維數(shù)組并初始化:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};則元素a[1][3]和a[2][1]的值分別為(

)。3553810116ABCD提交單選題10分以下程序的輸出結(jié)果是(

)。intmain(void){intaa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};inti,s=0;for(i=0;i<4;i++)s+=aa[i][1];printf("%d\n",s);return0;}11191320ABCD提交單選題10分字符串6.36.3.1字符數(shù)組和字符串用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個(gè)元素存放一個(gè)字符。字符數(shù)組的使用與本書前面介紹的整型數(shù)組或浮點(diǎn)型數(shù)組完全相同。例如inta[3]表示定義一個(gè)含3個(gè)整型元素的整型數(shù)組,同理,charb[5]表示定義一個(gè)含5個(gè)字符型元素的字符數(shù)組。字符數(shù)組可以用與整型數(shù)組相同的方式初始化。例如,charc[5]={‘a(chǎn)’,‘b’,‘c’,‘d’,‘e’}表示定義一個(gè)含5個(gè)元素的字符型數(shù)組,它在內(nèi)存中的存儲(chǔ)如下:字符數(shù)組和字符串字符數(shù)組還可以用一種更簡潔的方式初始化。比如chars[]={“abcde”}或chars[]=“abcde”。此時(shí)需要注意,在雙引號(“”)之間的一串字符稱為字符串常量。字符串常量擁有一個(gè)隱藏的結(jié)束符’\0’。也就是說,字符串常量“abcde”實(shí)際上由6個(gè)字符’a’、’b’、’c’、’d’、’e’、’\0’組成?!痋0’是一個(gè)轉(zhuǎn)義字符,它的ASCII碼為0,專門用來表示一個(gè)字符串的結(jié)束,稱為字符串結(jié)束符。因此,上例中的字符數(shù)組s在內(nèi)存中實(shí)際存儲(chǔ)如下:字符數(shù)組和字符串字符串(string),是由零個(gè)或多個(gè)字符組成的有限串行。字符串是實(shí)際應(yīng)用中非常重要的一種數(shù)據(jù)類型。在某些語言如VB、Java和C++中,有單獨(dú)的字符串類型。而在C語言中,沒有單獨(dú)的字符串類型,字符串常量是包含在雙引號之間的一系列字符,例如“abc”“a”“Iamastudent”等;而字符串常量則直接存儲(chǔ)到字符數(shù)組中,例如chars[]=“Hello”表示定義一個(gè)含6個(gè)元素的字符型數(shù)組,并將字符串“Hello”存儲(chǔ)在該字符數(shù)組中。需要說明的是,字符數(shù)組并不要求它的最后一個(gè)元素為‘\0’,甚至可以不包含‘\0’,以下這種寫法是完全合法的:Charc[5]={‘a(chǎn)’,‘b’,‘c’,‘d’,‘e’};假定char類型變量占用1個(gè)字節(jié),且數(shù)組定義如下,則數(shù)組str在內(nèi)存中所占字節(jié)數(shù)是(

)。charstr[81];0108081ABCD提交單選題10分按如下方式定義字符數(shù)組并初始化:chars1[

]=“Hello!”;chars2[10]

=“Hello!”;則數(shù)組s1和s2所占用的存儲(chǔ)空間分別為(

)。6661077710ABCD提交單選題10分6.3.2字符串的輸入和輸出在C語言中,字符串是以‘\0’結(jié)束的一串字符,它通常存儲(chǔ)在字符數(shù)組中,因此,所有我們以前學(xué)習(xí)過的對數(shù)組的處理方式都可以用來處理字符串。相對于普通數(shù)組,字符串最大的特點(diǎn)就是它有結(jié)束符‘\0’,因此,C語言中對字符串有一些特殊的處理。在C語言中,提供了字符串的格式控制符%s。我們可以利用這個(gè)格式控制符在scanf和printf函數(shù)中直接輸入和輸出字符串?!纠?.15】字符串的輸入和輸出#include<stdio.h>intmain(void){ chars[10]; printf("請輸入一個(gè)字符串\n"); scanf("%s",s); printf("字符串輸出到屏幕\n"); printf("%s\n",s); return0;}以下不正確的賦值或賦初值的方式是(

)。charstr[]="string";charstr[7]={'s','t','r','i','n','g'};charstr[10];str="string";charstr[7]={'s','t','r','i','n','g',’\0’};ABCD提交單選題10分下述對C語言字符數(shù)組的描述中錯(cuò)誤的是(

)。字符數(shù)組可以存放字符串字符數(shù)組中的字符串可以整體輸入、輸出可以在賦值語句中通過賦值運(yùn)算符"="對字符數(shù)組整體賦值不可以用關(guān)系運(yùn)算符對字符數(shù)組中的字符串進(jìn)行比較ABCD提交單選題10分6.3.3字符串處理【例6.16】從鍵盤輸入一個(gè)字符串,求該字符串的長度。字符串的長度,指字符串中除’\0’之外的字符個(gè)數(shù),#include<stdio.h>intmain(void){ chars[30]; intcounter=0; printf("請輸入一個(gè)字符串\n"); gets(s); while(s[counter]!='\0') { counter++; } printf("該字符串的長度是:\t"); printf("%d\n",counter); return0;}【例6.17】編寫一個(gè)程序,將存儲(chǔ)在字符數(shù)組s2中的字符串復(fù)制到字符數(shù)組s1中。#include<stdio.h>intmain(void){ chars1[20],s2[20]="Iamastudent"; inti=0; while(s2[i]!='\0') { s1[i]=s2[i]; i++; } s1[i]='\0'; printf("s1:\t%s\n",s1); printf("s2:\t%s\n",s2); return0;}假設(shè)scanf語句執(zhí)行時(shí)輸入ABCDE<回車>,能使puts(s)語句正確輸出ABCDE字符串的程序段是(

)。chars[5]={"ABCDE"};puts(s);chars[5]={'A','B','C','D','E'};puts(s);char*s;scanf("%s",s);puts(s);char*s;s="ABCDE";puts(s);ABCD提交單選題10分6.3.4字符串處理的庫函數(shù)在C語言中,并沒有定義字符串這種類型,字符串是存放在字符數(shù)組中的。為了使用方便,在C語言函數(shù)庫中,提供了一些專門處理字符串的函數(shù),下面介紹常用的幾個(gè)函數(shù)。(1)求字符串長度(strlen)(2)字符串復(fù)制(strcpy)(3)字符串連接(strcat)(4)字符串比較(strcmp)(1)求字符串長度(strlen)函數(shù)strlen的作用是求字符串的長度。字符串的長度是字符串中不包含’\0’的字符個(gè)數(shù),其函數(shù)原型是:size_tstrlen(constchar[]str);其中size_t是C語言標(biāo)準(zhǔn)為了C語言的可移植性而定義的一種數(shù)據(jù)類型,在C99中定義為typedefunsignedintsize_t,它是sizeof運(yùn)算符的返回類型。#include<stdio.h>#include<string.h>intmain(void){intlen;chars[30]="Hellothere";len=strlen(s);printf("Thelengthofstring\"%s\"is%d\n",s,len);return0;}(2)字符串復(fù)制(strcpy)strcpy的函數(shù)原型是:char[]strcpy(char[]strDestination,

constchar[]strSource);其作用是把字符串strSource的所有字符(包括結(jié)束符‘\0’)復(fù)制到字符數(shù)組strDestination中,函數(shù)的返回值是strDestination。#include<string.h>intmain(void){charstr1[20],str2[20];printf("%s:\t","請輸入一個(gè)字符串");gets(str2);strcpy(str1,str2);printf("str1:%s\n",str1);printf("str2:%s\n\n",str2);strcpy(str1,"Helloworld!");printf("str1:%s\n",str1);printf("str2:%s\n",str2);return0;}(3)字符串連接(strcat)strcat的函數(shù)原型是:char[]strcat(char[]strDestination,

constchar[]strSource);其作用是把字符串strSource放到字符串strDestination的后面,函數(shù)返回strDestination。#include<stdio.h>#include<string.h>intmain(void){charstr1[15]="abcdef";charstr2[5]="xyz";charstr3[20];strcpy(str3,strcat(str1,str2));printf("str1:%s\n",str1);printf("str2:%s\n",str2);printf("str3:%s\n",str3);return0;}(4)字符串比較(strcmp)函數(shù)strcmp的作用是比較兩個(gè)字符串的大小,其函數(shù)原型是:intstrcmp(constchar[]string1,constchar[]string2);返回值表示兩個(gè)字符串比較的結(jié)果。字符串比較的規(guī)則是對兩個(gè)字符串自左至右逐個(gè)字符相比較(按ASCII碼值大小比較),直到出現(xiàn)不同的字符或遇到‘\0’為止。如全部字符相同,則認(rèn)為相等;若出現(xiàn)不同的字符,則以第一個(gè)不相同的字符的比較結(jié)果為準(zhǔn),例如“A”<“B”,“a”>“A”,“computer”>“compare”,“these”>“that”,“36+54”<“99”,“CHINA”>“CANADA”,“DOG”<“cat”,“abc”<“ax”,“abcde”>“abcd”。程序6.21strcmp的使用#include<stdio.h>#include<string.h>intmain(void){charstring1[30],string2[30];intresult;printf("請輸入兩個(gè)字符串\n");gets(string1);gets(string2);result=strcmp(string1,string2);if(result==0) printf("\"%s\"等于\"%s\"\n",string1,string2);if(result>0) printf("\"%s\"大于\"%s\"\n",string1,string2);if(result<0) printf("\"%s\"小于\"%s\"\n",string1,string2);return0;}綜合應(yīng)用實(shí)例——篩法求素?cái)?shù)6.4素?cái)?shù)是僅僅能被它本身和1整除的任何整數(shù)。

本實(shí)例要求寫程序求出給定區(qū)間中所有的素?cái)?shù)輸入的第一行是一個(gè)整數(shù)k,表示之后會(huì)有k次查詢。后面的k行中,每行2個(gè)整數(shù)m和n,輸入保證2<=m<=n<=100000。對每一行的m和n,把閉區(qū)間[m,n]之間的所有素?cái)?shù)輸出到一行,每個(gè)數(shù)之間以空格隔開,若區(qū)間內(nèi)沒有素?cái)?shù),輸出None。輸入樣例:6220335151132121126100200輸出樣例:235711131719357111311131719232931None101103107109113127131137139149151157163167173179181191193197199篩法求素?cái)?shù)對于本綜合應(yīng)用實(shí)例,如果繼續(xù)使用之前討論過的判斷素?cái)?shù)的方法,在數(shù)字較大、較多時(shí)會(huì)花費(fèi)大量的時(shí)間,在此介紹一種新的查找素?cái)?shù)的方法——篩法求素?cái)?shù)。首先創(chuàng)建一個(gè)數(shù)組,并將所有元素初始化為1(真),數(shù)組下標(biāo)為素?cái)?shù)的數(shù)組元素將保持為1,而其它數(shù)組元素最終將被設(shè)置為0。從數(shù)組下標(biāo)2開始,在數(shù)組的剩余部分循環(huán)檢測,并將值為1的、下標(biāo)為2的整數(shù)倍的所有元素置0(下標(biāo)4、6、8、10等)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論