C语言基础知识数组.ppt_第1页
C语言基础知识数组.ppt_第2页
C语言基础知识数组.ppt_第3页
C语言基础知识数组.ppt_第4页
C语言基础知识数组.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 数 组,在应用中,经常会遇到某些类型相同并相互具有联系的数据。 这些数据,经常要作相关的处理。如,一个班30个人的一门课程的 成绩,求平均成绩、最高或最低成绩。处理这类数据的最好办法是 将其定义成为一个具有共同特征的集合,这种同类型相关数据的集 合称为数组。,Chapter 4 Array,数组的概念,C 语言可以根据用户需要,用基本数据类型定义特殊性质的数 据类型,称为构造类型。构造类型有:数组、结构、联合。,数组:相同数据类型变量的有序集合。有序表现在数组元素在 内存中连续存放。,数组用一个名字作为标识。为区分各元素,每个元素有一个用 整型表示的序号,称之为下标。下标可以有多个,下

2、标的个数称为 数组的维数。,如:十个整型变量 k0,k1, k9,一个下标。,数组名。,三个学生三门课程的成绩,97.5 80.5 94.5 76.5 81.4 90.0 60.0 64.5 75.0,学号 0 1 2,0 1 2 课程,下标一:行,下标二:列,数组元素:a11,数组必须先说明后使用。说明的目的如下:,说明数组的名字(标识)。 说明数组的类型。 说明数组的维数。 确定各维下标的变化范围。,编译系统将根据说明,开辟内存单元按特有的顺序和相应的类 型为各元素分配内存单元。,4.1 一维数组,一维数组的说明,说明方式:,type array1常量表达式, , arrayn常量表达式;

3、,类型说明符,根据需要可加修饰说明。说明数组的类型。,数组名,用标识符命名。,用 包含的常量表达式。数组的下标从0变化到常量达式的值减一。,short id5, iyear10; float fScore36;,当说明数组后,编译时系统会根据定义的类型分配连续的一段 内存单元给数组的各元素。,id0,id1,id2,id3,id4,系统为数组分配的连续内存单元,每个单元占两个BYTE。首地址用数组名id表示。,一维数组的初始化,数组的元素可以在说明数组时初始化。,int a10=1,2,3,4,5,6,7,8,9,10; /*说明数组,同时初始化全部元素。*/,float fValue10=1

4、.0,2.0,3.0; /*说明数组,给部分元素初值,其余元素为0。*/,unsigned a =0 x0000,0 x0001,0 x0002; /*当数组元素全部赋初值时,可以不指定长度*/,数组的引用,原 则:只能引用数组元素,而不能引用整个数组。 引用方式:数组名整型表达式 /*下标变量*/ 每个数组元素,可以出现在简单变量能够出现的任何地方。,a1=12; s=a2+a1*20;,举例,求10个学生一门课程的平均分,并输出低于平均成绩的分数。,#include void main(void) float fScore10,aver = 0; int i; for (i = 0; i

5、10; i+) scanf(“%f”, ,说明数组。,循环输入各元素的值并累加。,循环判断条件,满足条件输出。,4.2 多 维 数 组,在处理的数据中经常会遇到需要用多维索引的数据。如:四个 学生三门课的成绩。可以用下表表示:,显然,该表的每一项需要有两个索引项。表现为数组的两个下 标。超过一个下标的数组称为多维数组。,行:代表某个学生。,列:代表某门课程。,多维数组的说明,说明方式: type array常量表达式1常量表达式n,;,n个整型常量表达式,数组元素的个数?,int a23 , b452;,多维数组在内存中的顺序,int a33;,二维结构: a00 a01 a02 a10 a1

6、1 a12 a20 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;,

7、对全体数组元素赋初值,第一维下标可以省略。,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语言不作下标检查,语法正确,但使用危险,可能造成程序的错误!,整型表达式。, 举例,定义34的浮点数数组,并赋初值,输出每一行的平均值。,#include void main(vo

8、id) float a34= 1,3,5,7,9,2,4,6,8,10,12,11,fAve = 0.0f; int i,j; for (i = 0; i 3; i+) fAve = 0.0f; for (j = 0; j 4; j+) fAve += aij; printf(第%d行平均值:%7.2fn, i, fAve / 4.0f); ,4.3 字 符 数 组,C语言没有字符串变量,可以定义字符数组,每个元素存放一 个字符,从而达到存放字符串的目的。,字符数组的说明,char charrayconst exp1const expn,; char a10,b212;,字符数组的初始化,一维

9、数组赋初值,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+) pr

10、intf(“%c”,str i ); /*通过循环输出各元素*/ printf(”%s”,str); /*用字符串形式输出*/,输入: scanf(”%s”,str); /*用字符串输入整个数组*/,用scanf函数输入时space作为输入的分隔符,因此输入带空格 的字符串,会造成输入不全。,char a20; scanf(”%s”,a); 输入: Hefei Anhui China 结果a数组的内容是:Hefei0,为了解决这个问题,系统定义如下专用于字符数组的i/o函数。,gets( )字符串输入函数,用法:,char str 80; gets(str);,作用: 读入一个以换行符为终结符

