第6章利用数组处理批量数据_第1页
第6章利用数组处理批量数据_第2页
第6章利用数组处理批量数据_第3页
第6章利用数组处理批量数据_第4页
第6章利用数组处理批量数据_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、n一维数组的定义和引用一维数组的定义和引用n二维数组的定义和引用二维数组的定义和引用n字符数组字符数组第第6章章 数组数组u定义定义:把:把具有相同类型具有相同类型的若干变量按的若干变量按有序有序的形的形式组织起来。这些式组织起来。这些按序排列的同类数据元素的按序排列的同类数据元素的集合集合称为称为数组数组。u分类分类: 元素的类型:元素的类型:数值数值数组、数组、字符字符数组、数组、指针指针数组、数组、结构结构数组等;数组等; 维数:维数:一维一维数组、数组、二维二维数组、数组、数组数组一维数组的定义和引用一维数组的定义和引用u一维数组:一维数组: 类型说明符类型说明符 数组名数组名 常量表

2、达式常量表达式 ;u 常量常量表达式:元素的个数,即表达式:元素的个数,即数组长度数组长度。 例如:例如:int a10;int a10; 它表示数组名为它表示数组名为a a,此数组有此数组有1010个元素。个元素。下标从下标从0 0开始,开始,即即a0, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9a1, a2, a3, a4, a5, a6, a7, a8, a9。u注意注意:u数组长度是数组长度是固定固定的,不能是的,不能是变化变化的;的;u下标从下标从0 0开始;开始;u不能使用数组元素不能使用数组元素a10a10。u功能方面,数组中每个元素与普通变量等

3、价u数组元素引用:针对每个元素进行u输入:scanf(“%d”, &ai);u输出:printf(%d, ai);u注意:输入和输出数值型数组元素必须使用循环语句逐个输入输出各下标变量,而不能用一个语句输出整个数组。下面的写法是错误的: scanf(%d, a); printf(%d, a); 一维数组的定义和引用一维数组的定义和引用例:对数组a中10个元素分别赋值为0到9,并依次打印: #includestdio.h void main( ) int i,a10; for(i=0;i=9;i+) ai=i; for(i=0;i=9;i+) printf(%d ,ai); 012345

4、6789a0a0a1a1a2a2a3a3a4a4a5a5a6a6a7a7a8a8a9a9一维数组的定义和引用一维数组的定义和引用u初始化:定义数组时,初始化各元素的值(1) 对所有元素赋初值,如: int a10= 0,1,2,3,4,5,6,7,8,9 ;(2) 对部分元素赋初值,如: int a10= 0,1,2,3,4 ; (前5个元素赋初值,后5个元素值为0)(3) 若想使数组中元素值均为1,可写成 int a10= 1,1,1,1,1,1,1,1,1,1 ; 但不能写成:int a10=1*10;或 int a10=1 ;(4) 赋初值时,数组长度可省略,其长度值有初值的个数决定,如

5、: int a5=1,2,3,4,5; 可写为: int a =1,2,3,4,5;一维数组的初始化一维数组的初始化例:输入20个数,找出其中最大数,并输出。 #include int main( ) int i,max,a20; printf(input 20 numbers:n); for(i=0;i20;i+) scanf(“%d”,&ai); /*输入20个数*/ max=a0; /*先把第一个数作为最大数*/ for(i=1;imax) max=ai; /*max中存放当前最大数*/ printf(maxmum=%dn,max); return 0; 例:求Fibonacci

6、数列的前20项的值。 a1=a2=1an=an-1+an-2 #include int main( ) int a20= 1, 1 ; int j; for (j=2; j20; j+) aj = aj-1+aj-2; for (j=0; j20; j+) printf(%dt, aj); return 0;例:输入10个整数,按从小到大的顺序输出 #include int main( ) int i,j,temp,a10; printf(n input 10 numbers:n); for(i=0;i10;i+) scanf(“%d”,&ai); /*输入无序的10个数*/ for(

7、i=0;i9;i+) /*选择排序*/ for(j=i+1;jaj) temp=ai; ai=aj; aj=temp; for(i=0;i10;i+) /*输出有序的10个数*/ printf(%d,ai); return 0 改进的选择排序:#includeint main ( ) int i,j,t,p, a10; for (i=0; i10; i+) scanf (%d, &ai); /*输入无序的10个数*/ for ( i=0; i9; i+ ) /* 进行9次比较 */ p=i; /* p为排序过程中最小元素的下标 */ for (j=i+1; jaj) p = j; /*

8、 若有更小的数则记录下标 */ if ( p != i ) t=ap; ap=ai; ai=t; /* 一次交换到位 */ for (i=0; i10; i+)/* 输出排序后的结果 */ printf (%d , ai); return 0; 基本思想:将一堆无序的数据进行从小到大的排序,分若干次的排序,每一趟的排序都是将相邻两个数比较,将小的调到前头,即实现小的数“上升”,大的数“下沉”。且每趟“下沉”到最后的数即该趟比较的数据的最大的数。例如:9,8,5,4,2,0(共6个数据)第一趟:(共5次比较)冒泡排序冒泡排序第二趟:(共4次比较) 如此进行下去。可以推知,对6个数要比较5趟,才能

