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

下载本文档

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

文档简介

第七章数组数组的基本概念一维数组的定义和引用二维数组的定义和引用字符数组本章内容2

3

1.数组的基本概念

在前面几章中,所介绍的数据类型为基本类型(整、实、字符),基本类型的数据已是最小数据单位。C语言还提供了以这些基本类型为基础,按层次方法构造起来的构造类型(数组、结构体、共同体)。其中数组:同一种(基本)类型按一定顺序组合在一起的数据类型。1.数组的基本概念数组的特点:数组是同类型下标变量的有序集合。数组中的每个成员称为元素,数组元素如同基本变量一样地使用。

各元素按顺序排列,元素在数组中的位置由下标确定,数组是通过下标去访问各元素的。下标必须是正整数、0、整型表达式,下标的个数被称为维数。4

5

2.一维数组a[0]0145a[1]a[2]a[3]a[4]a[5]23a合法标识符表示元素个数下标从0开始编译时分配连续内存内存字节数=数组元素个数*

sizeof(元素数据类型)数组名表示内存首地址,是地址常量例

inta[6];类型说明符

数组名[常量表达式];int

a[6]

;

charc[5];[]:数组运算符单目运算符优先级(1)左结合不能用()注意:数组定义中的下标,表示元素的个数(数组的长度),不能是变量,下标编号是从0开始的。编译不检查数组的边界是否超界,在上例中若使用

a[6],c[5]是错误的。定义:

2.一维数组说明:

数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值只给部分数组元素赋初值当全部数组元素赋初值时,可不指定数组长度在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;如inta[5]={6,2,3};

等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};

()一维数组的初始化:

6

2.一维数组象使用变量那样,先定义后使用引用方式:数组名[下标]代表了一个元素,等价一个同类型的变量例如:a[0]5+a[1]6为正确的算术表达式一般地,一维数组各元素分配在连续地内存单元之中,只能逐个引用数组元素,不能一次引用整个数组一维数组的引用:

7

例inta[10];printf(“%d”,a);()必须

for(j=0;j<10;j++)printf(“%d\t”,a[j]);()【例1】读程序写结果#include<stdio.h>voidmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");}

数组元素的下标常用循环变量来控制98765432102.一维数组一维数组的程序举例:

8

用循环语句:s=0;for(n=1;n<=30;n++){scanf(“%d”,&x);

s=s+x;

}printf(“%f”,s/30);

用数组:s=0;for(n=1;n<=30;n++){scanf(“%d”,&x[n]

)s+=x[n];}printf(“%f”,s/30);

【例2】求平均分9

