c语言课件 第7章 数组_第1页
c语言课件 第7章 数组_第2页
c语言课件 第7章 数组_第3页
c语言课件 第7章 数组_第4页
c语言课件 第7章 数组_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

引言一维数组二维数组字符数组与字符串第7章

数组7.1

引言一、数组的引入为了便于处理一批类型相同的数据,引入了数组类型.

假设现在要保存每个学生的成绩,那就需要40个变量,但这样一来输入、输出、计算都会变得繁琐,若成千上万数据,显然不合适。在这种情况下,我们可以使用数组类型,声明一个数组含有40个整型元素,每个数组元素存放一个成绩,这样,成绩的输入、输出、计算就可通过循环来实现.例:某班有40名学生,求该班成绩的平均分#include<stdio.h>main(){intj,sum,s;floatave;sum=0;for(j=1;j<=40;j++){scanf(“%d”,&s);sum=sum+s;}ave=sum/40;printf(“ave=%f”,ave);}1.数组:由具有相同类型的有序数据的集合。用数组名标识。#include<stdio.h>main(){intj,sum,s[40];floatave;sum=0;for(j=0;j<=39;j++){scanf(“%d”,&s[j]);sum=sum+s[j];}ave=sum/40;printf(“ave=%f”,ave);}3.数组元素:数组中的每一个数据称为一个数组元素。数组元素用数组名和下标来表示。4.下标:用来表示数组元素在数组中的排列顺序。

c语言中下标从0开始2.数组的维数(长度):一个数组中相同类型的数据个数叫做数组的维数。二、数组的概念

构造数据类型之一7.2

一维数组表示一个数组元素需要一个下标的数组叫作一维数组。如:每个班的学生排成一队,只需要指出某个学生在队列中的编号,就可以确定这个学生。一、一维数组的定义

定义方式:

数据类型数组名[常量表达式]合法标识符例:inta[10];编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)=10×2数组名表示数组所在内存首地址也是a[0]的地址,是地址常量84:668095101010121014:1028a[0]a[1]a[2]:a[9]a数组维数(长度)定义的目的:为指定的数组分配相应字节的存储单元。定义a为一维数组,有10个元素,都是int型。7.2

一维数组数组元素地址表示:&a[i],&a[0]即a例:inta[20],b;

定义a为一维数组,可独立存放20个整型数据,系统要为数组a分配2*20=40个字节的连续存储单元。注意b是变量而不是数组floata[10];

定义a为一维数组,可存放10个单精度型数据,系统要为数组a分配4*10=40个字节的存储单元,且这些存储单元是连续的。例:

例:(不能用变量定义数组维数)inti=15;intdata[i];

解决方法:

#defineN15;intdata[N];一、一维数组的定义二、一维数组的引用格式:数组名[下标]数组元素的下标从0开始a如有定义:inta[10];a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[0]=3;3a[1]=8;8a[2]=a[0]+a[1];11a[3]=a[0]*a[1];24a[9]=a[0]-a[1];-5引用的数组元素与其他同类变量同等使用数组元素下标的最大值等于数组的长度减1数组必须先定义,后使用区分:数组定义:inta[10];数组元素引用:a[9]=a[0]-a[1];下标可以是常量或整型表达式。如:a[1],a[2*3]只能逐个引用数组元素,不能一次引用整个数组下标不要超范围(越界)二、一维数组的引用注意点:inti,a[5];for(i=0;i<5;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)printf(“%d”,a[i]);inta[5];scanf(“%d”,&a);×printf(“%d”,a);×注意:

如果出现a[5]=72;

尽管a[5]不属于数组元素,但编译时不会指出错误,系统会将a[5]理解为要访问的是从地址a后的第5×2个单元,即访问地址为1020存储单元,将其赋值为72,这样可能会破坏数组以外其他变量的值

例:下标越界危害数组定义为inta[5],

数组长度为5,下标在0----4之内,

