版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++第7章數(shù)組
主要內容:1、一維數(shù)組2、二維數(shù)組3、字符數(shù)組和字符串重點:數(shù)組的定義和數(shù)組元素的引用數(shù)組概述數(shù)組:用于保存一批相同類型的數(shù)據(jù)屬構造類型數(shù)組名:一批同類型數(shù)據(jù)共有的名字。下標:數(shù)組中的各個數(shù)據(jù)用下標來區(qū)分。例如,一組實驗數(shù)據(jù)、一批學生成績、表、矩陣等的處理,均用數(shù)組數(shù)據(jù)類型表示。7.1一維數(shù)組例7.1輸入50個整數(shù),按逆序輸出。main(){inta[50],i;/*定義數(shù)組a和循環(huán)變量i*/for(i=0;i<50;i++)
/*從鍵盤輸入50個整數(shù)*/scanf("%d",&a[i]);
for(i=49;i>=0;i--)
/*逆序輸出50個整數(shù)*/
printf("%4d",a[i]);
}a[0]a[1]a[2]a[3]a[4]……a[49]…..一維數(shù)組:每個數(shù)組元素只帶有一個下標一維數(shù)組的一般形式:
類型說明符
數(shù)組名[常量表達式]如:floatscore[30];
float
是類型說明符,定義了該數(shù)組中元素的類型。
score是數(shù)組名,是這一組數(shù)據(jù)共有的的名字;30是常量表達式,表示數(shù)組的長度,即數(shù)組元素的個數(shù)。也就是說:數(shù)組score可以保存30個float型的數(shù)據(jù)。注意:定義數(shù)組時長度必須是確定的值。例如:intaa[];(error)
intn;floatxs[n];(error)數(shù)組元素的引用:數(shù)組名[下標]如:a[i]是數(shù)組a中下標為i的數(shù)組元素;a[0]是下標為0的數(shù)組元素。C語言的規(guī)定:數(shù)組的下標從0開始。比方數(shù)組a[50]包含50個數(shù)組元素,分別是:a[0]a[1]a[2]……a[49]即下標的范圍為0~49,不存在數(shù)組元素score[50]。假設使用a[50]是危險的,為什么?一維數(shù)組的存儲格式:每個數(shù)組占用一片連續(xù)的存儲單元,按下標次序依次存放各元素。如intdata[10];數(shù)組data占2*10=20個字節(jié)data[0]data[1]data[2]……data[9]例7.3編程實現(xiàn):輸入某門課30人的成績〔0~100〕,要求將高于平均分的那些成績打印出來。分析數(shù)據(jù)結構:30人的成績,類型相同,可用一維數(shù)組來保存。分析算法:S1:輸入30人的成績并累加,用循環(huán)實現(xiàn),循環(huán)體為“輸入第k個人的成績、并累參加局部和〞;S2:求平均S3:求高于平均分的成績。也用循環(huán)實現(xiàn),循環(huán)體為“將第k個成績平均分比較,假設高,那么輸出〞;循環(huán)條件為“k<30",k的初值為0,增值為“k++〞.#defineN3main(){floatscore[N],sum,average;intk;printf("\nenter%dscores:",N);
sum=0;for(k=0;k<N;k++)/*輸入N個成績,存入數(shù)組,并累加*/{scanf("%f",&score[k]);sum=sum+score[i];}average=sum/N;/*求平均*/printf("\naverage=%6.1f",average);for(k=1;k<N;k++)if(score[k]>average)printf("\n%6.1f",score[k]);}例7.4用起泡法對N個整數(shù)由小到大排序。起泡排序的根本思想是:相鄰兩個元素比較,按要求的順序排放,比較一遍后,最大的元素被換到待排序數(shù)列的最后位置。對待排序序列依次重復上述過程,直至全部排完為止。數(shù)據(jù)結構:N個整數(shù)用一維整型數(shù)組保存。算法:〔設N=5,待排序的數(shù)據(jù)為:321081〕起泡排序過程為:第一遍:238110第二遍:231810第三遍:213810第四遍:123810分析:當待排序數(shù)據(jù)個數(shù)n=5時,共排n-1=4遍,第i遍待排序序列是從第1個元素到第n-i+1個元素。用雙重循環(huán)實現(xiàn)。流程圖:例7.4起泡排序。#defineN5main(){inta[]={0,3,2,10,8,1};intt,i,j;for(i=1;i<=N-1;i++)for(j=1;j<N-i+1;j++)if(a[j]>a[j+1])/*假設相鄰兩數(shù)逆序,那么交換*/{t=a[j];a[j]=a[j+1];a[j+1]=t;}printf("\n");for(i=1;i<=N;i++)printf("%d",a[i]);}數(shù)組a的長度為11,由初始值的個數(shù)決定。其中a[1]至a[10]為有效數(shù)據(jù),a[0]未用,主要是為了符合我們的計數(shù)習慣。例7.5求某數(shù)列的前20項。該數(shù)列的特點:f1=0(n=1)f2=1(n=2)fn=fn-1+fn-2(nisodd)、fn=|fn-1-fn-2|(niseven)分析:數(shù)據(jù)結構:該數(shù)列中的數(shù)據(jù)均為整型,可用整型的一維數(shù)組來保存。算法:S1:從第三項開始,每一項都是前兩項的和或差,可用循環(huán)實現(xiàn):每循環(huán)一次計算出一項。求出前20項,分別存入數(shù)組中相應位置。S2:輸出數(shù)組中的每一個元素,用循環(huán)實現(xiàn)。#include<math.h>main(){intf[21],k;f[1]=0;f[2]=1;for(k=3;k<=20;k+=2){f[k]=f[k-1]+f[k-2];f[k+1]=abs(f[k]-f[k-1]);}printf("\nnumberlist:\n");for(k=1;k<=20;k++){printf("%10d",f[k]);if(k%6==0)printf("\n");/*控制每行輸出6個數(shù)*/}}一維數(shù)組的初始化一維數(shù)組的初始化:定義數(shù)組時可以給局部或全部數(shù)組元素賦初值,即數(shù)組的初始化。數(shù)組元素的初值依次放在一對花括號內?!?〕只給局部元素賦初值。如:intx[20]={1,2};只給數(shù)組元素x[0],x[1]賦初值。〔2〕對全部數(shù)組元素賦初值,數(shù)組長度可以省略,由初值的個數(shù)決定。如:inta[]={0,3,2,10,8,1};7.2二維數(shù)組用于描述類似矩陣、表之類的數(shù)據(jù)結構特點:1〕所有數(shù)據(jù)同類型,并且是由個數(shù)相等的幾組數(shù)據(jù)組成。2〕每組數(shù)據(jù)表示一個完整的含義,可看作是一個整體。比方,2*3的矩陣,共有6個數(shù)據(jù),分成兩組,每組3個數(shù)據(jù),表示一行??啥x數(shù)組:intbb[2][3];又如,某班30人,期末考4門課,他們的成績都是float型,共有120個成績,分成30組,每組4個,即表示某一個人的成績;或分成4組,每組30個,即表示某一門課的成績。如定義數(shù)組:floatscore[30][4];可表示30人的成績,每人4門課。floatsc[4][30];可表示4門課,每門可有30人的成績。比較:假設用一維數(shù)組,能表示所有的數(shù)據(jù),但不能表示出數(shù)據(jù)之間的分組關系。例7.6輸入某班〔30人〕期末考試4門課的成績,計算出每人的平均成績,按每行10個數(shù)據(jù)輸出平均成績。分析數(shù)據(jù)結構:30人4門課的成績用二維數(shù)組表示,30人的平均成績可用一維數(shù)組表示。算法:S1:輸入30人〔每人4門課〕的成績。S2:計算每人的平均成績。S3:輸出每個人的平均成績。分別分析每一步如何實現(xiàn)?循環(huán)結構程序:main()/*例7.6*/{floatscore[30][4],aver[30],sum;inti,j;
for(i=0;i<30;i++)/*輸入30人的成績*/{printf("\nenter4scoresforno:%d\n",i+1);for(j=0;j<4;j++)/*輸入一個人4門課的成績*/scanf("%f",&score[i][j]);}for(i=0;i<30;i++){sum=0;
/*循環(huán)體:計算每人的平均分*/for(j=0;j<4;j++)sum+=score[i][j];aver[i]=sum/4;}/*nextpage*/for(i=0;i<30;i++)/*輸出每人的平均成績*/{if(i%10==0)printf(“\n〞);/*控制每行10個數(shù)據(jù)*/printf("%5.1f",aver[i]);}}二維數(shù)組定義的一般格式:類型名數(shù)組名[常量表達式1][常量表達式2]如floatscore[30][4];其中的數(shù)組元素為:score[0][0],score[0][1],score[0][2],score[0][3]score[1][0],score[1][1],score[1][2],score[1][3]score[2][0],score[2][1],score[2][2],score[2][3]……score[29][0],score[29][1],score[29][2],score[29][3]如表示2*3矩陣的數(shù)組bb的定義:intbb[2][3];其中的數(shù)組元素為:bb[0][0],bb[0][1],bb[0][2]bb[1][0],bb[1][1],bb[1][2]說明:數(shù)組每一維的下標均從0開始。〔二維數(shù)組可看作特殊的一維數(shù)組,每個數(shù)組元素又是一維數(shù)組〕存儲格式:二維數(shù)組同一維數(shù)組一樣,也占用一片連續(xù)的存儲單元,且按行存放。數(shù)組名代表整個數(shù)組的起始地址,數(shù)組名與第一維下標代表某一行的起始地址。如score&score[0],score[i]&score[i][0]例7.7求矩陣a=的轉置矩陣
b=分析兩個矩陣元素的對應關系:a[i][j]對應b[j][i]./*例7.7*/main(){inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};/*數(shù)組a初始化*/intb[3][3],i,j;for(i=0;i<3;i++)/*求轉置矩陣b*/for(j=0;j<3;j++)b[j][i]=a[i][j];printf(“\nmatrixa:\n〞);/*輸出矩陣a〔按行輸出〕*/for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%5d",a[i][j]);printf(“\n〞);/*輸出一行后,換行*/}
/*接下頁*//*上接頁*/printf(“matrixb:\n〞);/*輸出矩陣b*/for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%5d",b[i][j]);printf("\n");}}二維數(shù)組的初始化:〔1〕給全部數(shù)組元素賦初值:inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};等價于inta[3][3]={1,2,3,4,5,6,7,8,9};或inta[][3]={1,2,3,4,5,6,7,8,9};其中第一維的長度可省略。(按行存儲)〔2〕給局部數(shù)組元素賦初值:如intb[2][4]={{1,2},{6,8}};結果只給4個元素賦值為:b[0][0]=1,b[0][1]=2,b[1][0]=6,b[1][1]=8例7.8求N*N矩陣的兩條對角線元素之和。(以4*4矩陣為例)分析:對角線有兩條,每條有兩個對角線元素,第k行的兩個對角線元素為a[k][k],a[k][n-k-1]設s1、s2分別表示兩條對角線元素的局部和,那么對于矩陣的每一行,都要將其對角線元素參加對應的局部和變量中。因此用循環(huán)結構。循環(huán)體:s1+=a[k][k];s2+=a[k][n-k-1]條件:k<Nk的初值:0k的增值:k++#defineN4main(){inta[N][N],i,j,s1,s2;printf(“\nentermatrix:〞);/*提示信息*/for(i=0;i<N;i++)for(j=0;j<N;j++)/*輸入一行*/scanf("%d",&a[i][j]);s1=s2=0;for(i=0;i<N;i++){s1+=a[i][i];s2+=a[i][N-i-1];}printf("\nsum=%d",s1+s2);}7.3字符數(shù)組和字符串一維字符數(shù)組常用來表示字符串,每個數(shù)組元素保存一個字符。例7.9下面程序將從字母‘b’開始的5個字符存入一個字符數(shù)組,并觀察數(shù)組中的個元素。#include"stdio.h"main(){charss[5],ch='b';inti;for(i=0;i<5;i++){ss[i]=ch;ch++;}for(i=0;i<5;i++)/*輸出每個字符數(shù)組元素*/putchar(ss[i]);}運行結果:bcdef本例還可以用數(shù)組初始化的方式給數(shù)組元素賦值#include"stdio.h"main(){charss[5]={'b','c','d','e','f'};inti;for(i=0;i<5;i++)putchar(ss[i]);}結論:字符數(shù)組的定義、初始化及數(shù)組元素的引用方法與一般數(shù)組根本相同。不同點:字符數(shù)組通常用于保存字符串,此時整個數(shù)組可以整體輸入/輸出。而整型、實型等數(shù)組只能引用其中的數(shù)組元素。字符串存儲時,系統(tǒng)自動在其末尾加上一個字符串結束標志:‘\0’,因此當用字符數(shù)組保存字符串時,字符數(shù)組的長度至少應定義為:字符串長度+1。例7.11輸入一個字符串(設長度不超過80〕,統(tǒng)計其長度,并輸出該字符串。#include"stdio.h"main(){charstr[80];inti,n=0;printf("\nenteralinecharacter:");gets(str);/*字符串輸入函數(shù)*/i=0;while(str[i]!='\0'){n++;i++;}printf(“\nstring:%s〞,str);/*輸出字符串str,用%s*/printf("\nlength:%d",n);}運行時假設輸入:Turboc那么輸出:strng:Turboclength:7字符串輸入/輸出函數(shù)的使用:(1)gets(str):從終端輸入一個字符串,送入字符數(shù)組str。其中str代表數(shù)組str[80]的首地址。用gets輸入字符串時,以回車作為字符串的結束,并將回車符轉換成字符串結束標志‘\0’。(2)scanf():輸入不含空格的一個或多個字符串。如例中將gets(str)改為:scanf(“%s〞,str);假設輸入:Turboc那么輸出:string:Turbolength:5Note:用scanf輸入時,空格、回車均為數(shù)據(jù)的分隔符;當輸入多個字符串時,每個字符串末尾自動加上字符串結束標記‘\0’。(3)printf()和puts(str):例7.11輸出兩個字符串〔分別用printf和puts)。#include"stdio.h"main(){chars1[30]="abcde",s2[20]="ghi";printf("\n%s,%s",s1,s2);puts(s1);puts(s2);}運行結果:abcde,ghiabcdeghiPrintf可用控制符%s輸出一個或多個字符串,Printf輸出字符串時,字符串的結束標志‘\0’并不輸出,也不會轉換成‘\n’。puts(s1);輸出字符數(shù)組s1中的一個字符串,且將字符串結束標記‘\0’轉換成‘\n’輸出。最常用的字符串操作函數(shù)Strcpy(s1,s2):拷貝字符串s2到s1。Strcat(s1,s2):把字符串s2接到s1的末尾。Strlen(s1):返回字符串s1的長度。Strcmp(s1,s2):比較字符串s1和s2的大小。假設s1、s2相等,那么返回0;假設s1>s2那么返回值大于0;假設s1<s2那么返回值小于0。suchas:"abcdef"lessthan"abkdeg"Note:以上參數(shù)均為待處理字符串的首地址。例7.12輸入兩個字符串,分別測試其長度,并比較兩個字符串的大小。分析:1〕輸入兩個字符串,分別存入字符數(shù)組str1、str2,用gets實現(xiàn)。2〕用函數(shù)strlen測試兩個字符串的長度。3〕用函數(shù)strcmp比較兩個字符串的大小。#include“stdio.h“/*字符串函數(shù)的綜合使用*/#defineN80#include“string.h“/*字符串處理函數(shù)的頭文件*/main(){charstr1[N],str2[N];intcmp;
printf("\ninputfirststring:");gets(str1);printf("inputsecondstring:");gets(str2);printf("\nlength1=%d,length2=%d",strlen(str1),strlen(str2));
cmp=strcmp(str1,str2);if(cmp==0)printf("\nequal.");elseif(cmp>0)printf("\nstr1>str2.");elseprintf("\nstr1<str2.");}例7.14輸入一行字符,統(tǒng)計其中有多少個單詞〔單詞之間用空格分隔〕。思路:輸入一行字符串,存入一維字符數(shù)組;然后對每一個字符進行如下判斷:當前字符=空格?假設是,那么未出現(xiàn)新單詞,使word=0。假設不是,那么根據(jù)前一字符是否為空格判斷:假設是(即word=0),那么新單詞出現(xiàn),num加1,word=1;否那么〔即word=1),未出現(xiàn)新單詞。程序:x7_13.c#include"stdio.h“/*x7_13.c*/main(){charstr[81],c;inti,num=0,word=0;printf("\nenteralinecharacter:");gets(str);for(i=0;(c=str[i])!='\0';i++)if(c=='')word=0;elseif(word==0) {word=1;num++;}printf("\nthereare%dwordsintheline.",num);}特別提示1〕同一般數(shù)組一樣,字符串也不能整體賦值,只能逐個引用數(shù)組元素。如chars1[10],s2[40];那么s1=“ghhkji〞;/*error*/s2=s1;/*error*/可以用strcpy實現(xiàn),或逐個數(shù)組元素賦值。2〕用字符數(shù)組存儲字符串時,其元素的個數(shù)至少應比字符串的長度多1;字符串處理時,以‘\0’為字符串結束,無需關心字符數(shù)組的實際長度。例如:k=0;while(s[k]!='\0')k++;上機調試Errors:1〕注意數(shù)組訪問越界,或漏掉下標為0的元素。因為下標從0開始。2〕數(shù)組不能整體賦值。3〕定義數(shù)組時長度不確定。練習1.main(){inty[2][3]={2,34,6,8,10,12};inti;for(i=0;i<2;i++)printf("%d,",y[1-i][i+1]);}注意:二維數(shù)組的存儲格式,下標從0開始。2.#include"stdio.h"#defineN6main(){charc[N];inti;for(i=0;i<N;i++)c[i]=getchar();for(i=0;i<N;i++)putchar(c[i]);printf("\n");}/*注意:讀取字符時回車符的處理。*/假設運行時輸入:abcdef結果為:3.main(){intn[3],i,j,k;for(i=0;i<3;i++)n[i]=0;k=2;for(i=0;i<k;i++)for(j=0;j<k;j++)n[j]=n[i]+1;printf("\n%d",n[1]);}/*注意下標的變化*/運行結果為:34.#include"stdio.h"main(){charch[3][4]={"123","456","78"};inti;for(i=0;i<3;i++){printf("%s",ch[i]);puts(ch[i]);}}/*注意:字符串輸出時‘\0’的處理。*/運行結果為:12312345645678785.輸入N位學生的成績,統(tǒng)計各分數(shù)段的人數(shù),統(tǒng)計結果存入數(shù)組,并輸出?!步y(tǒng)計原那么:<60,60~69,70~79,80~89,90~99,100各為一段,N為符號常量〕分析:數(shù)據(jù)結構:N個學生的成績、各分數(shù)段的人數(shù)分別用一維數(shù)組sc[N],count[11]存放。算法:1〕輸入N個成績2〕count數(shù)組各元素清03〕統(tǒng)計:對每一個成績,判斷其屬于哪一分數(shù)段,然
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版固定資產互借互貸協(xié)議樣式版B版
- 2022端午節(jié)活動策劃方案三篇范文
- 2025年COD自動在線監(jiān)測儀項目規(guī)劃申請報告范文
- 2024-2025學年謝家集區(qū)數(shù)學三年級第一學期期末監(jiān)測試題含解析
- 2025年低壓接觸器項目提案報告
- 員工工作計劃(15篇)
- 九年級中秋節(jié)滿分作文5篇
- 中專自我鑒定范文集合五篇
- 教學改革學期工作總結簡短范文5篇模板
- 常用的員工個人工作總結12篇
- 2024廣西專業(yè)技術人員繼續(xù)教育公需科目參考答案(100分)
- 譯林版小學英語二年級上全冊教案
- DL∕T 821-2017 金屬熔化焊對接接頭射線檢測技術和質量分級
- 小學五年級英語語法練習
- NB-T32004-2018光伏并網逆變器技術規(guī)范
- 領導與班子廉潔談話記錄(4篇)
- 衡陽市耒陽市2022-2023學年七年級上學期期末語文試題【帶答案】
- 文庫發(fā)布:strata手冊
- 旋挖鉆孔灌注樁施工技術規(guī)程
- 過氧化二異丙苯安全技術說明書
- 幼師課例分析報告總結與反思
評論
0/150
提交評論