《C语言程序设计d》课件-第五讲-数组_第1页
《C语言程序设计d》课件-第五讲-数组_第2页
《C语言程序设计d》课件-第五讲-数组_第3页
《C语言程序设计d》课件-第五讲-数组_第4页
《C语言程序设计d》课件-第五讲-数组_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安电子科技大学计算机学院1引言西安电子科技大学计算机学院2简单问题:求4个整数的最大值如何表示4个整数?如何求出最大值?intmain(){inta1=75,a2=78,a3=91,a4=80;intmax=a1;

if(a2>max)max=a2;if(a3>max)max=a3;if(a4>max)max=a4;printf("max=%d\n",max);return0;}用4个整数变量逐一比较这4个变量西安电子科技大学计算机学院3引申:求n(n>100)个整数的最大值如果仍然采用前面的方法存在什么问题?intmain(){inta1=80,a2=75,…,an=88;intmax=a1;

if(a2>max)max=a2;if(a3>max)max=a3;…if(an>max)max=an;printf("max=%d\n",max);return0;}多个整数变量表示繁琐用于比较的代码冗长西安电子科技大学计算机学院4解决前面问题的思路:将n个同类型变量以整体的形式表示能够以简单的方式访问整体中的每个元素已具备的知识每个变量在内存中都有对应的地址,知道该地址就可以访问变量每个变量占据的内存大小只取决于变量类型西安电子科技大学计算机学院5一种可能的解决方式假设n个同类型变量在内存中连续存放,依次编号为0,1,2,…n-1已知第一个变量的内存地址为a每个变量占据的内存大小为SIZE任意一个编号为i的变量对应的地址ai可以通过以下公式计算:ai=a+i×SIZE…aa1a2a3an-1西安电子科技大学计算机学院6需要解决的问题如何才能让一组同类型变量连续存放?第一个变量的地址如何得到?能否直接通过编号引用任意一个变量,而将变量地址计算及通过地址访问变量的操作隐含在编号中?解决以上问题需要引入一个新的概念

——数组西安电子科技大学计算机学院7主要内容数组定义和使用排序算法二维和多维数组函数与数组字符数组和字符串西安电子科技大学计算机学院89.1数组定义和使用西安电子科技大学计算机学院9定义数组的方法语法:元素类型数组名称[元素个数];元素类型可以是任意类型数组名称(数组变量)必须是合法标识符数组元素个数必须是常量表达式//包含100个实数元素的数组floatscore[100];

//包含20个字符元素的数组charname[20];

10数组在内存中的实现数组名是一个内存地址(不可修改),称为数组首地址数组元素从首地址开始连续存放取数组首地址的三种方法取数组名对应的值a取数组名的地址&a取第一个元素的地址&a[0]数组不能整体赋值inta[8],b[8];a=b;//错误inta[5];?第1个元素????0x10000x10040x10080x100C0x1010地址数组元素第2个元素第3个元素第4个元素第5个元素11访问数组元素访问数组元素的方法:数组名[下标]数组下标从0开始计数,最后一个元素下标是数组大小-1下标可以是常数、变量和表达式,但计算结果必须是整数每个数组元素都是一个变量,可以赋值或取值通过数组名和下标引用数组元素的本质是:&a[i]=a

+i×sizeof(a[0])inta[5],i;a[4]=0;for(i=0;i<4;i++){a[i]=i;

a[4]+=a[i];}西安电子科技大学计算机学院12数组初始化数组元素和变量一样应该先初始化再使用方法1:先定义数组,然后用循环初始化每个元素inta[4],i;for(i=0;i<4;i++)

a[i]=i;