即a[0]----a[4]847566809510101012101410161018a[0]a[1]a[2]a[3]a[4]假设这个存储空间是变量x的,如果执行了a[5]=72,会将x原有的正确数据覆盖掉102070Xa[5]72二、一维数组的引用三、一维数组的初始化

inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;初始化方式2:只给一部分元素赋值

inta[10]={1,2,3,4,5};等价于:

inta[5]={1,2,3,4,5,0,0,0,0,0};初始化意义:给数组元素赋初值(在编译阶段使之得到初值),数组不初始化,其元素值为随机数。

inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数初始化方式1:在定义数组时,为数组元素赋初值初始化方式3:对数组全部元素赋值时可不指定数组长度例1输入10个数放入一个数组,然后逆序输出。四、一维数组程序举例main(){inti,a[10];

for(i=0;i<=9;i++)scanf(“%d”,&a[i]);for(i=9;i>=0;i--)printf(“%4d”,a[i]);}控制输入10个数据控制输出10个数据假定输入:0123456789运行结果如下:

9876543210程序使a[0]到a[9]的值为0~9,然后按逆序输出。例2:如何使两个数组的值相等/*错误编程*/main(){inta[4]={1,2,3,4},b[4];b=a;}解决方法法1:逐个元素赋值

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];法2:通过循环赋值

inti;for(i=0;i<4;i++)b[i]=a[i];原因:数组名表示数组的首地址,其值不可改变!例3:用数组求fibonacci数列的前20个数即:1,1,2,3,5,8,13#include<stdio.h>main(){inti,f[20]={1,1};for(i=2;i<20;i++)

f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf(“\n”);printf(“%12d”,f[i]);}}110000:0f[0]f[1]f[2]f[3]f[4]f[5]:f[19]23586765i=2f[2]=f[0]+f[1]i=3f[3]=f[1]+f[2]i=4f[4]=f[2]+f[3]第六章P125:f1=f1+f2f2=f2+f1优点:占用存储空间少,缺点:算法复杂,且不可存储。if语句用来控制换行,每行输出5个数据。例4:线性查找:输入一个数据,在已知数组中查找是否有该数据,有的话,打印find!5801926374x9a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]#include<stdio.h>main(){inti,x;inta[10]={5,8,0,1,9,2,6,3,7,4};scanf(“%d”,&x);for(i=0;i<10;i++)if(x==a[i]){printf(“find!”);break;}if(i==10)printf(“notfind!\n”);}改变:#include<stdio.h>main(){inti,x,flag=0;inta[5]={5,8,0,1,9};scanf(“%d”,&x);for(i=0;i<5;i++)if(x==a[i]){flag=1;

break;}if(flag==1)printf(“find!\n”);elseprintf(“notfind!\n”);}#include<stdio.h>main(){inti,x;inta[5]={5,8,0,1,9};scanf(“%d”,&x);for(i=0;i<5;i++)if(x==a[i]){printf(“find!”);

break;}if(i==5)printf(“notfind!\n”);}体会flag的作用和意义:例5读10个整数存入数组,找出其中最大值和下标数据:定义int型数组x[10],

变量max放最大数,变量n放对应下标;步骤:1.输入:for循环输入10个整数

2.处理:(a)先令max=x[0],n=0;(b)依次用x[i]和max比较(循环)3.输出:max和n#include<stdio.h>main(){intx[10],i,max,n;printf("Enter10integers:\n");for(i=0;i<10;i++){ scanf("%d",&x[i]);}

max=x[0];/*开始时假定a[0]为最大值*/n=0;/*开始时存放a[0]的下标*/

for(i=1;i<10;i++){if(max<x[i]){max=x[i];n=i;}

}

