![C語言程序設(shè)計(jì)項(xiàng)目化教程課件第7章_第1頁](http://file4.renrendoc.com/view10/M01/23/3A/wKhkGWWAJBmAaHlrAAKq_AJyhAA112.jpg)
![C語言程序設(shè)計(jì)項(xiàng)目化教程課件第7章_第2頁](http://file4.renrendoc.com/view10/M01/23/3A/wKhkGWWAJBmAaHlrAAKq_AJyhAA1122.jpg)
![C語言程序設(shè)計(jì)項(xiàng)目化教程課件第7章_第3頁](http://file4.renrendoc.com/view10/M01/23/3A/wKhkGWWAJBmAaHlrAAKq_AJyhAA1123.jpg)
![C語言程序設(shè)計(jì)項(xiàng)目化教程課件第7章_第4頁](http://file4.renrendoc.com/view10/M01/23/3A/wKhkGWWAJBmAaHlrAAKq_AJyhAA1124.jpg)
![C語言程序設(shè)計(jì)項(xiàng)目化教程課件第7章_第5頁](http://file4.renrendoc.com/view10/M01/23/3A/wKhkGWWAJBmAaHlrAAKq_AJyhAA1125.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章項(xiàng)目中數(shù)組的應(yīng)用在前面的章節(jié)中,我們學(xué)習(xí)了C語言的基本數(shù)據(jù)類型(整型、實(shí)型、字符型),通過這些數(shù)據(jù)類型可以描述和處理一些簡(jiǎn)單的問題。但是在實(shí)際問題中往往需要面對(duì)成批的數(shù)據(jù),如果仍用基本數(shù)據(jù)類型來進(jìn)行處理,就很不方便,甚至是不可能的。例如,一個(gè)班有50名學(xué)生,要求按某門課程成績(jī)排名。如果利用前面學(xué)習(xí)的變量類型表示學(xué)生成績(jī),需設(shè)置50個(gè)簡(jiǎn)單變量來表示學(xué)生成績(jī),而且各變量之間相互獨(dú)立,在設(shè)計(jì)程序時(shí)很難對(duì)這組數(shù)據(jù)進(jìn)行統(tǒng)一處理。而如果使用數(shù)組來存放50名學(xué)生的成績(jī),就可以利用循環(huán)很方便地處理這個(gè)問題。
數(shù)組是指一組數(shù)目固定、數(shù)據(jù)類型相同的若干元素的有序集合,使用統(tǒng)一的數(shù)組名和不同的下標(biāo)來惟一表示數(shù)組中的每一個(gè)元素。在許多場(chǎng)合,使用數(shù)組可以縮短和簡(jiǎn)化程序,因?yàn)榭梢岳孟聵?biāo)值設(shè)計(jì)循環(huán),高效地處理各種情況。本章將結(jié)合項(xiàng)目中學(xué)生成績(jī)統(tǒng)計(jì)和密碼驗(yàn)證的實(shí)現(xiàn),介紹一維數(shù)組、字符數(shù)組和二維數(shù)組的概念、定義和使用方法。學(xué)習(xí)目標(biāo):理解和掌握一維數(shù)組的概念、定義、存儲(chǔ)與初始化;理解和掌握數(shù)組元素和數(shù)組名作函數(shù)參數(shù)時(shí)的區(qū)別與聯(lián)系;理解和掌握字符數(shù)組的概念、定義、初始化及輸入輸出方法;掌握常用的字符串處理函數(shù);理解和掌握二維數(shù)組的概念、定義與存儲(chǔ)。7.1任務(wù)二用一維數(shù)組實(shí)現(xiàn)項(xiàng)目中學(xué)生成績(jī)的統(tǒng)計(jì)一、任務(wù)描述在§6.1節(jié)任務(wù)一中,除顯示主菜單函數(shù)MainMenu()外,其他函數(shù)均用一條輸出語句來實(shí)現(xiàn)。該任務(wù)要求用一維數(shù)組實(shí)現(xiàn)各函數(shù),包括輸入學(xué)生成績(jī)函數(shù)InputScore()、顯示學(xué)生成績(jī)函數(shù)DisplayScore()、統(tǒng)計(jì)總分和平均分函數(shù)SumAvgScore()、統(tǒng)計(jì)最高分和最低分函數(shù)MaxMinScore()、統(tǒng)計(jì)各分?jǐn)?shù)段人數(shù)函數(shù)GradeScore()。二、任務(wù)涉及知識(shí)要點(diǎn)
該任務(wù)涉及到的新知識(shí)點(diǎn)主要有一維數(shù)組,其具體內(nèi)容將在§7.2節(jié)的理論知識(shí)中進(jìn)行詳細(xì)介紹。三、任務(wù)分析
要實(shí)現(xiàn)學(xué)生成績(jī)的統(tǒng)計(jì),首先要考慮的一個(gè)問題就是學(xué)生成績(jī)的存儲(chǔ)。該任務(wù)用一個(gè)整型數(shù)組stu_score[]來存儲(chǔ)學(xué)生成績(jī),并在程序的開始設(shè)置了一個(gè)符號(hào)常量MAXSTU,它用于定義數(shù)組的最大長(zhǎng)度,即最多學(xué)生人數(shù)。假設(shè)學(xué)生不超過30人,則MAXSTU代表30。
在學(xué)生成績(jī)統(tǒng)計(jì)項(xiàng)目中,除密碼驗(yàn)證函數(shù)PassWord()和主菜單顯示函數(shù)MainMenu()外,其他函數(shù)均用到數(shù)組stu_score[]。有兩種方法實(shí)現(xiàn)該數(shù)組的訪問,一種方法是將該數(shù)組定義為全局變量,每個(gè)函數(shù)均可直接訪問數(shù)組。另一種方法是將該數(shù)組定義為局部變量,利用實(shí)參和形參的數(shù)據(jù)傳遞,實(shí)現(xiàn)對(duì)學(xué)生成績(jī)數(shù)據(jù)的訪問。若采用第一種方法,函數(shù)之間的聯(lián)系增大,數(shù)據(jù)的安全性很難保證。
因此,該任務(wù)采用第二種方法,在主函數(shù)中將整型數(shù)組stu_score[]定義為一個(gè)局部變量,數(shù)組元素的下標(biāo)對(duì)應(yīng)學(xué)生的學(xué)號(hào);再定義一個(gè)局部變量stu_count,存放學(xué)生的實(shí)際人數(shù)(即數(shù)組的實(shí)際長(zhǎng)度)。在進(jìn)行函數(shù)調(diào)用時(shí),將數(shù)組stu_score[]和數(shù)組實(shí)際長(zhǎng)度stu_count作為實(shí)參,傳遞給其他函數(shù)的形參,從而實(shí)現(xiàn)對(duì)學(xué)生成績(jī)數(shù)據(jù)的訪問。四、任務(wù)實(shí)現(xiàn)各函數(shù)的定義分別為:(1)輸入學(xué)生成績(jī)函數(shù)intInputScore(intscore[]){ inti; printf("\n\t\t請(qǐng)輸入學(xué)生成績(jī)(輸入-1退出)\n"); for(i=0;i<MAXSTU;i++) { printf("\t\t第%d個(gè)學(xué)生的成績(jī):",i+1); scanf("%d",&score[i]); if(score[i]==-1) break; } return(i);//返回實(shí)際學(xué)生人數(shù)}(2)顯示學(xué)生成績(jī)函數(shù)voidDisplayScore(intscore[],intn){ inti; printf("\n\t\t學(xué)生成績(jī)顯示如下:"); printf("\n\t\t學(xué)生序號(hào)成績(jī)"); for(i=0;i<n;i++) printf("\n\t\t%d%d",i+1,score[i]); return;}(3)統(tǒng)計(jì)課程總分和平均分函數(shù)voidSumAvgScore(intscore[],intn){ inti,sum=0; floataverage=0; for(i=0;i<n;i++) sum=sum+score[i]; average=(float)sum/n; printf("\n\t\t課程的總分為%d,平均分為%.2f\n",sum,average); return;}(4)統(tǒng)計(jì)課程最高分和最低分函數(shù)voidMaxMinScore(intscore[],intn){ inti,max=0,min=0; max=score[0]; min=score[0]; for(i=1;i<n;i++) { if(score[i]>max) max=score[i]; if(score[i]<min) min=score[i]; } printf("\n\t\t課程的最高分為%d,最低分為%d\n",max,min);return;}(5)統(tǒng)計(jì)課程各分?jǐn)?shù)段人數(shù)函數(shù)voidGradeScore(intscore[],intn){ inti; int grade90_100=0;//等級(jí)為"優(yōu)"的人數(shù)
intgrade80_90=0;//等級(jí)為"良"的人數(shù)
intgrade70_80=0;//等級(jí)為"中"的人數(shù)
intgrade60_70=0;//等級(jí)為"及格"的人數(shù)
intgrade0_59=0;//等級(jí)為"不及格"的人數(shù)
for(i=0;i<n;i++) { switch(score[i]/10){ case10: case9:grade90_100++;break; case8:grade80_90++;break; case7:grade70_80++;break; case6:grade60_70++;break; default:grade0_59++;break; }} printf("\n\t\t等級(jí)為優(yōu)的人數(shù)為:%d",grade90_100); printf("\n\t\t等級(jí)為良的人數(shù)為:%d",grade80_90);printf("\n\t\t等級(jí)為中的人數(shù)為:%d",grade70_80); printf("\n\t\t等級(jí)為及格的人數(shù)為:%d",grade60_70);printf("\n\t\t等級(jí)為不及格的人數(shù)為:%d",grade0_59); return;}程序說明:(1)為了節(jié)省篇幅,在此只給出每個(gè)函數(shù)的定義,其在主函數(shù)main()中的調(diào)用,請(qǐng)參見§6.1節(jié)任務(wù)一中的任務(wù)實(shí)現(xiàn),在此不再重復(fù)。(2)在調(diào)用每個(gè)函數(shù)時(shí),需要將數(shù)組名stu_score[]作為實(shí)參,數(shù)組名即數(shù)組的首地址,實(shí)參向形參傳遞的是一個(gè)地址,這是一種傳址調(diào)用。如果采用這種方式進(jìn)行函數(shù)調(diào)用,實(shí)參數(shù)組stu_score[]將和形參數(shù)組score[]共用一組連續(xù)的存儲(chǔ)單元,函數(shù)調(diào)用結(jié)束返回主函數(shù)時(shí),形參數(shù)組score[]的值就會(huì)保留在實(shí)參數(shù)組stu_score[]中。關(guān)于數(shù)組名作函數(shù)參數(shù)的具體用法,將在§7.2節(jié)的理論知識(shí)中進(jìn)行詳細(xì)介紹。(3)考慮到知識(shí)點(diǎn)的完整性,項(xiàng)目中的密碼驗(yàn)證函數(shù)PassWord()將在學(xué)習(xí)字符數(shù)組時(shí)再進(jìn)行完善。(4)該任務(wù)中的每個(gè)函數(shù)還可以用指針來實(shí)現(xiàn),具體內(nèi)容將在第8章進(jìn)行詳細(xì)介紹。五、要點(diǎn)總結(jié)訪問數(shù)組元素時(shí),如果下標(biāo)的取值超出該數(shù)組定義的長(zhǎng)度范圍,稱為下標(biāo)越界,屬于非法訪問。需要特別注意的是,C語言把下標(biāo)越界檢查的任務(wù)交給程序員,希望程序員在編程時(shí)嚴(yán)格把關(guān),而系統(tǒng)不做任何檢查。因此,使用數(shù)組編寫程序時(shí),應(yīng)避免數(shù)組下標(biāo)越界。7.2理論知識(shí)一維數(shù)組
一維數(shù)組用一維順序結(jié)構(gòu)關(guān)系將一組具有相同數(shù)據(jù)類型的數(shù)據(jù)元素組織起來,在內(nèi)存中占有連續(xù)的存儲(chǔ)空間。一維數(shù)組的定義一維數(shù)組定義的一般形式為:
類型說明符數(shù)組名[常量表達(dá)式];
例如:inta[5];//定義一個(gè)整型數(shù)組a[],共有5個(gè)元素說明:(1)“類型說明符”可以是任意一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型。(2)“數(shù)組名”是一個(gè)標(biāo)識(shí)符,其命名規(guī)則符合標(biāo)識(shí)符的規(guī)定。(3)“常量表達(dá)式”要用方括號(hào)括起來,不能使用圓括號(hào)或花括號(hào)。(4)“常量表達(dá)式”表示數(shù)組元素的個(gè)數(shù),即數(shù)組長(zhǎng)度。可以包括常量和符號(hào)常量,但不能包含變量。如:
intn;scanf("%d",&n);inta[n];
數(shù)組定義語句中,數(shù)組a[]的長(zhǎng)度依賴于程序運(yùn)行過程中變量n的值,這種定義數(shù)組的方式是錯(cuò)誤的。(5)允許在同一個(gè)類型說明中,說明多個(gè)數(shù)組和多個(gè)變量,它們之間用逗號(hào)分開。如:
inta[10],m[5],y;一維數(shù)組元素的引用
C語言規(guī)定,對(duì)于數(shù)值型數(shù)組,只能逐個(gè)引用數(shù)組元素,而不能一次引用整個(gè)數(shù)組。數(shù)組元素的引用形式為:
數(shù)組名[下標(biāo)表達(dá)式]說明:(1)“下標(biāo)表達(dá)式”表示數(shù)組元素在數(shù)組中的位置,可以是整型常量、整型變量或整型表達(dá)式,其值均為非負(fù)整數(shù)。(2)C語言規(guī)定,數(shù)組元素下標(biāo)從0開始,最大下標(biāo)為數(shù)組長(zhǎng)度減1。例如,num[5]表示數(shù)組有5個(gè)元素,下標(biāo)從0開始,5個(gè)元素分別為num[0],num[1],num[2],num[3],num[4]。注意不能使用num[5],因其下標(biāo)已越界,即超出了最大下標(biāo)取值【例7.1】數(shù)組元素引用舉例。#include<stdio.h>main(){ inti,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=9;i>=0;i--) printf("%2d",a[i]);}一維數(shù)組賦初值
一維數(shù)組賦初值可以在定義數(shù)組時(shí)進(jìn)行,即在編譯階段進(jìn)行,也可以在運(yùn)行期間,用賦值語句或輸入語句使數(shù)組元素得到初值。1.在定義數(shù)組時(shí)賦初值(1)對(duì)全部數(shù)組元素賦初值。例如:inta[6]={1,2,3,4,5,6};其中,數(shù)組元素的個(gè)數(shù)和花括號(hào)中初值的個(gè)數(shù)相同,并且花括號(hào)中的初值從左到右依次賦給每個(gè)數(shù)組元素,即a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=6。對(duì)全部數(shù)組元素賦初值時(shí),可以省略數(shù)組長(zhǎng)度。例如:inta[]={10,20,30,40,50};(2)對(duì)部分?jǐn)?shù)組元素賦初值。例如:inta[10]={0,1,2,3,4};此語句定義數(shù)組a[]有10個(gè)元素,但花括號(hào)中只提供了5個(gè)初值,表示只給前5個(gè)數(shù)組元素a[0]~a[4]賦初值,后面5個(gè)元素a[5]~a[9]系統(tǒng)自動(dòng)賦0。2.用賦值語句或輸入語句賦初值在程序執(zhí)行過程中,用賦值語句或輸入語句給數(shù)組元素賦初值的方法稱為動(dòng)態(tài)賦值。如:
inti,a[10];for(i=0;i<10;i++) a[i]=i;//用賦值語句給數(shù)組元素賦值或
inti,a[10];for(i=0;i<10;i++) scanf("%d",&a[i]);//用輸入語句給數(shù)組元素賦值C語言除了在定義數(shù)組時(shí)可以為數(shù)組整體賦值之外,不能在其他情況下對(duì)數(shù)組整體賦值。下面的用法是錯(cuò)誤的。for(i=0;i<10;i++) scanf("%d",a);【例7.2】用冒泡法對(duì)10個(gè)數(shù)按從小到大的順序排序
冒泡法排序的基本思路(以升序?yàn)槔菏紫缺容^序列中第一個(gè)數(shù)與第二個(gè)數(shù),若為逆序,則交換兩數(shù),然后比較第二,第三個(gè)數(shù),依次進(jìn)行下去,直到對(duì)最后兩個(gè)數(shù)進(jìn)行了比較和交換。這是第一趟排序過程,結(jié)果把最大數(shù)交換到最后位置。最后一個(gè)數(shù)不再參加排序。然后在剩余數(shù)組成的序列中進(jìn)行第二趟排序,第二趟排序結(jié)束后,就可將次大數(shù)移至倒數(shù)第二的位置上,如此繼續(xù),直到排序結(jié)束。在整個(gè)排序過程中,較大的數(shù)逐漸從前向后移動(dòng),其過程類似水中氣泡上浮,故稱冒泡法#include<stdio.h>main(){ inta[10]; inti,j,t; printf("請(qǐng)輸入10個(gè)整數(shù):"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=1;i<10;i++)//外循環(huán),控制比較趟數(shù)
for(j=1;j<=10-i;j++)//內(nèi)循環(huán),控制每趟比較次數(shù)
if(a[j-1]>a[j])//相鄰兩數(shù)比較和交換
{ t=a[j-1]; a[j-1]=a[j]; a[j]=t; } printf("排序后結(jié)果:"); for(i=0;i<10;i++) printf("%3d",a[i]);}
因?yàn)镃語言數(shù)組的下標(biāo)從0開始,所以為了便于數(shù)組元素的下標(biāo)表示,該例中灰色部分的程序段也可寫成以下形式:
for(i=1;i<10;i++) for(j=0;j<10-i;j++) if(a[j]>a[j+1]) { t=a[j];a[j]=a[j+1];a[j+1]=t;}一維數(shù)組作函數(shù)參數(shù)
一、數(shù)組元素作函數(shù)參數(shù)【例7.3】一個(gè)數(shù)組中有三個(gè)元素,求它們的和。#include<stdio.h>intfun(inta,intb,intc){ intt; t=a+b+c; return(t);}main(){ inta[3]; inti,sum; for(i=0;i<3;i++) scanf("%d",&a[i]); sum=fun(a[0],a[1],a[2]); printf("sum=%d\n",sum);}二、數(shù)組名作函數(shù)參數(shù)在C程序中,經(jīng)常需要把數(shù)組的全部元素傳遞到另一函數(shù)中處理。當(dāng)數(shù)組元素較多時(shí),如果仍采用傳值方式,把數(shù)組的每個(gè)元素作為一個(gè)參數(shù)傳遞到另一函數(shù)中,必然要使用大量的參數(shù)。此時(shí),若采用數(shù)組名作函數(shù)參數(shù),可以很好地解決數(shù)組中大量數(shù)據(jù)在函數(shù)間的傳遞問題?!纠?.4】一個(gè)數(shù)組中有10個(gè)元素,求它們的累加和。#include<stdio.h>intfun(intb[10]){ inti,t=0; for(i=0;i<10;i++) t=t+b[i]; return(t);}main(){ inta[10]={3,4,2,1,5,7,8,3,2,9}; inti,sum; sum=fun(a);//調(diào)用fun()函數(shù)
printf("sum=%d\n",sum);}
該例中,主函數(shù)main()調(diào)用fun()函數(shù)時(shí),用數(shù)組名a作為函數(shù)實(shí)參,不是把數(shù)組a[]的值傳遞給形參數(shù)組b[],而是把實(shí)參數(shù)組a[]的首地址傳送給形參數(shù)組b[],這樣a[]和b[]兩個(gè)數(shù)組就共占同一段內(nèi)存單元。在fun()函數(shù)中,表面上是對(duì)形參數(shù)組b[]中的元素求和,實(shí)際上也是對(duì)實(shí)參數(shù)組a[]中的元素求和。兩個(gè)數(shù)組共占存儲(chǔ)單元的示意圖如圖7-3所示。該例中的fun()函數(shù)還可改為以下形式:#include<stdio.h>intfun(intb[],intn){ inti,t=0; for(i=0;i<n;i++) t=t+b[i]; return(t);}
即定義fun()函數(shù)時(shí),不限定形參數(shù)組b[]的元素個(gè)數(shù),有關(guān)元素個(gè)數(shù)的信息通過形參表中另一個(gè)參數(shù)n傳遞。這樣做的好處是數(shù)組的長(zhǎng)度可變,可以對(duì)任意大小的數(shù)組求和,提高了函數(shù)的通用性。如該例中,如果將函數(shù)調(diào)用語句“fun(a,10);”改為“fun(a,5);”,則只對(duì)數(shù)組a的前5個(gè)元素求和?!纠?.5】分析以下程序的運(yùn)行結(jié)果。#include<stdio.h>voidfun(intb[],intn){ inti,t; for(i=0;i<n/2;i++) { t=b[i]; b[i]=b[n-i-1]; b[n-i-1]=t; }}main(){ inta[10]={1,2,3,4,5,6,7,8,9,10}; inti; for(i=0;i<10;i++) printf("%3d",a[i]); printf("\n"); fun(a,10); for(i=0;i<10;i++) printf("%3d",a[i]);}
該例中,fun()函數(shù)的功能是逆序數(shù)組b[]中的所有元素。在調(diào)用fun()函數(shù)時(shí),形參數(shù)組b[]和實(shí)參數(shù)組a[]共占同一段內(nèi)存單元,當(dāng)fun()函數(shù)中數(shù)組b[]發(fā)生改變時(shí),實(shí)參數(shù)組a[]也隨之發(fā)生變化用數(shù)組來處理Fibonicci數(shù)列的前20項(xiàng)。
F1=1n=1
F2=1n=2
Fn=Fn-1+Fn-2n≥3
main(){inti;
staticintf[20]={1,1};/*f1、f2已知*/
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
for(i=0;i<20;i++)
{
if(i%5==0)printf("\n");
printf("%12d",f[i]);
}}7.3任務(wù)三用字符數(shù)組實(shí)現(xiàn)項(xiàng)目中的密碼驗(yàn)證
程序說明:(1)為了降低難度,在此只給出字符數(shù)組下標(biāo)的越界檢查,沒有考慮錯(cuò)誤輸入的刪除,有關(guān)錯(cuò)誤輸入刪除的實(shí)現(xiàn),請(qǐng)參見附錄Ⅴ中的學(xué)生信息管理系統(tǒng)源程序代碼。(2)需要注意,在判斷輸入密碼和初始密碼是否相等時(shí),不能將判斷條件strcmp(pwd,"123456")==0,寫成pwd[20]=="123456"或pwd=="123456"或pwd="123456"的形式。(3)該例中密碼的長(zhǎng)度限制為20個(gè)字符,由于字符串要有結(jié)束標(biāo)志'\0',故數(shù)組pwd[]定義的長(zhǎng)度為21。(4)當(dāng)使用strcmp()函數(shù)時(shí),要在程序的開頭加上預(yù)處理命令“#include<string.h>”。7.4理論知識(shí)字符數(shù)組
一、字符數(shù)組的定義字符數(shù)組的定義與一般數(shù)組相同。一維字符數(shù)組定義的一般形式為:
char數(shù)組名[常量表達(dá)式]
二維字符數(shù)組定義的一般形式為:
char數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]
例如:
charc[5];
定義了一個(gè)一維字符數(shù)組c[],共有5個(gè)字符元素,占用5個(gè)字節(jié)內(nèi)存二、字符數(shù)組的初始化定義字符數(shù)組時(shí),可對(duì)字符數(shù)組的元素進(jìn)行初始化,方法有以下兩種。1.用字符初始化即在花括號(hào)中依次列出各個(gè)字符,字符之間用逗號(hào)隔開。例如:
charc[5]={'C','h','i','n','a'};
則c[0]='C',c[1]='h',c[2]='i',c[3]='n',c[4]='a'。如果花括號(hào)中提供的初值個(gè)數(shù)大于數(shù)組長(zhǎng)度,則作語法錯(cuò)誤處理。如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動(dòng)定為空字符(即'\0')。例如:
charb[5]={'a','b','c','d'};
則b[4]自動(dòng)賦為'\0'。當(dāng)對(duì)全部元素賦初值時(shí)也可省去長(zhǎng)度說明。例如:
chars[]={'s','t','u','d','e','n','t'};
字符數(shù)組s[]的大小由系統(tǒng)根據(jù)初值的個(gè)數(shù)來確定,此處s[]的元素個(gè)數(shù)為7。2.用字符串初始化即用雙引號(hào)括起來的一個(gè)字符串作為字符數(shù)組的初值。例如:
charc[6]={"China"};
可寫成:
charc[6]="China";
或省去字符數(shù)組的長(zhǎng)度,寫成:
charc[]="China";
其初始化效果與第一種方法有所不同,系統(tǒng)會(huì)在字符串常量后自動(dòng)添加一個(gè)字符串結(jié)束符‘\0’。因此,對(duì)字符數(shù)組初始化時(shí),用字符串方式比用字符方式(在字符個(gè)數(shù)相同的情況下)要多占一個(gè)字節(jié)。用字符串方式初始化時(shí),字符數(shù)組c[]在內(nèi)存中的實(shí)際存儲(chǔ)情況如圖7-4所示。三、字符數(shù)組的輸入和輸出字符數(shù)組的輸入和輸出通常有兩種方法,一種是逐個(gè)字符輸入輸出,另一種是整個(gè)字符串輸入輸出。1.逐個(gè)字符輸入輸出
用字符輸入輸出函數(shù)getchar()和putchar(),或用標(biāo)準(zhǔn)輸入輸出函數(shù)scanf()和printf()中的格式符“%c”,結(jié)合循環(huán)實(shí)現(xiàn)逐個(gè)字符輸入輸出。【例7.6】用%c格式逐個(gè)字符輸入輸出。#include<stdio.h>main(){charc[12];inti;printf("Inputstring:");for(i=0;i<12;i++)scanf("%c",&c[i]);//或?qū)懗桑篶[i]=getchar();for(i=0;i<12;i++)printf("%c",c[i]);//或?qū)懗桑簆utchar(b[i]); }程序運(yùn)行結(jié)果:Inputstring:Howareyou!↙Howareyou!2.整個(gè)字符串輸入輸出用scanf()和printf()中的格式符“%s”,實(shí)現(xiàn)整個(gè)字符串的輸入輸出?!纠?.7】使用%s格式輸入輸出整個(gè)字符串。#include<stdio.h>main(){charstr[20];printf("Inputstring:");scanf("%s",str);printf("%s",str);}說明:①用“%s”格式輸入字符串時(shí),系統(tǒng)會(huì)在輸入的有效字符后面自動(dòng)附加一個(gè)'\0'作為字符串結(jié)束標(biāo)志。②在C語言中,數(shù)組名代表該數(shù)組的起始地址。因此,scanf()和printf()函數(shù)用“%s”格式整體輸入輸出字符串時(shí),輸入項(xiàng)和輸出項(xiàng)均用數(shù)組名,并且scanf()函數(shù)中不需要地址運(yùn)算符&。如例7.7中的“scanf("%s",str);”不能寫成“scanf("%s",&str);”。③printf()函數(shù)用“%s”格式輸出一個(gè)字符串時(shí),要求字符數(shù)組一定以'\0'結(jié)尾。若一個(gè)字符數(shù)組中有多個(gè)'\0',則遇到第一個(gè)時(shí)就結(jié)束。要想輸出第一個(gè)'\0'之后的字符,只能用“%c”格式逐個(gè)字符輸出。④用scanf()函數(shù)輸入字符串時(shí),以空格或回車作為字符串的結(jié)束標(biāo)志。如運(yùn)行例7.7時(shí),如果輸入的字符串為:
Howareyou!
則輸出結(jié)果為:How
后面的areyou不能輸入到str中。(2)用gets()和puts()函數(shù)實(shí)現(xiàn)整個(gè)字符串的輸入輸出。①gets()函數(shù)調(diào)用形式:gets(字符數(shù)組名);
功能:從鍵盤輸入一個(gè)字符串到字符數(shù)組中,直到遇到換行符,換行符本身不被接收,它被轉(zhuǎn)換為'\0',并作為字符串的結(jié)束標(biāo)志。用gets()函數(shù)輸入的字符串中可以含有空格。②puts()函數(shù)調(diào)用形式:puts(字符數(shù)組名或字符串常量);
功能:在屏幕上輸出一個(gè)字符串(必須以'\0'作為結(jié)束標(biāo)志)?!纠?.8】使用gets()和puts()函數(shù)輸入輸出整個(gè)字符串。#include<stdio.h>main(){charstr[20];printf("Inputstring:");gets(str);puts(str);}程序運(yùn)行結(jié)果:Inputstring:Howareyou!↙Howareyou!常用的字符串處理函數(shù)1.字符串復(fù)制函數(shù)strcpy()
函數(shù)調(diào)用形式:strcpy(字符數(shù)組1,字符數(shù)組2)功能:將字符數(shù)組2中的內(nèi)容復(fù)制到字符數(shù)組1中(包括結(jié)尾的字符'\0')。
strcpy()函數(shù)的第一個(gè)參數(shù)一般為字符數(shù)組,該字符數(shù)組要有足夠的空間,以確保復(fù)制字符串后不越界;第二個(gè)參數(shù)可以是字符數(shù)組名,也可以是一個(gè)字符串常量。例如:
charstr1[10],str2[]="China";strcpy(str1,str2);注意:不能使用賦值運(yùn)算符“=”復(fù)制字符串。如上例中的“strcpy(str1,str2);”若寫成“str1=str2;”,則是錯(cuò)誤的2.字符串連接函數(shù)strcat()函數(shù)調(diào)用形式:strcat(字符數(shù)組1,字符數(shù)組2)功能:連接兩個(gè)字符數(shù)組中的字符串,去掉字符數(shù)組1中的結(jié)束標(biāo)志'\0',把字符數(shù)組2接到字符數(shù)組1的后面,結(jié)果放在字符數(shù)組1中。例如:
charstr1[30]="Hello";charstr2[]="world";printf("%s",strcat(str1,str2));
輸出結(jié)果如下:
Helloworld注意:字符數(shù)組1應(yīng)有足夠的空間容納兩串合并后的內(nèi)容3.字符串比較函數(shù)strcmp()函數(shù)調(diào)用形式:strcmp(字符數(shù)組1,字符數(shù)組2)功能:將兩個(gè)數(shù)組中的字符串按ASCII碼值,從左至右逐個(gè)字符進(jìn)行比較,直到出現(xiàn)不同的字符或遇到'\0'為止。比較結(jié)果是該函數(shù)的返回值。當(dāng)字符數(shù)組1等于字符數(shù)組2時(shí),返回值為0;當(dāng)字符數(shù)組1大于字符數(shù)組2時(shí),返回值為一個(gè)正整數(shù);當(dāng)字符數(shù)組1小于字符數(shù)組2時(shí),返回值為一個(gè)負(fù)整數(shù)。例如:printf("%d",strcmp("Book","Boat"));4.求字符串長(zhǎng)度函數(shù)strlen()函數(shù)調(diào)用形式:strlen(字符數(shù)組)功能:統(tǒng)計(jì)字符數(shù)組中字符串的長(zhǎng)度(不含字符串結(jié)束標(biāo)志'\0'),并作為函數(shù)返回值。例如:charc[10]="China";printf("%d",strlen(c));輸出結(jié)果為5。5.大寫字母轉(zhuǎn)變?yōu)樾懽帜负瘮?shù)strlwr()函數(shù)調(diào)用形式:strlwr(字符數(shù)組)功能:把字符數(shù)組中的大寫字母變成小寫字母。例如:charstr[]="HELLO";printf("%s",strlwr(str));輸出結(jié)果為:hello6.小寫字母轉(zhuǎn)變?yōu)榇髮懽帜负瘮?shù)strupr()函數(shù)調(diào)用形式:strupr(字符數(shù)組)功能:把字符數(shù)組中的小寫字母變成大寫字母。例如:charstr[]="hello";printf("%s",strlwr(str));輸出結(jié)果為:HELLO7.5知識(shí)擴(kuò)展二維數(shù)組
一、二維數(shù)組的定義二維數(shù)組定義的一般形式如下:
類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]
二維數(shù)組的定義形式和一維數(shù)組基本相同,只不過它的常量表達(dá)式有兩個(gè),第一個(gè)表示二維數(shù)組的行數(shù),第二個(gè)表示二維數(shù)組的列數(shù)。例如:
inta[3][4];
定義了一個(gè)3行4列的二維數(shù)組,數(shù)組名為a,數(shù)組元素的類型為整型,該數(shù)組的元素共有3×4=12個(gè)??梢园補(bǔ)看作是一個(gè)一維數(shù)組,它有三個(gè)元素:a[0],a[1],a[2]。每個(gè)元素又是一個(gè)包含四個(gè)元素的一維數(shù)組,如圖7-5所示
二維數(shù)組的下標(biāo)在兩個(gè)方向上變化,其邏輯結(jié)構(gòu)是二維的。但是,實(shí)際的硬件存儲(chǔ)器卻是連續(xù)編址,也就是說存儲(chǔ)器單元是按一維線性排列的。二、二維數(shù)組的引用二維數(shù)組元素的引用形式為:數(shù)組名[行下標(biāo)表達(dá)式][列下標(biāo)表達(dá)式]
其中,行下標(biāo)的取值范圍是0~行下標(biāo)表達(dá)式減1,列下標(biāo)的取值范圍是0~列下標(biāo)表達(dá)式減1。如:
inta[3][4];
二維數(shù)組a[][]的行下標(biāo)取值范圍是0~2,列下標(biāo)取值范圍是0~3,最小下標(biāo)元素是a[0][0],最大下標(biāo)元素是a[2][3]。a[3][2],a[2*2-1][3],a[3][2+2]均屬對(duì)數(shù)組a[][]的非法引用三、二維數(shù)組賦初值1.在定義數(shù)組時(shí)賦初值(1)分行給二維數(shù)組元素賦初值。例如:
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
即把內(nèi)層每個(gè)花括號(hào)內(nèi)的數(shù)據(jù)分行賦給每一行的元素。(2)全部數(shù)據(jù)寫在一個(gè)花括號(hào)內(nèi),按數(shù)組元素的排列順序?qū)Ω髟刭x初值。例如:
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};(3)對(duì)部分元素賦初值,其余元素自動(dòng)為0。例如:
inta[3][4]={{1},{2},{3}};
它的作用是只對(duì)各行第一列的元素賦初值,其余元素值自動(dòng)為0,故相當(dāng)于:
inta[3][4]={{1,0,0},{2,0,0},{3,0,0}};(4)給全部元素賦初值時(shí),第一維的長(zhǎng)度可以省略,但第二維的長(zhǎng)度不能省略。例如:
inta[][4]={1,2,3,4,5,6,7,8};
系統(tǒng)會(huì)自行判斷,它根據(jù)數(shù)據(jù)的個(gè)數(shù)分配存儲(chǔ)空間,一共8個(gè)數(shù)據(jù),每行4列,可以確定為2行。2.用賦值語句或輸入語句賦初值二維數(shù)組一般通過兩重循環(huán)改變行下標(biāo)和列下標(biāo)來對(duì)數(shù)組元素逐個(gè)訪問。例如:inti,j,a[3][4];for(i=0;i<3;i++)for(j=0;j<4;j++) a[i][j]=i+j;//用賦值語句給數(shù)組元素賦值或者inti,j,a[3][4];for(i=0;i<3;i++)for(j=0;j<4;j++) scanf("%d",&a[i][j]);//用輸入語句給數(shù)組元素賦值二維數(shù)組的應(yīng)用【例7.10】假設(shè)有5個(gè)學(xué)生,每個(gè)學(xué)生有3門課程的考試成績(jī)。分別計(jì)算每門課程的總分和平均分。
可設(shè)一個(gè)二維數(shù)組score[5][3],存放5個(gè)學(xué)生3門課程的成績(jī)。再設(shè)兩個(gè)一維數(shù)組sum[3]和ave[3]分別存放3門課程的總分和平均分。編程如下:#include<stdio.h>main(){ intscore[5][3];//存放5個(gè)學(xué)生的3門課成績(jī)
intsum[3]={0,0,0};//存放3門課程的總分
floatave[3]={0,0,0};//存放3門課程的平均分
inti,j; for(i=0;i<5;i++)//輸入5個(gè)學(xué)生的3門課成績(jī)
{ printf("請(qǐng)輸入第%d個(gè)學(xué)生的3門課成績(jī):",i+1); for(j=0;j<3;j++) scanf("%d",&score[i][j]); } for(j=0;j<3;j++)//j為列數(shù),控制課程門數(shù)
{ for(i=0;i<5;i++)//i為行數(shù),控制學(xué)生個(gè)數(shù)
sum[j]=sum[j]+score[i][j];//計(jì)算總分
ave[j]=(float)sum[j]/5.0; //計(jì)算平均分
}for(j=0;j<3;j++)//輸出
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年度養(yǎng)老服務(wù)業(yè)委托貸款協(xié)議
- 自愿合伙經(jīng)營(yíng)合同書(33篇)
- 2025屆柳州市高三語文下學(xué)期開學(xué)考試卷附答案解析
- 5萬噸年鋰電池物理法循環(huán)再生項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 2024-2025學(xué)年安徽省滁州市定遠(yuǎn)英華中學(xué)高二上學(xué)期期中考試歷史試卷
- 2025年企業(yè)租賃辦公地點(diǎn)合同標(biāo)準(zhǔn)格式
- 2025年移動(dòng)支付行業(yè)策劃發(fā)展聯(lián)盟合作協(xié)議模板
- 2025年化妝專業(yè)學(xué)員培訓(xùn)協(xié)議
- 2025年腳踏自行車及其零件項(xiàng)目提案報(bào)告模板
- 2025年制造業(yè)轉(zhuǎn)讓合同范文
- 電流互感器試驗(yàn)報(bào)告
- 蔣中一動(dòng)態(tài)最優(yōu)化基礎(chǔ)
- 華中農(nóng)業(yè)大學(xué)全日制專業(yè)學(xué)位研究生實(shí)踐單位意見反饋表
- 付款申請(qǐng)英文模板
- 七年級(jí)英語閱讀理解10篇(附答案解析)
- 抖音來客本地生活服務(wù)酒旅商家代運(yùn)營(yíng)策劃方案
- 鉆芯法樁基檢測(cè)報(bào)告
- 無線網(wǎng)網(wǎng)絡(luò)安全應(yīng)急預(yù)案
- 國(guó)籍狀況聲明書【模板】
- 常用保潔綠化人員勞動(dòng)合同范本5篇
- 新高考高一英語時(shí)文閱讀
評(píng)論
0/150
提交評(píng)論