13数组初始化方法2:在定义数组时指定元素的初始值格式:所有初值用大括号包围,逗号分隔inta[5]={0,1,2};a[0]=0a[1]=1a[2]=2a[3]=0a[4]=0数组大小大于初值个数时,其余元素用0初始化inta[4]={0,1,2,3};a[0]=0a[1]=1a[2]=2a[3]=3数组大小和初值个数相同时,一一对应初始化inta[]={0,1,2,3};a[0]=0a[1]=1a[2]=2a[3]=3不指定数组大小时,数组大小和初值个数相同西安电子科技大学计算机学院14数组初始化初始化数组时易犯的错误使用方法1时,数组下标越界使用方法2时初值个数大于数组元素个数inta[3]={0,1,2,3};编译错误inta[4],i;for(i=0;i<8;i++)a[i]=i;当数组下标大于等于数组元素个数时,编译不会出错,但运行时通常会出现内存访问错误西安电子科技大学计算机学院15例1:求100个整数的最大值//不使用数组的程序intmain(){inta1=80,a2=75,…,a100=88;intmax=a1;

if(a2>max)max=a2;if(a3>max)max=a3;…if(a100>max)max=a100;printf("max=%d\n",max);return0;}//使用数组的程序intmain(){inta[100]={/*初值*/};intmax=a[0],i;

for(i=1;i<100;i++)if(a[i]>max)max=a[i];

printf("max=%d\n",max);return0;}表示多个整数用于比较的代码西安电子科技大学计算机学院16例2:找出数组中最小元素所在的位置//使用数组的程序intmain(){inta[100]={/*初值*/};intk=0,i;//k记录最小元素所在的位置

for(i=1;i<100;i++)if(a[i]<a[k])k=i;

printf(“minimumelementindexis%d\n",k);return0;}西安电子科技大学计算机学院17例3:计算Fibonacci数列的前40项F(0)=1F(1)=1F(n)=F(n-1)+F(n-2)n>1F[0]=1F[1]=1F[n]=F[n-1]+F[n-2]n>1如果把圆括号换成方括号?这其实就是数组的表示方式西安电子科技大学计算机学院18例3:计算Fibonacci数列的前40项intmain(){

intF[40]={1,1};

//F(0)=1,F(1)=1

int

i;for(i=2;i<40;i++){//i>1时,F(i)=F(i-1)+F(i-2)

F[i]=F[i-1]+F[i-2];printf("F(%d)=%d\n",i,F[i]);//输出F(i)}return0;}西安电子科技大学计算机学院19例4:求下图所示的折线长度折线长度=多条线段长度之和求线段长度的公式:可以利用循环完成求和每个点的坐标可以用数组存储yx(0,1)(2,2)(3,2)(4,1)(6,1)西安电子科技大学计算机学院20intmain(){

doublex[5]={0,2,3,4,6};doubley[5]={1,2,2,1,1};doublepolyline_len=0;inti;for(i=0;i<4;i++){polyline_len+=sqrt(pow(x[i]-x[i+1],2)+pow(y[i]-y[i+1],2);}printf(“polylinelength=%f\n”,polyline_len);return0;}例4:求折线长度西安电子科技大学计算机学院21例5查找指定元素写一个程序,判断一个整数n是否在一个整数数组a中出现。如果出现,输出第一次出现位置的下标,不出现输出-1。思路:扫描整数数组中的每个整数a[i],如果a[i]等于给定的整数n,记录i,否则比较下一个整数,直到数组结束#include<stdio.h>intmain(){ inta[]={1,2,3,4,5,6,7,8,9,0}; intn=5;//n=10; inti=0; for(i=0;i<10;i++){

if(a[i]==n)break; } if(i<10) printf("pos=%d\n",i); else printf("pos=-1\n"); return0;}西安电子科技大学计算机学院23排序算法问题:输入100个学生的成绩,按从高到低排序后输出100个学生成绩可以用一个具有100个元素的数组表示如何对数组元素排序?西安电子科技大学计算机学院24排序算法排序算法应用广泛排序算法是很多算法的基础二分查找排序算法的种类?选择排序、起泡排序(O(n2))快速排序、归并排序、堆排序(O(n*Logn))排序算法的核心是比较和交换西安电子科技大学计算机学院25选择排序算法第1

趟在n个元素中选取最小元素作为有序序列的第1个元素第2

趟在n-1个元素中选取最小元素作为有序序列的第2个元素第i

趟在n-i+1个元素中选取最小的元素作为有序序列中的第i个元素。…1234*32296445347826inta[100];inti,j,k,t,n=100;//外层循环重复n-1次for(i=0;i<n-1;i++){