9、使6个数按大小顺序排列。在第一趟中要进行两个数之间的比较共5次,在第二趟中比4次第5趟比1次。如果有 n 个数,则要进行 n-1 趟比较。在第 1 趟比较中要进行n-1次两两比较,在第 j 趟比较中要进行 n-j 次两两比较。 冒泡排序冒泡排序 #include int main ( ) /* 冒泡排序 */ int i, j, t, a10; for (i=0; i10; i+) /* 输入10个整数 */ scanf (%d, &ai); for (i=0; i9; i+)/* 进行9趟比较 */ for (j=0; j aj+1 ) t=aj; aj=aj+1; aj+1=t;

10、for (i=0; i10; i+)/* 输出排序结果 */ printf(%d , ai); return 0; 冒泡冒泡排序排序 for(i=0;i9;i+)for(i=0;i9;i+) for(j=0;j9-i;j+) for(j=0;jaj+1) if(ajaj+1) t=aj; t=aj; aj=aj+1; aj=aj+1; aj+1=t; aj+1=t; 比较比较选择选择排序和排序和冒泡冒泡排序排序 选择选择排序排序for(i=0;i9;i+) for(i=0;i9;i+) for(j=i+1;j10;j+) for(j=i+1;jaj)if(aiaj) temp=ai;temp=

11、ai; ai=aj; ai=aj; aj=temp; aj=temp; 选择排序选择排序(从小到大):第一趟从(从小到大):第一趟从a0a0到到a9a9中找到中找到最小数最小数放在放在a0a0中,第二趟从中,第二趟从a1a1到到a9a9中找到次小数放在中找到次小数放在a1a1中,中,以此类推。以此类推。冒泡排序冒泡排序(从小到大):第一趟从(从小到大):第一趟从a0a0到到a9a9中找到中找到最大数最大数放在放在a9a9中,第二趟从中,第二趟从a0a0到到a8a8中找到次大数放在中找到次大数放在a8a8中,中,以此类推。以此类推。例:假设数组a的长度为10,要求输入a的所有元素,再输入一个整数

12、m,实现将a中后m个数字移到a的前面。 如:数组a中元素为:1 2 3 4 5 6 7 8 9 10,若m=4,则输出:7 8 9 10 1 2 3 4 5 6方法一:1) 1.9往后移动一位,将10放到最前面; 2) 10,1.,8往后移动一位,将9放到最前面; . 4) 将8,9,10,1.6往后移动一位,将7放到最前面;关键:m步循环,每次循环将数组中前9个元素往后移动一位,最后一位放到数组最前面。 例:假设数组a的长度为10,要求输入a的所有元素,再输入一个整数m,实现将a中后m个数字移到a的前面。 如:数组a中元素为:1 2 3 4 5 6 7 8 9 10,若m=4,则输出:7 8

13、 9 10 1 2 3 4 5 6方法二:1) 1.10个元素逆序存放; 2) 将前m个元素逆序存放; 3) 将剩余元素(10-m)个元素逆序存放;关键:使用逆序方式,只需3个循环,每次循环将数组中元素逆序存放即可。 #includeint main()int i, a10, t, m;printf(请输入数组:);for(i=0; i10; i+) scanf(%d, &ai);printf(请输入前置元素的个数:);scanf(%d, &m);/第一次全部逆序交换 for(i=0; i5; i+)t = ai; ai = a9-i;a9-i=t;/前m个元素逆序交换for(

14、i=0; im/2; i+)t = ai;ai = am-i-1;am-i-1=t; /剩余元素逆序交换for(i=m; i(10+m)/2; i+)t = ai;ai = am+9-i;am+9-i=t; /打印for(i=0; i10; i+) printf(%d , ai); return 0;例:假设数组a的长度为10,请输入a中的所有元素,再输入一个整数m,如果m在数组a中,则从a中删除m,并输出删除m后的数组a,如果m不在数组a中,提示“数据不存在!”。 如:数组a元素为:1 2 3 4 5 6 7 8 9 10。 若m=4,则输出: 1 2 3 5 6 7 8 9 10;若m=1

15、2,则输出“数据不存在!”;步骤:1) 使用循环,逐个判断数组a中元素是否与m相等,若相等则记录下标,并退出循环。 2) 循环结束后,判断该下标,如果下标10,则意味着a中存在m,此时删除m。具体做法:将下标后面的所有元素均往前移动一位,实现删除m的目的; 3) 若下标=10,表示没有a中找到m,输出“数据不存在!”;u二维数组定义: 类型说明符 数组名常量表达式1常量表达式2 例如:int a34; /* 不能写成 a3,4 */ 说明了一个三行四列的数组,数组名为a,其下标变量共有34个,即: a00, a01, a02, a03 a10, a11, a12, a13 a20, a21,

