




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
程序設計基礎——C語言程序設計
2023翻轉課堂實用教程第7章
數組一維數組7.1二維數組7.2
字符數組7.37.4數組的越界C語言解決問題的本質定義變量處理變量基本數據類型整形int字符型char實數單精度實數float雙精度實數double用于定義單個變量在實際生活中,存不存在對多個變量的集合進行處理的情況呢?數組7.1一維數組1234導入數組導入案例數組的定義引用初始化存儲方式知識點數組的使用案例案例分析練習數組的使用練習題導入案例(1)案例7.1.1:輸入5個整數,分別表示5名應屆畢業生的月薪,計算并輸出這5名應屆畢業生的平均月薪(小數點后保留2位小數)。解決步驟:(1)采用循環求和方式計算出總和,(2)然后除以個數就可以得到平均值。注意:在計算平均數時建議用實數類型保存和,這樣在用和除以個數時得到的均值也是實數。導入案例(1)#include<stdio.h>intmain(){ inti,salary; doubleaverage,sum=0; for(i=0;i<5;i++){ scanf("%d",&salary); sum=sum+salary; } average=sum/5; printf("%.2f",average); return0;}輸入數據:70008100750069007300輸出數據:7360.00運行結果案例7.1.1程序代碼導入案例(2)案例7.1.2:輸入5個整數,分別表示5名應屆畢業生的月薪,計算并輸出這5名應屆畢業生的平均月薪(小數點后保留兩位小數),以及高于平均月薪的工資數。本例題要求輸出所有大于平均月薪的工資數,此時就需要保存輸入的所有月薪,等平均值月薪計算出來后,再將高于平均月薪的工資數輸出。導入案例(2)intmain(){inti,salary1,salary2,salary3,salary4,salary5;doubleaverage,sum=0;scanf("%d",&salary1);scanf("%d",&salary2);scanf("%d",&salary3);scanf("%d",&salary4);scanf("%d",&salary5);sum=sum+salary1+salary2+salary3+salary4+salary5;average=sum/5;printf("平均月薪為:%.2f\n",average);printf("高于平均月薪的工資數為:");if(salary1>average)printf("%d\n",salary1);if(salary2>average)printf("%d\n",salary2);if(salary3>average)printf("%d\n",salary3);if(salary4>average)printf("%d\n",salary4);if(salary5>average)printf("%d\n",salary5);return0;}輸入:70006500710068007000輸出:平均月薪為:6880.00高于平均月薪的工資數為:700071007000運行結果案例7.1.2程序代碼如果此時應屆畢業生人數由5名變為10名、100名,如何解決?7.1.1一維數組知識點數組:若干相同類型的數據的集合數組中每一個數據叫做數組元素。元素均具有相同的數據類型,具有統一的變量名即數組名,并用不同編號來區分每個元素。數組的概念可以等同于班級中的小組,假如小組1有10名學生,為這10名學生依次編號為0、1、2...9,用小組1的0號學生、小組1的1號學生…小組1的9號學生就可以找到這10名學生。1、一維數組的定義一維數組的定義方式為:
數據類型名數組名[數組長度];舉例://定義一個含有10個整型數據的數組arrayintarray[10];//定義一個含有20個雙精度浮點型數據的數組numdoublenum[20];//定義一個含有30個字符型數據的數組strcharstr[30];7.1.1一維數組知識點每個元素的類型整型常量,指出元素個數,稱為數組長度合法標識符在定義數組時,[]方括號中的數值是數組中元素的個數2、一維數組的引用一維數組中各個元素的引用方式:
數組名[元素的下標];7.1.1一維數組知識點(1) 先定義,再引用。(2) 數組中按照元素的順序,從0開始為每個元素進行編號,這個編號稱為下標,合理的下標取值依次為:0、1...(數組長度-1),分別對應著數組中第一個元素、第二個元素...最后一個元素。(3) 下標也可以為整型表達式,其取值范圍為[0,數組長度-1],不在這個范圍內的下標值為越界,越界會導致溢出。上溢或者下溢會導致程序出現不可預料的錯誤。(4) 只能逐個引用數組元素,不能一次性引用整個數組。對數組元素的引用是自由的,通過數組名和元素下標即可唯一確定一個數組元素。在引用時,[]方括號中數值給出了將要引用的元素的下標值。7.1.1一維數組知識點以下關于數組的說法,不正確的選項為:引用數組元素時,數組下標可以是整形常量或者整形表達式2、一維數組的引用一維數組中各個元素的引用方式:
數組名[元素的下標];7.1.1一維數組知識點舉例: intarray[10];array[0]、array[1]、array[2]、array[3]、array[4]、array[5]、array[6]、array[7]、array[8]、array[9]
0
1
2
3
4
5
6
7
8
97.1.1一維數組知識點現定義了一維數組inta[4];關于數組元素的引用,正確的選項為:3、一維數組的初始化(1)在定義數組時初始化
數據類型名數組名[數組長度]={元素初值表};7.1.1一維數組知識點在定義數組時,根據元素初值表中給出的元素的個數,分三種情況為數組進行初始化:①元素初值表給出所有元素值②元素初值表只給出部分元素值③沒有元素初值表3、一維數組的初始化(1)在定義數組時初始化
數據類型名數組名[數組長度]={元素初值表};7.1.1一維數組知識點①元素初值表給出所有元素值賦值的原則為:將初始表中給出的初值依次賦值給全部數組元素。舉例:intarray[10]={1,2,3,4,5,6,7,8,9,10};等價于a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=6,a[6]=7,a[7]=8,a[8]=9,a[9]=10。若對所有元素賦值,可以省略數組長度,但不建議省略元素初值表中的初值個數不能超過數組長度。3、一維數組的初始化(1)在定義數組時初始化
數據類型名數組名[數組長度]={元素初值表};7.1.1一維數組知識點②元素初值表只給出部分元素值賦值的原則為:將初始表中給出的初值依次賦值給數組元素,其余元素自動賦值為0。舉例:intnum[10]={1,2,3};等價于num[0]=1,num[1]=2,num[2]=3,num[3]~num[9]均為0。如何給全部元素賦初值為0intnum[10]={0};3、一維數組的初始化(1)在定義數組時初始化
數據類型名數組名[數組長度]={元素初值表};7.1.1一維數組知識點③沒有元素初值表分兩種情況:普通數組intgrade[10];//動態數組,所有元素的值是一個隨機值。定義時加上static關鍵字的靜態數組staticintgrade[10];//若沒有對靜態數組元素賦初值,所有元素自動被賦初值0。3、一維數組的初始化(2)在定義數組后,單獨對數組元素賦值7.1.1一維數組知識點賦值的原則為:此時需要挨個為數組元素賦值。舉例:①
intgrade[10];
grade[0]=80,grade[1]=90,grade[2]=85,grade[3]=75;
其他沒有賦值的元素,其值為隨機值。②for(i=0;i<10;i++) scanf("%d",&grade[i]);//是否正確?intscore[20];score[20]={80,90};4、一維數組的存儲方式系統根據每個元素的數據類型、元素的個數在內存中分配一塊連續的內存空間用于存放該數組。數組名便是這塊連續內存空間的首地址/起始地址。7.1.1一維數組知識點舉例
inta[10]={1,2,3,4,5,6,7,8,9,10};4、一維數組的存儲方式系統根據每個元素的數據類型、元素的個數在內存中分配一塊連續的內存空間用于存放該數組。數組名便是這塊連續內存空間的首地址/起始地址。7.1.1一維數組知識點內存單元下標0123456789舉例
inta[10]={1,2,3,4,5,6,7,8,9,10};4、一維數組的存儲方式系統根據每個元素的數據類型、元素的個數在內存中分配一塊連續的內存空間用于存放該數組。數組名便是這塊連續內存空間的首地址/起始地址。7.1.1一維數組知識點舉例
inta[10]={1,2,3,4,5,6,7,8,9,10};數組元素引用a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]內存單元下標01234567894、一維數組的存儲方式系統根據每個元素的數據類型、元素的個數在內存中分配一塊連續的內存空間用于存放該數組。數組名便是這塊連續內存空間的首地址/起始地址。7.1.1一維數組知識點舉例
inta[10]={1,2,3,4,5,6,7,8,9,10};數組元素引用a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]內存單元12345678910下標01234567894、一維數組的存儲方式系統根據每個元素的數據類型、元素的個數在內存中分配一塊連續的內存空間用于存放該數組。數組名便是這塊連續內存空間的首地址/起始地址。7.1.1一維數組知識點舉例
inta[10]={1,2,3,4,5,6,7,8,9,10};數組元素引用a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]內存單元12345678910下標0123456789地址信息8080808480888092809681008104810881128116整形數據在內存中占4個字節,若首地址為8080案例分析一維數組的編程方法7.1.4分析一維世界中新冠病毒感染情況7.1.5在一系列數據中刪除第k個數據演示數組中每個元素的賦值和輸出方法演示查找某個數據,并刪除數組中元素的方法。下標作為循環變量,采用循環結構對數組進行操作巧用數組下標,簡化問題解決。演示下標的其他用處,如坐標點。7.1.2一維數組案例分析7.1.3放射加密方法對一系列數據進行加密案例7.1.3:用放射加密方法對一系列數據進行加密,并輸出加密后的數據。要求:輸入10個數據,保存到數組中,并采用放射加密法對每個數據進行加密,最后輸出加密后的10個數據。加密的公式:加密后數據=(7*數據+21)%26。問題分析:定義整型數組num保存這10個數據,數組長度定為10,定義i作為數組的下標,并將數組的下標i作為循環變量,通過循環變量i從0變到n-1,來逐個訪問數組中的a[0]到a[n-1],并對其進行相應的操作。7.1.2一維數組案例分析#include<stdio.h>#defineN10/*定義符號常量N為10,后續代碼N的地方*/intmain(void){inti;/*i既作為數組下標,又作為循環變量*/intnum[N]={50,34,40,68,60,45,39,47,51,30};for(i=0;i<N;i++){num[i]=(7*num[i]+21)%26;
}
printf("放射加密后的數據為:\n");for(i=0;i<N;i++){printf("%d",num[i]);}return0;}放射加密后的數據為:72515325248121423運行結果案例7.1.3程序代碼7.1.2一維數組案例分析案例7.1.4:分析一維世界中新冠病毒感染情況要求:從2019年12月開始,新冠病毒在全球傳播開來,該病毒傳染性極強,只要某人與攜帶了該病毒的感染者在活動范圍內有交集,則有被感染的可能。為了簡化運算,假設人生活在一維世界中,Ta到過的地方為一個區間[begin,end],其中0≤begin≤end≤200。假設有二個人,A、B,其中A為新冠病毒感染者,B為健康者,依次給出4個整數beginAendAbeginBendB,分別為這A、B二人的活動區間,請分析B是否有被感染的可能。7.1.2一維數組案例分析案例7.1.4:分析一維世界中新冠病毒感染情況問題分析:在一維世界中,人的活動范圍為[0,200],共201個點,定義intmark[201]={0}來記錄這201點是否為感染者的活動點。假設0≤i≤200,若mark[i]=0,表示i這個點不是感染者的活動點,若mark[i]=1,表示i這個點是感染者的活動點。7.1.2一維數組案例分析O感染者A的活動范圍beginAendAmark[beginA]~mark[endA]賦值為1beginBendBB循環判斷mark[beginB]~mark[endB]中的值是否有1的情況#include<stdio.h>intmain(){intn,m,i,j,flag=0;//flag為0表示未被感染intbeginA,endA,beginB,endB;intmark[201]={0};//用于在0到200這些坐標點標記scanf("%d%d%d%d",&beginA,&endA,&beginB,&endB);//標記A活動過的坐標點for(i=beginA;i<=endA;i++){mark[i]=1;
//表示i這個坐標點為A感染者的活動點。}for(j=beginB;j<=endB;j++){/*若j這個坐標點已經被標記為1,說明B的活動點j是A感染者活動的點*/if(mark[j]==1){flag=1;//可能被感染時flag置為1break;}}if(flag==1)//通過flag的值來判斷B是否可能被感染printf("B有可能被感染!");elseprintf("B暫無可能被感染!");return0;}運行結果1:5068345B暫無可能被感染!運行結果2:23453490B有可能被感染!運行結果案例7.1.4程序代碼數組的下標還可以有其他的含義,比如坐標點。解決某些實際問題時,好好利用下標,會簡化問題的求解。7.1.2一維數組案例分析案例7.1.5:在一系列數據中刪除第k個數據要求:輸入10個整數,將其保存到數組中。再輸入一個要刪除數據的下標index(從0開始),若該index值合法(0~9),則將該位置的數據從數組中刪除,不合法則不執行任何操作。問題分析:定義長度為10的arr數組來保存10個數據,i作為數組的下標,index來保存要刪除數據的下標值,刪除了該下標處的數據后,該位置后面的數據要往前移動。7.1.2一維數組案例分析#include<stdio.h>intmain(){intarr[10]={0};intindex,i;for(i=0;i<=9;i++)scanf("%d",&arr[i]);scanf("%d",&index);if(index>=0&&index<=9){//先輸出最開始的數組printf("原始數組為:\n");for(i=0;i<=9;i++)printf("%d",arr[i]);printf("\n");
for(i=index;i<9;i++)
//從index開始,i位置數據等于i+1,實現數據前移arr[i]=arr[i+1];printf("刪除一個數據,新的數組為:\n");for(i=0;i<=8;i++)printf("%d",arr[i]);}else{printf("theindexiswrong!");}return0;}運行結果1:0123456789↙0↙原始數組為:0123456789刪除下標0的元素,新的數組為:123456789運行結果2:0123456789↙9↙原始數組為:0123456789刪除下標9的元素,新的數組為:012345678運行結果案例7.1.5程序代碼7.1.2一維數組案例分析課堂練習題7.1.3:一維數組的循環左移先輸入一個整數n和m,n表示元素的個數,m表示左移的位置,隨后輸入n個整數。請依次輸出左移m位后的數組中所有的元素。舉例: 輸入: 82 12345678 輸出: 345678127.1.3一維數組練習題課堂練習題7.1.1:兩個一維數組相加先輸入一個整數n,隨后輸入兩行數據,每行n個整數,試計算這兩行數據對應位置的和,并輸出所有的和。舉例:輸入:51234567890輸出7911135
課堂練習題7.1.2:輸出某個大學生程序設計大賽中,最高的得分和最低的得分先輸入一個整數n表示參加程序設計大賽的選手人數,隨后給出n個整數表示每位參賽者的得分,用空格隔開。請輸出這n位參賽者中最高的得分和最低的得分。7.2二維數組1234導入二維數組導入案例二維數組的定義引用初始化存儲方式知識點二維數組的使用案例案例分析練習二維數組的使用練習題導入案例案例7.2.1:將C字母保存到矩陣中,并將該矩陣輸出到屏幕上。現有一個C字母的黑白像素圖片,下圖,在該圖片中,C字母的像素點使用黑色表示,其他地方用白色顯示。試用矩陣的形式將該圖片輸出出來。導入案例案例7.2.1:將C字母保存到矩陣中,并將該矩陣輸出到屏幕上。為了方便輸出,黑色的像素點的矩陣值用1來表示,白色像素點的矩陣值用0來表示。C字母對應的矩陣如何保存矩陣中各個元素的值?9行8列二維數組導入案例#include<stdio.h>#defineM9//宏定義,M表示行數,9行#defineN8//N為列數,8列intmain(){/*9行8列的矩陣,需要9行8列的二維數組來存放,初值為0*/intpic[M][N]={0};inti,j;//1行3、4、5、6列為C字母的一部分,值為1for(i=3;i<=6;i++)pic[1][i]=1;
/*同樣,2行2列、3行1列、4行1列、5行1列、6行2列為C字母一部分,值為1*/pic[2][2]=1,pic[3][1]=1,pic[4][1]=1,pic[5][1]=1;pic[6][2]=1;for(i=3;i<=6;i++) pic[7][i]=1;/*以上代碼將C字母的矩陣保存到了二維數組中,下面將該二維數組輸出即可。*/for(i=0;i<M;i++){for(j=0;j<N;j++)printf("%2d",pic[i][j]); printf("\n");}return0;}運行結果案例7.2.1程序代碼對矩陣的操作可以用對二維數組的操作來實現。1、二維數組的定義二維數組的定義方式為:
數據類型名數組名[行長度][列長度];舉例:
//定義一個10行10列的二維整型數組rect,共10*10=100個元素。intrect[10][10];//定義一個10行20列的二維字符數組names,共有10*20=200個字符元素。charnames[10][20];7.2.1二維數組知識點二維數組可被看作一個矩陣,有行也有列。定義時,第一個[]內指出的是二維數組的總行數,第二個[]內指出的是該二維數組的總列數,均為整型常量。每個元素的類型合法標識符2、二維數組的引用二維數組中各個元素的引用方式:
數組名[元素的行下標][元素的列下標];7.2.1二維數組知識點(1) 先定義,再引用。(2) 二維數組中的元素,需要通過其所在的行和列來唯一確定。(3) 行、列下標均為整型表達式,行下標取值范圍:0~行長度-1;列下標取值范圍:0~列長度-1,不在這個范圍內的下標值為越界,越界會導致溢出。上溢或者下溢會導致程序出現不可預料的錯誤。(4) 只能逐個引用數組元素,不能一次性引用整個數組。對數組元素的引用是自由的,通過數組名和元素的行下標、列下標可唯一確定一個數組元素。在引用,需要給定該元素的行下標和列下標。第一個[]中的數值為元素的行下標。第二個[]中數值為元素的列下標。2、二維數組的引用二維數組中各個元素的引用方式:
數組名[元素的行下標][元素的列下標];7.2.1二維數組知識點舉例:intrect[4][3];//定義了一個4行3列的二維數組rect,共4*3=12個元素。一維數組rect[0]一維數組rect[1]一維數組rect[2]一維數組rect[3]二維數組邏輯存儲方式0行1232、二維數組的引用二維數組中各個元素的引用方式:
數組名[元素的行下標][元素的列下標];7.2.1二維數組知識點舉例:intrect[4][3];//定義了一個4行3列的二維數組rect,共4*3=12個元素。二維數組按行存儲示意圖rect[0][0]rect[0][1]rect[0][2]rect[1][0]rect[1][1]rect[1][2]rect[2][0]rect[2][1]rect[2][2]rect[3][0]rect[3][1]rect[3][2]rect[0]
rect[1]
rect[2]
rect[3]在實際內存中的存放方式是按行存儲3、二維數組的初始化(1)在定義數組時初始化
數據類型名數組名[行長度][列長度]={元素初值表};7.2.1二維數組知識點根據元素初值表中給出的元素的個數,分三種情況為數組進行初始化:①元素初值表給所有元素賦值②元素初值表給部分元素賦值③沒有元素初值表3、二維數組的初始化(1)在定義數組時初始化
數據類型名數組名[行長度][列長度]={元素初值表};7.2.1二維數組知識點①元素初值表給所有元素賦值舉例1:
intrect[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};該行代碼采用按行分段賦值的方法對rect數組進行初始化。12345678910111201230123、二維數組的初始化(1)在定義數組時初始化
數據類型名數組名[行長度][列長度]={元素初值表};7.2.1二維數組知識點①元素初值表給所有元素賦值舉例2:
intrect[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
第0行所有元素
第1行所有元素
第2行所有元素該行代碼采用先按行再按列連續賦值的方法對rect數組進行初始化。123456789101112
0123
012在定義數組時如果對所有元素賦值,可以省略行長度。3、二維數組的初始化(1)在定義數組時初始化
數據類型名數組名[行長度][列長度]={元素初值表};7.2.1二維數組知識點②元素初值表給部分元素賦值若按行連續賦值,則將初始表中給出的初值先按行再按列依次賦值給數組元素,其余元素自動賦值為0。舉例:intrect[3][4]={1,2,3,4,5,6};12345600000001230123、二維數組的初始化(1)在定義數組時初始化
數據類型名數組名[行長度][列長度]={元素初值表};7.2.1二維數組知識點②元素初值表給部分元素賦值按行分段賦值,舉例:
intrect[3][4]={{1,2,3,4},{5,6}};
第0行元素
第1行的元素
intrect[10][10]={8};
intrect[3][4]={0};//所有元素賦值為0123456000000
0123
0123、二維數組的初始化(1)在定義數組時初始化
數據類型名數組名[行長度][列長度]={元素初值表};7.2.1二維數組知識點③沒有元素初值表分兩種情況:普通數組intarr[2][3];
//動態數組,所有元素的值是一個隨機值。定義時加上static關鍵字的靜態數組staticintarr[2][3];//若沒有對靜態數組元素賦初值,所有元素自動被賦初值0。3、二維數組的初始化(2)在定義數組后,單獨對數組元素賦值7.2.1二維數組知識點此時需要挨個為數組元素賦值,可以一個一個元素賦值,也可以用雙重循環賦值。舉例:intarr[2][3];arr[0][0]=80,arr[0][1]=90,arr[0][2]=85,arr[1][0]=78,arr[1][1]=94,arr[1][2]=75;4、多維數組7.2.1二維數組知識點在前面講解二維數組的引用時,我們講到二維數組可以理解為多個一維數組,C語言允許這樣解釋。同樣的,多維數組可以由二維數組類推而得到,此書不再講解多維數組的問題。一維數組rect[0]一維數組rect[1]一維數組rect[2]一維數組rect[3]二維數組邏輯存儲方式0行123案例分析二維數組的編程方法7.2.3判斷下三角矩陣7.2.4求矩陣每行的最大值,以及每列的最小值演示遍歷二維數組中每個元素的方法分別用行下標、列下標作為外層循環對矩陣的不同訪問。行列下表作為循環變量,雙層循環,遍歷數組演示矩陣的下三角位置行列下標的關系。7.2.2二維數組案例分析7.2.2數據a與矩陣相乘二維數組的編程:二維數組涉及到兩個下標,將數組行下標和列下標分別作為循環變量,雙重循環,遍歷數組。行下標作為外循環變量、列下標作為內循環變量,就會按照行來遍歷數組;相反的,就會按照列來遍歷數組。C語言中二維數組是按行存儲的,按行遍歷數組,程序執行效率最高。7.2.2二維數組案例分析案例7.2.2:將一個數a與矩陣相乘,并將結果保存到二維數組中,然后輸出。要求:輸入第一行為三個整數a、m和n,中間用空格隔開,m和n分別為矩陣的行和列(1≤m,n≤10)。隨后的m行,每行輸入n個整數,每個整數間用空格隔開。輸出a與該矩陣相乘后的矩陣,并保存到二維數組中,然后輸出。問題分析:在輸入時,矩陣中的元素值是按行給出的,所以在讀取矩陣中的元素值,也是要按行存放在二維數組中,按行存放時,行下標作為外循環變量,列下標作為內循環變量。7.2.2二維數組案例分析#include<stdio.h>intmain(){ intrect[10][10]={0}; inta,m,n,i,j,value; scanf("%d",&a); scanf("%d%d",&m,&n); for(i=0;i<m;i++){
for(j=0;j<n;j++){//按行來讀取矩陣中的數據
scanf("%d",&value);/*將矩陣中的所有元素*a后存在相應位置的二維數組中*/ rect[i][j]=a*value;
} } for(i=0;i<m;i++){
for(j=0;j<n;j++)//將第i行所有元素輸出,中間用空格隔開 printf("%d",rect[i][j]);
//當第i行的所有元素輸出后,需要換行,準備下一次循環輸出第i+1行的元素
printf("\n"); } return0;}運行結果:輸入:232↙12↙34↙5
6↙輸出:24681012運行結果案例7.2.2程序代碼7.2.2二維數組案例分析案例7.2.3:判斷下三角矩陣要求:輸入第一行為一個整數m(1≤m≤10),表示方陣的行數和列數。隨后m行數據,每一行都有m個整數,用空格隔開,試判斷該方陣是否為下三角矩陣:如果一個方陣的主對角線上方的元素全部為0,這個矩陣就成為下三角矩陣。7.2.2二維數組案例分析用二維數組a表示m*m方陣時,行下標i、列下標j對應關系:a[0][0]a[0][1]a[0][2]
a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]主對角線:i==j副對角線:i+j==m-1上三角:i<=j下三角:i>=j#include<stdio.h>#defineMAX10intmain(){ intrect[MAX][MAX]={0}; intm,i,j; intflag=1;
//flag為1:為下三角矩陣,flag為0:不為下三角矩陣。 scanf("%d",&m); for(i=0;i<m;i++){ for(j=0;j<m;j++)
//按行來讀取矩陣中元素,并存在數組中 scanf("%d",&rect[i][j]); } for(i=0;i<m;i++){ for(j=i+1;j<m;j++){ if(rect[i][j]!=0){ flag=0; break; } } } if(flag==1) printf("lowertriangularmatrix!"); else printf("notlowertriangularmatrix!"); return0;}運行結果1:5↙10000↙10000↙12000↙12300↙12340↙lowertriangularmatrix!運行結果2:5↙10010↙10010↙12000↙12300↙12340↙notlowertriangularmatrix!運行結果案例7.2.3程序代碼7.2.2二維數組案例分析若刪除break,結果如何?案例7.2.4:求矩陣每行的最大值,以及每列的最小值要求:輸入第一行為兩個整數m和n(1≤m,n≤10),表示矩陣的行數和列數。隨后m行數據,每一行都有n個整數,用空格隔開,試輸出該矩陣每行的最大值,以及每列的最小值。
問題分析:用二維數組來保存此矩陣,該矩陣有m行n列,那么共有m個最大值,n個最小值,所以可以定義兩個數組max和min來保存所有的最大值和最小值。其中求每行最大值時,需要先按行遍歷二維數組,求每列最小值時,需要按列遍歷二維數組。7.2.2二維數組案例分析#include<stdio.h>#defineMAX10intmain(){
intrect[MAX][MAX];
//max保存每行最大值,min保存每列最小值inti,j,m,n,max[MAX]={0},min[MAX]={0};scanf("%d%d",&m,&n);for(i=0;i<m;i++){//讀取矩陣,保存到二維數組中for(j=0;j<n;j++)scanf("%d",&rect[i][j]);}
/*求每一行的最大值存到max數組中,共m行,所以max數組中有m個值*/for(i=0;i<m;i++){//先假設第i行的第0列元素最大,再和后面列的數據進行比較max[i]=rect[i][0];for(j=1;j<n;j++){if(max[i]<rect[i][j])max[i]=rect[i][j];}}
案例7.2.4程序代碼7.2.2二維數組案例分析
/*求每一列的最小值存到min數組中,共n列,mim數組中有n個值*/for(j=0;j<n;j++){min[j]=rect[0][j];for(i=1;i<m;i++)if(min[j]>rect[i][j])min[j]=rect[i][j];}printf("每行最大值如下:");for(i=0;i<m;i++) printf("%d",max[i]);printf("\n每列最小值如下:");for(i=0;i<n;i++) printf("%d",min[i]);return0;}運行結果1:45↙34539↙1020487↙2454913↙634547↙每行最大值如下:9202434每列最小值如下:34437運行結果//有錯誤的源程序#include<stdio.h>intmain(){ intarray[10][10]={0}; intflag;//標記是否存在k intm,n,k,i,j; scanf("%d%d%d",&m,&n,&k); for(i=0;i<m;i++){ for(j=0;j<n;j++){ scanf("%d",&array[i][j]); if(array[i][j]==k){ flag=1; printf("%d%d\n",i,j); } } } if(flag==0) printf("不存在%d這個數",k); return0;}7.2.3二維數組練習題課堂練習題7.2.1:程序調試題,請查找下面程序中的邏輯錯誤。輸入三個整數m,n,k,其中m表示二維數組的行數,n表示二維數組的列數,k表示要查找的數據;隨后輸入m行n列數據,請輸出m行n列的數據中是否存在k這個數據,如果存在輸出第一次出現k時的行列號(從0開始計數)。輸入:2510345107891031輸出:03課堂練習題7.2.3:矩陣循環左移輸入兩個正整數n和m,其中n表示方陣的行列數,m表示矩陣中每個元素左移的位數,隨后輸入n行n列的數據。請輸出左移m位后的方陣。舉例: 輸入: 42 1234 5678 8372 5127 輸出: 3412 7856 7283 27517.2.3二維數組練習題課堂練習題7.2.2:找矩陣中的是否存在某個元素,該元素是所在行最大值、所在列最大值。輸入兩個正整數,m和n分別表示矩陣的行數和列數,隨后輸入m行n列的數據,請找出該矩陣中是否存某個元素:既是其所在行的最大值,又是其所在列的最大值),如果有鞍點,則輸出其所在的行列號。(本練習題基于案例7.2.3來解決)7.3字符數組123一維字符數組字符串和字符數組的關系字符串結束符字符數組的輸入和輸出方式字符串處理函數二維字符數組知識點案例7.3.1案例7.3.2案例7.3.3案例分析練習字符數組的使用練習題1、一維字符數組存放了字符的數組就是字符數組。只有一個下標的就是一維字符數組。定義、初始化、引用都與其他類型的一維數組是一樣的。舉例:
chart[8]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’};等價于:t[0]=‘H’,t[1]=‘e’,t[2]=‘l’,t[3]=‘l’,t[4]=‘o’,t[5]=‘’,t[6]=‘C’,t[7]=‘!’。charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};等價于:str[0]=‘H’,str[1]=‘e’,str[2]=‘l’,str[3]=‘l’,str[4]=‘o’,str[5]=‘’,str[6]=‘C’,str[7]=‘!’,str[8]=‘\0’較t數組,多了一個‘\0’字符,該字符的ASCII值為0在C語言的字符串處理中,‘\0’字符作為字符串的結束。7.3.1字符數組知識點字符數組名還是字符數組的地址,即首字符的地址。2、字符串與字符數組的關系字符串就是一組連續的字符的集合,它有一個結束標志‘\0’。使用一維字符數組來存儲字符串。一維字符數組并不一定是字符串,主要在于一維字符數組中是否在所有字符后保存一個結束符‘\0’。舉例:
若要保存”HelloC!”這個字符串常量,除了HelloC!這8個字符外,還有一個結束符‘\0’charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};7.3.1字符數組知識點2、字符串與字符數組的關系舉例:
chart[8]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’};charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};字符數組str的有效長度:8
7.3.1字符數組知識點str和t數組的區別是什么?t數組沒有保存‘\0’,它僅是一個字符數組.str不僅是一個字符數組,它還可以作為一個字符串。str的實際大小:93、字符串結束符訪問內存中的一個字符串,需要知道
。'\0'意味著字符串的結束。charstr[9]={‘H’,’e’,’l’,’l’,’o’,’’,’C’,’!’,’\0’};C語言在處理字符串時,會從前往后逐個掃描字符,直到遇到第一個'\0'就認為到達了字符串的末尾,結束處理。7.3.1字符數組知識點字符串的地址+字符串的結束符#include<stdio.h>intmain(){inti;chars[17]="HelloCprogram!";//先給所有元素賦初值 printf("%s\n",s);s[0]='H';s[1]='a';s[2]='p';s[3]='p';s[4]='y';
s[5]='\0';
for(i=0;i<16;i++){//輸出s字符數組中所有元素putchar(s[i]);;}
printf("\n");printf("%s\n",s);//將s作為一個字符串來處理return0;}運行結果舉例,理解結束符7.3.1字符數組知識點HelloCprogram!HappyCprogram!Happy'\0'在輸出時不顯示內容。4、字符數組的輸入和輸出分為兩種:7.3.1字符數組知識點①逐個元素的處理②整個數組一次性處理4、字符數組的輸入和輸出7.3.1字符數組知識點①逐個元素的處理涉及到的函數為:scanf()、printf()、getchar()、putchar(),使用這四個函數時需要添加stdio.h。在scanf()和printf()中使用格式控制說明符%c來進行單個字符的輸入和輸出。getchar()讀取單個字符,并且只能讀取單個字符。putchar()輸出單個字符,并且只能輸出單個字符。舉例:charch;scanf("%c",&ch);//從鍵盤中讀取一個字符,并存到變量ch中printf("%c",'A');//輸出一個字符'A',也可輸出一個字符變量ch=getchar();//從鍵盤中讀取一個字符,并存到變量ch中putchar(ch);//輸出一個字符變量,也可以輸出字符常量4、字符數組的輸入和輸出7.3.1字符數組知識點②整個數組一次性處理涉及到的函數為:scanf()、printf()、gets()、puts()。在scanf()和printf()中使用格式控制說明符%s來進行字符串的輸入和輸出。scanf遇到空格、tab鍵或者回車便停止讀取字符。gets()讀取一行字符串。gets()在讀取時,只要不遇到換行符就會一直讀取,即使遇到多個空格,也不會停止讀取。puts()輸出字符串并換行。舉例:charstr[10]={'\0'};scanf("%s",str);gets(str);puts(str);4、字符數組的輸入和輸出7.3.1字符數組知識點②整個數組一次性處理scanf()遇到空格、制表符tab或者換行符停止讀取;gets()只會在遇到換行符’\n’停止讀取。區別#include<stdio.h>intmain(){inti;chars[40];
scanf("%s",s); printf("%s\n",s);return0;}運行結果:WeareClanguagelearners.↙We使用scanf()讀取字符串#include<stdio.h>intmain(){inti;chars[40];
gets(s); printf("%s\n",s);return0;}
運行結果:WeareClanguagelearners.↙WeareClanguagelearners.gets()讀取字符串5、字符數組串處理函數7.3.1字符數組知識點常見的處理函數,包含在string.h頭文件中。strlen()計算字符串有效長度strcmp()字符串比較strcat()字符串拼接函數strcpy()字符串拷貝函數strstr()字串查找函數需要#include<string.h>5、字符數組串處理函數7.3.1字符數組知識點(1)strlen計算字符串有效長度字符串包含兩個部分:一組連續的字符序列和結束符’\0’,strlen()返回的是連續字符的個數。#include<stdio.h>intmain(){ charstr1[30]={"HelloClanguage!"}; charstr2[30]={"language"}; charstr3[10]="C++"; printf("%d\n",strlen(str1)); printf("%d\n",strlen(str2)); printf("%d\n",strlen(str3)); return0;}運行結果:17835、字符數組串處理函數7.3.1字符數組知識點(2)strcmp字符串比較函數strcmp(str1,str2)用于比較兩個字符串大小,自左往右逐個字符的ASCII碼值進行比較,直到出現不同的字符或者遇到‘\0’,其中str1和str2為字符串。0(當str1和str2中的字符完全一樣時,str1等于str2)strcmp(str1,str2)
返回
正數
(當str1>str2)
負數
(當str1<str2)5、字符數組串處理函數7.3.1字符數組知識點(2)strcmp字符串比較函數舉例:#include<stdio.h>intmain(){ charstr1[]="Abc";//如果對全部元素賦值,數組長度可以省略 charstr2[]="Abc"; charstr3[]="Acd"; charstr4[]="Bbca"; charstr5[]="Bbc"; printf("str1VSstr2is%d\n",strcmp(str1,str2)); printf("str1VSstr3is%d\n",strcmp(str1,str3)); printf("str3VSstr4is%d\n",strcmp(str3,str4)); printf("str4VSstr5is%d",strcmp(str4,str5)); return0;}運行結果:str1VSstr2is0str1VSstr3is-1str3VSstr4is-1str4VSstr5is15、字符數組串處理函數7.3.1字符數組知識點(3)strcat字符串拼接函數strcat(str1,str2)用于將str2拼接到str1后面,并返回str1,其中str1和str2為字符串。注意:該函數要求str1的字符數組長度要夠長,能夠放下str1的有效字符+str2的有效字符+一個結束符。5、字符數組串處理函數7.3.1字符數組知識點(3)strcat字符串拼接函數舉例:#include<stdio.h>intmain(){ charstr1[30]={"Hello"}; charstr2[5]={"C"}; charstr3[10]={"language!"};
strcat(str1,str2); printf("str1:%s\n",str1);//str1中拼接了str2的內容 printf("str2:%s\n",str2);//str2字符串內容不變 strcat(str1,str3); printf("str1:%s",str1); return0;}運行結果:str1:HelloCstr2:Cstr1:HelloClanguage!5、字符數組串處理函數7.3.1字符數組知識點(4)strcpy字符串拷貝函數strcpy(str1,str2)用于將str2中的內容拷貝到str1中,會清除str1中原有的字符。注意:str1字符數組的大小要足夠大能容納str2數組中的字符,否則出現越界的現象。5、字符數組串處理函數7.3.1字符數組知識點(4)strcpy字符串拷貝函數舉例:#include<stdio.h>intmain(){ charstr1[30]={"Hello"}; charstr2[30]={"Language"}; printf("before:str1:%s\n",str1); strcpy(str1,str2); printf("after:str1:%s\n",str1); return0;}運行結果:before:str1:Helloafter:str1:Language5、字符數組串處理函數7.3.1字符數組知識點(5)strstr字串查找函數strstr(str1,str2)用于判斷str1是否含有str2這個字符串。如果有,str2則被稱為str1的子串。該函數返回指向str1中str2第一個出現的位置的指針;如果str2不是sr1的子串,則返回NULL。5、字符數組串處理函數7.3.1字符數組知識點(5)strstr字串查找函數舉例:#include<stdio.h>intmain(){ charstr1[30]={"HelloClanguage!"}; charstr2[30]={"language"}; charstr3[10]="C++"; char*p=strstr(str1,str2); printf("%s\n",p);//p指向str1中從'l'開始的"language"子串 printf("%d",strstr(str1,str3)==NULL);//str3不是str1的子串,所以strstr返回NULL return0;}運行結果:language!16、二維字符數組7.3.1字符數組知識點二維字符數組,可以理解為多個一維字符數組,如果一維字符數組中存放的是學生姓名,那二維數組就可以存放多個學生的姓名,其初始化、引用都和二維數組一樣。舉例:charname[3][20]={{“Peter”},{“Tom”},{“Emily”}};3行20列,表示3個一維字符數組(每個數組最多20個字符),可以保存3個字符串。name[0]name[1]name[2]案例7.3.1:查找特定的字符要求:本例包含兩行輸入,輸入第一行是一串以回車符結束的字符串str(不超過50個字符),第二行是要查找的字符ch。如果在給定的字符串str中找到了字符ch,則輸出在str中最先出現ch的下標(從0開始計數);若未找到,則輸出“NotFound!”7.3.2字符數組案例分析str數組的長度應該定義為多少?#include<stdio.h>intmain(){inti,flag=0;//flag為0表示沒有找到charstr[51]={'\0'},ch;gets(str);ch=getchar();for(i=0;str[i]!='\0';i++){if(ch==str[i]){flag=1;printf("Thefirstindexof%cis%d",ch,i);break;}}if(flag==0){printf("NotFound!");}}運行結果:Lifeislikeaboxofchocolates↙l↙Thefirstindexoflis8運行結果案例7.3.1程序代碼7.3.2字符數組案例分析案例7.3.2:刪除重復數字字符要求:輸入是一串以回車符結束的字符串str(不超過80個字符),編寫程序將str字符串重復的數字字符刪除,其他字符原樣輸出。問題分析:(1)定義長度為10的number數組來保存某個數字是否出現過。比如,若6出現過,則number[6]為1,若6沒有出現,則number[6]為0;所以number[0]、number[1]、number[2]…number[9]依次表示數字0、1、2…9是否出現過,元素值為1表示出現過,元素值為0表示沒出現過。(2)在后續輸出str時,對于其中的數字字符,先轉化為相應的數字,再判斷number[該數字]的值是否為0,為0表示沒出現過,便可以直接輸出。7.3.2字符數組案例分析#include<stdio.h>intmain(){inti,number[10]={0};//標記某個數字是否出現過charstr[81]={'\0'};gets(str);for(i=0;str[i]!='\0';i++){if(str[i]>='0'&&str[i]<='9'){intindex=str[i]-'0';//數字字符轉對應數字if(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物材料與組織工程-全面剖析
- 2020-2021學年湖北省武漢市華中師大一附中高二下學期期中語文試題
- 智能工廠中的柔性生產策略優化-全面剖析
- 皮革抑菌材料改性研究-全面剖析
- 燈箱翻新施工方案
- 足球健身中心行業深度調研及發展戰略咨詢報告
- 自我成長類圖書出版行業深度調研及發展戰略咨詢報告
- 航天技術類博物館在線平臺行業深度調研及發展戰略咨詢報告
- 茶藝師培訓在線平臺行業深度調研及發展戰略咨詢報告
- 營養素水平檢查行業跨境出海戰略研究報告
- 校長在中考復習備考研討會上講話:聚焦中考命題核心!靶向突破薄弱環節
- 2025年湖北省八市高三(3月)聯考化學
- 健康管理師的心理健康指導試題及答案
- 3.2《做自尊的人》課件-2024-2025學年統編版道德與法治七年級下冊
- 德育測試試題及答案
- 設計院掛靠合作協議書范本
- 2025年中國電子信息產業集團有限公司招聘筆試參考題庫含答案解析
- 2025年江蘇省職業院校技能大賽高職組(智慧物流)參考試題庫資料及答案
- 上海市松江區屆2024-2025學年高三上學期一模考試歷史試題(解析版)
- 2025年浙江省高職單招《職業適應性測試》高頻必練考試題(附答案)
- 《影視照明技術》課件:照亮影視作品的靈魂
評論
0/150
提交評論