//循环体内找到第i小的元素,放在数组的位置i

}for(j=i+1,k=i;j<n;j++)if(a[j]<a[k])k=j;

if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}找出[i..n]中最小值对应的下标k如果最小值不是第i个元素则将a[i]和a[j]交换西安电子科技大学计算机学院27起泡排序算法起泡排序(BubbleSorting)的基本思想是:将相邻位置的元素进行比较,若为逆序则交换之。若在一趟排序过程中没有进行过交换记录的操作,则整个排序过程终止。无序序列R[1..n-i+1]有序序列R[n-i+2..n]n-i+1无序序列R[1..n-i]有序序列R[n-i+1..n]比较相邻记录,将值最大的元素交换到n-i+1的位置上第i趟起泡排序28初始数组4938659776132749*0123456738496576132749*97第一趟排序后384965132749*7697第二趟排序后3849132749*657697第三趟排序后3813274949*657697第四趟排序后1327384949*657697第五趟排序后1327384949*657697第六趟排序后起泡排序过程示例西安电子科技大学计算机学院29inta[10],i,j,change,t,n=10;

for(i=0,change=1;i<n&&change;++i){}

change=0;

//一趟排序过程中是否进行了元素交换for(j=0;j<n-i-1;++j){if(a[j]>a[j+1]){//需要交换相邻元素t=a[j];a[j]=a[j+1];a[j+1]=t;

change=1;

}}起泡排序算法西安电子科技大学计算机学院30排序算法示例给定N个不同的整数,要求对这N个整数按如下规则排序并输出。规则一:所有的偶数排在奇数前面。规则二:在规则一的前提下按照从大到小的顺序排序。排序算法示例方法1输入数据时将偶数和奇数分别放在两个数组中对偶数数组从大到小排序,然后输入对奇数数组从大到小排序,然后输入西安电子科技大学计算机学院31intodd[100],even[100];intn,i,even_count=0,odd_count=0;scanf(“%d”,&n);for(i=0;i<n;i++){intv;scanf(“%d”,&v);

if(v%2==0)even[even_count++]=v;elseodd[odd_count++]=v;}…排序算法示例方法2定义比较规则偶数大于奇数同为偶数或奇数时正常比较大小按定义的规则进行排序西安电子科技大学计算机学院32//compare函数比较x和y的大小关系//如果x大于y返回正数//如果x小于y返回负数//如果x等于y返回0intcompare(intx,inty){if((x%2)==0&&(y%2)!=0)return1;elseif((x%2)!=0&&(y%2)==0)return-1;elsereturn(x-y);}多关键字排序示例1:世界杯排序规则1.积分2.净胜球…示例2:扑克牌花色数字西安电子科技大学计算机学院33多关键字排序需要能够用一个整体表示一条记录,同时能访问一条记录的各个字段。比较时可以逐一比较需要排序的各个字段交换时可以交换整条记录西安电子科技大学计算机学院34西安电子科技大学计算机学院34练习写一个程序将数组x中的整数以相反顺序复制到数组y中(也就是y[0]中保存x[n-1],…,y[n-1]中保存x[0])12,15,67,23,55,4444,55,23,67,15,12xy西安电子科技大学计算机学院359.2二维数组一维数组处理线性结构二维数组可以处理矩阵例如:一幅800×600的图像或一个行列式C语言对二维数组的表示定义二维数组:类型数组名[行数][列数]36也可以认为a是一个3个元素的一维数组,每个元素都是有4个元素的一维数组inta[3][4];//定义一个三行四列的二维数组

