程序设计教案二维数组_第1页
程序设计教案二维数组_第2页
程序设计教案二维数组_第3页
程序设计教案二维数组_第4页
程序设计教案二维数组_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

二维数组的定义(1)1、一般形式:类型说明符

数组名[常量表达式][常量表达式]例如:int

a[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]定义了一个3*4(3行4列)的数组.注意:

不能写成

int

a[3,4];二维数组的定义(2)可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组.例如:inta[3][4];/*定义了一个3*4(3行4列)的数组.*/我们可以将a看成一个一维数组:a[0]、a[1]、a[2],每个元素又是包含4个元素的一维数组。aa[0]---------a[0][0]a[0][1]a[0][2]a[0][3]a[1]---------a[1][0]a[1][1]a[1][2]a[1][3]a[2]---------a[2][0]a[2][1]a[2][2]a[2][3]二维数组的存放2、存放顺序:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。int

a[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]二维数组的引用1、数组元素的表示形式:数组名[下标][下标]例如:a[3][4]区分在定义数组时用的a[3][4]和引用元素a[3][4]下标可以是整型表达式例如:a[2-1][2*2-1]数组元素可以出现在表达式中,也可以被赋值。例如:b[1][2]=a[2][3]/2;2、注意:使用数组元素时,下标值应该在定义的数组大小的范围内。不要出现这样的错误:例如:int

a[3][4];a[3][4]=3;二维数组的初始化(1)1、分行给二维数组赋初值。例如:int

a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};1234567891011122、可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。例如:int

a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};123456789101112二维数组的初始化(2)3、可以对部分数据赋初值。例如:int

a[3][4]={{1},{5},{9}};100050009000例如:int

a[3][4]={{1},{0,6},{0,0,11}};1000060000110例如:int

a[3][4]={{1},{5,6}};100056000000例如:int

a[3][4]={{1},{},{0,0,11}};1000000000110二维数组的初始化(3)4、如果对全部元素赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如:int

a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};等价于:int

a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};1234567891011120030000001000如果定义时也可以只对部分元素赋初值而省略第一维的长度,但应该分行赋初值:例如:int

a[][4]={{0,0,3},{},{0,10}};(4)例

7.4

有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号.

(见教材129页)for

i=0

to

2max=a[0][0]for j

=0

to

3a[i][j]>max真max=a[

i][j];row=i;colum=j;假输出:max,row,colummain(){int

i,j,row=0,colum=0,max;int

a[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<=2;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;}printf(“%d,%d,%d”,max,row,colum);}字符数组定义(1)c[5]当数组中的全部初始化,定义时数组的长度可以省略,注意不同的初始化方式会导致数组长度的不同c[6]c[6]用来存放字符数据的是字符数组.字符数组中的一个元素存放一个字符.1、定义方式:字符数组的定义方法与前面介绍的数值数组相同。例如:(1)char

c[]

={‘c’,’h’,’i’,’n’,’a'};c[0]=‘c’;c[1]=‘h‘;c[2]=‘i’;c[3]=‘n’;c[4]=‘a’;(2)char

c[]

={“china”};

char

c[]

=“china”c[0]=‘c’;c[1]=‘h‘;c[2]=‘i’;c[3]=‘n’;c[4]=‘a’;c[5]=‘\0’;字符数组定义(2)2.说明:(1)由于字符型和整型通用,也可以定义为intc[10]。但这时每个数组元素占2个字节的内存单元。char

c[10];占1个字节int

c[10];占两个字节C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]IamhappyC[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]Iamhappy字符数组定义(3)I\0ad\0\0\0\0\0\0\0char

a[3][4]={{‘I’,’a’},{‘

’,’d’}};(2)字符数组也可以是二维或多维数组。例如:char

c[5][10];即为二维字符数组。char

a[3][4]={“Ia”,”

d”};I\0ad\0\0\0\0\0\0\0当数组中各个串的内容被初始化,定义时可以省略数组的第一维大小字符数组的初始化(1)1、字符数组允许在类型说明时作初始化赋值,逐个对数组元素进行初始化。例如:char

c[10]={‘I’,’

‘,’a’,’m’,’

’,’h’,’a’,’p’,’p’,’y’};初值个数等于数组元素长度时,依次赋值。初值个数大于数组元素长度时,做语法错误处理。C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]Iamhappy例如:char

c[10]={‘I’,’

’,’a’,’m’,’

’,’h’,’a’,’p’,’p’,’y’,’!’};字符数组的初始化(2)(3)初值个数小于数组元素长度时,则后面的元素自动置为空字符(也就是‘\0’)。例如:static

char