printf(“max=%d,n=%d\n”,max,n);}例6:用冒泡排序法对6个数进行升序排序(从小到大)对n个数进行冒泡排序的思路是:如果要对n个数据排序,就需要进行n-1轮的比较,每次都对相邻两个数进行比较,将较大的数交换到后一个元素中。每1轮的比较都找出未排好的数据中的最大数放在这几个数的后面。例如,第1轮需要比较n-1次,在n个数中找出最大数放在数组的最后1个元素中;第2轮将对剩下的前n-1个数进行比较,需要比较(n-1)-1次,将前n-1个数中的最大者放入数组的倒数第2个元素中;……以此类推,第n-1轮需要进行1次比较,将剩下的2个数中的较大者放入a[1]中,将最小的数放入a[0]中。当第n-1轮比较进行完后,所有的数据都按照升序在数组中排列。例6:用冒泡排序法对6个数进行排序(从小到大)升序冒泡排序方法:依次比较相邻的两个数a[j]和a[j+1],将小数放前面,大数放后面(如果前面的数大于后面的数,则进行交换,否则不做任何改变)。

经过第1轮(共5次比较与交换)后最大的数9已“沉底”。再对余下的前面5个数进行下1轮比较,次大的数又被安置。972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始状态第1轮第2轮第3轮第4轮第5轮7

思考:6个数排序,共经过5轮,每1轮都很相似,程序如何写?隐约感觉可用循环,但需分析规律。972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始状态第1轮i=0;7例6:用冒泡排序法对6个数进行排序(从小到大)第1轮i=0for(j=0;j<5;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}5次比较第2轮i=1;第3轮i=2;第4轮i=3;第5轮i=4;第2轮i=1for(j=0;j<4;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}4次比较第4轮i=3for(j=0;j<2;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}2次比较第5轮i=4for(j=0;j<1;j++){if(a[j]>a[j+1]){(a[j]a[j+1]}}1次比较归纳:for(i=0;i<5;i++)for(j=0;j<5-i;j++)外层循环变量i控制进行几轮比较内层循环变量j控制每轮的比较次数972541a[0]a[1]a[2]a[3]a[4]a[5]72541

927754712541794515241

5

7921

4

5

7

914129725419999972541初始状态第1轮i=0;7第2轮i=1;第3轮i=2;第4轮i=3;第5轮i=4;for(i=0;i<5;i++)for(j=0;j<5-i;j++)

if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}例6:用冒泡排序法对6个数进行排序(从小到大)用嵌套的for循环实现排序外层循环控制进行几轮比较内层循环控制每轮的比较次数#include<stdio.h>main(){inta[6],i,j,t;

for(i=0;i<6;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)for(j=0;j<5-i;j++)

if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}

for(i=0;i<6;i++)printf(“%3d”,a[i]);}输入6个数据用嵌套的for循环实现排序外层循环控制进行几轮比较内层循环控制每轮的比较次数如果前面的数大于后面的数,则进行交换,否则不做任何改变输出排序后的6个数据#defineN6main(){inta[N],i,j,t;for(i=0;i<N;i++)scanf(“%d”,&a[i]);for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;

}for(i=0;i<N;i++)printf(“%3d”,a[i]);}定义一个符号常量N代表要排序的数字个数如何推广到任意个数排序?#include<stdio.h>main(){inta[6],i,j,t;for(i=0;i<6;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)for(j=0;j<5-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;

}for(i=0;i<6;i++)printf(“%3d”,a[i]);}例7:用选择排序法对6个数进行升序排序(从小到大)选择法对n个数进行排序的思路是:如果要对n个数据排序,就需要进行n-1轮的比较,每次都从数组中未排好的子序列中找出一个最小数,与子序列最前面的1个元素交换,使小数放在子序列的最前面。例如,第1轮需要比较n-1次,在n个数中找出最小数与数组中的第1个元素(即a[0])交换,使数组中的最小数放在数组的最前面;第2轮将对剩下的n-1个数进行比较,需要比较(n-1)-1次,将n-1个数中的最小的数与子序列最前面的元素交换,也就数组中的第2个元素(即a[1])交换,使子序列中的最小数放在子序列的最前面;……以此类推,第n-1轮需要进行1次比较,将剩下的2个数中的小数与子序列的前面即a[n-2]交换,使子序列中的最小数子序列中的前面。当第n-1轮比较进行完后,所有的数据都按照升序在数组中排列。例7:用选择排序法对6个数进行排序(从小到大)选择排序:

第1轮比较时,用a[0]依次与a[1]到a[5]进行比较,如果a[0]较大则进行交换,否则不变。第1轮结束后,a[0]中为最小数.

第2轮比较时,用a[1]依次与a[2]到a[5]进行比较,如果a[1]较大则进行交换,否则不变。第2轮结束后,a[1]中为次小数.

以后各轮比较过程类似.972541a[0]a[1]a[2]a[3]a[4]a[5]

19754212975479574524

124975

1245

9

7795745972541729712初始状态第1轮第2轮第3轮第4轮第5轮795779例7:用选择排序法对6个数进行排序(从小到大)972541a[0]a[1]a[2]a[3]a[4]a[5]

19754212975479574524

124975

1245

9

7795745972541729712初始状态795779第1轮i=0for(j=1;j<6;j++){if(a[0]>a[j]){(a[0]a[j]}}5次比较第2轮i=1for(j=2;j<6;j++){if(a[1]>a[j]){(a[1]a[j]}}4次比较第4轮i=3for(j=4;j<6;j++){if(a[3]>a[j]){(a[3]a[j]}}2次比较第5轮i=4for(j=5;j<6;j++){if(a[4]>a[j]){(a[4]a[j]}}1次比较归纳:for(i=0;i<5;i++)for(j=i+1;j<6;j++)外层循环变量i控制进行几轮比较内层循环变量j控制每轮的比较第1轮i=0;第2轮i=1;第3轮i=2;第4轮i=3;第5轮i=4;例7:用选择排序法对6个数进行排序(从小到大)972541a[0]a[1]a[2]a[3]a[4]a[5]

19754212975479574524

124975

1245

9

7795745972541729712初始状态795779第1轮i=0;第2轮i=1;第3轮i=2;第4轮i=3;第5轮i=4;for(i=0;i<5;i++)for(j=i+1;j<6;j++)

if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}用嵌套的for循环实现排序外层循环控制进行几轮比较内层循环控制每轮的比较次数#include<stdio.h>main(){inta[6],i,j,t;

for(i=0;i<6;i++)scanf(“%d”,&a[i]);for(i=0;i<5;i++)for(j=i+1;j<6;j++)

if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}

for(i=0;i<6;i++)printf(“%3d”,a[i]);}i=0时,要进行5次比较,a[0]与a[1]比,a[0]与a[2]比…a[0]与a[5]比,最后a[0]中为最小数i=1时,要进行4次比较,a[1]与a[2]比,a[1]与a[3]比…a[1]与a[5]比,最后a[1]中为第2小的数i=2时,要进行3次比较,a[2]与a[3]比,a[2]与a[4]比,a[2]与a[5]比,最后a[2]中为第3小的数……..用嵌套的for循环实现排序外层循环控制进行几轮比较内层循环控制每轮的比较选择排序法第二种方法(从小到大,思考)第二种方法:

两两比较后并不马上交换,而是找到最小数后记下其下标P。在一轮比较完毕后,再将最小的数一次交换到位。——比较次数不变,交换次数减少。972541a[0]a[1]a[2]a[3]a[4]a[5]12457912457997254191初始状态第1轮第2轮第3轮第4轮第5轮p=0p=1p=2p=5

172549p=1p=227

1

27549p=247p=3p=4p=3p=4选择排序法第二种方法(从小到大)972541a[0]a[1]a[2]a[3]a[4]a[5]12457912457997254191初始状态第1轮第2轮第3轮第4轮第5轮p=0p=1p=2p=5

172549p=1p=227

1

27549p=247p=3p=4p=3p=4第1轮i=0{p=0;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;//比较5次,

if(p!=i){a[p]a[0]}}第2轮i=1{p=1;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;//比较4次,

if(p!=i){a[p]a[1]}}第5轮i=4{p=4;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;//比较1次

if(p!=i){a[p]a[4]}}main(){inta[6],i,j,p,temp;for(i=0;i<6;i++)scanf("%d",&a[i]);for(i=0;i<5;i++){p=i;for(j=i+1;j<6;j++)if(a[j]<a[p])p=j;if(p!=i){temp=a[p];a[p]=a[i];a[i]=temp;}}for(i=0;i<6;i++)printf("%3d",a[i]);}1、第1轮排序找到所有元素的最小值a[p],然后将a[0]与a[p]交换,则第1轮结束后,a[0]中为最小数。第1轮找最小值a[p]的方法:令p=0,扫描a[1]…a[5],有小于a[0]的即令p记录其下标,否则p不变。之后比较a[p]与剩余元素,若有比a[p]小的,则改变p值,否则p不变。该轮比较结束时,p记录的就是最小值的下标。2、其他几轮与此类似,只是不要再动已排好的元素.课后作业教材P152-153:

7.2、7.4、7.57.3

二维数组

一、二维数组的定义

1.概念:表示1个数组元素需要2个下标的数组叫作二维数组。

如:学生年龄表

若用一维数组描述,需要两个数组: intnum[5];/*存放学号*/ intage[5];/*存放年龄*/

若用二维数组描述: inta[2][5];

2.定义形式:

类型说明符数组名[常量表达式1][常量表达式2];

如:inta[100][3];

/*定义一个100行3列的整型数组*/ floatf[20][5];/*定义一个20行5列的浮点型数组*/ inta[10+20][6+2];/*定义一个30行8列的整型数组*/

学号12345年龄15161714153.二维数组的理解:特殊的一维数组,该一维数组的每个数据元素也是一个一维数组。例inta[3][4];a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]每个元素a[i]由包含4个元素的一维数组组成二维数组a是由3个元素组成a[0]a[1]a[2]4.存储形式:二维数组的元素在内存中按行连续存放