C语言对二维数组的表示C语言二维数组在内存中的表示内存是一维线性编址,没有行列的概念在内存中依次存放二维数组的每一行3701234567891011第一行a[0]第二行a[1]第三行a[2]0x10000x102C连续线性编址a[1][3]a[0][1]a[2][3]a[1][0]a[2][0]a[2][1]a[2][2]a[0][0]a[1][2]a[1][1]a[0][3]a[0][2]西安电子科技大学计算机学院38二维数组的使用用行下标和列下标引用单个元素,行列下标都从0开始计数a[i][j]表示二维数组a的第i行第j列的元素j=0123i=012a[1][2]a[2][2]西安电子科技大学计算机学院39二维数组初始化方法1:按行初始化inta[2][3]={{1,2,3},{4,5,6}}inta[2][3]={{1,2,3}}inta[2][3]={{1,2},{4,5}}每一对大括号内是一行的初值,初值个数不足时用0初始化西安电子科技大学计算机学院40二维数组初始化方法2:将二维数组当作一维数组初始化inta[2][3]={1,2,3,4,5,6}inta[2][3]={1,2,3,4}大括号内是整个二维数组的初值,按照行序依次赋值,初值个数不足时用0初始化西安电子科技大学计算机学院41二维数组初始化方法3:省略第一维大小inta[][3]={1,2,3,4,5,6}inta[][3]={{1,2,3},{4,5}}定义二维数组时,如果有初值,可以省略第一维大小(行数),但不能省略第二维大小(列数),行数根据初始值个数计算定义二维数组时,如果有没有初值,第一维大小(行数)和第二维大小(列数)都不能省略西安电子科技大学计算机学院42二维数组的使用示例1:求一个方阵的主/辅对角线之和inta[3][3]={…};intsum=0,i;for(i=0;i<3;i++){sum+=a[i][i];}inta[3][3]={…};intsum=0,i;for(i=0;i<3;i++){sum+=a[i][2-i];}231125789302010210210西安电子科技大学计算机学院43二维数组的使用示例2:写一个程序,找出给定矩阵的马鞍点。若一个矩阵中的某元素是其所在行的最小值,并且是其所在列的最大值,则该元素为矩阵的一个马鞍点,如果找到输出对应的行和列,找不到输出“no”