2.一维数组【例3】用数组求Fibonacci数列问题。f[i]=f[i–2]+f[i–1];i=2~20F1=1,F2=1Fn=Fn–1+Fn–2(n>2)main(){inti;staticintf[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]);}}main(){longintf1,f2;inti;f1=1;f2=1;for(i=1;i<=20;i++){printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}

10

2.一维数组【例4】在一批数中求最大数和最小数,并将最大数与最小数互换位置。

由于后一个问题中涉及位置,故用数组来存数。1、输入:for循环输入6个整数

2、给变量min,max赋初值max=min=a[0];3、依次用a[i]和max,min比较(循环)若max≤a[i],令max=a[i],记录大数的位置k=i;若min≥a[i],令min=a[i],记录小数的位置j=i;4、遍历后,将max与min互换a[k]=min;a[j]=max;5、输出:for循环输出互换位置的6个整数。算法:11

2.一维数组voidmain(){inti,a[6],max,min,k=0,j=0;for(i=0;i<=5;i++)scanf("%d",&a[i]);max=min=a[0];for(i=1;i<=5;i++){if(max<=a[i]){max=a[i];k=i;}if(min>=a[i]){min=a[i];j=i;}}printf("max=%dmin=%d\n",max,min);

a[k]=min;a[j]=max;for(i=0;i<=5;i++)printf("%d",a[i]);}运行过程:输入:132957↙输出:max=9min=193215712

2.一维数组for(i=2;i<=5;i++){if(max<a[i]){max=a[i];k=i;}

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

for(i=2;i<=5;i++){if(max<a[i]){max=a[i];k=i;}

else

{min=a[i];j=i;}}

13

2.一维数组【例5】将任意5个数从小→大排序。分析:a[0],a[1],a[2],a[3],a[4]

排序过程:(相邻元素二二比较)(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束冒泡排序法14

2.一维数组冒泡排序法:voidmain(){inti,j,t,k,a[5]={24,67,-2,-23,78};

for(i=0;i<4;i++)

for(j=0;j<4-i;j++)

if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=t;}

for(i=0;i<5;i++)printf("%d",a[i]);}运行结果:-23-2246778外循环控制比较的趟数n-1内循环控制每趟比较的次数

15

2.一维数组排序过程:将a[0]与a[1]-a[4]分别比较,将最小值存入a[0],将a[1]→a[2]-a[4]分别比较,将当前最小值存入a[1],

将a[2]→a[3]-a[4]分别比较,将当前最小值存入a[2],将a[3]→a[4]比较,将当前最小值存入a[3]。选择排序法16

2.一维数组选择排序法:voidmain(){inti,j,t,k,a[5]={24,67,-2,-23,78};

for(i=0;i<4;i++){k=i;for(j=k+1;j<5;j++)

if(a[k]>a[j])k=j;

t=a[i];a[i]=a[k];a[k]=t;}for(i=0;i<5;i++)printf("%d",a[i]);}运行结果:-23-224677817

2.一维数组【例6】有一个从小到大已排好序的数组,现插入一个数,使数组仍有序。分析:

解决上述问题可采用重排序和插入算法。重排序:将数据插入数组尾部,将数组重新排序。插入:前插和后插。仅移动部分数据,效率高,多采用。18

2.一维数组1.给a数组输入一组有序数,给x赋值。4.a[i]=x,输出a数组。2.查找插入点:

若x>尾元素,插在队尾之后。否则将数组中各元素逐一与x比较,一旦

x<=a[i](即找到插入点i)就跳出循环。前插算法:3.将a[i]及其之后的元素向后平移一位,以便腾出

a[i]插入x。19

2.一维数组查找位置向后平移,腾出i位置插入数据voidmain(){intx,i,j,a[5]={2,5,8,10};scanf("%d",&x);

if(x>a[3])i=4;

else

{for(i=0;i<5;i++)

if(x<=a[i])break;for(j=3;j>=i;j--)a[j+1]=a[j];}a[i]=x;for(j=0;j<5;j++)printf("%d",a[j]);}运行过程:输入:7↙输出:25781020

2.一维数组1.给a数组输入一组有序数,给x赋值。3.后插x:a[i+1]=x;

输出a数组。2.反向遍历数组:

若x>某元素,跳出(找到插入点)。否则将当前元素向后平移(腾位置)。后插算法:for(i=3;i>=0;i--){

if(x>a[i])break;

elsea[i+1]=a[i];

}21

2.一维数组voidmain(){intx,i,a[5]={1,5,9,14};scanf("%d",&x);for(i=3;i>=0;i--){if(x>a[i])break;

//找到插入点,跳出

elsea[i+1]=a[i];

//否则,向后平移}a[i+1]=x;for(i=0;i<5;i++)printf("%d",a[i]);}运行过程:输入:6↙输出:15691422

3.二维数组

主要用来处理具有行列结构的数据(矩阵)类型说明符数组名[常量表达式][常量表达式]inta[3][4];floatx[5][8];因为有两个下标,故称为二维数组。(下标的个数被称为维数)此下标指示行此下标指示列

定义a为3×4(3行4列)的整型数组定义x为5×8(5行8列)的实型数组注意不能写成

inta[3,4];floatx[5,8];定义:作用:23

3.二维数组

成绩单学号数学英语c语言平均分

198808627869903567880在这批数中,每个数具有固定的位置这批数须用二维数组来处理。

例如:

inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]1988086

a[1][0]a[1][1]a[1][2]a[1][3]2786990a[2][0]a[2][1]a[2][2]a[2][3]35678803.二维数组

特点:

按行存放可将二维数组看成是特殊的一维数组,它的每个元素又是一个一维数组例如inta[3][4];表示:一个二维数组,共存放3*4=12个整数可将a数组看作是一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组24

014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]3.二维数组

二维数组的引用引用方式:数组名[下标][下标]其中的下标为整型表达式,但不得越界与一维数组元素一样,二维数组元素相当于同类型的简单变量注意下标的最大取值,即要注意数组定义和数组元素引用的区别例如定义inta[3][4];下标下限值是a[0][0]下标上限值是a[2][3]25

3.二维数组

二维数组的初始化按行给二维数组赋全值inta[3][4]={{1,2,3,4},

{5,6,7,8},{9,10,11,12}};或:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};staticb[2][3];b[2][4]={0};所有的元素被赋值0。26

3.二维数组可以对部分元素赋初值,但需表达清楚。例如:inta[3][4]={{1,2},{3},{8}}

则相当于1200

30008000若:inta[3][4]={1,2,3,8}

则相当于12380000

0000

27

3.二维数组在程序中对二维数组访问,一般要利用双循环。例如:for(j=0;j<3;j++)

for(k=0;k<4;k++)scanf(“%d”,&a[j][k]);

a[3][2]=20;例如:a[i][j]=10;printf(“%d”,a[i][j]);28

3.二维数组二维数组的程序举例:

29

【例7】将一个二维数组行和列元素互换,存到另一个二维数组中。a=123456b=142536①

a数组初始化(或赋值)并输出②用二重循环进行转置b[j][i]=a[i][j]③输出b数组算法如下:数组元素数据的输入必须以循环方式进行或者定义时置初值二维数组一般用二重循环30

3.二维数组main(){staticinta[2][3]={{1,2,3},{4,5,6}};staticintb[3][2],i,j;printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}}运行结果:arraya:123456arrayb:14253631

3.二维数组【例8】有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号。先用N-S流程图表示算法max=a[0][0]fori=0to2forj=0to3a[i][j]>maxmax=a[i][j]row=icolum=j输出:max和row,colum真假32

