《C语言程序设计》第4章数组.ppt
《《C语言程序设计》第4章数组.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》第4章数组.ppt(78页珍藏版)》请在三一办公上搜索。
1、第四章 数 组,在实际的应用中,经常会遇到某些类型相同并相互具有联系的数据。该类数据,经常要作相关的处理。如,一个班30个人的一门课程的成绩,求平均成绩、最高或最低成绩。处理这类数据的最好办法是将其定义成为一个具有共同特征的集合,这种同类型相关数据的集合称为数组。,Chapter 4 Array,4.1 数组的基本概念,C 语言可以根据用户需要,用基本数据类型定义特殊性质的数据类型,称为构造类型。构造类型有:数组、结构、联合。,数组:相同数据类型变量的有序集合。有序表现在数组元素在内存中连续存放。,数组用一个名字作为标识。为区分各元素,每个元素有一个用整型表示的序号,称之为下标。下标可以有多个
2、,下标的个数称为数组的维数。,如:十个整型变量 k0,k1,k9,一个下标。,数组名。,三个学生三门课程的成绩,97.5 80.5 94.5 76.5 81.4 90.060.0 64.5 75.0,学号 0 1 2,0 1 2 课程,下标一:行,下标二:列,数组元素:a11,/*example 4-1(b)计算平均成绩*/#include void main(void)int i;float math,ave;ave=0.0;/*平均成绩初值为0*/for(i=0;i10;i+)/*循环10次*/scanf(%f,【例4-1】学生分数的处理问题。有10个学生参加数学考试,考试成绩由键盘输入,
3、计算平均成绩。,/*example 4-1(b)计算平均成绩*/#include void main(void)int i;float math,ave;ave=0.0;/*平均成绩初值为0*/for(i=0;i=ave)printf(%fn,math);/*大于平均成绩则打印*/,【例4-1(b)】,/*example 4-1(c)计算平均成绩*/#includevoid main(void)int i;float math10,ave;ave=0.0;/*平均成绩初值为0*/for(i=0;i=ave)printf(%fn,mathi);/*大于平均成绩则打印*/,【例4-1(c)】,数组
4、必须先说明后使用。说明的目的如下:,说明数组的名字(标识)。说明数组的类型。说明数组的维数。确定各维下标的变化范围。,编译系统将根据说明,开辟内存单元按特有的顺序和相应的类型为各元素分配内存单元。,4.2 一维数组,一维数组的说明,说明方式:,type array1常量表达式,arrayn常量表达式;,类型说明符,根据需要可加修饰说明。说明数组的类型。,数组名,用标识符命名。,用 包含的常量表达式。数组的下标从0变化到常量达式的值减一。,int id5,iyear10;float fScore36;,当说明数组后,编译时系统会根据定义的类型分配连续的一段内存单元给数组的各元素。,id0,id1
5、,id2,id3,id4,系统为数组分配的连续内存单元,每个单元占两个BYTE。首地址用数组名id表示。,2.一维数组的引用,数组是一组数,它们公用一个数组名,这是它们公有的属性,但它们在数组中的位置不同,这是它们私有的属性,为表明数组中的一个元素,既要指出其来自于哪个数组,这就需要数组名;又要声明其在这个数组中的位置,这就需要下标。,一维数组中元素引用的一般形式为:数组名下标值,说明:下标通常为整型,如果为实型,系统自动取整;下标常常巧妙的和循环变量相结合,随着循环变量的变化而变化,可以达到事半功倍的效果;C语言不做下标越界的检查,即语法上对越界的下标不报错。,3.一维数组的存储,计算机系统
6、中有着大量的存储单元,为区别各个存储单元,每一个存储单元都有一个唯一的代表这个存储单元的地址,就好像我们每一个人都有一个唯一的代表自己的身份证号一样。计算机系统中,存储单元的地址的编码规则是线性的,以十六进制表示,并且从0开始计数,因此存储单元的地址为:0、1、2、.9、A、B、C、D、E、F、10H、.,如果说明的是一个数组,如:int math10;计算机开辟20个地址连续的存储单元(TC环境下整型占2个字节,共有10个数组元素),用于存放数组中的10个数组元素,且这20个存储单元的首地址标记为:数组名math或&math0,其它的地址依次标记为:&math1.&math9,10个数组元素
7、在内存中依次存放,它们是邻居关系,它们的地址是连续的。,4.一维数组的初始化,数组的元素可以在说明数组时初始化。,int a10=1,2,3,4,5,6,7,8,9,10;/*说明数组,同时初始化全部元素。*/,float fValue10=1.0,2.0,3.0;/*说明数组,给部分元素初值,其余元素为0。*/,unsigned a=0 x0000,0 x0001,0 x0002;/*当数组元素全部赋初值时,可以不指定长度*/,/*example 4-2 数组的初始化*/#includevoid main(void)int i;int a5=1,2,3,4,5;int b5=1,2;int
8、c=1,2,3;for(i=0;i5;i+)/*循环5次*/printf(a%d=%d,i,ai);/*输出a数组元素*/printf(n);/*换行*/for(i=0;i5;i+)/*循环5次*/,【例4-2】数组的初始化示例。编写代码4-2如下,其执行结果如图4-3所示。,printf(b%d=%d,i,bi);/*输出b数组元素*/printf(n);/*换行*/for(i=0;i5;i+)/*循环5次*/printf(c%d=%d,i,ci);/*输出c元素,注意有危险*/printf(n);/*换行*/,5.一维数组的应用,【例4-3】兔子繁殖问题。,/*example 4-3 Fi
9、bonacci数列*/#include void main(void)int month;int f13=1,1;for(month=2;month13;month+)/*循环递推*/fmonth=fmonth-1+fmonth-2;/*计算数列*/for(month=0;month13;month+)printf(%d,fmonth);/*输出数列*/,【例4-4】由键盘输入n个学生(设人数不超过50人)的数学成绩,分别统计优、良、中、及格、不及格的人数。,/*example 4-4 分别统计成绩*/#include void main(void)int i,n;int a=0,b=0,c=
10、0,d=0,e=0;/*表示各段人数*/float math50;printf(“n=?”);/*输入人数*/scanf(“%d”,i+)/*循环n次*/,if(mathi=90)a+;/*分别统计*/else if(mathi=80)b+;else if(mathi=70)c+;else if(mathi=60)d+;else e+;printf(%dt%dt%dt%dt%dn,a,b,c,d,e);/*打印*/,例:,求10个学生一门课程的平均分,并输出低于平均成绩的分数。,#include void main(void)float fScore10,aver=0;int i;for(i=
11、0;i10;i+)scanf(“%f”,说明数组。,循环输入各元素的值并累加。,循环判断条件,满足条件输出。,4.3 二 维 数 组,在实际应用中,经常会遇到一些用多维索引的数据。如:四个学生三门课的成绩。可以用下表表示:,显然,该表的每一项需要有两个索引项。表现为数组的两个下标。超过一个下标的数组称为多维数组。,行:代表某个学生。,列:代表某门课程。,二维数组的说明,说明方式:type array常量表达式1常量表达式n,;,n个整型常量表达式,数组元素的个数?,int a23,b452;,多维数组在内存中的顺序,int a33;,二维结构:a00 a01 a02a10 a11 a12a20
12、 a21 a22,排列顺序:先行后列。,a00,a01,a02,a10,a11,a12,a20,a21,a22,下标为0的行,总原则:最后一个下标先变化,变化一个周期后,倒数第二个开始变化,如此类推。,a为数组在内存中的首地址。,int b234;,内存中的排列?,二维数组的初始化,数组可以在说明时初始化。,全部赋初值,int a23=1,2,3,4,5,6;,下标为0的一行,下标为1的一行,int b23=1,2,3,4,5,6;,按内存顺序赋初值。,部分赋初值,int a23=1,2;,0行的0列的元素赋初值。0行其余值为0。,int a23=1,2;,对全体数组元素赋初值,第一维下标可以
13、省略。,int a 3=1,2,3,4,5,6;,二维数组元素的引用,数组定义后,具备简单变量的一切性质,可以作为表达式的运算对象,也可以被赋值。引用时,只能引用数组元素,方式如下:,arrayexp1expn,int a1010,y,i=2;ai+26=20;y=ai+26*100/30;a1011=34;,对4行6列的元素赋值。,参加表达式运算。,C语言不作下标检查,语法正确,但使用危险,可能造成程序的错误!,整型表达式。,5.二维数组的应用,【例4-5】下三角矩阵。,/*example 4-5 下三角矩阵*/#include void main(void)int i,j;int a44;
14、for(i=0;i=j)aij=1;/*下三角*/else aij=0;/*上三角*/for(i=0;i4;i+),for(j=0;j4;j+)printf(“%4d”,aij);/*输出数列*/printf(“n”);/*换行*/,【例4-6(a)】二维数组的转置。,/*example 4-6(a)二维数组的转置*/#include void main(void)int i,j;int a33=1,2,3,4,5,6,7,8,9;/*定义原数组*/int b33;/*定义新数组*/for(i=0;i3;i+)/*外循环遍历行*/for(j=0;j3;j+)/*内循环遍历列*/bij=aji;
15、/*计算新元素*/for(i=0;i3;i+)for(j=0;j3;j+)printf(“%4d,aij);/*输出原数组*/printf(“n”);/*换行*/,printf(“n”);/*换行*/for(i=0;i3;i+)for(j=0;j3;j+)printf(%4d,bij);/*输出新数组*/printf(“n”);/*换行*/,/*example 4-6(b)二维数组的转置*/#includevoid main(void)int i,j,t;int a33=1,2,3,4,5,6,7,8,9;/*定义原数组*/for(i=0;i3;i+)for(j=0;j3;j+)printf(
16、%4d,aij);/*输出原数组*/printf(n);/*换行*/for(i=0;i3;i+)/*外循环遍历行*/for(j=0;ji;j+)/*注意内循环范围*/t=aij;/*互换元素*/aij=aji;,【例4-6(b)】,aji=t;for(i=0;i3;i+)for(j=0;j3;j+)printf(%4d,aij);/*输出新数组*/printf(n);/*换行*/,4.4 字 符 数 组,C语言没有字符串变量,可以定义字符数组,每个元素存放一个字符,从而达到存放字符串的目的。,字符数组的说明,char charrayconst exp1const expn,;char a10,
17、b212;,字符数组的初始化,一维数组赋初值,char str16=h,e,l,l,o,0;char str2=”hello”;,用单个字符对每一个元素赋值。,用字符串对数组赋初值。,可以指定长度,也可不指定长度。,系统会在字串的结尾加0,表示字符串结束。因此,说明数组时,长度指定应至少比实际长度大1,保证赋初值正确。,0,存储结构:,h,e,l,l,o,0,二维数组赋初值,二维数组的每一行可以存放一个字符串。,char str36=”wang”,”zhang”,”liu”;,str数组在内存中的首地址。,存储结构,字符数组的输入输出,格式输入输出函数,输出:for(i=0;iSTRLEN;i
18、+)printf(“%c”,str i);/*通过循环输出各元素*/printf(”%s”,str);/*用字符串形式输出*/,输入:scanf(”%s”,str);/*用字符串输入整个数组*/,用scanf函数输入时space作为输入的分隔符,因此输入带空格的字符串,会造成输入不全。,char a20;scanf(”%s”,a);输入:China Anhui Hefei 结果a数组的内容是:China0,为了解决这个问题,系统定义如下专用于字符数组的i/o函数。,gets()字符串输入函数,用法:,char str 80;gets(str);,作用:读入一个以换行符为终结符的字符串到str中
19、,用0代替换行符。,数组名作为函数的参数。,puts()字符串输出函数,用法:,char string=”China”;puts(string);,数组名作为函数的参数。,作用:输出以NULL 即0结尾的字符串string,自动加上换行符。,【例4-7】用格式符%c逐个输入和输出示例。,/*example 4-7 用格式符c逐个输入和输出*/#include void main(void)int i;char a12;for(i=0;i12;i+)scanf(%c,【例4-8】用格式符s整体输入和输出示例。,/*example 4-8 用格式符s整体输入和输出*/#include void m
20、ain(void)char a12;scanf(%s,a);/*输入a数组元素*/printf(“%s”,a);/*输出a数组元素*/printf(n);,【例4-9】字符输入输出举例,#include void main(void)char str80;int i;gets(str);for(i=0;str i!=0;i+)if(stri=a,判断字符串结束。,常用的字符处理函数,C语言定义了一系列的字符处理函数用于字符串的处理,该类函数的原型定义在string.h中。因此,在使用该类函数时,应在程序的开始处,加#include,字符串拷贝函数strcpy(str1,str2),作用:将st
21、r2拷贝到str1中。,用法:char str110,str2=”Computer”;strcpy(str1,str2);/*str1的内容是“Computer”*/strcpy(str2,”Program”);/*str2的内容是“Program”*/,说明:,str1的长度要足够长;str1只能是字符数组名,str2可以是字符数组或字符串常量。,字符串连接函数strcat(str1,str2),作用:将str2连接到str1后(去掉str1的0)。,用法:char str115=“Anhui”,str2=”Hefei”;strcat(str1,str2);puts(str1);/*输出结果
22、为 Anhui Hefei*/,说明:,str1的长度要足够长;str1只能是字符数组名,str2可以是字符数组或字符串常量。,测试字符串长度函数strlen(str),作用:测试字符串的实际长度。函数运算得到整型值,该值是字符串的长度!,int iLenStr;char str=“China”;iLenStr=strlen(str);printf(“%d”,iLenStr);,结果?,字符串的比较 strcmp(str1,str2),作用:对str1和str2 进行逐位无符号字符(ASCII码)比较,直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。,字符的数值关系也就是字符的ASC
23、II码值的数值关系。,比较结果如下:,char str1=”abcd”;char str2=“abcd”;int iRe1,iRe2,iRe3;iRe1=strcmp(str1,”abdc”);iRe2=strcmp(str1,str2);iRe3=strcmp(”abcde”,str2);,abcd,abdc,c,d,c-d-1结果小于0。,strlwr(str)将str中的大写字母转换成小写字母。,strupr(str)将str中的小写字母转换成大写字母,#include#include void main(void)char str1=c programming!123,str2=Com
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 数组

链接地址:https://www.31ppt.com/p-5896087.html