如:inta[3][3];它的存放形式如下:012345678a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]a[0][0]a[0][1]a[0][2]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]100010021004100610081010101210141016

二、二维数组的引用:

数组名[下标][下标]

注意:(1)每个下标都要用[]括起来

如a[2][1]不能写成a[2,1](2)下标从0开始,且不要超过定义的范围

(3)通过引用,二维数组元素就可以象普通数据

一样进行赋值、算术运算及输入输出操作。

三、二维数组的初始化——定义同时赋初值

1.分行初始化(看作是特殊的一维数组)

如:inta[3][4]={

{1,2,3,4},{5,6,7,8},{9,10,11,12}};

此方法较直观,第1对{}内的数据赋给第1行数组元素,依

次类推2.将所有数据写在一个花括号内,按数据的排列顺序对数组

元素赋初值

如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

将数据依次赋给元素a[0][0],a[0][1]……a[2][3]123456789101112注意:此方法数据无明显的界限,当数据较多时容易出错3.对数组的部分元素赋初值,未赋值元素自动取0

如:inta[3][4]={{1,2},{3},{4,5,6}};

inta[3][4]={1,2,3,4,5,6};1200300045601234560000004.对数组的全部元素赋初值时可以省略第一维的长度(行下标),

系统会根据数据的个数和第二维的长度自动求出第一维长度,

但第二维下标不可省。

如:intb[][2]={1,2,3,4,5,6,7,8};数组a第一维长度为3

数组b第一维长度为4

如仅对部分元素赋初值,要想省略数组的行数,则必须分行赋值。

如:inta[][4]={{1,2},{0,3,4},{5}};120003405000例9:找出3×4矩阵中最大的数,并输出其行号和列号N-S流程图表示算法52093712610418max0row0col59301212输出:max=12max=a[1][2]for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max){max=a[i][j];row=i;col=j;}例9:找出3×4矩阵中最大的数,并输出其行号和列号#include<stdio.h>main(){inti,j,row=0,col=0,max;inta[3][4]={{5,2,0,9},{3,7,12,6},{10,4,1,8}};max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)

