《C语言数组结构介绍实用教案》由会员分享,可在线阅读,更多相关《C语言数组结构介绍实用教案(42页珍藏版)》请在金锄头文库上搜索。
1、一维数组的引用一维数组的引用(ynyng)格式:数组名下标下标可以是常数或者常数表达式,也可以是变量或者变量表达式,但必须(bx)是整数。数组不可整体引用,不可整体赋值,想给一维数组score里面的50个数组元素都赋值为0,使用score=0是错误的,可以使用循环结构来赋值:for(i=0;i50;i+)scorei=0;使用数组不但简化了变量的命名,还简化了变量的使用。数组元素(用下标去引用)相当于一个普通变量,可以出现在该类变量可以出现的所有场合。数组名不是一个普通的变量名,而是第一个数组元素的地址。第1页/共41页第一页,共42页。一维数组的初始化一维数组的初始化l数组可以在定义的时候就
2、进行初始化(赋初值)l例如:intscore10=0,1,2,3,4,5,6,7,8,9;如果括号内的数小于10个,那么只是从score0开始赋值,剩下的没有赋值的数组元素的值初始化为0。如果只是定义而没有初始化(一个都没赋初值),则所有的数组元素的值都是不可预测的。l如果在定义数组时候,已经(yjing)对所有的数组元素进行赋初值,数组的长度可以省略intscore10=0,1,2,3,4,5,6,7,8,9;等价于intscore=0,1,2,3,4,5,6,7,8,9;第2页/共41页第二页,共42页。l如果没有对所有的数组元素进行赋初值,例如intscore=0,1,2,3,4,5,6
3、,7,8;编译系统测出赋初值的个数为9,就认为数组的长度(chngd)是9而不是10。l【例6.3】输入10个数,用冒泡法排序(从小到大)l冒泡排序是相邻的两个数进行比较,如果前一个比后一个大,就交换,每一轮都会把本轮要比较的所有的数中最大的那个数放到最后,小的数往前面移动,就像水里的气泡逐渐往上浮一样。第3页/共41页第三页,共42页。l第1轮,把第0跟第1个数比较,第1跟第2个数比较第n-2个数跟第n-1个数比较,如果前一个数比后一个大,就交换。那么第1轮交换结束后,就把第0个至第n-1个数中最大者放到第n-1的位置;l第2轮,把第0跟第1个数比较,第1跟第2个数比较第n-3个数跟第n-2
4、个数比较,如果前一个数比后一个大,就交换。那么第2轮比较结束后,就可以(ky)把第0至第n-2个数中最大者放到第n-2的位置;l依次类推,直到第0个跟第1个数比较,把最大者放到第1的位置,这样就可以(ky)把整个数组排好序。l冒泡法每轮都把该轮要比较的数的最大者放到最后第4页/共41页第四页,共42页。#include#defineN10main()intaN;inti,j,temp;for(i=0;iN;i+)scanf(%d,&ai);printf(beforsorting:n);for(i=0;iN;i+)printf(%-5d,ai);printf(n);第5页/共41页第五页,共42
5、页。for(i=0;iN-1;i+)for( j=0;jaj+1)temp=a j;aj=aj+1;aj+1=temp;printf(aftersorting:n);for(i=0;iN;i+)printf(%-5d,ai);printf(n);第6页/共41页第六页,共42页。运行结果( jigu)如下:13579246810beforsorting:13579246810aftersorting:12345678910Pressanykeytocontinue第7页/共41页第七页,共42页。二维数组的定义二维数组的定义(dngy)、引用及初始化、引用及初始化二维数组的定义格式:类型说明符
6、数组名常量表达1常量表达2;例如(lr),intb34;定义了一个3行4列的二维数组,一共有12个数组元素,每个都是int类型,序号从b00b23。逻辑顺序如下:b00b01b02b03b10b11b12b13b20b21b22b23第8页/共41页第八页,共42页。二维数组是按行存储二维数组是按行存储(cnch)先存完第1行,再存第2行,第3行,直到(zhdo)最后一行。在内存中存储顺序如下:第0行第1行第2行第3行b00b01b02b03b10b11b12b13b20b21b22b23第9页/共41页第九页,共42页。二维数组的引用二维数组的引用(ynyng)格式:数组名下标1下标2与一维
7、数组相同,下标可以是常数或者常数表达式,也可以是变量或者变量表达式,但必须是整数。二维数组的初始化二维数组在定义的时候就可以进行(jnxng)初始化,例如intb34=0,1,2,3,4,5,6,7,8,9,10,11;等价于intb34=0,1,2,3,4,5,6,7,8,9,10,11;(分行赋初值,更直观,建议使用)第10页/共41页第十页,共42页。在这里已经给数组所有元素赋初值了,第一维的长度(chngd)可以省略,但是不建议省略。第二维的长度(chngd)不可省略。赋值效果如下:01234567891011第11页/共41页第十一页,共42页。二维数组(或者多维数组)省略写第一维的
8、情况intb4=0,1,2,3,4,5,6,7,8,9;没有(miyu)问题,最后一行没有(miyu)赋值的两个数组元素会初始化为0。012345678900第12页/共41页第十二页,共42页。intb4=0,1,2,3,4,5,8,9;也没有问题,最后两行有两个(lin)没有赋值的数组元素也会初始化为0。012345008900第13页/共41页第十三页,共42页。l但是intb4=0,1,2,3,4,5,6,7;还可以吗?l编译器会认为第一维的长度是2,而不是3lb20b23的值是不确定的,引用b20b23的值没有意义,l对b20b23进行写操作可能会造成系统严重错误(数组越界(yuji
9、)访问)。第14页/共41页第十四页,共42页。【例6.5】有一个(y)34的二维数组a,求出值最大的数组元素的值及所在的行号和列号。程序如下:#includevoidmain()inti,j,row=0,colum=0,max;inta34=1,2,3,4,9,8,7,6,-10,10,-5,2;第15页/共41页第十五页,共42页。max=a00;for(i=0;i3;i+)for( j=0;jmax)max=ai j;row=i;colum=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);第16页/共41页第十六页,共42页。运行(ynxn
10、g)结果为:max=10,row=2,colum=1Pressanykeytocontinue第17页/共41页第十七页,共42页。字符字符(zf)数组数组l数组不但(bdn)可以用来存储数值,也可以用来存储字符。用来存储字符的数组是字符数组。l定义字符数组 例如:charc10;l字符数组的初始化l例如,charc5=h,e,l,l,o; 初始化后,c0=h,c1=e,c2=l,c3=l,c4=ol如果花括号提供的字符个数超过数组长度则语法错误,少于则后面补空字符0l例如charc5=h,e,l;则c0=h,c1=e,c2=l,c3=0,c4=0第18页/共41页第十八页,共42页。l如果花
11、括号提供的字符个数跟数组长度相等,可以省略数组长度,例如lcharc=h,e,l,l,o;l也可以定义二维字符数组,例如charc510;l引用字符数组的元素l引用字符数组的元素跟其他数组操作(cozu)方式类似,例如c0=h;第19页/共41页第十九页,共42页。【例【例6.76.7】输出一个】输出一个(y )(y )菱形图菱形图#includevoidmain()inti,j;charc55=,*,*,*,*,*,*,*,*,;for(i=0;i5;i+)for(j=0;j5;j+)printf(%c,ci j);printf(n);第20页/共41页第二十页,共42页。运行(ynxng)
12、结果为:第21页/共41页第二十一页,共42页。字符串和字符串结束字符串和字符串结束(jish)标志标志l字符串是若干字符的序列,并且(bngqi)以特殊字符0结尾。0就是ascii码值为0的字符。l字符串常量,编译器会在末尾自动添加一个0。例如abcd,用sizeof(abcd)测算,值为5,sizeof()运算符会把结束标志算上作为字符串长度。lC语言不提供字符串变量,字符串只能用字符数组来存储。注意字符数组长度。l字符数组的初始化:例如charstr5=a,b,c,d,0;也可以写成lcharstr=a,b,c,d,0;编译器会测算字符串长度,并按长度为5来为数组开辟存储空间。第22页/
13、共41页第二十二页,共42页。l当然(dngrn)可以定义并初始化字符数组charstr4=a,b,c,d;但由于没有0作为结束标志,并不认为是一个字符串,不能用库函数里的字符串处理函数来进行处理,在自己编程中,由于缺少结束标志,会给编程带来很大的麻烦。l可以用字符串常量来对字符数组进行初始化,例如charstr=abcd;或者charstr=abcd;都可以。不能写成charstr4=abcd;,由于数组长度不够,编译错误。第23页/共41页第二十三页,共42页。l一个字符串用一维数组存储,多个(du)字符串用二维数组存储。例如:charweekday710=Sunday,lMonday,T
14、uesday,Wednesday,lThursday,Friday,Saturday;注意第二维的长度应该根据最长的字符串来设置。第24页/共41页第二十四页,共42页。字符字符(zf)数组的输入输出数组的输入输出l对字符数组中的字符,可以(ky)按单个字符进行输入或输出,例如:lfor(i=0;i10;i+)scanf(%c,&stri);lfor(i=0;istr2则函数值为1;str1str2则函数值为-1;相等则函数值为0。例如,li=strcmp(hello,hello);,i的值为-1,i=strcmp(hello,hello);,i的值为0,i=strcmp(hello,hell
15、o);,i的值为1。字符串不可直接比较大小,if(str1str2)是错误的。lstrcat(str1,str2):把str2连接到str1末尾,也就是str1数组中第一个0出现的位置,str2的字符依次存放(包括(boku)str2中的0),成为一个新的字符串第32页/共41页第三十二页,共42页。如果str1,str2原来的存储情况如下,那么连接(linji)后结果为str1abcd0000xystr2efgh000000连接后abcdefgh0y第33页/共41页第三十三页,共42页。l说明:第一个字符串的长度应该足够大,能容纳得下连接后的字符串。lstrlwr(str):把字符串(从第
16、1个数组元素开始,到第一个0位置(wizhi))大写字母改为小写字母。strupr(str):与strlur(str)刚好相反,把小写字母改为大写字母。例如,charstr10=a,b,c,d,0,e,f,g,x,y;,则strupr()函数只处理a,b,c,d4个字母,e,f,g,x,y不进行处理。第34页/共41页第三十四页,共42页。字符字符(zf)数组应用举例数组应用举例l【例6.8】统计一行输入(shr)中有多少个单词,已知单词之间用空格隔开。l判断出现一个单词方法:从第1个输入(shr)的字符开始扫描,直至输入(shr)结束,如果出现:当前字符为非空格,而后一个字符为空格或者0,就
17、可以判断为出现一个单词。l#includel#includelvoidmain()llinti,count=0;lchar str100;第35页/共41页第三十五页,共42页。gets(str);for(i=0;stri!=0;i+)if(stri=a&stri=A&stri=a&stri+1=A&stri+1=Z)count+;printf(%dn,count);第36页/共41页第三十六页,共42页。也可采用字符串处理函数isalpha来测试一个(y)字符是否是字母#include#includevoidmain()int i,count=0;charstr100;gets(str);f
18、or(i=0;stri!=0;i+)if(isalpha(stri)&!isalpha(stri+1)count+;printf(%dn,count);第37页/共41页第三十七页,共42页。【例6.9】有三个字符串,求出最大的字符串。分析:字符串比较采用strcmp函数。算法与求三个数中的最大者类似。程序(chngx)如下:#include#includevoidmain()charstr320;charstring20;inti;第38页/共41页第三十八页,共42页。for(i=0;i3;i+)gets(stri);if(strcmp(str0,str1)0)strcpy(string,
19、str1);elsestrcpy(string,str0);if(strcmp(string,str2)0)strcpy(string,str2);printf(thebiggeststringis:%sn,string);第39页/共41页第三十九页,共42页。运行(ynxng)结果:brazilchinaamericathebiggeststringis:chinaPressanykeytocontinue第40页/共41页第四十页,共42页。感谢您的欣赏(xnshng)!第41页/共41页第四十一页,共42页。内容(nirng)总结一维数组的引用。scanf(%d,&ai)。jN-i-1。没有问题,最后一行没有赋值的两个数组元素(yun s)会初始化为0。也没有问题,最后两行有两个没有赋值的数组元素(yun s)也会初始化为0。只能输出abcd,后面的efg就不能输出了。如果str1,str2原来存储情况及复制后str1的情况如下图所示。str2也可以是常量,例如strcpy(str1, abcd)。if(isalpha(stri) &。感谢您的欣赏第四十二页,共42页。