您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > C语言入门到精通6教程
第5章数组5.1一维数组5.2二维数组5.3字符数组5.4二维字符数组小结构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定5.1一维数组5.1.1一维数组的定义定义方式:数据类型数组名[常量表达式];例:inta[10];floatb[5];charc[20];合法标识符[]:数组运算符单目运算符优先级(1)左结合不能用()表示元素个数下标从0开始数组名表示内存首地址,是地址常量a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]各元素地址aa+1a+2a+3a+4a+5a+6a+7a+8a+9a编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)5.1.2一维数组的初始化初始化方式在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数初值个数不能多于数组长度当全部数组元素赋初值时,可不指定数组长度如inta[5]={6,2,3};等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};()只给部分数组元素赋初值inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数5.1.3一维数组元素的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组一维数组的下标表示法数组名[下标]其中:下标可以是正整型常量或表达式例inti=15;intdata[i];(不能用变量定义数组维数)例inta[10];printf(“%d”,a);()必须for(j=0;j10;j++)printf(“%d\t”,a[j]);()例intdata[5];data[5]=10;//C语言对数组不作越界检查,使用时要注意5.1.3一维数组应用举例f[0]f[1]f[2]f[3]f[4]f[5]f[39]……...11f[39]01452339例5.1用数组求Fibonacci数列前40项。235#includestdio.hmain(){inti;longintf[40]={1,1};for(i=2;i40;i++)f[i]=f[i-2]+f[i-1];for(i=0;i40;i++){if(i%5==0)printf(\n);printf(%12ld,f[i]);}}例5-1d1读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)若maxx[i],令max=x[i]若minx[i],令min=x[i]3.输出:max和min#includestdio.h#defineSIZE10main(){intx[SIZE],i,max,min;printf(Enter10integers:\n);for(i=0;iSIZE;i++){printf(%d:,i+1);scanf(%d,&x[i]);}max=min=x[0];for(i=1;iSIZE;i++){if(maxx[i])max=x[i];if(minx[i])min=x[i];}printf(Maximumvalueis%d\n,max);printf(Minimumvalueis%d\n,min);}例5-1d2输入一个正整数n(1n≤10),再输入n个整数,将它们存入数组a中,将最小值与第一个数交换,输出交换后的n个数。#includestdio.hvoidmain(){inti,k,temp,n,a[10];printf(“Inputn:\n”);scanf(“%d”,&n);for(i=0;in;i++)scanf(“%d”,&a[i]);for(k=0,i=1;in;i++)if(a[i]a[k])k=i;temp=a[0];a[0]=a[k];a[k]=temp;for(i=0;in;i++)printf(“%d“,a[i]);}5.1.5数组排序与数组查找选择法排序排序过程:(1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束for(i=0;in-1;i++){找出a[i]至a[n-1]值最小的数组素的下标k;交换a[k]与a[i];}找出a[i]至a[n-1]值最小的数组元素的下标k的程序段:k=i;for(j=i+1;jn;j++)if(a[j]a[k])k=j;例初始:[49386597761327]kji=01349一趟:13[386597764927]i=12738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]kkkkjjjjjjjjjj例5.4对n个数排序。#defineN8main(){floata[N],t;inti,j,k;printf(“input%dnumber:\n”,N);for(i=0;iN;i++)scanf(“%f”,&a[i]);for(i=0;iN-1;i++){k=i;for(j=i+1;jN;j++)if(a[j]a[k])k=j;if(k!=i){t=a[k];a[k]=a[i];a[i]=t;}}printf("\nthesortednumbers:\n");for(i=0;iN;i++)printf(“%.2f“,a[i]);printf(“\n”);}输入N个数给数组ai从0到N-1找出剩下的N-i个数中的最小数与a[i]交换k=ik为最小数下标j从i+1到N-1a[j]a[k]真假k=j交换a[i]与a[k]输出排序后的数组冒泡法排序排序过程:(1)比较第一个数与第二个数,若为逆序a[0]a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束for(i=0;in-1;i++){第i趟排序算法}第i趟排序算法:for(j=0;jn-1-i;j++){若a[j+1]≤a[j]则交换a[j]与[j+1]}例3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟4938659776132730初始关键字n=8384976971397279730971376767627301365276530651313494930492738273830381327第七趟例5-4d1冒泡法排序(由小到大)#includestdio.h#defineN8voidmain(){floata[N],i,j,t;printf(“input%dnumber:\n”,N);for(i=0;iN;i++)scanf(“%f”,&a[i]);for(i=0;iN–1;i++)for(j=0;jN–1–i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf(“thesortednumbers:\n”);for(i=0;iN;i++)printf(“%.2f”,a[i]);}输入N个数给a[0]到a[N-1]i从0到N-2j从0到N-1-ia[j]a[j+1]假a[j]与a[j+1]互换输出a[0]到a[N-1]真例5.5在n个数中查找某一个数。(顺序查找)#includestdio.h#includestdlib.h#defineN10voidmain(){inta[N],i,x;printf(“input%dnumber:\n”,N);for(i=0;iN;i++)scanf(“%d”,&a[i]);printf(“inputxtolookfor:”);scanf(“%d”,&x);for(i=0;iN;i++)if(a[i]==x){printf(“find:%ditisa[%d]”,x,i);exit(0);//在数组中找到x,结束程序}printf(“%dnotbeenfound.\n”,x);//如x存在,则不执行}例5-5d1*折半查找法(前提,数据已按一定的规律升或降序排列好)例如:初始数据2791534569096123345存放在数组a中,查找90。输入N个数给a数组top=0,bot=N-1mid=(top+bot)/2x==a[mid]输出找到程序结束xa[mid]bot=mid-1x在mid左边xa[mid]top=mid+1x在mid右边输出未找到top=bot#includestdio.h#includestdlib.h#defineN10voidmain(){inta[N],x,i,n,top,bot,mid;printf(“input%dnumber:\n”,N);for(i=0;iN;i++)scanf(“%d”,&a[i]);printf(“inputxtolookfor:”);scanf(“%d”,&x);top=0;bot=N–1;while(top=bot)//若topbot表示所查找区间为空{mid=(top+bot)/2;if(x==a[mid]){printf(“find:%d,itisa[%2d]\n”,x,mid);exit(0);}elseif(xa[mid])bot=mid-1;elseif(xa[mid])top=mid+1;}printf(“%dnotbeenfound.\n”,x);}L5-5d2在一个已排序的数组中插入一个数。#includestdio.hmain(){inta[10]={-3,4,6,8,9,34,56,90,230};inti,j,x;printf(Enterx:);scanf(%d,&x);for(i=0;i9;i++)if(a[i]x)break;for(j=9;ji;j--)a[j]=a[j-1];a[i]=x;for(i=0;i10;i++)printf(%5d,a[i]);printf(\n);}L5-5d3输入一个正整数,将其转换成二进制数。#includestdio.hmain(){intx,a[16],i,n,j;printf(Enterx:);scanf(%d,&x);for(i=0;x;i++){a[i]=x%2;x/=2;}n=i;for(j=0,i--;ji;j++,i--){x=a[j];a[j]=a[i];a[i]=x;}for(i=0;in;i++)printf(%d,a[i]);printf(\n);}5.2二维数组5.2.1二维数组的定义二维数组说明符数据类型数组名[常量表达式][常量表达式];数组元素的存放顺序原因:内存是一维的二维数组:按行序优先,按行存放多维数组:最右下标变化最快例inta[3][4];floatb[2][5];intc[2][3][4];inta[3,4];()行数列数元素个数=行数*列数inta[3][2]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]014523a[0][0]a[0][0]a[0][1]a[1
本文标题:C语言入门到精通6教程
链接地址:https://www.777doc.com/doc-3984344 .html