if(a[i][j]>max){max=a[i][j];row=i;col=j;}printf(“max=%d\n”,max);printf(“max=a[%d][%d]\n”,row,col);}例10:将一个矩阵进行转置(即原来的行变为列)例如:37126104185209b[1][0]b[1][2]52093712610418a[0][1]a[2][1]算法:for(i=0;i<3;i++)for(j=0;j<4;j++)b[j][i]=a[i][j];转置前转置后3712610418520952093712610418#include<stdio.h>main(){inta[3][4],b[4][3],i,j;for(i=0;i<3;i++)for(j=0;j<4;j++)scanf(“%d”,&a[i][j]);for(i=0;i<3;i++)for(j=0;j<4;j++)

b[j][i]=a[i][j];

for(i=0;i<4

;i++)

{for(j=0;j<3;j++)printf(“%5d”,b[i][j]);printf(“\n”);

}}a[0][1]b[1][0]a[2][1]b[1][2]输入数组a进行矩阵转置输出数组b例11:求一个4×4矩阵对角线元素之和。#include<stdio.h>main(){inta[4][4]={{12,76,4,1},{-19,28,55,-6},{2,10,13,-2},{3,-9,112,-100}};inti,sum;/*sum:用于求和*/sum=0;for(i=0;i<4;i++)sum+=a[i][i];printf(”对角线和为%d\n”,sum);}定义数组a并初始化遍历所有的对角线元素,并求和例12读入下表中值到数组,分别求各行、各列及表中所有数之和(思考题)124615798233251712462215793182333425172437

39

35

111main(){intx[5][4],i,j;

for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&x[i][j]);

for(i=0;i<3;i++)x[4][i]=0;for(j=0;j<5;j++)x[j][3]=0;

for(i=0;i<4;i++)for(j=0;j<3;j++){x[i][3]+=x[i][j];

x[4][j]+=x[i][j];x[4][3]+=x[i][j];}for(i=0;i<5;i++){for(j=0;j<4;j++)printf("%5d\t",x[i][j]);printf("\n");}}7.4

字符数组和字符串

字符数组:每个元素都是字符类型的数组。charstring[80];字符串:一串以‘\0’结尾的字符在C语言中被看作字符串。

字符串的末尾必须有’\0’字符,它的ASCII码值为0。

C语言中没有字符串变量,而是将字符串存入字符数组来处理。China\0China不是字符串是字符串字符串常量:用双引号括起的一串字符是字符串常量,C语言自动为其添加‘\0’结束符。如:"China"一、字符数组1.定义:

char数组名[常量表达式]

例:charc[10],ch[3][4];2.字符数组的初始化1).逐个字符赋值2).用字符串常量7.4

字符数组和字符串

例charch[5];ch[0]=‘H’;ch[1]=‘e’;ch[2]=‘l’;ch[3]=‘l’;ch[4]=‘o’;ch[0]Hello逐个字符赋值ch[1]ch[2]ch[3]ch[4]注意{}

例charch[5]={‘H’,’e’,’l’,’l’,’o’};ch[0]Hello逐个字符赋值ch[1]ch[2]ch[3]ch[4]

例charch[5]={‘B’,’o’,’y’};ch[0]Boy\0\0逐个字符赋值ch[1]ch[2]ch[3]ch[4]

例charch[5]=“Boy”;ch[0]Boy\0\0用字符串常量ch[1]ch[2]ch[3]ch[4]

例charch[6]={“Hello”};charch[6]=“Hello”;charch[]=“Hello”;用字符串常量ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]3、字符数组元素的引用#include<stdio.h>main(){charc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++)printf("%c",c[i]);printf("\n");}Iamaboy0123456789可以为字符数组元素赋值,也可以引用字符数组中的一个元素,用来运算或输入/输出元素的值。字符串存放及其结束标志无字符串变量,用字符数组处理字符串字符串结束标志:‘\0’例“hello”共5个字符,在内存占6个字节,字符串长度5

