C语言用数组处理批量数据.docx
C语言用数组处理批量数据整型、字符型、浮点型数据,都是简单的数据类型。对于简单的问题,使用这些简单的数据类型就可以了。对于有些需要处理的数据,只用以上简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。比如,一个班有30个学生,每个学生有一个成绩,要求这30名学生的平均成绩。实际上这些数据是同一个班级、同一门课程的成绩,它们具有相同的属性。人们想出这样的办法:既然它们都是同一类性质的数据(都代表一个班中学生的成绩)就可以用同一个名字(如S)来代表它们,而在名字的右下角加一个数字来表示这是第几名学生的成绩,例如,可以用sl,s2,s3,S30代表学生L学生2、学生3学生30,这30个学生的成绩。这个右下角的数字称为下标。一批具有同名的同属性的数据就组成一个数组(array)zs就是数组名。Q)数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。(2)用一个数组名(如S)和下标(如15)来唯一地确定数组中的元素,如s15就代表第15个学生的成绩。(3)数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据(如学生的成绩和学生的性别)放在同一个数组中。C语言规定用方括号中的数字来表示下标,如用s15表示S15,即第15个学生的成绩。将数组与循环结合起来,可以有效地处理大批量的数据。1定义数组和引用一维数组一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一地确定。比如:学生成绩数组s就是一维数组。有的数组,其元素要指定两个下标才能唯一确定,如用S2z3表示第2班第3名学生的成绩,其中第1个下标代表班,第2个下标代表班中的学生序号。此时,s就是二维数组。还可以有三维甚至多维数组,如用S4,2,3表示4年级2班第3名学生的成绩,这里s就是三维数组。它们的概念和用法基本上是相同的。定义一维数组要使用数组,必须在程序中先定义该数组,即通知计算机:由哪些数据组成数组,数组有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。下面是对数组的定义:inta10;它表示定义了一个整型数组数组名为a,此数组包含10个整型元素。定义一维数组的一般形式为类型说明符数组名常量表达式;说明:(1)数组名的命名规则和变量名相同,遵循标识符命名规则。(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,指定a10z表示a数组有10个元素。注意,下标是从0开始的,这10个元素是a0za1,a2,a3za4za5za6,a7za8,a9o按数组的定义,不存在数组元素a10(3)常量表达式中可以包括常量和符号常量,如inta3十5;是合法的。不能包含变量,如intan;是不合法的。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:scanf(n%d”,&n);企图在程序中临时输入数组的大小intan;Il数组长度性质是常量,一定不是变量,它有地址,数值是可变的,不能变量表示数组长度。数组整体是变量。用inta10;定义了数组a后,在内存中划出一片存储空间,存放了一个有10个整型元素的数组。可以看到,用一个minta10zz就相当于定义了10个简单的整型变量,比较方便。2引用一维数组元素在定义数组并对其中各元素赋值后,就可以引用数组中的元素。应注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。引用数组元素的表示形式为数组名下标例如,a0就是数组a中序号为O的元素,它和一个简单变量的地位和作用相似。下标可以是整型常量或整型表达式。例如下面的赋值表达式包含了对数组元素的引用,a0=a5+a7-a2*33一维数组的初始化在定义数组的同时给各数组元素赋值,称为数组的初始化。用初始化列表”方法实现数组的初始化。(1)在定义数组时对全部数组元素赋予初值。例如:inta10=O111,2,3,4,5,6,7,8,9;将数组中各元素的初值JII页序放在一对花括号内,数据间用逗号分隔。花括号内的数据效为初始化列表。经过上面的定义和初始化之后,a0=0,al=lza2=2za3=3,a4=4,a5=5,a6=6,a7=7za8=8za9=9o(2)可以只给数组中的一部分元素赋值。例如:inta10=0,1,2,3,4);定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为Oo(3)如果想使一个数组中全部元素值为0,可以写成inta10=(0z0z0,0z0z0z0z0z0z0);或inta10=(0);(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:未赋值的部分元素自动设定为Ointa5=(1,234,5)可以写成inta=123,4,5在第2种写法中,花括号中有5个数,虽然没有在方括号中指定数组的长度,但是系统会根据花括号中数据的个数确定a数组有5个元素。但是,如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成inta10=(lz2z3A5;只初始化前5个元素,后5个元素为Oo说明:如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被"初始列表指定初始化的数组元素,系统会自动把它们初始化为0(如果是字符型数组,则初始为,0"l如果是指金十型数组,则初始化为NULL,即空指针)。4一维数组程序实例如:已知前两项初值为I1I1后面一项是前面两项之和,依次类推,显示前40项数据。如果用简单变量处理的,只定义3个变量,程序可以顺序计算并输出各项数据值,但不能在内存中保存这些数。假如想直接输出数列中的第40个数是很困难的。查资料找到下面程序:include<stdio.h>斐波那锲数列第四十项为多少(前两项的和是后一项)intFabonacci(intn)(intfl=1;intf2=1;intf3=1;inti;for(i=3;i<=n;i+)前两项的和给第三项,然后2给1,3给2(f3=fl+f2;fl=f2;f2=f3;returnf3;)intmai()(printf(',%dn,zFabonacci(40);getchar();return0;)scanf和getchar的区别字符数据的输入:scanf()函数是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量中。在SCanf()语句的格式串中由于没有非格式字符在'%d%d%d''之间作为输入时的间隔,因此在输入时要用一个以上的空格或回车符作为每两个输入数之间的间隔。SCanf()在读取数字时会跳过空格、制表符和换行符。如:1#include<stdio.h>2intmain()3(4 intazbzc;5 SCanfe%d%d%d”,&a,&b,&c);6 printf("%d%d%d"zazbzc);)getchar()函数是键盘输入函数,其功能是从键盘上输入一个字符。简单来说就是getchar()函数在C程序中的功能是接收一个字符。SCanf()的程序:1 #include<stdio.h>2 #include<stdlib.h>3 intmain(void)45 intazbzc;6 printf("pleaseinputnuma:nn);7 scanf(%d"a);8 printf(,pleaseinputnumb:nn);9 scanf("%d',b);10 printf("pleaseinputnumcn");11 scanf(',%d,c);12 printf("%d,%d,%dnza,bzc);13 )运行结果pleaseinputnuma:1pleaseinputnumb:2pleaseinputnumc:3 123pressanykeytocontinueChar的程序:1 #include<stdio.h>2 #include<stdlib.h>3 intmain(void)4(5 charazbzc;6 printf(,pleaseinputnuma:nn);7 scanf(n%c,a);8 printf(,pleaseinputnumb:nn);9 scanf(%c"b);10 printf(,pleaseinputnumcn");11 scanf(',%c"zc);12 printf(',%c,%cr%c",a,b,c);)程序连续接收了三个字符,在C中enter键代表一个换行符,所以当输入完a的值'q'之后按下enter键,换行符立马被字符b接收了,然后程序再向下走,输入C的值'Wq结果就会按顺序显示azbzc的值,我们已经知道2二十'力='曰工='/7';所以结果就会显示两行。getchar()程序:1 #include<stdio.h>2 #include<stdlib.h>3 intmain(void)4(5 charazbzc;6 printf("pleaseinputnuma:nn);7 scanf(%ca);8 getchar();9 printf(',pleaseinputnumb:nn);10 scanf(1,%c,b);11 getchar();12 printf("pleaseinputnumc:n");13scanf(',%c"Ac);14printf(n%c,%c,%c"zazb,c);15)如果用数组来处理,每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中即可。数组是变量,有空间存储地址,可以存放数组元素,要显示20项数值,直接提取20项数据。编写程序:#include<stdio.h>intmain()inti;intf20=lzl;对最前面两个元素0和1赋初值1,Iofor(i=2;i<20;i+)f=fi-2+fi-1;先后求出f2-19的值for(i=0;i<20;i+)if(i%5=0)printf(nn,);printf(n%12d"zfi);控制每输出5个数后换行输出一个数printf(nn");return0;该程序只计算20个数,定义数组长度为20,对最前面两个元素f0和f1均指定初值为1,根据数列的特点,由前面两个元素的值可计算出第3个元素的值,即f2=f0÷fl;在循环中可以用以下语句依次计算出f2-f19的值。fi=fi-2+fi-l;if语句用来控制换行,每行输出5个数据。5定义和引用二维数组有的问题需要用二维数组来处理。例如,有3个小分队,每队有6名队员,要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组。如果建立一个数组pay,它应当是二维的,第一维用来表示第几分队,第二维用来表示第几个队员。例如用pay2;3表示2分队第3名队员的工资,它的值是1725o二维数组常称为矩阵(matrix)o把二维数组写成行(row)和列(column)的排列形可以有助于形象化地理解二维数组的逻辑结构。5.1 怎样定义二维数组怎样定义二维数组呢?其基本概念与方法和一维数组相似。如:floatpay36;以上定义了一个float型的二维数组,第1维有3个元素,第2维有6个元素。每一维的长度分别用一对方括号括起来。二维数组定义的一般形式为类型说明符数组名常量表达式常量表达式;例如:floata34lb510;定义a为3×4(3行4列)的数组,b为5X10(5行10列)的数组。注意,不能写成floata3,4Lb5,10;在一对方括号内写两个下标,错误C语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a看作一个一维数组,它有3个元素:a0.alla2每个元素又是一个包含4个元素的一维数组。aO.a00aola02a03al.al0allal2al3a2-a20a21a22a23可以把a0lalza2看作3个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于floata04,al4za24;此处把a0zalla2看作一维数组名。C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。假设数组a存放在从2000字节开始的一段内存单元中,一个元素占4个字节,前16个字节(20002015)存放序号为0的行中的4个元素,接着的16个字节(20162031)存放库号为1的行中的4个元素,余类推。注意:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。C语言还允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。如,定义三维数组的方法如下:floata234;多维数组元素在内存中的排列Jl质序为:第1维的下标变化最慢,最右边的下标变化最快。5.2 怎样引用二维数组的元素二维数组元素的表示形式为数组名下标下标如:a23表示a数组中序号为2的行中序号为3的列的元素。下标应是整型表达式,如a2-l2*2-lo不要写成a2z3或a2-1,2*2-1形式。数组元素可以出现在表达式中,也可以被赋值,如:b12=a232注意:在引用数组元素时,下标值应在已定义的数组大小的范围内。在这个问题上常出现金昔误。例如:inta34;a34=3;按以上的定义,数组a可用的行下标的范围为02,列下标的范围为03。定义a为3X4的二维数组不存在a34元素a34表示元素显然超过了数组的范围。注意:请读者严格区分在定义数组时用的a34和引用元素时的a34的区别前者用a4来定义数组的维数和各维的大小,后者a34中的3和4是数组元素下标值,a34代表行序号为3、列序号为4的元素(行序号和列序号均从O起算)。5.3 二维数组的初始化可以用初始化列表对二维数组初始化。(1)可以分行给二维数组赋初值。如:inta34=(1,2,3,4),(5,6,7,8),(9.10rll,12);这种赋初值方法上匕较直观,把第1个花括号内的数据给第1行的元素,第2个花括号内的教据赋给第2行的元素,即按行赋初值。(2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。如:inta34=l,2,3,4,5,6,7,8,9,10,lL12);效果与前相同。但以第(1)种方法为好,一行对一行,界限清楚。用第(2)种方法如果数据多,则会写成一大片,容易遗漏,不方便检查发现错误。(3)可以对部分元素赋初值。例如:inta34=lz5z9);它的作用是只对各行第1歹LI(即序号为0的列)的元素赋初值,其余元素值自动为Oo(4)也可以对各行中的某一元素赋初值。如:inta34=(l),(0z6),(0,0z11)这种方法对非0元素少时上匕较方便,不必将所有的0都写出来,只须输入少量数据,(5)也可以只对某几行元素赋初值:inta34=(l),(5r6);