马鞍点,行为1,列为1西安电子科技大学计算机学院44二维数组的使用思路:(假设矩阵为a)Step1:初始化行号row=0Step2:找出第row行最小元素及其所在列下标colStep3:然后检查元素a[row][col]是不是所在列上的最大值,是则输出行列坐标,行号row递增重复步骤2和3直到所有行检查完马鞍点,行为1,列为145示例2伪代码for(row=0;row<行数;row++){//外层循环处理每一行找到一行的最小值对应的列下标col,则当前行值最小的元素是a[row][col]

//内层循环处理一列

for(i=0;i<行数;i++){

判断a[row][col]是不是这一列中最大的值}if(是马鞍点){输出行列坐标马鞍点个数递增

}}if(马鞍点个数==0)输出"no"西安电子科技大学计算机学院46二维数组的使用示例3:图像的灰度直方图一幅m×n的灰度图像可以用一个二维矩阵表示,矩阵中的每个元素表示对应像素的灰度值。“灰度直方图”以图像中每种灰度级的象素个数来反映图像中每种灰度出现的频率灰度图像灰度直方图intmain(){intimg[256][256];//表示图像的数组inta[256]={0};//统计出现次数的数组intm,n,k,i,j;scanf("%d%d%d",&m,&n,&k);for(i=0;i<n;i++){for(j=0;j<m;j++){scanf("%d",&img[i][j]);

a[img[i][j]]++;}}for(i=0;i<k;i++)printf("%d%d\n",i,a[i]);return0;}灰度图像灰度直方图西安电子科技大学计算机学院489.3数组与函数需要讨论的问题数组元素能否作为函数参数?数组能否作为函数参数?数组能否作为函数返回值?西安电子科技大学计算机学院49数组元素作为函数参数数组元素是一个变量,可以出现在任何普通变量能出现的地方作为表达式的一部分参与运算作为函数调用的实际参数西安电子科技大学计算机学院50示例:求下图所示的折线长度折线长度=多条线段长度之和求线段长度的公式:可以利用循环完成求和yx(0,1)(2,2)(3,2)(4,1)(6,1)西安电子科技大学计算机学院51intmain(){

doublex[5]={0,2,3,4,6};doubley[5]={1,2,2,1,1};doublepolyline_len=0;inti;for(i=0;i<4;i++){polyline_len+=sqrt(pow(x[i]-x[i+1],2)+pow(y[i]-y[i+1],2);}printf(“polylinelength=%f\n”,polyline_len);return0;}不使用函数求折线长度如何用函数实现求线段长度?用函数line_len求线段长度:西安电子科技大学计算机学院52doubleline_len(doublex1,//第一个点x坐标doubley1,//第一个点y坐标doublex2,//第二个点x坐标doubley2)//第二个点y坐标{returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}数组元素作为函数参数在主函数中如何调用该函数?西安电子科技大学计算机学院53intmain(){

doublex[5]={0,2,3,4,6};doubley[5]={1,2,2,1,1};doublepolyline_len=0;inti;for(i=0;i<4;i++){polyline_len+=line_len(x[i],y[i],x[i+1],y[i+1]);}printf(“polylinelength=%f\n”,polyline_len);return0;}数组元素作为函数参数西安电子科技大学计算机学院54数组元素作为函数参数时的传递数组元素作为实参就是把数组元素的值传递给形参02346x[0]x[1]x[2]x[3]x[4]12211y[0]y[1]x[2]y[3]y[4]0212x1x2y1y2main函数数据区line_len函数数据区西安电子科技大学计算机学院55用函数求折线段长度数组可以表示一组数据,而且可以单独操作每个元素,考虑用数组作为函数参数用数组作为函数参数需要解决的问题1.定义函数时如何定义数组类型的参数?2.调用函数时如何传入实际的数组?3.实参数组和形参数组的关系?西安电子科技大学计算机学院56用函数求折线段长度doublepolyline_len(…){…}intmain(){doubleco_x[5],co_y[5];

doublelen=polyline_len(…);printf(“polylinelength=%f\n”,len);return0;}如何定义数组参数,需要定义数组大小吗?如何传入实际数组,数组元素值和元素个数如何传递?西安电子科技大学计算机学院57回顾数组的特点数组名是数组首地址,数组元素连续存放通过下标和首地址可以计算任何一个数组元素的地址只要将数组首地址(数组变量名)传入函数,那么在函数内就可以访问到所有数组元素为了使数组元素访问不超出数组范围,应该明确给出数组大小&a[i]=a

+i×sizeof(a[0])西安电子科技大学计算机学院58用函数来求折线段长度doublepoly_len(doublex[],doubley[],intn){doublelen=0.0;inti;for(i=0;i<n-1;i++)len+=sqrt(pow(x[i]-x[i+1],2)+pow(y[i]-y[i+1],2));returnlen;}传递数组首地址的好处是避免复制大量元素这确实是一个数组吗?intmain(){

doubleco_x[5]={0,2,3,4,6};doubleco_y[5]={1,2,2,1,1};

doublelen=poly_len(co_x,co_y,5);}西安电子科技大学计算机学院59用数组作为函数参数的本质x是函数内的局部变量,x是用指针变量表示的,x的值是数组首地址,是函数调用时传入实际数组的首地址doublepoly_len(doublex[],doubley[],intn){…}doublepoly_len(double*x,double*y,intn){…}如果x是一个数组,那么x=&x=&x[0]实际的结果是:x=0x0012fc60&x=0x0012fbfc&x[0]=0x0012fc60doublepolyline_len(doublex[],doubley[],intn){…}intmain(){…polyline_len(co_x,co_y,5)…}0co_x[0]0x0012fc602364co_x[1]co_x[4]co_x0x0012fc60x0x0012fbfcx的内存地址值变量co_x[2]co_x[3]poly_len函数数据区main函数数据区西安电子科技大学计算机学院61计算数组元素个数数组大小一旦改变,这个值也要改变,能不能用表达式计算出数组元素个数?intmain(){

doubleco_x[5]={0,2,3,4,6};doubleco_y[5]={1,2,2,1,1};

poly_len(co_x,co_y,5);}西安电子科技大学计算机学院62sizeof运算符sizeof运算符用于计算一种类型或一个变量所占据的存储空间数组元素个数=sizeof(数组)/sizeof(数组第一个元素)intn=0,m=0;doubled=3.5;n=sizeof(double);//n=8m=sizeof(d);//m=8inta[6]={0},m=0,n=0,k=0;m=sizeof(a);//m=24n=sizeof(a[0]);//n=4k=m/n;//k=6如果对数组变量应用sizeof运算符得到的是整个数组所占据的存储空间西安电子科技大学计算机学院63计算数组元素个数intmain(){

doubleco_x[6]={0,2,3,4,6,8};doubleco_y[6]={1,2,2,1,1,2};

poly_len(co_x,co_y,sizeof(co_x)/sizeof(co_x[0]);}数组大小一旦改变,这个表达式的值也会改变西安电子科技大学计算机学院64对函数的数组参数应用sizeof运算符这从另一个角度证明函数参数中的数组不是一个真正的数组。doublepoly_len(doublex[],doubley[],intn){…}sizeof(x)=?sizeof(x)/sizeof(x[0])=?sizeof(x)=4sizeof(x)/sizeof(x[0])=0doublepoly_len(intx[],inty[],intn){…}sizeof(x)=?sizeof(x)/sizeof(x[0])=?sizeof(x)=4sizeof(x)/sizeof(x[0])=1西安电子科技大学计算机学院65西安电子科技大学计算机学院数组作为函数的输出参数用函数完成折线段坐标输入voidinput(intx[],inty[]intn){inti;for(i=0;i<n;i++)scanf(“%d%d”,&x[i],&y[i]);}intmain(){intco_x[5],co_y[5];

input(co_x,co_y,5);}?co_x[0]0x12f060?…?co_x[1]co_x[4]co_x0x12f060x0x12fbfc内存地址值变量input函数数据区main函数数据区函数形参数组指向实参数组所在内存地址,因此在函数内修改形参数组就相当于修改了实参数组西安电子科技大学计算机学院66数组与函数返回值数组不能作为函数返回值int[]rand_int(intn){…}intmain(){intrand_num[10];

rand_num=rand_int(10);}数组不能整体赋值这样声明返回值是语法错误西安电子科技大学计算机学院67示例1写一个函数,它判断一个整数n是否在一个整数数组a中出现。如果出现,给出第一次出现位置的下标,不出现给出-1。思路:扫描整数数组中的每个整数a[i],如果a[i]等于给定的整数n,记录i,否则比较下一个整数,直到数组结束#include<stdio.h>intsearch(inta[],intsize,intn){inti=0;for(i=0;i<size;i++){

if(a[i]==n)break;}