c[10]={`w`,`

h

`,`o`,`

`,’a’,m`,‘’,`I`};赋值后各元素的值为:C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]whoamI\0\0其中c[8]

、c[9]未赋值,由系统自动赋予\0值。(4)当对全体元素赋初值时也可以省去长度说明。例如:static

char

c[

]={`c`,`

`,`p`,`r`,`o`,`g`,`r`,`a`,`m`};这时C数组的长度自动定为9。输出结果:BASICdBASE字符数组的引用(1)1、输出一个字符串例:

写出下面程序的运行结果。main(

){ int

i,j;char

a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};for(i=0;i<=1;i++){for(j=0;j<=4;j++)

printf("%c",a[i][j]);printf("\n");}}字符数组的引用(2)2、输出一个钻石图形例:

写出下面程序的运行结果。main(

){ int

i,j;char

diamond[][5]={{‘

’,’

‘,’*’},{’

’,’*’,’

‘,’*’},{‘*’,’

’,’

’,’*’},{‘

’,’*’,’

’,’*’},{‘

’,’

’,’*’}};for(i=0;i<5;i++){for(j=0;j<5;j++)

printf("%c",diamond[i][j]);printf("\n");}}**

**

**

**字符串和字符串结束标志(1):1.总领:在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以‘\0’作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。`\0`代表ASCII码为0的字符,从ASCII码表中可以查到,

ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。字符串和字符串结束标志(2):‘\0'是由C编译系统自动加上的。2、字符数组的初始化:C语言允许用字符串的方式对数组作初始化赋值。例如:static

char

c[]={'c','','p','r','o','g','r','a','m'};可写为:static

char

c[]={"C

program"};或去掉{

}写为:static

char

c[]="C

program";说明:(1)用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:C

program\0。C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]CPrgram\0由于采用了‘\0’标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。例如:static

char

c[10]={“China”};C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]Cin、0、0、0、0、0在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符(2)对一个字符数组,如果不作初始化赋值,则必须说明数组长度。字符数组的输入输出(1)字符数组的输入输出方法:逐个字符输入输出。用格式符“%c”输入或输出一个字符。将整个字符串一次输入或输出。用“%s”格式符,意思是输出字符串(String)。例如:static

char

c[10]={`w`,`

h

`,`o`,`

`,’a’,m`,‘’,`I`,’!’};C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]whoamI!\0printf(“%s”,c);字符数组的输入输出(2)C[0]C[1]C[2]C[3]C[4]C[5]C[6]C[7]C[8]C[9]whoamI!\0字符数组的输入输出方法:逐个字符输入输出。用格式符“%c”输入或输出一个字符。将整个字符串一次输入或输出。用“%s”格式符,意思是输出字符串(String)。例如:static

char

c[10]={`w`,`

h

`,`o`,`

`,’a’,m`,‘’,`I`,’!’};printf(“%s”,c);在内存中数组c的状态如图所示。输出时,遇结束符‘\0’就停止输出.输出结果为:Who

am

I!字符数组的输入输出(3)注意:1、输出字符不包括结束符`\0`。2、用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。例如:printf(”%s”,c[0]);3、如果数组长度大于字符串实际长度,也只输出到遇`\0`结束。4、如果一个字符数组中包含一个以上`\0`,则遇第一个`\0`时输出就结束。如果利用一个scanf例:

写出下面程序的输出结果:main(

){static

char

c[]="BASIC\ndBASE";printf("%s\n",c);}输出结果:BASICdBASE例:

写出下面程序的输出结果:main(

){static

char

c[]="BASIC\0dBASE";printf("%s\n",c);}输出结果:BASIC例:

写出下列程序的功能:main(

){char

st[15];

printf("input

string:\n");scanf("%s",st);printf("%s\n",st);}注意:当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如运行上例:当输入的字符串中含有空格时,运行情况为:input

string:this

is

a

bookthis从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:main(

){char

st1[6],st2[6],st3[6],st4[6];printf("input

string:\n");scanf("%s%s%s%s",st1,st2,st3,st4);printf("%s

%s

%s

%s\n",st1,st2,st3,st4);}5.在前面介绍过,scanf的各输入项必须以地址方式出现,如

&a,&b等。但在例7.3.3中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char

c[10],在内存中设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在字符数组c前面不能再加地址运算符&。如写作

scanf("%s",&c);则是错误的。在执行函数printf("%s",c)时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。字符串处理函数:1.

字符输出函数puts格式:puts(字符数组名)作用:将一个字符串(以`\0`结束的字符序列)输出到终端。例:#include"stdio.h"main(){static

char

c[]="BASIC\ndBASE";puts(c);}从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。gets(字符数组)格式:gets(字符数组名)作用:从终端输入一个字符串到字符数组,并且得 到一个函数值。该函数值是字符数组的首地 址。例:#include"stdio.h"main(

){char

st[15];

printf("input

string:\n");gets(st);puts(st);}可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。注意:puts和gets函数只能输入或输出一个字符串。字符串连接函数strcat格式:strcat(字符数组名1,字符数组名2)作用:连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。例:

strcat函数的使用#include"string.h"main(

){static

char

st1[30]="My

name

is

";int

st2[10];printf("input

your

name:\n");gets(st2);strcat(st1,st2);puts(st1);}本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。说明:字符数组1必须足够大,以便容纳连接后的新字符串。连接前两个字符串的后面都有一个`\0`,连接时将字符串1后面的`\0`取消,只在新串最后保留一个`\0`。字符串复制函数strcpy格式:strcpy(字符数组名1,字符数组名2)作用:将字符串2复制到字符串1中去。字符数名2, 也可以是一个字符串常量。这时相当于把一 个字符串赋予一个字符数组。不能用赋值语 句对整个数组进行赋值。例:复制函数的使用#include"string.h"main(

){static

char

st1[15],st2[]="C

Language";strcpy(st1,st2);puts(st1);printf("\n");}说明:字符数组1必须定义的足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。复制时连同字符串后面的`\0`一起复制到字符数组1中。不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。而只能用stropy函数处理。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。可以用stropy函数将字符串2中前面若干个字符复制到字符 数组1中去。例如:strcpy(str1,str2,2)是将str2中前面两个字符拷贝到str1中,然后再加一个结束符‘\0’。字符串比较函数strcmp格式:strcmp(字符数组名1,字符数组名2)作用:比较字符串1和字符串2。规则:对两个字符串自左至右逐个字符相比(按照ASCII码值大小比较),直到出现不同的字符或遇到`\0`为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。并由函数返回值返回比较结果。如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”。注意:小写字母比大写字母“大”。C.比较的结果由函数值带回。如果字符串1==字符串2,函数值为0;如果字符串2>字符串2,函数值为一正整数;如果字符串1<字符串2,函数值为一负整数。注意:对两个字符串比较时的书写格式。例如:if

(str1=s

温馨提示

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

评论

0/150

提交评论