利用数组处理批量数据

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

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

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

资源描述

1第6章利用数组处理批量数据2数据类型空类型指针类型构造类型结构体类型数组类型共用体类型基本类型整型实型字符型标准类型用户定义类型枚举型单精度型双精度型C的数据类型3•a,b从大到小排序输出?Programming1:if(ab){temp=a;a=b;b=temp;}printf(“%d%d\n”,a,b);•a,b,c从大到小排序输出?Programming2:if(ab){temp=a;a=b;b=temp;}if(ac){temp=a;a=c;c=temp;}if(bc){temp=b;b=c;c=temp;}printf(“%d%d%d\n”,a,b,c);•a,b,c,d从大到小排序输出?•a,b,…,从大到小排序输出?利用数组可以进行数据的排序问题的提出4#includestdio.hmain(){floatcj1,cj2,cj3,…cj10,pj;/*声明变量*/scanf(“%f”,&cj1);/*输入10个成绩*/scanf(“%f”,&cj2);…scanf(“%f”,&cj10);pj=cj1+cj2+…+cj10;pj=pj/10;/*求平均成绩*//*打印低于平均成绩的同学成绩*/if(cj1pj)printf(“%f\n”,cj1);if(cj2pj)printf(“%f\n”,cj2);…if(cj10pj)printf(“%f\n”,cj10);}例2:计算10个同学成绩的平均值,打印低于平均值的成绩如果增加1000个成绩?用变量来解决:5#includestdio.hmain(){floatcj[10];/*定义一个实型数组存放10个成绩*/floatpj;inti;for(i=0;i10;i++)/*输入10个成绩*/scanf(%f,&cj[i]);for(i=0,pj=0;i10;i++)/*求平均成绩*/pj=pj+cj[i];pj=pj/10;for(i=0;i10;i++)/*打印低于平均成绩的同学成绩*/if(cj[i]pj)printf(cj[%d]=%f\n,i+1,cj[i]);}用数组来解决:6用数组解决此类问题循环中使用数组能更好地发挥循环的作用.例2:某些问题不使用数组就难以解决.例1:优点程序简洁、思路清楚明了书写简洁,通用性强71、常用于处理大批量数据;2、数据特点:存在内在联系;3、数组——具有相同数据类型的变量集合;这些变量都有相同名字,但下标不同;称这些变量为数组元素;4、只有一个下标——一维数组,如:cj[10];有两个下标——二维数组,如:grade[3][4]。关于数组8本章内容6.1怎样定义和引用一维数组6.2怎样定义和引用二维数组6.3字符数组小结96.1怎样定义和引用一维数组一维数组是数组中最简单的,它的元素只需用数组名加一个下标,就能唯一地确定。106.1怎样定义和引用一维数组6.1.1一维数组的定义和引用6.1.2一维数组的初始化116.1.1一维数组的定义和引用【例】一维数组示例。#defineN10main(){inti,a[3];floatb[N];a[0]=2;a[1]=4;a[2]=a[0]+a[1];for(i=0;iN;i++)scanf(%f,&b[i]);printf(%d%d%d\n,a[0],a[1],a[2]);for(i=0;iN;i++)printf(%.0f,b[i]);printf(\n);}N为符号常量定义数组a和b给数组a的元素赋值必须是常量表达式输入的数据放入数组b的元素中12运行结果:1234567891024612345678910数组a的元素值数组b的元素值13inta[3];表示:a为一维数组名;a的长度为3,即含3个元素;元素为a[0]、a[1]、a[2];元素类型均为整型。说明:每个元素都是变量下标:0~214floatb[N];表示:数组名为b;b数组的长度为N;元素为b[0],b[1],b[2],…,b[N-1];各元素的类型为单精度型。不能含变量15数组元素代表内存中的一个存储单元;数组元素像普通变量一样使用;数组元素用下标形式表示;常用循环对数组进行输入输出操作。16为a数组分配3个连续的存储单元:(2字节×3=6个字节)为b数组分配N个连续的存储单元:(4字节×N)a[0]a[1]a[2]ab[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]b17一维数组的一般定义形式:类型名数组名1[常量表达式1],数组名2[常量表达式2],…;例如,inta[5],b[6+3];元素类型数组名数组长度18正确的定义方式#defineN5inta[N];/*N是符号常量,其值为5*/intb[2+3];/*2+3是常量表达式,其值为5*/intc[10];错误的数组定义inta[j];/*j不是常量*/intx=10,b[x];/*?*/intM(4);/*不能用圆括号定义数组*/intn[1.0];/*?*/19引用数组元素的形式:数组名[下标]例如,a[2],b[i],b[i+1]是合法引用下标可以是常量、变量或表达式;其值必须确定、且是整型;系统不做下标越界检查。20问题1:inta[2];scanf(“%d%d”,&a[1],&a[2]);——??错误:在C语言中数组元素的下标由0开始,一个数组的下标的合法范围在0~n-1,因此该题正确的写法是:inta[2];scanf(“%d%d”,&a[0],&a[1]);错误:数组元素是通过数组名[下标]来访问的,其中下标必须是大于0的整数、整型变量或整型表达式,在这段程序中,i是浮点数,不能做数组元素的下标。问题2:inta[10];floati=3;a[i]=10;——??问题问题3:intn;scanf(“%d”,&n);inta[n];——??错误:不允许对数组进行动态定义216.1.2一维数组的初始化定义数组的同时,给数组元素赋初值——数组的初始化22(1)在定义数组时对全部数组元素赋予初值inti;inta[5]={1,2,3,4,5};for(i=0;i5;i++)printf(%5d,a[i]);等价于inta[5];a[0]=1;a[1]=2;...a[4]=5;运行结果:12345【例】一维数组的初始化示例。23inti;intb[5]={2,3,4};for(i=0;i5;i++)printf(%5d,b[i]);等价于intb[5]={2,3,4,0,0};运行结果:23400(2)可以只给数组中的一部分元素赋值24(3)使数组中全部元素值为0inti;intd[5]={0};for(i=0;i5;i++)printf(%5d,d[i]);等价于intd[5]={0,0,0,0,0};运行结果:0000025inti;intc[]={3,4,5,6,7};for(i=0;i5;i++)printf(%5d,c[i]);等价于intc[5]={3,4,5,6,7};运行结果:34567(4)对全部数组元素赋初值时,可不指定长度26inti;inte[5];for(i=0;i5;i++)printf(%5d,e[i]);未初始化不能写成inte[];运行结果:-5613340643129输出不确定值(5)未初始化时定义长度不能省27inti;intf[5]={1,2,3,4,5,6,7,8};提供数据过多,报错(6)初始化数据个数不能超过长度。28【例6.1】定义含有10个元素的数组,并按顺序和逆序输出各元素的值。#includestdio.hmain(){inti;inta[10]={1,2,3,4,5,6,7,8,9,10};for(i=0;i10;i++)printf(%4d,a[i]);printf(\n);for(i=9;i=0;i--)printf(%4d,a[i]);printf(\n);}顺序输出逆序输出29运行结果:123456789101098765432130思路:将相邻两数比较,将小的调前排序过程:(1)比较第一个数与第二个数,若为a[0]a[1],则交换,然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大数被放在最后一个元素的位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大数被放在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束例6.3用冒泡法对n个数排序(升序)31例用冒泡法对6个数排序(升序)895420第2次985420第1次859420第3次854920第4次854290第5次985420原始数据854209结果第1趟寻找第一个最大的数32例用冒泡法对6个数排序(升序)584209第2次854209第1次548209第3次542809第4次854209原始数据542089结果第2趟寻找第二个较大的数33冒泡排序规律1、若有n个数,则要进行n-1趟比较,其中在第i趟应进行n-i次比较。2、用for循环嵌套,外层循环负责趟数比较,内层循环负责次数比较。for(i=1;i=n-1;i++)for(j=1;j=n-i;j++)若a[j]a[j+1]交换a[j]与a[j+1]34用冒泡法对10个数排序(升序)1,9,8,5,4,2,0,3,7,6main(){inta[10]={1,9,8,5,4,2,0,3,7,6};inti,j,t;for(i=0;i9;i++)for(j=0;j9-i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;i10;i++)printf(%d,a[i]);}356.2怎样定义和引用二维数组6.2.1怎样定义二维数组6.2.2怎样引用二维数组6.2.3二维数组的初始化36有两个下标的数组a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]123456a行下标列下标37二维数组定义的一般形式:类型说明符数组名[常量表达式1][常量表达式2];6.2.1怎样定义二维数组例如:floata[3][4],b[5][10];38012第0行第1行第2行0123第0列第1列第2列第3列数组名行下标列下标a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]该二维数组包含三行四列,因此称为3×4数组。数组中的每一个元素都用a[i][j]的形式表示。所以:该例中定义了一个3*4(3行4列)的数组,我们可以将其视为一个有3个元素a[0]、a[1]、a[2]组成的一维数组,而a[0]、a[1]、a[2]又是包含4个元素的一维数组。因此,可以将a[0]、a[1]、a[2]分别看成是三个一维数组的名字。39在C语言中,二维数组在内存中的存储是按行存放的a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]aa[0][0]a[0][1]…….a[2][2]a[2][3]二维数组存储所占的内存字节数的计算公式为:数组总字节数=sizeof(type)*size1*size240二维数组元素的引用格式数组名[下标1][下标2];6.2.2怎样引用二维数组每个元素同一般变量一样使用例:inta[3][4];a[0][2]=a[1][3]*4;41格式:数据类型数组名[整常量表达式][整常量表达式]={初始化数据};在{}中给出各数组元素的初值各初值之间用逗号分开把{}中的初值依次赋给各数组元素6.2.3二维数组的初始化42初始化方式(1)分行进行初始化例如:inta[3][4]={{1,2,3,4},{5,6,7

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

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

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

×
保存成功