returni<size?i:-1;}intmain(){inta[]={1,2,3,4,5,6,7,8,9,0};intn1=5,n2=10;intpos1=search(a,10,n1);intpos2=search(a,10,n2);printf("pos1=%d,pos2=%d\n",pos1,pos2);return0;}函数参数:a表示待查找的数组size表示数组大小n表示待查找整数示例2用函数实现排序算法西安电子科技大学计算机学院69voidsort(inta[],intn){inti,j,k;for(i=0;i<n-1;i++){for(j=i+1,k=i;j<n;j++)if(a[j]<a[k])k=j;if(i!=k){intt=a[i];a[i]=a[k];a[k]=t;}}}西安电子科技大学计算机学院70西安电子科技大学计算机学院70练习写一个函数将数组x中的整数颠倒顺序12,15,67,23,55,4444,55,23,67,15,12xx调用函数西安电子科技大学计算机学院719.4字符数组和字符串文字处理是应用程序中一个常用的功能字符数组就是元素类型是字符的数组定义方式和普通数组一样使用方式和初始化方式也一样charname[20]={'W','a','n','b','o'};字符数组name的其余元素用0初始化,不是字符'0',这个0对字符串而言有特殊意义西安电子科技大学计算机学院72从键盘输入一行字符,保存到字符数组中#include<stdio.h>intmain(){charline[80]={0};//如果不初始化为0会导致什么结果?inti;for(i=0;i<80;i++){scanf("%c",&line[i]);//输入一个字符if(line[i]=='\n')break;//输入字符是换行符时结束输入}