3.二维数组main(){inti,j,row=0,colum=0,max;staticinta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;}printf("max=%d,row=%d,colum=%d\n",max,row,colum);}运行结果:max=10,row=2,colum=1小测验【题1】以下能对一维数组a所有元素正确初始化的语句是:

A)inta[20]={1,2,3,4,5};

B)

inta[30]={};C)inta[]={1};

D)

a[20]={10};【题2】以下数组定义错误的是:

A)inta[2][3];B)

intb[][3]={0,1,2,3};C)intc[100][100]={0};

D)

d[2][]={{1,2},{1,2,3}};【例3】下面程序的输出结果是:main(){staticinta[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;for(i=0;i<3;i++)for(j=0;j<=i;j++)s+=a[i][j];printf(“%d\n”,s);}A)18B)19C)20D)21√√√33

4.字符数组

定义:34

存放字符数据。字符串–––用字符数组存放。类型名数组名大小

charc[10];

字符型和整型可以相互通用。初始化:直接给出字符串中的各字符例如staticchara[4]={'G','o','o','d'};若字符多于元素个数,则语法错,反之,后面补"\0"4.字符数组可以去掉定义时的大小设置,而通过自动赋值决定长度(大小)例如staticcharx[]={'I','','a','m','','a','','s','t','u','d','e','n','t'};前面说过,字符串常量用“”表示,且由‘\0’结尾例如staticcharx[]={"Iamastudent."};则长度为15+1=16,其中x[15]存放‘\0’,其中{}

亦可省略引用:每一个字符数组元素相当于一个字符变量35

4.字符数组字符串:用“字符串”赋初值时,长度=字符个数+1,以便编译自动在串尾后加结束符\0;赋初值时,若未指定长度,以实际录入的字符个数为准定义字符串类型时,长度不能省略例如charstr[]字符个数>数组长度,出错。字符个数<数组长度,多余的元素被自动赋值\0例如charcity[5]=“Beijing”;36

4.字符数组字符数组的访问:对字符数组的访问可采用两种格式符:格式符:

%c–––逐个输入/输出字符

%s–––整个串一次输入/输出输出(用%s)用%s输出时,不输出‘\0’在printf中须直接写数组名

staticcharc[]={"Iamastudent"};printf("%s",c);若数组长度大于字符串长度,则遇到‘\0’即停止输出

staticcharc[10]="china";printf("%s",c);输出时遇到第一个‘\0’即结束37

4.字符数组输入(用%s)输入字符串时,系统自动加上‘\0’输入多个字符串,可用空格隔开

scanf中须用地址量,数组名表示地址量38

staticcharstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);则:输入Howareyou?str1:How\0str2:are\0str3:you?\0但若:staticcharstr[13]scanf("%s",str);输入:Howareyou?则只会将How输入,且存为str:How\0……

4.字符数组【例9】输入一个字符串并存放至字符数组,统计字符串中共有多少个数字和其他字符。main(){

charch[100];inti=0,number=0,other=0;scanf("%s",ch);while(ch[i]!='\0'){if(ch[i]>='0'&&ch[i]<='9')

number++;else

other++;

i++;}printf("\nnumber=%d,other=%d",number,other);}运行过程:输入:6,e,5;m?3#↙

输出:number=3,other=739

4.字符数组字符串处理函数:

40

gets(字符数组名):从键盘输入一个字符串(以回车结束

)放到数组中,并且得到一个函数值,该函数值是字符数组的起始地址。如:gets(str)

puts(字符数组名/字符串):

将数组中的字符串(以’\0’结束的字符序列)输出到终端上,输完换行。

即puts(str)与printf(“%s\n”,str)等价或puts(“ok!”);与printf(“%s\n”,“ok!”)

或printf(“ok!\n”)等价4.字符数组

41

strcat(字符数组1,字符数组2)

连接两个字符数组中的字符串,把字符串2接到字符串1后面,结果放在字符数组1中。strcpy(字符数组1,字符串2)

将字符串2复制到字符数组1中去。注意:①字符数组1的长度≥字符串2的长度②拷贝时连同’\0’一起拷贝③不能把字符串或字符数组直接赋给一个字符数组如:charstr[6];

str=“China”;

str[0]=“C”;str[1]=“h”;

strcpy(str,“China”);4.字符数组

42

strcmy(字符串1,字符串2)

比较两个字符串:如:

字符串1>字符串2时,正数x=strcmy(“abc”,“ABC”);

字符串1=字符串2时,0x=strcmy(“AX”,“AX”);字符串1<字符串2时,负数x=strcmy(“1000”,“2”);

※两个字符串比较不能用下面形式

str1==str2或str1<str2或str1>str2

只能用strcmy(str1,str2)==0或<0或>0来判断strlen(字符数组)

测试字符串长度(不含‘\0’)如:strlen(“China”)值为5字符串的比较、拷贝、连接都必须用函数4.字符数组

43

strlwr(字符串)将字符串中大写字母转换成小写字母strupr(字符串)将字符串中小写字母转换成大写字母4.字符数组

温馨提示

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

评论

0/150

提交评论