版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第
6
章
批量数据组织与处理1主要内容6.1批量数据类型的概念6.2再识数组6.3数组的定义和初始化6.4数组的数据处理6.5数组程序设计举例26.1批量数据类型的概念一个变量只能存储一个值,只能对其单独进行处理。变量对于批量数据无能为力例1:设计一个程序,对全年级200名学生的“计算机程序设计”课程的成绩进行排序。需要定义200个变量来存储这些成绩设计代码输入(赋值)这些成绩设计代码来进行具体的排序过程设计代码输出排好序的结果…34批量数据类型是指由多个同种类型的数据构成的数据类型,并且构成批量数据的多个数据之间存在一定逻辑关系,例如数学中的向量、矩阵、课程成绩表等对于批量数据,如果仍然按单个变量来进行存储和处理,将无法顾及数据间的逻辑关系,处理效率会很低鉴于一般情况下,数据列表中的数据的操作步骤基本相同,只是操作对象不同。这时,可以考虑使用循环结构来设计程序,即使用循环控制变量自身的值或包含循环控制变量的表达式来确定要访问的具体的变量5回顾数列:对于一个数列,其具体的构成元素a1、a2、…、a200由字母和数字组合共同确定将上述特点推广到计算机程序设计领域:使用循环结构来控制访问数列中的所有元素,使用循环控制变量自身的值或包含循环控制变量的表达式的值作为数列元素在序列中的位置,并且将该位置值转变为下标值,即用a1、a2、…、a200表示不同的元素使批量数据的所有元素有了共同的名字a,体现了它们之间的内在联系及相同属性,同时又可以利用下标区别不同的元素,从而避免定义太多的变量,大大提高了程序的运行效率C语言中处理批量数据的机制——数组数组将一组数据类型相同的数据按顺序存储在连续的空间中数组提供了一种组织数据的机制,所以属于构造数据类型处理大批量、存储在数组中的数据,比处理分散存放到变量中大批数据更加容易和高效但比普通变量使用复杂,代码要长,调试难66.2再识数组适用场合:
只有在必须将大量的数据集全部同时放入内存中的情况下才使用数组7区别于变量,数组可以存储一组值。所存储的这组值的个数称为“数组长度”(或数组大小)因为决定着为数组分配的空间的大小,数组长度必须为常量,是一个非负整数,该常量在程序运行过程中不能更改数组长度要恰当,否则会出现不够用或浪费现象为方便阅读和修改,一般使用符号常量指定数组长度,当需要修改数组长度时,只需修改符号常量的值即可8数组中的存储单元称为“数组元素”数组元素通常是连续的空间可以通过赋值或键盘输入数据方式为数组元素指定值(内容)可以使用循环遍历数组,对每个数组元素实施相同的操作每个数组元素本质上与普遍变量相同,可以在数学表达式等中使用数组元素参与运算9每一个数组元素都指定了一个唯一编号:称为“下标”下标是数组中具体元素的标志可以通过下标操作数组元素大多数程序设计语言中,下标从0开始下标可以是具有整数值的变量或表达式下标使用不当会造成数组“越界”下标可以有多个,为多维数组101D2D3D11从逻辑视角理解各维数组4D5D1213存储结构,又称物理结构,是指数组元素在内存中的组织方式其中,二维数组的存储结构,是将数组元素映射成线性关系存储,采用一维存储器连续存储二维数组的所有元素,将若干连续的存储单元在逻辑上划分成多个行,按行排列的方式依次进行存储14数组特点:相同性。构成数组的各个元素都属于同一种数据类型,可以对数组元素进行相同的操作顺序性。从逻辑角度,数组元素按下标值从0开始、按自然数增长,从小到大的顺序进行排列连续性。从物理角度,数组被存储到一块连续的内存空间中,下标相连的两个数组元素在内存中的位置相邻静态性。编译系统为数组分配固定大小的存储空间,程序一旦运行,数组所占空间大小和元素个数将维持不变6.3数组的定义和初始化“数组的定义”要解决的问题:数组名是什么?数组有多少个元素?数组元素的类型是什么?15大多数程序设计语言可以在定义一个数组时给该数组赋初值,称为“数组的初始化”一系列用于初始化的数值称为初始化列表这些数值按照它们在列表中的顺序存储在数组元素中数组初始化是在编译阶段进行的,这样可以减少程序的运行时间16C语言中数组的定义及初始化例:intx[5];floaty[7];charz[4];元素类型数组名[数组长度];inta[3][4];floatb[4][3];charc[2][5];intu[2][5][8];floatv[3][6][9];charw[5][7][10];元素类型数组名[长度1][长度2];元素类型数组名[长度1][长度2][长度3];17x[0]x[1]x[2]x[3]x[4]x例:intx[5];charz[4];x[0]x[1]x[2]x[3]x[4]…z[0]z[1]z[2]z[3]xz数组元素数组名:地址常量,表示数组首地址。下标偏移量内存地址5718-599…
内存用户数据区0x61fe000x61fe040x61fe080x61fe0c0x61fe10…0x61fdfc0x61fdfd0x61fdfe0x61fdff'C''S''\0'8'\0'z[0]z[1]z[2]z[3]z18a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[2]a[1]a[0]a[3]a[4]aa[4][0]a[4][1]a[4][2]a[4][3]a[4][4]713-54937
内存用户数据区0x61fdb00x61fdb40x61fdb80x61fdbc0x61fdc00x61fdc40x61fdc80x61fdcc0x61fdd00x61fdd4…0x61fe10-812184830a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]…a[4][4]…98例:inta[5][5];1920例:求不同数组的内存空间大小#include<stdio.h>intmain(){intx[5];floaty[7];charz[4];inta[5][5];floatb[4][3];charc[2][6];intu[2][5][8];floatv[3][6][9];charw[5][7][10];
printf("数组长度(字节数):\n);printf("%d%d%d\n",sizeof(x),sizeof(y),sizeof(z));printf("%d%d%d\n",sizeof(a),sizeof(b),sizeof(c));printf("%d%d%d\n",sizeof(u),sizeof(v),sizeof(w));printf("数组默认初值:\n);printf("x[0]=%d,y[0]=%f,z[0]=%d\n",x[0],y[0],z[0]);printf("a[1][1]=%d,b[1][1]=%f,c[1][1]=%d\n",a[1][1],b[1][1],c[1][1]);printf("u[2][2][2]=%d,v[2][2][2]=%f,w[2][2][2]=%d\n",u[2][2][2],v[2][2][2],w[2][2][2]);return0;}例:intx[10]={0,1,2,3,4,5,6,7,8,9};floaty[7]={3,1.2,-6.6,0,7.8,3.14,-21};charz[8]={‘E’,‘C’,‘U’,‘S’,‘T’,‘’,‘C’,‘S’};元素类型数组名[数组长度]={初值0,初值1,初值2,…};也可:intx[]={0,1,2,3,4,5,6,7,8,9};intt[5]={0};floaty[10]={3,1.2,-6.6,0,7.8,3.14,-21};charz[8]={‘E’,‘C’,‘U’,‘S’,‘T’};21inta[3][4]={{1,2,3,4},{5,6,7,8},{10,11,12,13}};floatb[4][3]={{1.1,2.2,3.3},{0,0,0},{2.1,3.2,4.3},{1,1,1}};charc[2][5]={{‘C’,‘H’,‘I’,‘N’,‘A’},{‘E’,‘C’,‘U’,‘S’,‘T’}};inta[3][4]={1,2,3,4,5,6,7,8,10,11,12,13};floatb[4][3]={1.1,2.2,3.3,0,0,0,2.1,3.2,4.3,1,1,1};charc[2][5]={‘C’,‘H’,‘I’,‘N’,‘A’,‘E’,‘C’,‘U’,‘S’,‘T’};inta[][4]={{1,2,3,4},{5,6,7,8},{10,11,12,13}};floatb[][3]={{1.1,2.2,3.3},{0,0,0},{2.1,3.2,4.3},{1,1,1}};charc[][5]={{‘C’,‘H’,‘I’,‘N’,‘A’},{‘E’,‘C’,‘U’,‘S’,‘T’}};inta[][4]={{1,2,3},{5,6},{10}};floatb[4][3]={{1.1,2.2,3.3},{0},{2.1,3.2,4.3},{1,1,1}};charc[][5]={‘C’,‘H’,‘I’,‘N’,‘A’,‘E’,‘C’,‘U’,‘S’,‘T’};22//提倡如下写法:inta[3][4]={{1,2,3,4},{5,6,7,8},{10,11,12,13}};floatb[4][3]={{1.1,2.2,3.3},{0,0,0},{2.1,3.2,4.3},{1,1,1}};charc[2][5]={{‘C’,‘H’,‘I’,‘N’,‘A’},{‘E’,‘C’,‘U’,‘S’,‘T’}};23注意:
(1)数组长度应为整型常量表达式,不允许用变量进行动态定义;
(2)同一函数中,数组名不允许与变量名相同;
(3)数组名是常量,代表数组在内存中的首地址(4)初始化时初值个数应小于等于数组长度;
(5)不允许对数组进行整体赋值intx[10]={0,1,2,3,4,5,6,7,8,9},y[10];y=x;
24(6)如果未对数组进行显式初始化,全局数组的数组元素将被置为它们的默认初值(int型为0,float、double型为0.0,char型为空(ASCII码值为0));当数组在函数内或复合语句中定义时,如果不写“{}”,则默认的初值为随机值或乱码;当数组在函数内或复合语句中定义时,如果写“{}”或给某几个元素赋初值时,则其他未赋值的元素取它们的默认初值25(7)对于字符数组,可以用字符常量进行初始化:charz[8]={‘E’,‘C’,‘U’,‘S’,‘T’,‘’,‘C’,‘S’};
也可以用字符串常量进行初始化:charz1[9]={“ECUSTCS”};
或charz2[9]=“ECUSTCS”;
或charz3[]=“ECUSTCS”;//可测量数组所占内存大小sizeof(z3)
字符串结束标志:‘\0’
//
ASCII为0,空操作符,仅用于标志字符串的结束charstr[3][10]={“Beijing”,“Shanghai”,“Nanjing”};26对数组的任何操作,即“数组操作”都是通过元素实现的赋值、运算输入、输出查找、排序字符串处理数组作为函数参数6.4数组的数据处理数组名[下标]数组名[下标][下标]数组名[下标][下标]…[下标]27C语言中的数组操作赋值、运算、输出
#defineN20voidmain(){inti,num[N]={1,1};for(i=2;i<N;i++)num[i]=num[i-1]+num[i-2];for(i=0;i<N;i++)printf("%5d",num[i]);}//斐波那契数列28输入、查找
#include<stdio.h>
#defineN10voidmain(){inta[N],i,max,min;floatsum=0;for(i=0;i<N;i++)scanf("%d",&a[i]);sum=max=min=a[0];for(i=1;i<N;i++){ if(a[i]>max)max=a[i];elseif(a[i]<min)min=a[i]; sum+=a[i];}printf("Max=%d,Min=%d,Average=%.2f\n",max,min,sum/N);
}//从键盘上输入10个数,输出其//中的最大值、最小值和平均值29插入x到第i个位置思路:将第i个到最后的数组元素向后移一位,将新数据元素插入到第i个位置;后移操作必须从最后一个数组元素开始1.循环j从n-1到i,step:-1a[j+1]=a[j]2.a[i]=x3.n++
a[0]a[1]a[9]a3528122890afor(j=n-1;j>=i;j--)a[j+1]=a[j];a[i]=x;n++;j指向需要移位的数组元素。思考:如果j指向移位后的存放位置,如何修改算法30删除第i个数组元素循环j从i+1到n-1a[j-1]=a[j]n=n-1
a[0]a[1]a[9]0129a3528228900for(j=i+1;j<n;j++)a[j-1]=a[j];n--;思路:将第i+1个到第n-1个数组元素前移一位31数组作为函数参数
a[0]a[1]a[9]0129a3528228900
数组作为实参时,分为两种情况:(1)传递一个数组元素值(2)传递整个数组地址或某个数组元素的地址3233//数组元素作为函数的实参。#include<stdio.h>intadd(intx,intn){returnx+n;}intmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i<10;i++)a[i]=add(a[i],i);//数组元素作为函数实参for(i=0;i<10;i++)printf("%d",a[i]);return0;}34//数组名作为函数的实参。#include<stdio.h>voidfun(intx[5],intn)//可不指定数组长度,即不要求其长度与实参数组一致{inti;for(i=0;i<n;i++)x[i]=x[i]-1;}
intmain(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};fun(a,10);//数组名作为函数的实参for(i=0;i<10;i++)printf("%3d",a[i]);printf("\n");return0;}字符串的处理
(1)字符/字符串的输入/出功能输入函数输出函数输入/出一个字符getchar()putchar()格式化输入/出函数scanf()printf()非格式化输入/出函数gets()puts()基于文件的输入/出函数fgets()fputs()35说明:
charstr[10];scanf(“%s”,str);//该函数不会以整行形式读入,//而是一个一个地从缓冲区中读取字符,但//不会读取空白字符(空格、制表符等)printf(“%s”,str);//逐个输出str中的字符,直//到遇到‘\0’;若无‘\0’,则会继续向后将内//存中的字符输出,直到遇到‘\0’36gets(str);//该函数将空白当作合法字符一起读入,//直到遇到一个换行符为止。函数执行//成功,将返回一个字符数组首地址puts(str);//输出str中的字符串,并在其后添加一//个换行符。函数执行成功,返回一个//非负值(0),否则返回EOF(-1)37(2)字符串处理函数一般形式功能说明返回值strlen(字符串)求字符串的长度有效字符的个数strcpy(字符数组1,字符串2)将字符串2复制到字符数组1中字符数组1的首地址strcmp(字符串1,字符串2)比较两个字符串字符串1==字符串2,返回0字符串1>字符串2,返回正整数字符串1<字符串2,返回负整数strcat(字符数组1,字符数组2)连接两个字符串字符数组1的首地址strchr(字符串,字符)在字符串中查找字符找到,返回字符第1次出现的位置;未找到,返回空地址strupr(字符串)/strlwr(字符串)转换为大/小写不是标准C函数,只能在VC中用386.5数组程序设计举例例:输入10个学生的成绩,由高到底输出排好序的成绩。解题思路:排序方法:选择排序、冒泡排序、希尔排序、快速排序…排序规律:“升序”——从小到大
“降序”——从大到小39选择排序法:基本思想:每一轮从待排序的数据元素中选择最大(或最小)的一个元素作为首元素,直到所有元素排完为止第一轮在数组中找到最大(小)值,并将其与数组中的第一个元素互换位置;第二轮在剩下的元素中找到次大(小)值,并将其与数组中的第二个元素互换位置…程序用两重循环实现,外循环用i控制轮数,内循环用j控制该轮中的第j次比较4041#include<stdio.h>
#defineN10voidmain(){ints[N],i,j,tmp;
printf("Input%dscores:",N);for(i=0;i<N;i++)scanf("%d",&s[i]);
for(i=0;i<N-1;i++)//第i轮
for(j=i+1;j<N;j++)//第i轮中第j次比较
if(s[j]>s[i]){tmp=s[i];s[i]=s[j];s[j]=tmp;}
printf("Thesortedscores:\n");for(i=0;i<N;i++)printf("%4d",s[i]);printf("\n");
}42冒泡排序法:基本思想:对相邻的元素进行两两比较,不符合要求则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序程序用两重循环实现,外循环用i控制轮数,内循环用j控制该轮中第几次比较4344985420895420859420854920854290854209大数沉淀,小数起泡a[0]a[1]a[2]a[3]a[4]a[5]for(j=0;j<5;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}示例:454647854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(j=0;j<4;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}48542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]for(j=0;j<3;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}49420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]for(j=0;j<2;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}50204589024589a[0]a[1]a[2]a[3]a[4]a[5]for(j=0;j<1;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}51for(j=0;j<5;j++)if(a[j]>a[j+1]){……}for(j=0;j<4;j++)if(a[j]>a[j+1]){……}for(j=0;j<1;j++)if(a[j]>a[j+1]){……}……for(j=0;j<5-i;j++)if(a[j]>a[j+1]){……}for(i=0;i<5;i++)#include<stdio.h>
#defineN10voidmain(){ints[N],i,j,tmp;
printf("Input%dscores:",N);for(i=0;i<N;i++)scanf("%d",&s[i]);
for(i=0;i<N-1;i++)//第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网约车司机服务质量考试题库及答案
- 维修技师考试题及答案
- 物流管理部(危货押运员)安全培训考试题及答案
- 心理与教育测量学试题库及答案
- 新疆油田公司安全考题库及答案
- 营养配餐员高级理论知识试题及答案
- 油品入门测试题库及答案
- 医疗器械冷链管理培训试题及参考答案
- 中层竞聘面试试题及答案及答案
- 中化控股综合办公室总经理笔试测试题及答案
- PCS-9785-H2时间同步装置说明书
- 《堤防抢险技术导则SLT 832-2024》知识培训
- 公务员面试宝典:2025年升级版详解
- 七年级数学上册有理数加减乘除混合运算测试卷
- T-GXAS 421-2022 成人急性中毒洗胃操作技术规范
- 《品篆刻之美》课件 2024-2025学年人美版(2024)初中美术七年级上册
- 双氧水SIS联锁联调确认表
- 《水电工程水利计算规范》(NB-T 10083-2018)
- 欢乐的那达慕混声合唱简谱
- 二级动火安全施工方案
- 中国居民膳食营养素参考摄入量(DRIs)(2013-修订版)资料
评论
0/150
提交评论