printf(“%s”,line);//输出字符数组内容return0;}西安电子科技大学计算机学院73字符串的相关问题字符串是一个字符数组加结束标志('\0')定义字符串就是定义一个字符数组字符串用字符数组存储字符串存储空间比实际字符个数多1结束标志是为了知道字符串什么时候结束字符串长度是字符数组中第一个结束标志前的字符个数字符串长度可能小于字符数组大小字符数组中没有结束标志时,长度不确定74字符串初始化方法1:像数组一样单独指定每个元素charname[20]={'W','a','n','b','o'};数组大小为20,字符串长度为5,其余字符初值为'\0'charname[]={'W','a','n','\0','o'};数组大小为5,字符串长度为3charname[5]={'W','a','n','b','o'};数组大小为5,缺少结束标志'\0',不能当作字符串使用charname[]={'W','a','n','b','o'};数组大小为5,缺少结束标志'\0',不能当作字符串使用西安电子科技大学计算机学院75字符串初始化方法2:用双引号括起来的字符串常量初始化charname[20]="Wanbo";数组大小为20,字符串长度为5,其余字符初值为'\0'charname[]="Wanbo";数组大小为6,字符串长度为5,自动添加结束标志'\0'charname[5]="Wanbo";数组大小为5,没有结束标志'\0',不能当作字符串使用西安电子科技大学计算机学院76字符串使用示例示例1:写一个程序,求一个字符串的长度。intmain(){chars[]=“hello,world”;inti=0;//累加字符串长度while(s[i]!='\0'){++i;}

returni;}西安电子科技大学计算机学院77字符串使用示例示例2:写一个程序,将一个字符串复制到一个字符数组里(同样做成字符串)。intmain(){chardst[100],src[]=“hello,world”;inti=0;while(src[i]!='\0'){dst[i]=src[i];++i;}

dst[i]=‘\0’;

//添加结束标志

return0;}注意:dst必须能够容纳src中所有字符和结束标志78字符串使用示例示例2的其他实现方式。intmain(){chardst[100],src[]=“hello,world”;inti=0;while((dst[i]=src[i])!='\0')++i;return0;}这两个程序利用赋值表达式的值作为循环结束条件intmain(){chardst[100],src[]=“hello,world”;inti=0;while(dst[i]=src[i])++i;

return0;}西安电子科技大学计算机学院79示例3回文是从前向后和从后向前读起来都一样的句子。例如"amanaplanacanalpanama",写一个函数,够判断一个字符串是否为一个回文。步骤1:设两个下标i和j,i指向第一个字符,j指向最后一个字符步骤2:判断s[i]和s[j]是否相同,相同则i递增,j递减,直到i>=j,否则结束比较(循环体)#include<stdio.h>#include<STRING.H>inthuiwen(chars[]){ inti=0,j=strlen(s)-1;

while(i<j&&s[i]==s[j]){i++;j--;} returni>=j;//这条语句不属于for循环}intmain(){ chars[]="abcba"; if(huiwen(s)) printf("%sishuiwen\n",s); else printf("%sisnothuiwen\n",s);

return0;}西安电子科技大学计算机学院81示例4写函数squeeze(chars1[],chars2[]),它从字符串s1中删除串s2里包含的所有字符(而且保证剩下的字符仍然按照原来顺序连续排列,形成字符串)。步骤1:扫描s1的每个字符c,如果c不在s2中则将c存放在一个临时数组temp中,否则继续检查下一个字符步骤2:将临时数组temp中的字符复制到s1中#include<stdio.h>voidsqueeze(chars1[],chars2[]){chartemp[100];inti,j,k=0;for(i=0;s1[i];i++){charc=s1[i];

//判断c是否在s2中

for(j=0;s2[j]&&c!=s2[j];j++);if(s2[j]==0)

//c不在s2中

temp[k++]=c;}

//将temp复制到s1for(i=0;i<k;i++)s1[i]=temp[i];

s1[k]=0;}intmain(){chars1[]="abcedfghijkl",s2[]="dhj";printf("s1=%s,s2=%s\n",s1,s2);squeeze(s1,s2);printf("s1=%s\n",s1);return0;}9.5C语言字符串处理库函数西安电子科技大学计算机学院8384字符串处理库函数需要包含头文件<string.h>intstrlen(chars[])计算字符串长度,返回值表示字符串长度strcat(chardst[],c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论