您好,欢迎访问三七文档
第6章数组2020/11/232内容提要数组定义和基本操作;常用算法:求最大最小值、排序、查找等;用字符数组存取字符串;使用字符串处理函数处理字符串2020/11/235一维数组(Array)的定义类型数组名[长度];–长度为常量表达式,不可以是变量(但C99提供了动态数组)例:inta[10];–定义一个有10个元素的数组,每个元素的类型均为int–系统会在内存分配连续的10个int空间给此数组–a是数组名,同时也代表着此数组的首地址×//长度n不可以是变量2020/11/236一维数组的初始化inta[5]={12,34,56,78,9};inta[5]={12};inta[]={12,34,56,78,9};123456789a[0]a[1]a[2]a[3]a[4]120000a[0]a[1]a[2]a[3]a[4]123456789a[0]a[1]a[2]a[3]a[4]×√√√2020/11/237一维数组的赋值数组赋值和普通变量赋值一样–只能逐个对数组元素进行操作!–不能整体赋值!–切忌下标越界!inta[4];for(i=0;i4;i++)a[i]=2*i+1;√√×inta[4],b[4];……………;a=b;inta[4];a[0]=1;a[1]=3;a[2]=5;a[3]=7;//a和b是数组首地址,是地址常量//地址常量a不可以被赋值2020/11/238如何使两个一维数组的值相等8inta[4]={1,2,3,4},b[4];方法1:逐个元素赋值b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];方法2:通过循环赋值inti;for(i=0;i4;i++)b[i]=a[i];2020/11/239一维数组的输入和输出inta[10],i=0;scanf(“%d”,&a[i]);//方法1:输入第i个数组元素for(i=0;i10;i++)scanf(%d,&a[i]);//方法2:循环输入数组元素inta[10],i=0;printf(“%d”,a[i]);//方法1:输出第i个数组元素for(i=0;i10;i++)printf(%d,a[i]);//方法2:循环输出数组元素2020/11/2310耳听为虚,眼见为实一维数组在内存中是连续存放的一维数组名就是此数组首元素的地址数组下标越界的严重性2020/11/2311证明:数组在内存中是连续分布的;数组名就是数组的首地址inti;inta[6]={1,3,5,7,9,11};for(i=0;i=5;i++)printf(a[%d]的值是%2d,地址是%p\n,i,a[i],&a[i]);printf(“a的size是%d\n”,sizeof(a));printf(“a的值是%p\n”,a);//a是数组名,也是首元素的地址//a的值和&a[0]的值相等2020/11/2312后果很严重!下标越界inti,a[6];for(i=1;i=6;i++){a[i]=0;printf(a[%d]的值是%d\n,i,a[i]);}总是出现莫名其妙的错误,且不容易被发现!越界下标将访问数组以外的空间,可能带来严重后果!C语言不提供下标越界检查,所以一定要注意!2020/11/2313数组的使用数组的下标都是从0开始对数组每个元素的使用与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;iSIZE;i++)a[i]=2*i;下标越界是大忌!–使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果sizeof可以用来获得数组大小2020/11/2314Fibonacci数列–1,1,2,3,5,8,13,21,34,55…兔子繁殖问题(数组版)2020/11/2315兔子问题(数组版)#includestdio.h#defineYEAR_MONTH12intmain(){intf[YEAR_MONTH+1]={0,1,1};intmonth;for(month=3;month=YEAR_MONTH;month++){f[month]=f[month-1]+f[month-2];}for(month=1;month=YEAR_MONTH;month++){printf(%d\t,f[month]);}retuun0;}2020/11/2316反转并打印数组#include……#defineN10intmain(){inti,temp,a[N];srand(time(NULL));for(i=0;iN;++i){a[i]=rand()%100;printf(“%3d,a[i]);}for(i=0;iN/2;++i){temp=a[i];a[i]=a[N-1-i];a[N-1-i]=temp;}for(i=0;iN;++i)printf(“%3d,a[i]);return0;}2020/11/2317求数组最小元素及其所在下标#defineN10…………………………inti,a[N];imin=0;for(i=1;iN;++i){if(a[i]a[imin])imin=i;}printf(最小值是a[%d]:%3d\n,imin,a[imin]);2020/11/2318求数组最小元素及其所在下标#include……#defineN10intmain(){inti,imin,a[N];srand(time(NULL));for(i=0;iN;++i){a[i]=rand()%100;printf(“a[%d]是:%3d\n,i,a[i]);}imin=0;for(i=1;iN;++i){if(a[i]a[imin])imin=i;}printf(最小值是a[%d]:%3d\n,imin,a[imin]);return0;}2020/11/2319常用排序算法冒泡排序选择排序2020/11/2320a[0]9a[1]3a[2]5a[3]4a[4]2a[5]0395420359420354920354290354209a[0]3a[1]5a[2]4a[3]2a[4]0a[5]9354209345209342509342059第0轮第1轮2020/11/2321Bubblesort#includestdio.hintmain(){inta[10]={93,84,52,46,25,0,66,18,39,70},i,j,temp;for(j=0;j9;j++)for(i=0;i9-j;i++){if(a[i]a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}for(i=0;i10;i++)printf(%3d,a[i]);return0;}2020/11/2322选择排序a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]532687409103268745610126874563第0轮第1轮第2轮iminiminiminiminiminiminiminimin2020/11/2323选择排序for(i=0;in-1;i++){imin=i;for(j=i+1;jn;j++){if(a[j]a[imin])记录此轮参加比较的最小元素的下标imin=j;}若imin不等于i,则交换a[imin]和a[i],}2020/11/2324选择排序inta[10]={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(a[j]a[imin])imin=j;}if(imin!=i){temp=a[i];a[i]=a[imin];a[imin]=temp;}}for(i=0;i10;i++)printf(%3d,a[i]);2020/11/2325顺序查找哈,找到了!a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135792468102020/11/2327顺序查找#includestdio.h#defineN10intmain(){inta[N]={1,3,5,7,9,2,4,6,8,10},number;inti,find=0,pos=-1;printf(请输入要查找数据:);scanf(%d,&number);for(i=0;iN;i++){if(a[i]==number){pos=i;find=1;}}if(find)printf(找到了,位置是%d,pos);elseprintf(未找到);return0;}2020/11/2330折半查找(有序数组)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135791214161820第1次第2次第3次lowhighmid135791214161820lowhighmid135791214161820lowhighmid2020/11/2331折半查找(有序数组)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135791214161820第1次第2次第3次lowhighmid135791214161820lowhighmid135791214161820lowhighmid第4次135791214161820lowhigh2020/11/2332折半查找inta[10]={1,3,5,7,9,12,14,16,18,20},number;intlow=0,high=9,mid,pos=-1,find=0printf(请输入要查找的数:);scanf(%d,&number);while(low=high){mid=(low+high)/2;if(numbera[mid]){low=mid+1;}elseif(numbera[mid]){high=mid-1;}else{find=1;pos=mid;break;}}if(find)printf(找到了!位置是%d,pos);elseprintf(未找到);}2020/11/2333二维数组的定义数据类型数组名[常量表达式][常量表达式];inta[2][3];a[0]a[1]a----a[0][0]a[0][1]a[0][2]----a[1][0]a[1][1]a[1][2]在c语言中,二维数组是数组的数组!2020/11/2334二维数组的初始化intb[2][3]={{1,2,3},{4,5,6}};按行赋值intb[2][3]={1,2,3,4,5,6};按存放顺序赋值intb[][3]={1,2,3,4,5,6};行长度可省,列长度不能省intb[2][3]={1,2,3,4};部分元素赋初值intb[2][3]={{1,2,3,4},5,6};√√√√×2020/11/2335二维数组的存储结构shortinta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放先存放第0行的元素,再存放第1行的元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]2020/11/2336二维数组是先行后列存放inti,j;shortinta[3][4];//注意:a是short整型for(i=0;i3;i++)for(j=0;j4;j++){a[i][j]=4*i+j;printf(a[%d][%d]的值是:%2d“,”地址是:%p\n,i,j,a[i][j],&a[i][j]);}2020/11/2337二维数组是数组的数组inti,j;shortinta[3][4];for(i=0;i3;i++){printf(a[%d]的值是:%psize是:%d\n,i,
本文标题:C语言-数组ppt
链接地址:https://www.777doc.com/doc-7257579 .html