C语言-数组ppt_第1页
C语言-数组ppt_第2页
C语言-数组ppt_第3页
C语言-数组ppt_第4页
C语言-数组ppt_第5页
免费预览已结束,剩余65页可下载查看

下载本文档

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

文档简介

第6章数组,内容提要,数组定义和基本操作;常用算法:求最大最小值、排序、查找等;用字符数组存取字符串;使用字符串处理函数处理字符串,为什么引入数组,保存大量同类型的相关数据如矩阵运算,表格数据等,一维数组(Array)的定义,类型数组名长度;长度为常量表达式,不可以是变量(但C99提供了动态数组)例:inta10;定义一个有10个元素的数组,每个元素的类型均为int使用a0、a1、a2、a9这样的形式访问每个元素。系统会在内存分配连续的10个int空间给此数组a就是此数组的首地址,intn=5;intan;,/长度n不可以是变量,一维数组(Array)的定义,类型数组名长度;长度为常量表达式,不可以是变量(但C99提供了动态数组)例:inta10;定义一个有10个元素的数组,每个元素的类型均为int系统会在内存分配连续的10个int空间给此数组a是数组名,同时也代表着此数组的首地址,/长度n不可以是变量,一维数组的初始化,inta5=12,34,56,78,9;inta5=12;inta=12,34,56,78,9;,一维数组的赋值,数组赋值和普通变量赋值一样只能逐个对数组元素进行操作!不能整体赋值!切忌下标越界!,inta4;for(i=0;i4;i+)ai=2*i+1;,inta4,b4;a=b;,inta4;a0=1;a1=3;a2=5;a3=7;,/a和b是数组首地址,是地址常量/地址常量a不可以被赋值,如何使两个一维数组的值相等,8,inta4=1,2,3,4,b4;方法1:逐个元素赋值b0=a0;b1=a1;b2=a2;b3=a3;方法2:通过循环赋值inti;for(i=0;i4;i+)bi=ai;,一维数组的输入和输出,inta10,i=0;scanf(“%d”,/方法2:循环输入数组元素,inta10,i=0;printf(“%d”,ai);/方法1:输出第i个数组元素for(i=0;i10;i+)printf(%d,ai);/方法2:循环输出数组元素,耳听为虚,眼见为实,一维数组在内存中是连续存放的一维数组名就是此数组首元素的地址数组下标越界的严重性,证明:数组在内存中是连续分布的;数组名就是数组的首地址,inti;inta6=1,3,5,7,9,11;for(i=0;i=5;i+)printf(a%d的值是%2d,地址是%pn,i,ai,/a是数组名,也是首元素的地址/a的值和for(i=1;i=6;i+)ai=0;printf(a%d的值是%dn,i,ai);,总是出现莫名其妙的错误,且不容易被发现!越界下标将访问数组以外的空间,可能带来严重后果!C语言不提供下标越界检查,所以一定要注意!,数组的使用,数组的下标都是从0开始对数组每个元素的使用与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;iSIZE;i+)ai=2*i;下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果sizeof可以用来获得数组大小,Fibonacci数列1,1,2,3,5,8,13,21,34,55,兔子繁殖问题(数组版),兔子问题(数组版),#include#defineYEAR_MONTH12intmain()intfYEAR_MONTH+1=0,1,1;intmonth;for(month=3;month=YEAR_MONTH;month+)fmonth=fmonth-1+fmonth-2;for(month=1;month=YEAR_MONTH;month+)printf(%dt,fmonth);retuun0;,反转并打印数组,#include#defineN10intmain()inti,temp,aN;srand(time(NULL);for(i=0;iN;+i)ai=rand()%100;printf(“%3d,ai);for(i=0;iN/2;+i)temp=ai;ai=aN-1-i;aN-1-i=temp;for(i=0;iN;+i)printf(“%3d,ai);return0;,求数组最小元素及其所在下标,#defineN10inti,aN;imin=0;for(i=1;iN;+i)if(aiaimin)imin=i;printf(最小值是a%d:%3dn,imin,aimin);,求数组最小元素及其所在下标,#include#defineN10intmain()inti,imin,aN;srand(time(NULL);for(i=0;iN;+i)ai=rand()%100;printf(“a%d是:%3dn,i,ai);imin=0;for(i=1;iN;+i)if(aiaimin)imin=i;printf(最小值是a%d:%3dn,imin,aimin);return0;,常用排序算法,冒泡排序选择排序,第0轮,第1轮,Bubblesort,#includeintmain()inta10=93,84,52,46,25,0,66,18,39,70,i,j,temp;for(j=0;jai+1)temp=ai;ai=ai+1;ai+1=temp;for(i=0;i10;i+)printf(%3d,ai);return0;,选择排序,第0轮,第1轮,第2轮,选择排序,for(i=0;in-1;i+)imin=i;for(j=i+1;jn;j+)if(ajaimin)记录此轮参加比较的最小元素的下标imin=j;若imin不等于i,则交换aimin和ai,,选择排序,inta10=1,3,5,7,9,10,8,6,4,2;inti,j,imin,temp;for(i=0;i9;i+)imin=i;for(j=i+1;j10;j+)if(ajaimin)imin=j;if(imin!=i)temp=ai;ai=aimin;aimin=temp;for(i=0;i10;i+)printf(%3d,ai);,顺序查找,哈,找到了!,顺序查找,intaN=(1,3,5,7,9,2,4,6,8,10),xinti,find=0,pos=-1;for(i=0;i10;i+)if(ai=number)pos=i;find=1;if(find)printf(“找到了,位置是%d“,pos);elseprintf(”未找到”);,哈,找到了!,顺序查找,#include#defineN10intmain()intaN=1,3,5,7,9,2,4,6,8,10,number;inti,find=0,pos=-1;printf(请输入要查找数据:);scanf(%d,折半查找(有序数组),第1次,第2次,第3次,查找12成功!,折半查找(有序数组),第1次,第2次,第3次,折半查找(有序数组),第1次,第2次,第3次,折半查找(有序数组),第1次,第2次,第3次,第4次,折半查找,inta10=1,3,5,7,9,12,14,16,18,20,number;intlow=0,high=9,mid,pos=-1,find=0printf(请输入要查找的数:);scanf(%d,二维数组的定义,数据类型数组名常量表达式常量表达式;,inta23;,a0a1,a,-a00a01a02,-a10a11a12,在c语言中,二维数组是数组的数组!,二维数组的初始化,intb23=1,2,3,4,5,6;按行赋值intb23=1,2,3,4,5,6;按存放顺序赋值intb3=1,2,3,4,5,6;行长度可省,列长度不能省intb23=1,2,3,4;部分元素赋初值intb23=1,2,3,4,5,6;,二维数组的存储结构,shortinta23;,a10,a11,a12,a00,a01,a02,存放顺序:按行存放先存放第0行的元素,再存放第1行的元素,二维数组是先行后列存放,inti,j;shortinta34;/注意:a是short整型for(i=0;i3;i+)for(j=0;j4;j+)aij=4*i+j;printf(a%d%d的值是:%2d“,”地址是:%pn,i,j,aij,二维数组是数组的数组,inti,j;shortinta34;for(i=0;i3;i+)printf(a%d的值是:%psize是:%dn,i,ai,sizeof(ai);printf(a的值是:%pn,a);printf(a的size是:%dn,sizeof(a);,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),二维数组的输入和输出,for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,/输入,for(i=0;i2;i+)for(j=0;j3;j+)printf(“%d”,aij);/输出,inta23,i,j;,只能逐个对数组元素进行操作(字符数组例外),二维数组的最大值,#includeintmain()inti,j,row=0,col=0;inta34=1,2,3,4,9,8,7,6,-10,10,-5,2;row=0;col=0;for(i=0;iarowcol)row=i;col=j;printf(最大值为:%d,arowcol);return0;,#includeintmain()inta1010;inti,j,k;for(i=0;i10;i+)ai0=1;aii=1;for(i=2;i10;i+)for(j=1;ji;j+)aij=ai-1j+ai-1j-1;for(i=0;i10;i+)for(j=0;j=i;j+)printf(%6d,aij);printf(n);return0;,111121133114641,杨辉三角形,例:输出10行扬辉三角形。intmain()inta1010;inti,j;for(i=0;i10;i+)ai0=1;aii=1;for(i=0;i10;i+)for(j=1;ji;j+)/*0,1两行不用计算,j循环不执行*/aij=ai-1j+ai-1j-1;/*上一行的同列元素与前一列元素之和*/for(j=0;j=i;j+)printf(%5d,aij);printf(n);,111121133114641,字符数组与字符串(String),字符数组数组每个元素都是字符类型charstring5=h,e,l,l,o;字符串以0结尾的字符数组(在c语言中)charstring6=h,e,l,l,o,0;C语言使用字符数组实现字符串,字符串的初始化,用字符初始化charstr6=C,h,i,n,a,0;用字符串常量初始化charstr6=China;charstr6=China;charstr=China;“China”是字符串常量,系统自动添加0字符,字符数组的赋值,只能逐个对字符数组元素进行操作!切忌下标越界!,chara4;for(i=0;i4;i+)ai=a+i;,chara4,b4;,chara4;a0=a;a1=b;,a=b;/a是数组首地址,是地址常量,不能赋值,字符数组的赋值,字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);,scanf(%s,str);printf(%s,str);,charstr10;,字符串的输入输出,gets(str);puts(str);,gets可以输入带空格的字符串scanf(“%s”,str)将遇到空格或回车键停止读入字符串注意字符长度越界,引起缓冲区溢出,for(i=0;i0)/*正确*/,字符串函数strcmp(),strcmp(str1,str2),str1,str2,str1,str2,str1,str2,strcmp(str1,str2)=0,strcmp(str1,str2)0,strcmp(str1,str2)0,字符串例题,从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名等价于求最小字符串,#include#include#defineARRA_SIZE80main()intn;charstrARRA_SIZE,minARRA_SIZE;printf(Pleaseenterfivenames:n);gets(str);strcpy(min,str);for(n=1;n0)/*正确*/,字符串不能直接整体复制!也不能用关系运算符比较大小,例6.

温馨提示

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

评论

0/150

提交评论