11、的字符串到str中,用0代替换行符。,数组名作为函数的参数。,puts( )字符串输出函数,用法:,char string =”China”; puts(string);,数组名作为函数的参数。,作用: 输出以NULL 即0结尾的字符串string,自动加上换行符。,字符输入输出举例,#include void main(void) char str80; int i; gets(str); for(i=0 ; str i !=0; i+) if(stri=a ,判断字符串结束。,常用的字符处理函数,C语言定义了一系列的字符处理函数用于字符串的处理,该类 函数的原型定义在string.h中。因

12、此,在使用该类函数时,应在程 序的开始处,加#include ,字符串拷贝函数strcpy(str1,str2),作用:将str2拷贝到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)。

13、,用法: char str115=“Anhui ”, str2 =”Hefei”; strcat(str1,str2); puts(str1); /*输出结果为 Anhui Hefei */,说明:,str1的长度要足够长; str1只能是字符数组名,str2可以是字符数组或字符串常量。,测试字符串长度函数strlen(str),作用:测试字符串的实际长度。函数结果得到整型值,该值是 字符串的长度!,int iLenStr; char str =“China”; iLenStr=strlen(str); printf(“%d”,iLenStr);,结果?,字符串的比较 strcmp(str1,

14、str2),作用:对str1和str2 进行逐位无符号字符(ASCII码)比较, 直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。,字符的数值关系也就是字符的ASCII码值的数值关系。,比较结果如下:,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中的大写字母转换

15、成小写字母。,strupr(str)将str中的小写字母转换成大写字母,#include #include void main(void) char str1 = c programming! 123,str2 = Computer; strlwr(str2); strupr(str1); puts(str1); puts(str2); ,C PROGRAMMING! 123 computer,举例:将字符串str2连接到str1之后,并将连接后的str1中的小写字母转换为大写字母输出,并输出连接后字符串的长度。,#include #include void main(void) char s

16、tr180,str280; int iStrLen; gets(str1); gets(str2); strcat(str1,str2); strupr(str1); iStrLen = strlen(str1); puts(str1); printf(连接后的字符串长度 = %dn,iStrLen); ,专题一、数组的常用算法,数组是同类型数据的集合。便于整体处理数据,数组操作的主 要算法有:,求极值; 排序; 查找;,求极值及其位置,算法演示,一维数组的极值,#include void main(void) int a10=1,6,-2,5,4,32,47,-66,13,14; int i

17、Max, iPos, i; iPos=0; iMax=a0; for(i=1; iiMax) iMax = ai; iPos = i; printf(“Max=%5d Position=%5d”,iMax,iPos); ,假定最大值及其位置。,循环比较,当前元素比最大值大,将其 赋值为新的最大值并记录其位置。,二维数组求极值,#include void main(void) float a34= 1.0, 3.0, 5.2, 7.4, 4.6, 5.5, 4.2, 1.2, 10.5, 0.23,1.3, 0.5; int i, j, iRow=0,iCol=0; for(i=0; i3; i

18、+) for(j=0;j4;j+) if(aijaiRowiCol) iRow = i; iCol = j; printf(”%f7.2,iRow%5d,iCol%5d”,aiRowiCol,iRow,iCol); ,假定最小值的位置。,二重循环遍历所有元素,比较求最小值,记录其位置。, 排 序,排序的概念,排序是将一组随机排放的数按下标顺序从大到小或从小到大重 新排列。,1 ,5,4,6,7,9,9,7,6,5,4,1,1,4,5,6,7,9,降序,升序,选择排序算法一,选择排序算法演示,选择排序程序如下:,#include void main(void) int i, j, a10=4,3

19、,5,1,10,12,2,6,7,9, iTemp; for(i=0; iaj) iTemp=a i ; a i =a j ; a j =iTemp; for(i=0;i10; i+) printf(”%4d”,ai); ,外层循环i变化,内层循环j变化,升序比较交换,思考题,降序的条件如何构造?,联合排序问题 已知一个班有36个同学,a数组存放一门课的成绩,m数组存放 其学号。要求将成绩从大到小排序。,提示:应考虑的问题是当a数组元素比较交换时,m数组如何处 理?,a 5 89.5 m 5 1005 a 7 90.0 m 7 1007,被动排序方。,选择排序算法二,选择排序算法二的基本思路,

20、每轮排序将a i 假定为极值,每次 在a i 到 aMAX中找出个极值,记录其位置,最后让极值位置的 元素与a i 交换。 选择排序保证每轮排序只有一次交换,且为有效的交换!,选择排序程序,#include void main(void) int i, j,iPos,a10=4,3,5,1,10,12,2,6,7,9, iTemp; for(i=0; i9 ;i+) iPos=i; for( j=i+1;j10;j+) if(aiPosaj) iPos=j; if ( iPos != i ) iTemp=ai; ai=aiPos; aiPos=iTemp; for(i=0;i10; i+) p

