C语言-数组ppt

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第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/2314Fibonacci数列–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,

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功