16、a22, a23u二维数组引用或访问 : 数组名下标1下标2 其中下标应为整型常量或整型表达式。 二维数组的初始化二维数组的初始化u初始化u全部元素:按行分段赋值,或按行连续赋值,如: int a33= 80,75,92,61,65,71,59,63,70 ; 或:int a33= 80,75,92,61,65,71,59,63,70 ;u部分元素:未赋初值的元素自动取0值。如: int a23 = 1, 4 ; int a33 = 1,2, , 4,5,6 ; u全部元素初始化时,可省略第一维的大小。例如: int a 3 = 1, 2, 3, 4, 5, 6; 注意:此时只能省略第1维的值

17、。C根据初始化数据的数量,自动确定第1维的大小。二维数组的初始化二维数组的初始化 二维数组中的元素在内存中的排列顺序是:按按行存放,即先顺序存放行存放,即先顺序存放第一行的元素,再存放第一行的元素,再存放第二行的元素第二行的元素 二维数组二维数组b00b01b02b10b11b12b20b21b22例如:例如:整型数组整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;123456789多维数组的定义,类似于二维数组。例如:三维数组:例如:三维数组: float a234;注意:注意:多维数组元素在内存中的多维数组元素在内存中的排列顺序排列顺序: a000a000a001a001a0

18、02a002a003a003 a010 a010a011a011a012a012a013a013 a020a020a021a021a022a022a023a023 a100 a100a101a101a102a102a103a103 a110 a110a111a111a112a112a113a113 a120 a120a121a121a122a122a123a123二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。根据这样的分析,一个二维数组也可以分解为多个一维数组。如二维数组a34,可分解为三个一维数组,其数组名分别为: a0 、a1、a2。这三

19、个一维数组都有4个元素,例如:一维数组a0的元素为a00,a01,a02,a03。 二维数组二维数组二维数组元素的表示形式为:二维数组元素的表示形式为:数组名下标下标数组名下标下标例如:例如: k = a23下标可以是下标可以是整型整型表达式或表达式或整型整型变量,如变量,如 k=a2-12*2-1; j = aii+5;注意:注意:1. 不要写成不要写成 a2,3,a2-1,2*2-1形式形式;2. 下标值应在已定义的数组大小的范围内。下标值应在已定义的数组大小的范围内。二维数组二维数组例:求矩阵A(23)的转置矩阵B(32)。 1 2 3 1 4 2 5 4 5 6 3 6 矩阵转置算法:

20、在原来矩阵中的元素aij,应是转置后矩阵中的元素bji。 #include int main( ) int i, j, b32, a23 = 1,2,3, 4,5,6 ; for (i=0; i=1; i+) for (j=0; j=2; j+) bji = aij; /* 进行数组转置 */ for (i=0; i=2; i+) for (j=0; j=1; j+) printf(%d , bij); printf(“n”); /* 输出完一行换行*/ 例:有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。#include int main() int i,

21、j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for(i=0;i=2;i+) for(j=0;jmax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum); return 0;u定义 char 数组名常量表达式;u初始化 char c10=c, ,p,r,o,g,r,a,m; 多余元素自动定为空字符(即0)n当省略数组长度,系统会自动根据初值个数确定数组长度。 char c=c, ,p,r,o,g,r,a,m;

22、(长度自动为9)字符数组字符数组u初始化用字符串的方式 char c=“I am happy”; 或 char c=I am happy; 等价于 char c= I , ,a,m, ,h,a,p,p,y,0 ; 定义的数组长度大于实际字符串长度时,多余的以0补。字符数组字符数组u字符数组的输入和输出 1)用循环语句逐个输入输出:用格式符“c” 输入: for(i=0; i10; i+) scanf(%c,&ai); 输出: for (i=0; i10; i+) printf(%c,ai); 2)整个字符串一次性输入输出:用格式符“s” 例如: scanf( %s,c ); print

23、f( %s,c );n注意:用“%s”格式符输出字符串时,scanf、printf函数中的输出项是字符数组名,而不是数组元素名。写成下面这样是不对的:printf(%s,c0);字符数组字符数组例:输出一个字符串例:输出一个字符串“I am a boy!”。 程序如下:程序如下:#include void main() char c10=I, ,a,m, ,a, , b, o, y, !; int i; for(i=0;i 字符串2,返回值 0; 字符串1 字符串2,返回值 0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。如:k=strcmp(“China”,“CHINA”);

24、 注意:对两个字符串比较,不能用以下形式: if(str1=str2) printf(“yes”);而只能用 if(strcmp(str1,str2)=0) printf(“yes”);字符串处理函数u6、测字符串长度函数strlen 格式: strlen(字符数组名) 功能:测字符串的实际长度(不含0) 并作为函数返回值。 如:char st=C language; k=strlen(st); u7、字符串大小写转换函数strlwr,strupr strlwr(str) 将字符串中大写字母换成小写字母 strupr(str) 将字符串中小写字母换成大写字母函数的返回值为字符串的首地址。字符串

25、处理函数例:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。#includevoid main() char string81, c; int i,num=0,word=0; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1; num+; printf(“There are %d words in the line.n”,num);0 x y . z #include int main( ) char str1100,str2100;int i, j;printf (”Enter string 1:”);gets (str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论