21、rintf(”%4d”,ai); ,排序循环,假定最大值位置。,循环比较找出最大值的位置。,与本次比较的第一个元素交换。,升序如何构造?, 查 找,查找是在一组数中,寻找一个特定的数,并显示结果。,顺序查找,顺序查找算法:构造循环,使循环的变量遍历数组每个元素的 下标。循环的过程中让特定的数和每个元素比较,相等则表示找到 该数,并输出其下标(位置)。,程序设计中标志的设置和应用:,在程序设计中,经常要记录一些状态,作为判断的条件。因此 需要在程序中设置一些标志,通常标志是整型变量。,如查找问题,可以先设置一个整型变量iFlag=0表示没有找到, 在查找的过程中一旦找到后,将iFlag赋值为1,

22、结束查找后,可以 由iFlag值所代表的逻辑状态,确定是否已找到特定的数。,标志设置框图,int iFlag;,iFlag=0;,是否找到?,iFlag=1;,yes,no,顺序查找程序,#include void main(void) int i,iSel,iFlag,a10=4,3,5,1,10,12,2,6,7,9; iFlag=0; scanf(“%d”, ,设置标志为没找到。,循环遍历所有元素,比较设置标志输出位置。,chp4ex7,折半查找适用于在有序数组中查找,在一个有序的一维数组中查找某一个数。已知某数组按升序排 列,给定一个数,找出该数在数组中的位置。 可以通过将区间折半,快

23、速缩小查找区间,提高效率!,折半查找算法演示,折半查找程序,#include void main(void) int iTop,iBot,iMid,iSel,iFlag,a10=1,2,3,5,6,8,9,10,11,12; iFlag=0; iTop=0; iBot=9; scanf(“%d”, ,初始化查找标志及顶、底。,查找循环,折半。,找到。,没找到,调整iTop或iBot,专题二、字符数组,统计字符串中的各元音字母的个数,#include void main(void) char str80,ch6=a,e,i,o,u,0; int i,iCount5=0,0,0,0,0; gets

24、(str); for(i=0;stri!=0;i+) switch(stri) case a: case A: iCount0+;break; case e: case E: iCount1+;break; case i : case I: iCount2+;break; case o: case O: iCount3+;break; case u: case U: iCount4+; for(i=0;i5;i+) printf(“Num of %c :%5d”,chi,iCounti); ,循环遍历数组元素,判断字母。,判断字符串是否结束的方法。 istrlen(str),字符的加密解密,将

25、字符串中的字母加密,密钥为循环平移两个字母。如A加密 成C.,Z加密成B。,如:I am a student. Zip 230009 加密后: K co c uvwfgpw. Bkr 230009,加密算法可以描述为: 如果stri是字母 循环平移两个字符;,以大写字母为例,循环平移两个字符的加密算法: stri=(stri-A+2)%26+A,程序如下:,#include #include void main(void) int i; char str80,chKey=2; gets(str); for(i=0;i=a ,密钥。,输入待加密的字符串。,循环遍历字符串,是字母,则加密!,设计解

26、密算法!,专题三、数组与矩阵,int a33,a00 a01 a02 a10 a11 a12 a20 a21 a22,该表示方法,在数学上称为“矩阵”,当行、列数相同时,称为“方阵”,也称为“行列式”。,矩阵的相关算法,生成特殊矩阵,生成单位方阵,单位方阵: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1,主对角线元素为1,其余为0。if(i=j)aij=1, 其余为0。,#include void main(void) int a44,i,j; for(i=0;i4;i+) for(j=0;j4;j+) if(i=j) aij=1; else aij=0; for(i=0;i

27、4;i+) for(j=0;j4;j+) printf(“%4d”,aij); printf(“n”); ,生成三角阵,三角阵的概念,以对角线为界,一半元素为0的方阵。,1 2 3 4 0 5 6 7 0 0 9 10 0 0 0 11,上三角阵。,当i=j时值非0为上三角阵,当i=j值非0为下三角阵,i,j,如何生成元素为行、列下标和的下三角阵?,与下标相关矩阵,形成如下矩阵 : 1 4 7 2 5 8 3 6 9,0 1 2 3,0 1 2,在列方向上每跨一列,要走三步;在行方向上每跨一行,要走 一步,只能横向或纵向行走,且不走远路,确定从一行一列走到任 意行列所走的步数。,1,8,显然,所走的步数和当前行列的位置有关。,s=i*1+j*3,1 4 72 5 83 6 9,aij=i*1+j*3+1,#include void main(void) int a33,i,j; for(i=0;i3;i+) for(j=0;j3;j+) aij=i+j*

温馨提示

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

评论

0/150

提交评论