'h'

'e'

'l'

'l'

'o'

'\0'

1041011081081110内存存放字符ASCII码4、字符串在字符数组中存放的注意点等价于:chars1[]={'C','h','i','n','a','\0'};chars2[10]={'C','h','i','n','a','\0',

'\0','\0','\0','\0'};chars1[]=“China”

chars2[10]="China"

;4、字符串在字符数组中存放的注意点s2[4]s2[5]s2[7]s2[6]s2[8]s2s2[0]s2[2]s2[1]s2[3]10个字节'C''i''n''a''h''\0's2[9]'\0'

'\0'

'\0'

'\0''\0's1[5]s1s1[0]s1[2]s1[1]s1[3]6个字节s1[4]'C''i''n''a''h'

数组名:字符数组(字符串)在内存的首地址。

作为字符串进行存储时,字符串与字符数组的长度可以不等,系统自动加‘\0’为结束标志。ss1[0]s1[2]s1[1]s1[3]5个字节s1[4]'C''i''n''a''h''\0's3[5]s1s3[0]s3[2]s3[1]s3[3]6个字节s3[4]'C''i''n''a''h'不等价于:chars[5]={'C','h','i','n','a'};chars1[]=“China”

不能写成:chars1[5]="China"

用字符串作初值时,数组的长度应足够大以便能容纳全部字符和‘\0’。4、字符串在字符数组中存放的注意点不是字符串二、字符数组的输入输出1、逐个字符I/O:%c,输入或输出一个字符;2、整个字符串I/O:%s,将整个字符串一次输入或输出。例用%cmain(){charstr[5];inti;for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=0;i<5;i++)printf(“%c”,str[i]);}例用%smain(){charstr[5];scanf(“%s”,str);printf(“%s”,str);}用字符数组名,不要加&输入串长度<数组维数遇空格或回车结束自动加‘\0’用字符数组名,一次输出整个字符串,遇‘\0’结束main(){chara[]=“Hello”;printf(“%s”,a);}结果:Helloprintf的%s输出字符串main(){chara[]={'h','e','l','\0','l','o','\0'};printf("%s",a);}输出:hel

hel\0lo\0数组中有多个‘\0’时,遇第一个结束用“%s”输出时,遇‘\0’结束hello02314\05main(){inti;chara[5];scanf("%s",a);for(i=0;i<5;i++)printf("%d,",a[i]);}运行情况:(1)若输入hel,正常(2)若输入hell,正常(3)若输入hello,用%s输出时会出错输入字符串长度<数组维数scanf的%s输入字符串

hel\0

hell\0

helloscanf的%s输入字符串#include<stdio.h>main(){chara[15],b[5],c[5];

scanf("%s%s%s",a,b,c);printf("a=%s\nb=%s\nc=%s\n",a,b,c);

scanf("%s",a);printf("a=%s\n",a);}运行情况:输入:Howareyou?输出:a=Howb=arec=you?输入:Howareyou?输出:a=Howscanf中%s输入时,遇空格或回车结束

How\0

are\0

you?\0

三个字符串用空格隔开,分别赋给a、b、c三个数组。三、常用的字符串处理函数包含在头文件string.h(1)字符串输出函数puts格式:puts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以‘\0’结束(2)字符串输入函数gets格式:gets(字符数组)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’说明:输入串长度应小于字符数组维数例#include<stdio.h>#include<string.h>main(){charstring[80];printf(“Inputastring:”);gets(string);puts(string);}输入:Howareyou?输出:Howareyou?

#include<stdio.h>main(){chars1[80]=“CLanguage”;

chars2[80]="Program";

printf("%s",s1);

printf("%s",s2);}运行结果为:CLanguageProgram讨论1:printf()和puts()函数一次输出整个字符串区别?#include<stdio.h>main(){chars1[80]=“CLanguage”;

