版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章
數(shù)組與指針基礎(chǔ)
數(shù)組1輸出所有大于平均值的數(shù)2找出矩陣中最大值所在的位置3判斷回文本章要點(diǎn)什么是數(shù)組?為什么要使用數(shù)組?如何定義數(shù)組?如何引用數(shù)組元素?二維數(shù)組的元素在內(nèi)存中按什么方式存放?什么是字符串?字符串結(jié)束符的作用是什么?如何實(shí)現(xiàn)字符串的存儲和操作,包括字符串的輸入和輸出?怎樣理解C語言將字符串作為一個特殊的一維字符數(shù)組?例
輸入10個整數(shù),計(jì)算這些數(shù)的平均值,再輸出所有大于平均值的數(shù)。1.1程序解析1.2一維數(shù)組的定義和引用1.3一維數(shù)組的初始化1.4使用一維數(shù)組編程1
輸出所有大于平均值的數(shù)1.1程序解析-輸出大于均值的數(shù)intmain(void){
inti;doubleaverage,sum;/*average存放平均值*/
int
a[10]; /*定義1個數(shù)組a,它有10個整型元素*/
printf("Enter10integers:");
sum=0;
for(
i=0;i<10;i++
){scanf(
"%d",&a[i]
);sum=sum+a[i];
}average=sum/10;
printf
(
"average=%.2f\n",average
);
printf
(
">average:"
);
for(
i=0;i<10;i++
){if(
a[i]>average
)
printf(
"%d",a[i]
);
}
printf
(
"\n"
);
return0;}Enter
10integers:55
23
8
1122890-178186average=47.10>average:5589781860123456789552381122890-178186for(
i=0;i<10;i++
){scanf(
"%d",&a[i]
);sum=sum+a[i];}a
a[0]a[1]
a[9]數(shù)組數(shù)組:相同類型數(shù)據(jù)的有序集合,在內(nèi)存中連續(xù)存放。由數(shù)組名和下標(biāo)惟一地確定每個數(shù)組元素每個元素都屬于同一類型一批相同類型的變量使用同一個數(shù)組變量名,用下標(biāo)來相互區(qū)分。優(yōu)點(diǎn):表述簡潔,可讀性高;便于使用循環(huán)結(jié)構(gòu)1.2一維數(shù)組的定義和引用(1)定義
類型名
數(shù)組名
[數(shù)組長度]類型名:數(shù)組元素的類型數(shù)組名:數(shù)組(變量)的名稱,標(biāo)識符數(shù)組長度:常量表達(dá)式,給定數(shù)組的大小inta[10];
定義一個含有10個整型元素的數(shù)組acharc[200];定義一個含有200個字符元素的數(shù)組cfloatf[5];定義一個含有5個浮點(diǎn)型元素的數(shù)組f數(shù)組長度為常量(2)數(shù)組的內(nèi)存結(jié)構(gòu)內(nèi)存地址下標(biāo)值40289402684024740226402054018440163401424012140100aint
a[10];假設(shè)系統(tǒng)規(guī)定int類型占用2個字節(jié),則對于數(shù)組a,其內(nèi)存分配形式只要知道了數(shù)組第一個元素的地址以及每個元素所需的字節(jié)數(shù),其余各個元素的存儲地址均可計(jì)算得到。數(shù)組名是一個地址常量,存放數(shù)組內(nèi)存空間的首地址。(3)引用先定義,后使用只能引用單個的數(shù)組元素,不能一次引用整個數(shù)組inta[10];10個數(shù)組元素:a[0]、a[1]、……a[9]數(shù)組元素:數(shù)組名[下標(biāo)]下標(biāo):整型表達(dá)式下標(biāo)取值范圍:[0,數(shù)組長度-1]數(shù)組元素的使用方法與同類型的變量相同scanf("%d",&a[i]);sum=sum+a[i];printf("%d",a[i]);下標(biāo)不要越界不能使用a[10]定義數(shù)組類型名數(shù)組名[數(shù)組長度]引用數(shù)組元素?cái)?shù)組名[下標(biāo)]inta[10];a[0]=a[9]=0;a[i]=i;區(qū)分?jǐn)?shù)組的定義和數(shù)組元素的引用下標(biāo)不要越界數(shù)組長度為常量1.3一維數(shù)組的初始化定義數(shù)組時,對數(shù)組元素賦初值類型名數(shù)組名[數(shù)組長度]={初值表};inta[10]={1,2,3,4,5,6,7,8,9,10};a[0]=1,a[1]=2,...…a[9]=10靜態(tài)數(shù)組、動態(tài)數(shù)組的初始化staticintb[5]={1,2,3,4,5};靜態(tài)存儲的數(shù)組如果沒有初始化,所有元素自動賦0staticintb[5];動態(tài)存儲的數(shù)組如果沒有初始化,所有元素為隨機(jī)值autointc[5];等價與intc[5];staticintb[5]={1,2,3};b[0]=1,b[1]=2,b[2]=3,b[3]=0,b[4]=0autointfib[20]={0,1};fib[0]=0,fib[1]=1,其余元素不確定如果對全部元素都賦初值,可以省略數(shù)組長度inta[10]={0,1,2,3,4,5,6,7,8,9}針對部分元素的初始化建議不要省略數(shù)組長度1.4使用一維數(shù)組編程數(shù)組和循環(huán)for(i=0;i<n;i++)
printf("%d",a[i]);數(shù)組下標(biāo)作為循環(huán)變量,通過循環(huán),逐個處理數(shù)組元素
一維數(shù)組示例例
用數(shù)組計(jì)算fibonacci數(shù)列的前10個數(shù),并按每行打印5個數(shù)的格式輸出。1,1,2,3,5,……例
順序查找法。輸入5個整數(shù),將它們存入數(shù)組a中,再輸入1個數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的最小下標(biāo),否則,輸出“NotFound”。例
輸入n(n<10),再輸入n個數(shù)(1)輸出最小值和它所對應(yīng)的下標(biāo)(2)將最小值與第一個數(shù)交換,輸出交換后的n個數(shù)例
選擇排序法。輸入一個n(1<n≤10),再輸入n個整數(shù),用選擇法將它們從小到大排序后輸出。例
調(diào)查電視節(jié)目歡迎程度。某電視臺要進(jìn)行一次對該臺8個欄目(設(shè)相應(yīng)欄目編號為1~8)的受歡迎情況,共調(diào)查了1000位觀眾,現(xiàn)要求編寫程序,輸入每一位觀眾的投票,每位觀眾只能選擇一個最喜歡的欄目投票,統(tǒng)計(jì)輸出各欄目的得票情況。補(bǔ)充二分查找法。設(shè)已有一個10個元素的整形數(shù)組a,且按值從小到大有序。輸入一個整數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。用數(shù)組計(jì)算fibonacci數(shù)列的前10個數(shù),并按每行打印5個數(shù)的格式輸出。1,1,2,3,5,8,13,……用數(shù)組計(jì)算并存放fibonacci數(shù)列的前10個數(shù)f[0]=f[1]=1f[n]=f[n-1]+f[n-2]2≤n≤9例
計(jì)算fibonacci數(shù)列#include<stdio.h>intmain(void){inti;intfib[10]={1,1};/*數(shù)組初始化*/for(i=2;i<10;i++)
fib[i]=fib[i-1]+fib[i-2];
for(i=0;i<10;i++){printf("%6d",fib[i]);if((i+1)%5==0)/*5個數(shù)換行*/printf("\n");}return0;}
源程序11235813213455輸入5個整數(shù),將它們存入數(shù)組a中,再輸入1個數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。輸入:298199輸出:1輸入:298167輸出:NotFound例
在數(shù)組中查找一個給定的數(shù)#include<stdio.h>intmain(void){inti,flag,x;inta[5];printf("Enter5integers:“);for(i=0;i<5;i++)scanf("%d",&a[i]);printf("Enterx:“);scanf("%d",&x);
flag=0;
for(i=0;i<5;i++)if(a[i]==x){printf("Indexis%d\n",i);flag=1;
break;}
if(flag==0)
printf("NotFound\n");return0;}
源程序Enter5integers:29819Enterx:9Indexis1Enter5integers:29819Enterx:7NotFoundflag的作用?#include<stdio.h>intmain(void){inti,flag,x;inta[5];printf(“Enter5integers:");for(i=0;i<5;i++)scanf("%d",&a[i]);printf(“Enterx:");scanf("%d",&x);flag=0;
for(i=0;i<5;i++)if(a[i]==x){printf("Indexis%d\n",i);flag=1;break;}
if(flag==0)
printf("NotFound\n");return0;}
思考(1)Enter5integers:29819Enterx:9Indexis1Indexis4去掉break語句,結(jié)果?#include<stdio.h>intmain(void){inti,sub,x;inta[5];printf(“Enter5integers:");for(i=0;i<5;i++)scanf("%d",&a[i]);printf(“Enterx:");scanf("%d",&x);sub=-1;
for(i=0;i<5;i++)if(a[i]==x)sub=i;
if(sub!=-1)printf("Indexis%d\n",sub);
elseprintf("NotFound\n");return0;}思考(2)Enter5integers:29819Enterx:9Indexis4sub的作用?#include<stdio.h>intmain(void){inti,min,n;inta[10];printf(“Entern:");scanf("%d",&n);printf(“Enter%dintegers:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);
min=a[0];for(i=1;i<n;i++)if(a[i]<min)min=a[i];printf("minis%d\n",min);return0;}例
求最小值Entern:6Enter6integers:29-1816minis-1方法??!雖得到了最小值,但不能確定最小值所在下標(biāo)!輸入n(n<10),再輸入n個數(shù),輸出最小值和它所對應(yīng)的下標(biāo)。用index記錄最小值對應(yīng)的下標(biāo)a[index]就是最小值(1)求最小值及其下標(biāo)流程圖#include<stdio.h>intmain(void){inti,index,n;inta[10];printf(“Entern:");scanf("%d",&n);printf(“Enter%dintegers:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);
index=0;for(i=1;i<n;i++)if(a[i]<a[index])index=i;
printf("minis%d\tsubis%d\n",a[index],index);return0;}求最小值及下標(biāo)Entern:6Enter6integers:29-1816minis-1subis2
輸入n(n<10),再輸入n個數(shù),將最小值與第一個數(shù)交換,輸出交換后的n個數(shù)。用index記錄最小值對應(yīng)的下標(biāo)a[index]就是最小值最小值與第一個數(shù)交換a[index]<==>a[0](2)交換最小值例
選擇法排序輸入n(n<10),再輸入n個數(shù),用選擇法將它們從小到大排序后輸出。設(shè)n=5,輸入為:35281第1次:15283第2次:2583第3次:385第4次:580123435281下標(biāo)值35281(n=5)5個數(shù)(a[0]~a[4])中找最小數(shù),與a[0]交換(1)15283a[4]<==>a[0]4個數(shù)(a[1]~a[4])中找最小數(shù),與a[1]交換(2)12583a[2]<==>a[1]3個數(shù)(a[2]~a[4])中找最小數(shù),與a[2]交換(3)12385a[4]<==>a[2]2個數(shù)(a[3]~a[4])中找最小數(shù),與a[3]交換(4)12358a[4]<==>a[3]選擇法(1)(1)n個數(shù)(a[0]~a[n-1])中找最小數(shù),與a[0]交換(2)n-1個數(shù)(a[1]~a[n-1])中找最小數(shù),與a[1]交換……(n-1)2個數(shù)(a[n-2]~a[n-1])中找最小數(shù),與a[n-2]交換(1)5個數(shù)(a[0]~a[4])中找最小數(shù),與a[0]交換(2)4個數(shù)(a[1]~a[4])中找最小數(shù),與a[1]交換(3)3個數(shù)(a[2]~a[4])中找最小數(shù),與a[2]交換(4)2個數(shù)(a[3]~a[4])中找最小數(shù),與a[3]交換選擇法(2)n個數(shù)重復(fù)n-1次流程圖輸入數(shù)組ak=0k<n-1a[i]<a[index]index=i假(0)假(0)真(非0)真(非0)i=i+1交換a[index]和a[k]輸出數(shù)組aindex=ki=k+1k=k+1i<n假(0)外循環(huán)控制:n個數(shù)選擇排序共需要n-1次內(nèi)循環(huán)控制:在下標(biāo)范圍[k,n-1]內(nèi)找最小值所在位置index選擇法排序(程序段)for(k=0;k<n-1;k++){
index=k;for(i=k+1;i<n;i++)if(a[i]<a[index])index=i;temp=a[index];a[index]=a[k];a[k]=temp;}
Entern:5Enter10integers:35281Aftersorted:12358某電視臺要調(diào)查觀眾對該臺8個欄目(設(shè)相應(yīng)欄目編號為1~8)的受歡迎情況,共調(diào)查了1000位觀眾?,F(xiàn)要求編寫程序,輸入每一位觀眾的投票情況(每位觀眾只能選擇一個最喜歡的欄目投票),統(tǒng)計(jì)并輸出各欄目的得票情況。數(shù)組count
保存各欄目的得票數(shù)count[i]:記錄編號為i(1~8)的欄目的得票數(shù)count[i]++例
投票情況統(tǒng)計(jì)
源程序#include<stdio.h>intmain(void){
intcount[9];
inti,
response;for
(
i=1;
i<=8;
i++
)count[i]=0;/*各欄目計(jì)數(shù)器清0*/for
(i=1;
i<=1000;
i++){
printf
(
"Enteryourresponse:"
);scanf
(
"%d",
&response
);if
(
response>=1&&response<=8)
count[response]++;
else
printf("invalid:%d\n",response);
}printf
(
"result:\n“
);
for
(
i=1;
i<=8;
i++
)printf(
"%4d%4d\n",
i,
count[i]
);return0;}inputyourresponse:3inputyourresponse:6inputyourresponse:9thisisabadresponse:9inputyourresponse:8…result:122034…補(bǔ)充
二分法查找設(shè)已有一個10個元素的整形數(shù)組a,且按值從小到大有序排列。輸入一個整數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。例7-3順序的查找算法簡單明了,其查找過程就是對數(shù)組元素從頭到尾的遍歷過程。當(dāng)數(shù)組很大時,查找效率不高。二分查找的效率較高,前提是數(shù)組元素必須有序排列。二分法查找流程圖二分法查找(程序段)low=0;high=n-1;/*開始時查找區(qū)間為整個數(shù)組*/
while(low<=high){/*循環(huán)條件*/mid=(low+high)/2;/*中間位置*/if(x==a[mid])
break;/*查找成功,中止循環(huán)*/elseif(x<a[mid])high=mid-1;/*新查找區(qū)間為前半段,high前移*/elselow=mid+1;/*新查找區(qū)間為后半段,low后移*/}if(low<=high)printf("Indexis%d\n",mid);elseprintf("NotFound\n");將1個3*2的矩陣存入1個3*2的二維數(shù)組中,找出最大值以及它的行下標(biāo)和列下標(biāo),并輸出該矩陣。2.1程序解析2.2二維數(shù)組的定義和引用2.3二維數(shù)組的初始化2.4使用二維數(shù)組編程2找出矩陣中最大值所在的位置2.1程序解析-求矩陣的最大值例
將1個3*2的矩陣存入1個3*2的二維數(shù)組中,找出最大值以及它的行下標(biāo)和列下標(biāo),并輸出該矩陣。
row
記錄最大值的行下標(biāo)col最大值的列下標(biāo)a[row][col]就是最大值intmain(void){intcol,i,j,row;inta[3][2];printf(“Enter6integers:\n");for(i=0;i<3;i++)for(j=0;j<2;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%4d",a[i][j]);printf("\n");}
row=col=0;for(i=0;i<3;i++)for(j=0;j<2;j++)if(a[i][j]>a[row][col]){row=i;col=j;}printf("max=a[%d][%d]=%d\n",row,col,a[row][col]);return0;}
源程序Enter6integers:3210-96-13210-96-1max=a[1][0]=10二維數(shù)組多維數(shù)組的空間想象二維數(shù)組:一個表格或一個平面矩陣一維數(shù)組:一列長表或一個向量多維數(shù)組:多維空間的一個數(shù)據(jù)列陣三維數(shù)組:三維空間的一個方陣2.2二維數(shù)組的定義和引用(1)定義類型名
數(shù)組名[行長度][列長度]inta[3][2];定義1個二維數(shù)組a,3行2列,6個元素intb[5][10];定義1個二維數(shù)組a,5行10列,50個元素(2)引用先定義,后使用數(shù)組元素的引用:數(shù)組名[行下標(biāo)][列下標(biāo)]行下標(biāo)和列下標(biāo):整型表達(dá)式行下標(biāo)的取值范圍是[0,行長度-1]列下標(biāo)的取值范圍是[0,列長度-1]inta[3][2];3行2列,6個元素a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]下標(biāo)不要越界二維數(shù)組在內(nèi)存中的存放方式inta[3][2];3行2列,6個元素表示1個3行2列的矩陣a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二維數(shù)組的元素在內(nèi)存中按行/列方式存放a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]2.3二維數(shù)組的初始化(1)
分行賦初值inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};staticintb[4][3]={{1,2,3},{},{4,5}};數(shù)組a123456789數(shù)組b123000450000(2)順序賦初值
inta[3][3]={1,2,3,4,5,6,7,8,9}; staticintb[4][3]={1,2,3,0,0,0,4,5};省略行長度對全部元素都賦了初值,inta[][3]={1,2,3,4,5,6,7,8,9};或分行賦初值時,在初值表中列出了全部行staticintb[][3]={{1,2,3},{},{4,5},{}}數(shù)組a123456789數(shù)組b123000450000建議不要省略2.4使用二維數(shù)組編程行下標(biāo)和列下標(biāo)分別做為循環(huán)變量,通過二重循環(huán),遍歷二維數(shù)組通常將行下標(biāo)做為外循環(huán)的循環(huán)變量列下標(biāo)內(nèi)循環(huán)定義1個3*2的二維數(shù)組a,數(shù)組元素的值由下式給出,按矩陣的形式輸出a。a[i][j]=i+j(0≤i≤2,0≤j≤1)例
生成一個矩陣并輸出inta[3][2];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]011223#include<stdio.h>intmain(void){inti,j;inta[3][2];for(i=0;i<3;i++)for(j=0;j<2;j++)a[i][j]=i+j;for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%4d",a[i][j]);
printf("\n");}return0;}a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]i=0j=0i=0j=1i=1j=0i=1j=1i=2j=0i=2j=1
源程序011223二維數(shù)組的輸入示例中,inta[3][2];for(i=0;i<3;i++)for(j=0;j<2;j++)scanf("%d",&a[i][j]);a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]for(j=0;j<2;j++)for(i=0;i<3;i++)scanf("%d",&a[i][j]);Enter6integers:3210-96-13210-96-1max=a[1][0]=10Enter6integers:210-96-13-92610-1max=a[2][0]=10inta[N][N];N是正整數(shù)a[i][j]:i、j的取值范圍[0,N-1]用二維數(shù)組a表示N*N方陣時,對應(yīng)關(guān)系: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]下三角付對角線矩陣與二維數(shù)組i==ji<=ji>=ji+j==N-1輸入一個正整數(shù)n(1<n≤6),根據(jù)下式生成1個n*n的方陣,然后將該方陣轉(zhuǎn)置(行列互換)后輸出。a[i][j]=i*n+j+1(0≤i≤n-1,0≤j≤n-1)分析:inta[6][6];n=3時例
方陣轉(zhuǎn)置123456789147258369a[0][1]a[1][0]a[0][2]a[2][0]a[1][2]a[2][1]a[i][j]a[j][i]#include<stdio.h>intmain(void){inti,j,n,temp;inta[6][6];
printf("Entern:“);scanf("%d",&n);/*給二維數(shù)組賦值略……*//*行列互換*/for(i=0;i<n;i++)for(j=0;j<n;j++)if(i<=j){/*只遍歷上三角陣*/
temp=a[i][j];a[i][j]=a[j][i];a[j][i]=temp;}/*按矩陣的形式輸出a略……*/return0;}
源程序
/*行列互換*/for(i=0;i<n;i++)for(j=0;j<n;j++)if(i<=j){
temp=a[i][j];a[i][j]=a[j][i];a[j][i]=temp;}123456789主對角線:i==j上三角:i<=j下三角:i>=ji=0147256389i=1147258369說明for(j=i;j<n;j++)
/*行列互換*/for(i=0;i<n;i++)for(j=0;j<n;j++){
temp=a[i][j];a[i][j]=a[j][i];a[j][i]=temp;}123456789
思考i=0147256389i=1127458369i=2123456789例
日期計(jì)算自定義1個函數(shù)day_of_year(year,month,day),計(jì)算并返回年year、月month和日day對應(yīng)的是該年的第幾天。
day_of_year(2000,3,1)返回61day_of_year(1981,3,1)返回60分析:月0123……1112非閏年03128313031閏年03129313031inttab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}{0,31,29,31,30,31,30,31,31,30,31,30,31}}
源程序intday_of_year(intyear,intmonth,intday){intk,leap;inttab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}{0,31,29,31,30,31,30,31,31,30,31,30,31}};leap=(year%4==0&&year%100!=0)||year%400==0;for(k=1;k<month;k++)day=day+tab[leap][k];
returnday;}例
輸入一個以回車符為結(jié)束標(biāo)志的字符串(少于80個字符),判斷該字符串是否為回文。回文就是字符串中心對稱,如“abcba”、“abccba”是回文,“abcdba”不是回文。3.1程序解析3.2一維字符數(shù)組3.3字符串3.4使用字符串編程3判斷回文3.1程序解析-
判斷回文intmain(void){
inti,k;charline[80];
printf("Enterastring:");
k=0;while((line[k]=getchar())!='\n')k++;line[k]='\0';
i=0;/*i是字符串首字符的下標(biāo)*/k=k-1;/*k是字符串尾字符的下標(biāo)*/while(i<k){ if(line[i]!=line[k])break; i++; k--;}if(i>=k)
printf("Itisaplalindrome\n");else
printf("Itisnotaplalindrome\n");
return0;}Enterastring:abcbaItisaplalindrome
Enterastring:abcdbaItisnotaplalindrome
3.2一維字符數(shù)組字符串的存儲和運(yùn)算可以用一維字符數(shù)組實(shí)現(xiàn)一維字符數(shù)組的定義、引用、初始化與其他類型的一維數(shù)組一樣。charstr[80];
定義一個含有80個字符型元素的數(shù)組strchart[5]={'H','a','p','p','y'};初始化數(shù)組t
t[0]t[1]t[4]t
Happy輸出數(shù)組t的所有元素for(i=0;i<5;i++)putchar(t[i]);一維字符數(shù)組chart[5]={'H','a','p','p','y'};staticchars[6]={'H','a','p','p','y'};staticchars[6]={'H','a','p','p','y',0};0代表字符'\0',也就是ASCII碼為0的字符
staticchars[6]={'H','a','p','p','y','\0'};
s[0]s[1]s[5]s
Happy\0
t[0]t[1]t[4]t
Happy3.3字符串字符串常量用一對雙引號括起來的字符序列一個字符串結(jié)束符'\0'"Happy"6個字符'H''a''p''p''y''\0'有效字符字符串結(jié)束符字符串的有效長度:有效字符的個數(shù)字符串與一維字符數(shù)組字符串:一個特殊的一維字符數(shù)組把字符串放入一維字符數(shù)組(存儲)對字符串的操作===>對字符數(shù)組的操作(1)字符串的存儲-數(shù)組初始化字符串可以存放在一維字符數(shù)組中
staticchars[6]={'H','a','p','p','y','\0'};字符數(shù)組初始化:用字符串常量staticchars[6]={"Happy"};staticchars[6]="Happy";數(shù)組長度>=字符串的有效長度+1chart[5];"Happy"能存入t嗎?
s[0]s[1]s[5]s
Happy\0字符串的存儲autochars[80]="Happy";字符串遇'\0'結(jié)束第一個'\0'前面的所有字符和'\0'一起構(gòu)成了字符串"Happy"'\0'
之后的其他數(shù)組元素與該字符串無關(guān)
s[0]s[1]s[5]s
Happy\0
?
?字符串由有效字符和字符串結(jié)束符'\0'組成(2)對字符串的操作把字符串放入一維字符數(shù)組(存儲)對字符串的操作===>對字符數(shù)組的操作普通字符數(shù)組:數(shù)組元素的個數(shù)是確定的,一般用下標(biāo)控制循環(huán)字符串:沒有顯式地給出有效字符的個數(shù),只規(guī)定在字符串結(jié)束符
'\0'
之前的字符都是字符串的有效字符,一般用結(jié)束符
'\0'來控制循環(huán)循環(huán)條件:s[i]!='\0'for(i=0;s[i]!='\0';i++)putchar(s[i]);for(i=0;i<80;i++)putchar(s[i]);for(i=0;i<len;i++)putchar(s[i]);輸出字符串
s[0]s[1]s[5]s
Happy\0
??輸出?(3)字符串的存儲-賦值和輸入把字符串放入一維字符數(shù)組(存儲)對字符串的操作==>對字符數(shù)組的操作存儲數(shù)組初始化staticchars[6]="a";賦值s[0]='a';s[1]='\0';輸入'\0'代表空操作,無法輸入輸入時,設(shè)定一個輸入結(jié)束符將輸入結(jié)束符轉(zhuǎn)換為字符串結(jié)束符'\0'"a"2個字符'a'和'\0''a'1個字符常量區(qū)分"a"和'a'3.4使用字符串編程C語言將字符串作為一個特殊的一維字符數(shù)組來處理。存儲:把字符串放入一維字符數(shù)組數(shù)組初始化、賦值、輸入對字符串的操作==>對字符數(shù)組的操作對一維字符數(shù)組的操作:針對字符串的有效字符和字符串結(jié)束符檢測字符串結(jié)束符'\0'輸入一個以回車符為結(jié)束標(biāo)志的字符串(少于80個字符),統(tǒng)計(jì)其中數(shù)字字符('0'……'9')的個數(shù)。分析:數(shù)組長度取上限80以'\n'做為輸入結(jié)束符例
統(tǒng)計(jì)數(shù)字字符個數(shù)intmain(void){intcount,i;charstr[80];
printf("Enterastring:");i=0;while((str[i]=getchar())!='\n')i++;
str[i]='\0';/*輸入結(jié)束符=>字符串結(jié)束符*/count=0;for(i=0;str[i]!='\0';i++)if(str[i]<='9'&&str[i]>='0')count++;printf("count=%d\n",count);return0;}源程序字符串的輸入Enterastring:It‘s512count=3如何改變輸入結(jié)束符?能省略str[i]='\0'嗎?012345678sIt's512
\0
??輸入一個以回車符為結(jié)束標(biāo)志的字符串(少于10個字符),提取其中所有的數(shù)字字符('0'……'9'),將其轉(zhuǎn)換為一個十進(jìn)制整數(shù)輸出。分析:數(shù)組長度取上限10以'\n'做為輸入結(jié)束符"123"==》123例
字符串轉(zhuǎn)換"123"==》123n=0;for(i=0;s[i]!='\0';i++)if(s[i]<='9'&&s[i]>='0')
n=n*10+(s[i]-'0');0123
s123\0
??is[i]s[i]-'0'0'1'11'2'22'3'33'\0'n=n*10+(s[i]-'0')0*10+1=11*10+2=1212*10+3=123源程序#include<stdio.h>intmain(void){inti,number;chars[10];
printf("Enterastring:");
/*輸入字符串*/i=0;while((s[i]=getchar())!='\n')i++;s[i]='\0';
n=0;/*將字符串轉(zhuǎn)換為整數(shù)*/for(i=0;s[i]!='\0';i++)if(s[i]<='9'&&s[i]>='0')
n=n*10+(s[i]-'0');printf("digit=%d\n",n);return0;}Enterastring:
a12d3digit=123a12d3??01234思考n=0;for(i=0;s[i]!='\0';i++)if(s[i]<='9'&&s[i]>='0')
n=n*10+(s[i]-'0');elsebreak;Enterastring:
a12d3digit=123a12d3??01234is[i]s[i]-'0'n=n*10+(s[i]-'0')0'a'1'1'10*10+1=12'2'21*10+2=123'd'4'3'312*10+3=1235'\0'digit=輸入一個以‘#’為結(jié)束標(biāo)志的字符串(少于10個字符),濾去所有的非十六進(jìn)制字符(不分大小寫),組成一個新字符串(十六進(jìn)制形式),輸出該字符串并將其轉(zhuǎn)換為十進(jìn)制數(shù)后輸出。例如:輸入字符串:zx1?ma0!kbq#濾去非十六進(jìn)制后組成新字符串:1a0b轉(zhuǎn)換為十進(jìn)制整數(shù):6667例
進(jìn)制轉(zhuǎn)換輸入字符串:zx1?ma0!kbq#濾去非十六進(jìn)制后組成新字符串:1a0b轉(zhuǎn)換為十進(jìn)制整數(shù):6667分析:數(shù)組長度取上限10以'#'做為輸入結(jié)束符"zx1?ma0!kbq"==》"1a0b""1a0b"==》6667分析"zx1?ma0!kbq"==》"1a0b"strhexadk=0;/*k:新字符串hexad的下標(biāo)*/for(i=0;str[i]!='\0';i++)if(str[i]>='0'&&str[i]<='9'||str[i]>='a'&&str[i]<='f'||str[i]>='A'&&str[i]<='F'){hexad[k]=str[i];/*放入新字符串*/k++;}hexad[k]='\0';/*新字符串結(jié)束標(biāo)記*/生成十六進(jìn)制字符串"1a0b"==》6667hexadnumbernumber=0;/*存放十進(jìn)制數(shù),先清0*/for(i=0;hexad[i]!='\0';i++){/*逐個轉(zhuǎn)換*/if(hexad[i]>='0'&&hexad[i]<='9')number=number*16+hexad[i]-'0';elseif(hexad[i]>='A'&&hexad[i]<='F')number=number*16+hexad[i]-'A'+10;elseif(hexad[i]>='a'&&hexad[i]<='f')number=number*16+hexad[i]-'a'+10;}轉(zhuǎn)換為十進(jìn)制整數(shù)程序段輸入原字符串str濾去非16進(jìn)制字符后生成新字符串hexad把字符串hexad轉(zhuǎn)換成十進(jìn)制整數(shù)numberprintf("Enterastring:");i=0;while((str[i]=getchar())!='#‘)i++;str[i]='\0';k=0;for(i=0;str[i]!='\0';i++)if(str[i]>='0'&&str[i]<='9‘||str[i]>='a'&&str[i]<='f'||str[i]>='A'&&str[i]<='F'){hexad[k]=str[i];k++;}hexad[k]='\0‘;number=0;for(i=0;hexad[i]!='\0';i++){if(hexad[i]>='0'&&hexad[i]<='9')number=number*16+hexad[i]-'0';elseif(hexad[i]>='A'&&hexad[i]<='F')number=number*16+hexad[i]-'A'+10;elseif(hexad[i]>='a'&&hexad[i]<='f')number=number*16+hexad[i]-'a'+10;}字符串小結(jié)字符串:一個特殊的一維字符數(shù)組'\0'把字符串放入一維字符數(shù)組(存儲)數(shù)組長度足夠字符數(shù)組初始化:staticchars[80]="Happy";賦值:s[0]='a';s[1]='\0';輸入:輸入結(jié)束符==>字符串結(jié)束符'\0'
i=0;while((s[i]=getchar())!='\n')i++;s[i]='\0';s[0]s[1]s[5]sHappy\0
??把字符串放入一維字符數(shù)組(存儲)對字符串的操作===>對字符數(shù)組的操作只針對字符串的有效字符和字符串結(jié)束符'\0'
檢測for(i=0;s[i]!='\0';i++)putchar(s[i]);s[0]s[1]s[5]sHappy\0
??本章總結(jié)一維數(shù)組:定義、初始化、引用使用一維數(shù)組:選擇排序二維數(shù)組定義、初始化、引用使用二維數(shù)組:矩陣字符串字符數(shù)組與字符串字符串的存儲字符串的操作使用數(shù)組進(jìn)行程序設(shè)計(jì)正確理解數(shù)組的基本概念及在內(nèi)存中的存放方式;掌握使用一維數(shù)組編寫程序;掌握使用二維數(shù)組編寫程序;正確理解字符串的概念,掌握使用字符串編寫程序;能合理運(yùn)用數(shù)組進(jìn)行程序設(shè)計(jì),熟練掌握幾個常用的算法;指針
1密碼開鎖2角色互換3冒泡排序4電碼加密5任意個整數(shù)求和*6指針作為函數(shù)返回值本章要點(diǎn)變量、內(nèi)存單元和地址之間是什么關(guān)系?如何定義指針變量,怎樣才能使用指針變量?什么是指針變量的初始化?指針變量的基本運(yùn)算有哪些?如何使用指針操作所指向的變量?指針作為函數(shù)參數(shù)的作用是什么?如何使用指針實(shí)現(xiàn)函數(shù)調(diào)用返回多個值?如何利用指針實(shí)現(xiàn)內(nèi)存的動態(tài)分配?1密碼開鎖
一個密室逃脫游戲中的密碼開鎖:26個寄存箱,每個寄存箱上按順序都有一個英文字母和一個編號,字母從A到Z,編號從01到26關(guān)鍵點(diǎn)分析得到線索:找到一把鑰匙,打開p寄存箱(編號為16)
提示地址:里面是一把刻著數(shù)字24的鑰匙找到目標(biāo):打開編號為24的X寄存箱取出內(nèi)容:“5342”1.1尋找密碼的途徑分析密碼存放需要一定的存儲空間作為存放地,每個存放地都會有地址如果知道了存放地的名字,當(dāng)然能夠找到密碼如果不知道存放地的名字,知道該存放地的地址也能夠取出密碼如果有另外一個地方存放了該密碼存放地的地址,那么就能順藤摸瓜,間接找到密碼密碼存放示意圖534224p2416名字px地址1624內(nèi)容245342x例
利用指針模擬密碼開鎖游戲獲取密碼的兩種方法
:#include<stdio.h>intmain(void){ intx=5342;/*變量x用于存放密碼值5342*/ int*p=NULL;/*定義整型指針變量p,NULL值為0,代表空指針*/
p=&x;/*將變量x的地址存儲在p中*/
/*通過變量名x輸出密碼值*/ printf("IfIknowthenameofthevariable,Icangetit’svaluebyname:%d\n",x); /*通過變量x的地址輸出密碼值*/ printf("IfIknowtheaddressofthevariableis:%x,thenIalsocangetit’svaluebyaddress:%d\n",p,*p);
return0;}IfIknowthenameofthevariable,Icangetit’svaluebyname:5342IfIknowtheaddressofthevariableis:12ff7c,thenIalsocangetit’svaluebyaddress:53421.2地址和指針-指針的概念內(nèi)存單元地址內(nèi)容變量intx=20,y=1,z=155;printf("%d",x;)直接訪問:通過變量名訪問間接訪問:通過另一個變量訪問把變量的地址放到另一變量中使用時先找到后者再從中取出前者的地址100020x10021y1004155z20001000p2002地址指針變量指針內(nèi)存單元地址內(nèi)容變量intx=20,y=1,z=155;printf("%d",x;)100020x10021y1004155z20001000p2002地址指針變量指針變量:存放地址的變量某個變量的地址指向指針變量所指向的變量的類型int*p;p是整型指針,指向整型變量float*fp;fp是浮點(diǎn)型指針,指向浮點(diǎn)型變量char*cp;
cp是字符型指針,指向字符型變量類型名*
指針變量名指針聲明符1.3指針變量的定義指針變量的定義類型名*
指針變量名int*
p;指針變量名是p,不是*p*是指針聲明符intk,*p1,*p2;等價于:intk;int*p1;int*p2;定義多個指針變量時,每一個指針變量前面都必須加上*1.4指針的基本運(yùn)算
*間接訪問運(yùn)算符,訪問指針?biāo)赶虻淖兞?p:指針變量p所指向的變量a3&ap*p如果指針的值是某個變量的地址,通過指針就能間接訪問那個變量。1、取地址運(yùn)算和間接訪問運(yùn)算
&取地址運(yùn)算符,給出變量的地址int*p,a=3;p=&a;把a(bǔ)的地址賦給p,即p指向a指針變量的類型和它所指向變量的類型相同#include<stdio.h>intmain(void){inta=3,*p; p=&a; printf(“a=%d,*p=%d\n”,a,*p);*p=10;printf("a=%d,*p=%d\n",a,*p);printf("Entera:");scanf("%d",&a); printf("a=%d,*p=%d\n",a,*p);(*p)++; printf("a=%d,*p=%d\n",a,*p);
return0;}例指針取地址運(yùn)算和間接訪問運(yùn)算
a3&ap*pa=3,*p=3a=10,*p=10Entera:5
a=5,*p=5a=6,*p=6a3&ap*p(1)當(dāng)p=&a后,*p與a相同(2)int*p;定義指針變量p
*p=10;指針p所指向的變量,即a(3)&*p與&a相同,是地址
*&a與a相同,是變量(4)(*p)++等價于a++
將p所指向的變量值加1*p++等價于*(p++)
先取*p,然后p自加,此時p不再指向a說明inta=1,x,*p;p=&a;x=*p++;2、賦值運(yùn)算a3&ap1&ap2*p1
*p2inta=3,*p1,*p2;p1=&a;把a(bǔ)的地址賦給p1,即p1指向ap2=p1;p2也指向a相同類型的指針才能相互賦值1)指針變量在定義后也要先賦值再引用
2)在定義指針變量時,可以同時對它賦初值inta;int*p1=&a;int*p2=p1;3)不能用數(shù)值作為指針變量的初值,但可以將一個指針變量初始化為一個空指針int*p=1000;p=0;p=NULL;p=(int*)1732;1.5指針變量的初始化使用強(qiáng)制類型轉(zhuǎn)換(int*)來避免編譯錯誤,不提倡2角色互換如何通過函數(shù)調(diào)用實(shí)現(xiàn)代表2個角色的變量互相…三套方案swap1()swap2()swap3()哪個方案能成功?2.1例
指針作為函數(shù)參數(shù)模擬角色互換intmain(void){inta=1,b=2;int*pa=&a,*pb=&b;
voidswap1(intx,inty),swap2(int*px,int*py),swap3(int*px,int*py);
swap1(a,b);printf(“Aftercallingswap1:a=%db=%d\n”,a,b);
a=1;b=2;
swap2(pa,pb);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版產(chǎn)業(yè)園入駐企業(yè)綠色生產(chǎn)與可持續(xù)發(fā)展合作協(xié)議3篇
- 2024年標(biāo)準(zhǔn)棋牌室聯(lián)合投資經(jīng)營管理合同版B版
- 2024年度農(nóng)業(yè)技術(shù)研發(fā)與推廣協(xié)議2篇
- 2024年標(biāo)準(zhǔn)三方抵押擔(dān)保合同版B版
- 2024年度石油化工設(shè)備采購租賃合同2篇
- 2024至2030年中國織物去油劑行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024年特色酒店服務(wù)合同示范
- 2024年度版權(quán)許可使用合同:著作權(quán)人與使用人間的版權(quán)使用約定3篇
- 2024年度草原牧草種植與草場承包合同3篇
- 2024版二手房出售合同及原業(yè)主裝修遺留問題處理及房屋租約轉(zhuǎn)讓協(xié)議3篇
- 材料科學(xué)-相場模擬簡介ppt課件
- 水利機(jī)械臺班費(fèi)用定額
- 托班一日生活情況反饋表
- 關(guān)于企業(yè)重組業(yè)務(wù)的稅收政策解讀與研究--企業(yè)特殊(免稅)重組的條件
- ××35千伏輸電線路施工方案
- JGJ_T231-2021建筑施工承插型盤扣式鋼管腳手架安全技術(shù)標(biāo)準(zhǔn)(高清-最新版)
- 交通工程精細(xì)化施工質(zhì)量控制及驗(yàn)收標(biāo)準(zhǔn)
- 鏡片加工知識之四研磨
- 乒乓球中的力學(xué)原理PPT課件
- 激光原理與激光技術(shù)習(xí)題全解(北工大)
- 中央空調(diào)設(shè)備運(yùn)行管理方案課案
評論
0/150
提交評論