




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 数组,数组的概念 数组:若干相同类型的数据项的有序集合。 数组的用途:用于存储相同类型的多个数据,可以减少命名上的麻烦,并且方便统一运算。,一维数组的定义、引用和初始化,一维数组的定义、引用和初始化 一维数组的定义 格式:类型说明符 数组名常量表达式; 例如,int score50; 定义了一个一维数组,共有50个数组元素,每个都是int类型,序号从score0score49,其中score为数组名,内的数值必须为整形常量,或整形常量表达式,如30+20,不允许为变量,也不允许为浮点数。 常量表达式称为数组的长度,也就是数组元素的个数。,一维数组的引用,格式:数组名下标 下标可以是常数或者常数表达式,也可以是变量或者变量表达式,但必须是整数。 数组不可整体引用,不可整体赋值,想给一维数组score里面的50个数组元素都赋值为0,使用score=0是错误的,可以使用循环结构来赋值:for(i=0;i50;i+) scorei=0; 使用数组不但简化了变量的命名,还简化了变量的使用。 数组元素(用下标去引用)相当于一个普通变量,可以出现在该类变量可以出现的所有场合。 数组名不是一个普通的变量名,而是第一个数组元素的地址。,一维数组的初始化,数组可以在定义的时候就进行初始化(赋初值) 例如:int score10=0,1,2,3,4,5,6,7,8,9;如果括号内的数小于10个,那么只是从score0开始赋值,剩下的没有赋值的数组元素的值初始化为0。如果只是定义而没有初始化(一个都没赋初值),则所有的数组元素的值都是不可预测的。 如果在定义数组时候,已经对所有的数组元素进行赋初值,数组的长度可以省略int score10=0,1,2,3,4,5,6,7,8,9;等价于int score=0,1,2,3,4,5,6,7,8,9;,如果没有对所有的数组元素进行赋初值,例如int score=0,1,2,3,4,5,6,7,8;编译系统测出赋初值的个数为9,就认为数组的长度是9而不是10。 【例6.3】输入10个数,用冒泡法排序(从小到大) 冒泡排序是相邻的两个数进行比较,如果前一个比后一个大,就交换,每一轮都会把本轮要比较的所有的数中最大的那个数放到最后,小的数往前面移动,就像水里的气泡逐渐往上浮一样。,第1轮,把第0跟第1个数比较,第1跟第2个数比较第n-2个数跟第n-1个数比较,如果前一个数比后一个大,就交换。那么第1轮交换结束后,就把第0个至第n-1个数中最大者放到第n-1的位置; 第2轮,把第0跟第1个数比较,第1跟第2个数比较第n-3个数跟第n-2个数比较,如果前一个数比后一个大,就交换。那么第2轮比较结束后,就可以把第0至第n-2个数中最大者放到第n-2的位置; 依次类推,直到第0个跟第1个数比较,把最大者放到第1的位置,这样就可以把整个数组排好序。 冒泡法每轮都把该轮要比较的数的最大者放到最后,#include #define N 10 main( ) int aN; int i,j,temp; for(i=0;iN;i+) scanf(“%d“,for(i=0;iaj+1) temp=aj; aj=aj+1; aj+1=temp; printf(“after sorting:n“); for(i=0;iN;i+) printf(“%-5d“,ai); printf(“n“); ,运行结果如下: 1 3 5 7 9 2 4 6 8 10 befor sorting: 1 3 5 7 9 2 4 6 8 10 after sorting: 1 2 3 4 5 6 7 8 9 10 Press any key to continue,二维数组的定义、引用及初始化,二维数组的定义 格式:类型说明符 数组名常量表达1 常量表达2; 例如,int b34;定义了一个3行4列的二维数组,一共有12个数组元素,每个都是int类型,序号从b00b23。逻辑顺序如下:,二维数组是按行存储,先存完第1行,再存第2行,第3行,直到最后一行。在内存中存储顺序如下:,二维数组的引用,格式:数组名下标1下标2 与一维数组相同,下标可以是常数或者常数表达式,也可以是变量或者变量表达式,但必须是整数。 二维数组的初始化 二维数组在定义的时候就可以进行初始化,例如 int b34=0,1,2,3,4,5,6,7,8,9,10,11;等价于 int b34=0,1,2,3,4,5,6,7,8,9,10,11; (分行赋初值,更直观,建议使用),在这里已经给数组所有元素赋初值了,第一维的长度可以省略,但是不建议省略。第二维的长度不可省略。赋值效果如下:,二维数组(或者多维数组)省略写第一维的情况 int b4=0,1,2,3,4,5,6,7,8,9 ;没有问题,最后一行没有赋值的两个数组元素会初始化为0。,int b4=0,1,2,3,4,5,8,9; 也没有问题,最后两行有两个没有赋值的数组元素也会初始化为0。,但是int b4=0,1,2,3,4,5,6,7;还可以吗? 编译器会认为第一维的长度是2,而不是3 b20b23的值是不确定的,引用b20b23的值没有意义, 对b20b23进行写操作可能会造成系统严重错误(数组越界访问)。,【例6.5】有一个34的二维数组a,求出值最大的数组元素的值及所在的行号和列号。程序如下: #include void main( ) int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6, -10,10,-5,2;,max=a00; for(i=0;imax) max=aij; row=i; colum=j; printf(“max=%d,row=%d, colum=%dn“,max,row,colum); ,运行结果为: max=10,row=2,colum=1 Press any key to continue,字符数组,数组不但可以用来存储数值,也可以用来存储字符。用来存储字符的数组是字符数组。 定义字符数组 例如:char c10; 字符数组的初始化 例如,char c5=h,e,l,l,o;初始化后,c0=h, c1=e, c2=l, c3=l, c4=o 如果花括号提供的字符个数超过数组长度则语法错误,少于则后面补空字符0 例如char c5=h,e,l;则c0=h, c1=e, c2=l, c3=0, c4=0,如果花括号提供的字符个数跟数组长度相等,可以省略数组长度,例如 char c=h,e,l,l,o; 也可以定义二维字符数组,例如char c510; 引用字符数组的元素 引用字符数组的元素跟其他数组操作方式类似,例如c0= h;,【例6.7】输出一个菱形图,#include void main() int i,j; char c55= , ,*, , , ,*, ,*, , *, , , ,*, ,*, ,*, , , ,*, , ; for(i=0;i5;i+) for(j=0;j5;j+) printf(“%c“,cij); printf(“n“); ,运行结果为:,字符串和字符串结束标志,字符串是若干字符的序列,并且以特殊字符0结尾。0就是ascii码值为0的字符。 字符串常量,编译器会在末尾自动添加一个0。例如“abcd“,用sizeof(“abcd“)测算,值为5,sizeof()运算符会把结束标志算上作为字符串长度。 C语言不提供字符串变量,字符串只能用字符数组来存储。注意字符数组长度。 字符数组的初始化:例如char str5=a,b,c,d,0;也可以写成 char str=a,b,c,d,0;编译器会测算字符串长度,并按长度为5来为数组开辟存储空间。,当然可以定义并初始化字符数组char str4= a,b,c,d;但由于没有0作为结束标志,并不认为是一个字符串,不能用库函数里的字符串处理函数来进行处理,在自己编程中,由于缺少结束标志,会给编程带来很大的麻烦。 可以用字符串常量来对字符数组进行初始化,例如char str= “abcd“;或者char str= “abcd“;都可以。不能写成char str4= “abcd“;,由于数组长度不够,编译错误。,一个字符串用一维数组存储,多个字符串用二维数组存储。例如:char weekday710=“Sunday“, “Monday“,“Tuesday“,“Wednesday“, “Thursday“,“Friday“,“Saturday“;注意第二维的长度应该根据最长的字符串来设置。,字符数组的输入输出,对字符数组中的字符,可以按单个字符进行输入或输出,例如: for(i=0;i10;i+) scanf(“%c“,用scanf(),printf()函数对字符串进行输入/输出,例如: scanf(“%s”,str); 注意到在scanf(“%s”,str);中,str没有加取地址符号。因为str是数组名,表示数组第一个元素的地址。另外,在scanf函数碰到空白符就会结束,因此想输入”hello world”是不行的,只能输入hello,系统会在末尾自动添加0。 printf(“%s”,str); printf(“%s“, weekday0); str ,weekday0是字符串第1个字符的地址,遇到0输出停止。,用gets(),puts()函数对字符串进行整体输入/输出。 使用gets可以输入带空格、制表符的字符串,末尾会自动添加0。gets();函数用数组名作为参数,这样输入的字符串就放到对应的数组中。 不管printf(),还是puts()函数,遇到0都会结束输出。如: char str10=a,b,c,d,0,e,f,g,0; 不管用printf(“%s”,str);还是puts(str);只能输出abcd,后面的efg就不能输出了。,与printf()函数不同的是,输出完毕后,puts函数会自动换一行。puts()函数也用数组名,或者字符串常量作为参数,例如puts(“hello“);,字符串处理函数,要使用字符串处理函数应该把头文件string.h包含进来 strlen(str):测试字符串长度(不包括0),注意与sizeof运算不同。 strcpy(str1,str2):字符串复制,把str2的第一个字符放在str1的起始位置,后面的字符依次存放。例如:,strcpy函数作用 如果str1,str2原来存储情况及复制后str1的情况如下图所示,字符数组str1长度必须大于或者等于字符串str2的长度,字符串str2的长度是指从str2的第一个数组元素开始,到第一个0为止。str2也可以是常量,例如strcpy(str1, “abcd“)。 不能用赋值语句直接把一个字符数组或者字符串常量赋值给另一个字符数组,例如str1=str2;或者str1=“abcd“;是错误的。,strcmp(str1,str2):字符串比较,str1str2则函数值为1;str1str2则函数值为-1;相等则函数值为0。例如, i=strcmp(“hello“,“hello “);,i的值为-1,i=strcmp(“hello“,“hello“);,i的值为0,i=strcmp(“hello “,“hello“);,i的值为1。字符串不可直接比较大小,if(str1str2)是错误的。 strcat(str1,str2):把str2连接到str1末尾,也就是str1数组中第一个0出现的位置,str2的字符依次存放(包括str2中的0),成为一个新的字符串,如果str1,str2原来的存储情况如下,那么连接后结果为,说明:第一个字符串的长度应该足够大,能容纳得下连接后的字符串。 strlwr(str):把字符串(从第1个数组元素开始,到第一个0位置)大写字母改为小写字母。strupr(str):与strlur(str)刚好相反,把小写字母改为大写字母。例如,char str 10=a,b,c,d,0,e,f,g,x,y;,则strupr()函数只处理a,b,c,d4个字母,e,f,g,x,y不进行处理。,字符数组应用举例,【例6.8】统计一行输入中有多少个单词,已知单词之间用空格隔开。 判断出现一个单词方法:从第1个输入的字符开始扫描,直至输入结束,如果出现:当前字符为非空格,而后一个字符为空格或者0,就可以判断为出现一个单词。 #include #include void main() int i,count=0; char str100;,gets(str); for(i=0;stri!=0;i+) if(stri=a ,也可采用字符串处理函数isalpha来测试一个字符是否是字母 #include #include void main() int i,count=0; char str100; gets(str); for(i=0;stri!=0;i+) if(isalpha(stri) ,【例6.9】有三个字符串,求出最大的字符串。 分析:字符串比较采用strcmp函数。算法与求三个数中的最大者类似。 程序如下: #include #include void main() char str320; c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 客运站安全管理制度
- 家乐福产品管理制度
- 家庭文件夹管理制度
- 应急器材库管理制度
- 归口领导与管理制度
- 影视中控室管理制度
- 微机课安全管理制度
- 心电图员工管理制度
- 快递员派送管理制度
- 怎样做电镀管理制度
- 2025年新安全知识竞赛培训试题及答案
- 纪法知识测试题及答案
- 科技论文写作 第2版 课件 第1-5章 科技论文写作概述-英文科技论文的写作
- 军事研学训练营行业跨境出海项目商业计划书
- 法律职业伦理试题及答案
- 2025年苏教版数学小学四年级下册期末真题及答案(七)
- 2024珠海农商银行社会招聘笔试历年典型考题及考点剖析附带答案详解
- 车间物料员员试题及答案
- 锚杆锚固质量无损检测技术规程
- 百香果购销合同协议
- 老年痴呆健康知识讲座课件
评论
0/150
提交评论