chars2[80]="Program";

puts(s1);

puts(s2);

}运行结果为:CLanguagePrograme注意:puts()函数输出字符串后会自动换行#include<stdio.h>main(){chara[15],b[5],c[5];scanf("%s",a);printf("a=%s\n",a);}运行情况:输入:Howareyou?输出:a=How#include<stdio.h>main(){chara[15],b[5],c[5];gets(a);printf("a=%s\n",a);}

使用scanf()的%s整体输入,空格或回车结束使用gets()函数,只以回车键结束输入运行情况:输入:Howareyou?输出:a=Howareyou?讨论2:scanf()的%s与gets()函数的区别?scanf不能读入带空格的字符串,gets()可以(3)字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串最后加‘\0’main(){charc1[20]="abcde",c2[10]="12345";

strcat(c1,c2);12345\0\0\0\0\0abcde\0\0\0\0\0\0……\012345\0

puts(c1);puts(c2);}abcde1234512345c1:c2:(4)字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大拷贝时‘\0’一同拷贝

不能使用赋值语句为一个字符数组赋值例charstr1[20],str2[20];str1={“Hello!”};(

)str2=str1;(

)abcde\0\0\0\0\0\0……\0strcpy()函数的使用1main(){charc1[20]="abcde",c2[10]="123";

strcpy(c1,c2);123\0\0\0\0\0\0\0123\0puts(c1);puts(c2);}123123c1:c2:abcde\0\0\0\0\0\0……\0strcpy()函数的使用2main(){charc1[20]="abcde",c2[10]="123456789";

strcpy(c1,c2);123456789\0123\0

puts(c1);puts(c2);}123456789123456789456789c1:c2:(5)字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止返值:返回两个字符串中第一个不同字符的ASCII码值之差。说明:字符串比较不能用“==”,必须用strcmpstrcmp()函数的使用1——遇到不同的字符main(){charc1[10]="abcde",c2[10]="abbde";intn;

n=strcmp(c1,c2);abbde\0abcde\0print("n=%d\n",n);}n=1c1:c2:strcmp()函数的使用2——遇到不同的字符main(){charc1[10]="aaa",c2[10]="abcde";intn;

n=strcmp(c1,c2);abcde\0aaa\0

print("n=%d\n",n);}n=-1c1:c2:strcmp()函数的使用3——字符串2结束main(){charc1[10]="abcde",c2[10]="abcd";intn;

n=strcmp(c1,c2);abcd\0abcde\0print("n=%d\n",n);}n=101c1:c2:strcmp()函数的使用4——两个字符串相等main(){charc1[10]="abcde",c2[10]="abcde";intn;

n=strcmp(c1,c2);abcde\0abcde\0

print("n=%d\n",n);}n=0c1:c2:strcmp()函数的使用5——字符数组与字符串比较main(){charc1[10]="abcde";intn;

n=strcmp(c1,"ad");ad\0abcde\0\0\0\0\0

print("n=%d\n",n);}n=-2c1:(6)字符串长度函数strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括‘\0’在内例:对于以下字符串,strlen(s)的值为:思考)(1)chars[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};(2)chars[]=“\t\v\\\0will\n”;(3)chars[]=“\x69\082\n”;答案:131#include"string.h"main(){intm,n;charstr[80]="Clanguage";m=strlen(str);n=sizeof(str);printf("mis%d\nnis%d\n",m,n);程序的运行结果:mis10nis80#include<string.h>#include<stdio.h>main(){charstr1[]=”Hello!",str2[]=”Howareyou?”,str[20];intlen1,len2,len3;

len1=strlen(str1);len2=strlen(str2);

if(strcmp(str1,str2)>0){strcpy(str,str1);strcat(str,str2);}

elseif(strcmp(str1,str2)<0){strcpy(str,str2);strcat(str,str1);}

elsestrcpy(

温馨提示

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

评论

0/150

提交评论