数组字符串指针及其应ppt课件_第1页
数组字符串指针及其应ppt课件_第2页
数组字符串指针及其应ppt课件_第3页
数组字符串指针及其应ppt课件_第4页
数组字符串指针及其应ppt课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

1、第第6讲讲数组、字符串、指针及其运用数组、字符串、指针及其运用Part I周水庚2005年10月19日n数组的根本概念n一维数组(One-dimensional Array)n多维数组(Multi-dimensional Array)提要提要C言语中的复杂数听阐明言语中的复杂数听阐明n复杂数据是由假设干根本数据或其它复杂数据按一定的方法(规那么)构造而成的(也称 “导出类型)n言语包含的构造复杂数据类型的构造机制有数组、构造和结合。利用这几种构造手段,能在根本数据类型、指针等类型根底上,经过反复运用言语提供的构造手段,使程序能描画各种复杂的数据构造n阐明或定义复杂数据必需指出它的成分元素的类型

2、、成分个数和构造方法。对于复杂类型的变量来说,重点是访问它的元素的方法n数组的根本概念数组的根本概念n一维数组一维数组n多维数组多维数组提要提要数组的根本概念数组的根本概念n数组是由假设干同类元素组成的对象n数组的每个元素的数据类型一样,元素个数固定,其元素按顺序存放,每个元素对应一个序号称为下标,各元素按下标存取援用n数组元素的存储顺序与其下标相对应,数组元素的下标从0开场顺序编号数组概念阐明数组概念阐明n数组元素在数组中的下标是固定不变的,而数组元素是变量,其值是可以变化的。数组元素变量与一样类型的独立的变量一样运用n程序援用数组元素变量借助于数组定义时为元素变量隐含设定的下标n援用数组元

3、素变量所需的下标个数由数组的维数决议,数组有一维数组、二维数组或多维数组之分数组举例数组举例n一行正文可以表示成由字符组成的数组n char s120; /*字符数组*/n一个整数向量可以表示成由整数组成的数组n int intVector80; /*由80个整数组成的数组*/n一个矩阵就可以表示成由向量构成的数组n double matrix4050; /*40行X50列实数矩阵*/n学生成果表可表示成由学生成果单组成的数组n int score407; /* 40名学生课程成果,每个学生学7门课程 */n数组的根本概念n一维数组n多维数组提要提要一维数组定义一维数组定义n定义方式: 类型阐

4、明符 数组名常量表达式;n类型阐明符用来指明数组元素的类型,同一数组元素的类型一样n数组是一个变量,用标识符命名,数组名遵守标识符的命名规那么n方括号“是数组的标志,其中的常量表达式的值表示数组的元素个数,即数组的长度n常量表达式通常是整型常量、符号常量或 sizeof(类型名),以及由它们组成的常量表达式n言语商定,当数组名单独在程序中运用时,数组名可以代表为它分配的内存区域的开场地址,即数组中下标为0的元素的地址一维数组例如一维数组例如一维数组元素的援用一维数组元素的援用n援用方式: 数组名下标 n例如, int a5; n数组a的5个元素可分别用a0,a1,a2,a3,a4来援用n如n

5、a4 = a0 + a1 + a2 + a3;n a0 = ai+z; /* 假设 0 = i+z 5 */一维数组元素的援用例如一维数组元素的援用例如n设有定义: int x20, i; n顺序输入数组x的全部元素n printf(Enter data for array x.n);n for(i = 0; i 20; i+)n scanf(%d, &xi); n顺序输出x的全部元素n for(i = 0; i 20; i+)n printf(%dt, xi); 一维数组元素的援用例如一维数组元素的援用例如(续续)n设仍有定义: int x20, i;n分别统计数组x中大于、等于和小

6、于 0 的元素个数n great = equal = less = 0;n for(i = 0; i 0) great+;n else if (xi = 0) equal+;n else less+;一维数组定义及元素援用程序样例一维数组定义及元素援用程序样例 #include void main() int i, digits10; for(i = 0; i 10; +i) digitsi = i; for (i = 0; i 5; +i) printf(%3d, digits2*i); printf(n); for(i = 0; i 5; +i) printf(%3d, digits2*i

7、+1); printf(nnn); 程序运转结果程序运转结果 0 2 4 6 8 1 3 5 7 9数组初始化数组初始化n数组定义的初始化或数组初始化指的是数组定义同时给出元素初值的表述方式n数组初始化方式有n数组定义时,顺序列出数组全部元素的初值n只给数组的前面一部分元素设定初值n当对数组的全部元素都明确设定初值时,可以不指定数组元素的个数数组初始化例如数组初始化例如-1n数组定义时,顺序列出数组全部元素初值数组定义时,顺序列出数组全部元素初值n例如:例如: int d5 = 0, 1, 2, 3, 4;n将数组元素的初值依次写在一对花括弧内,将数组元素的初值依次写在一对花括弧内,有有n n

8、 d0=0;d1=1;d2=2;d3=3;d4=4数组初始化例如数组初始化例如-2n只给数组的前面一部分元素设定初值只给数组的前面一部分元素设定初值n例如:例如: int e5 = 0, 1, 2;n定义数组定义数组e有有5个整型元素,其中前个整型元素,其中前3个元个元素设定了初值,而后素设定了初值,而后2个元素未明确地设定个元素未明确地设定初值初值n系统商定,当一个数组的部分元素被设定系统商定,当一个数组的部分元素被设定初值后,对于元素为数值型的数组,那些初值后,对于元素为数值型的数组,那些未设定初值的元素自动被设定未设定初值的元素自动被设定0值。所以数值。所以数组组e的后的后2个元素的初值

9、为个元素的初值为0n但是,当定义数组时,如未对它的元素指但是,当定义数组时,如未对它的元素指定过初值,对于内部的部分数组,那么它定过初值,对于内部的部分数组,那么它的元素的值是不确定的的元素的值是不确定的数组初始化例如数组初始化例如-3n当对数组的全部元素都明确设定初值时,可以不当对数组的全部元素都明确设定初值时,可以不指定数组元素的个数指定数组元素的个数n例如:例如: int g = 5, 6, 7, 8, 9; n由花括号内的初值个数确定数组的元素个数由花括号内的初值个数确定数组的元素个数n假设提供的初值个数小于数组希望的元素个数时,假设提供的初值个数小于数组希望的元素个数时,那么方括号中

10、的数组元素个数不能省略那么方括号中的数组元素个数不能省略n例如例如: int b10 = 1,2,3,4,5n数组数组b有有10个元素个元素,前前5个如设定所示,后个如设定所示,后5个都为个都为0n留意:初值个数不允诉超越数组元素个数留意:初值个数不允诉超越数组元素个数n例如:例如:int c5 = 0, 1, 2, 3, 4, 5;是错误的代码;是错误的代码一维数组程序实例一维数组程序实例-1n用数组计算用数组计算Fibonacci数列数列1、1、2、3、5、8、的前的前30项值项值n程序实例分析程序实例分析nFibonacci数列有规律数列有规律nf0 = f1 = 1;nfk = fk-

11、2 + fk-1;(k = 2,3,4,)n利用数组存储利用数组存储Fibonacci数列的各项值,其数列的各项值,其中,数列的前中,数列的前2项可用初值为它设定项可用初值为它设定一维数组程序实例一维数组程序实例-1续续#include #define MAXN 30#define Aline 10void main() long fMAXN = 1L, 1L; int k; for(k = 2; k MAXN; k+) fk = fk-2 + fk-1; for(k = 0; k MAXN; k+) if(k%Aline = 0) /* 每行输出Aline个数 */ printf(“n);

12、printf(“%8ld, fk); printf(“n);一维数组程序实例一维数组程序实例-2n在数组中找值等于变量在数组中找值等于变量key值元素的下标值元素的下标n程序实例分析程序实例分析n在数组的前在数组的前n个元素中找值为个元素中找值为key的元素,的元素,有多种解法有多种解法n直观解法直观解法n设置哨兵法设置哨兵法n假设已顺序存放,那么用二分法假设已顺序存放,那么用二分法一维数组程序实例一维数组程序实例-2续续n在数组中找值等于变量在数组中找值等于变量key值元素的下标值元素的下标-直观解法直观解法n从数组的第一个元素开场,顺序查找至数组的末尾,从数组的第一个元素开场,顺序查找至数

13、组的末尾,假设存在值为假设存在值为key的元素,程序就终止查找过程;的元素,程序就终止查找过程;假设不存在值为假设不存在值为key的元素,的元素, 程序将找遍整个数组。程序将找遍整个数组。程序代码如下程序代码如下n for(i = 0; i n; i+)n if(key = ai) break; /*找到终止循环找到终止循环,假设假设找到那么找到那么in;否那么否那么i=n*/n查找过程也可用以下代码来描画查找过程也可用以下代码来描画n for(i=0;in&key!=ai;i+); /*找到终了找到终了循环循环,假设找到假设找到in;否那么否那么i=n*/n假定每个元素的查找时机均等

14、,那么采用上述查找假定每个元素的查找时机均等,那么采用上述查找方法,查找的平均次数方法,查找的平均次数v为:为:v = (1+2+3+n)/n = (n+1)/2n假设在数组中没有指定值的元素,那么需查找假设在数组中没有指定值的元素,那么需查找n次次一维数组程序实例一维数组程序实例-2续续n在数组中找值等于变量在数组中找值等于变量key值元素下标值元素下标-设置哨兵设置哨兵n先在数组第先在数组第n个元素的后面如数组定义时已预留个元素的后面如数组定义时已预留了空闲的元素,第了空闲的元素,第n+1元素位置放入要寻觅的值元素位置放入要寻觅的值设置了一个哨兵,然后再从第一个元素开场顺设置了一个哨兵,然

15、后再从第一个元素开场顺序寻觅,这能简化寻觅循环的控制条件序寻觅,这能简化寻觅循环的控制条件n an = key;n for(i = 0; key != ai; i+); /*假设找到假设找到in;否那么;否那么i=n*/n这种写法,数组需多用一个元素,但程序比前一种这种写法,数组需多用一个元素,但程序比前一种更简单更简单一维数组程序实例一维数组程序实例-2续续n在数组中找值等于变量在数组中找值等于变量key值元素下标值元素下标-二分法二分法n假定数组假定数组a的元素已按它们的值从小到大的顺序存的元素已按它们的值从小到大的顺序存放,那么二分法是更好的查找方法放,那么二分法是更好的查找方法n算法根

16、本思想是对恣意算法根本思想是对恣意ai到到aj(i am;下一轮的查找区间为;下一轮的查找区间为 m+1,jnkey am;下一轮的查找区间为;下一轮的查找区间为 i,m-1n当当 ji 时,区间时,区间i,j变为一个空区间,即表示在数变为一个空区间,即表示在数组组a中没有值为中没有值为key的元素。由于每轮查找后,使的元素。由于每轮查找后,使查找区间减半,查找区间减半, 因此称为二分法查找。初始查找因此称为二分法查找。初始查找区间为区间为i=0,j=n-1一维数组程序实例一维数组程序实例-2续续n在数组中找值等于变量在数组中找值等于变量key值元素下标值元素下标-二分法二分法(续续)n二分法

17、查找可用二分法查找可用C代码描画如下代码描画如下n i = 0 ; j = n-1 ; /* 设定初始查找设定初始查找区间区间 */n while(i am)n i = m+1;n elsen j = m-1;n n /* 找到时,找到时,i j */一维数组程序实例一维数组程序实例-3n从文件输入一批数据到数组,对数组的元素用冒泡从文件输入一批数据到数组,对数组的元素用冒泡法排序,然后输出法排序,然后输出n程序实例分析程序实例分析n设文件中的元素不超出过设文件中的元素不超出过10001000个,程序可先把它们个,程序可先把它们从文件输入到数组,然后对数组的元素进展排序从文件输入到数组,然后对

18、数组的元素进展排序n把数组元素按值的大小进展整理,数组元素值按从把数组元素按值的大小进展整理,数组元素值按从小到大小到大( (或从大到小或从大到小) )的顺序重新存放的过程称为数的顺序重新存放的过程称为数组排序组排序n冒泡法排序的思想是对数组作多次比较调整遍历,冒泡法排序的思想是对数组作多次比较调整遍历,每次遍历是对遍历范围内的相邻两个数作比较和调每次遍历是对遍历范围内的相邻两个数作比较和调整,将小的调到前面,大的调到后面整,将小的调到前面,大的调到后面( (设从小到大设从小到大排序排序) )一维数组程序实例一维数组程序实例-3(续续)n冒泡排序冒泡排序n设要排序数组设要排序数组a有有n个元素

19、,冒泡法排序共要作个元素,冒泡法排序共要作n-1次遍历次遍历n第一次遍历:从第一次遍历:从a0开场,依次对相邻两个元素进开场,依次对相邻两个元素进展比较调整。即展比较调整。即a0与与a1比较调整;比较调整;a1与与a2比较调整;比较调整;直至;直至an-2与与an-1比较调整,比较调整,每次比较调整使小的调到前面,大的调到后面。这每次比较调整使小的调到前面,大的调到后面。这次比较调整遍历共做了次比较调整遍历共做了n-1次,使值最大的元置于次,使值最大的元置于an-1n第二次遍历:再次从第二次遍历:再次从a0开场,依次对两个相邻元开场,依次对两个相邻元素作比较调整,直至素作比较调整,直至an-3

20、与与an-2的比较调整。的比较调整。这次遍历共做了这次遍历共做了n-2次比较调整,使次最大元置于次比较调整,使次最大元置于an-2n依次类推,直至第依次类推,直至第n-1次遍历,仅对次遍历,仅对a0和和a1作作比较调整。至此,完成对数组从小到大排序的要求比较调整。至此,完成对数组从小到大排序的要求一维数组程序实例一维数组程序实例-3(续续)n冒泡排序冒泡排序 - 例如例如n如有定义:如有定义: int a = 7,8,4,5,1;n对对a的的5个数的冒泡排序从小到大过程为个数的冒泡排序从小到大过程为n第一次遍历:首先第一次遍历:首先7与与8比较,与要求顺序一致,不比较,与要求顺序一致,不用对调

21、;第二次用对调;第二次8与与4比较,与要求顺序不一致,需比较,与要求顺序不一致,需对调;第三次是对调;第三次是8与与5的比较和对调;直至第四次的比较和对调;直至第四次8与与1的比较和对调。第一次遍历后,使的比较和对调。第一次遍历后,使a=7,4,5,1,8,a的最大数置于的最大数置于a4n第二次遍历:首先第二次遍历:首先7与与4比较,对调;第二次比较,对调;第二次7与与5比较,对调;直至第三次比较,对调;直至第三次7与与1的比较和对调。第二的比较和对调。第二次遍历后,次遍历后,a=4,5,1,7,8,a的次最大数置于的次最大数置于a3n第三次遍历:首先第三次遍历:首先4与与5比较,不用对调;第

22、二次比较,不用对调;第二次5与与1比较,对调。第三次遍历后,使比较,对调。第三次遍历后,使a=4,1,5,7,8,a原来的元素原来的元素5被置于被置于a2n第四次遍历是最后一次,只需作一次比较调整,第四次遍历是最后一次,只需作一次比较调整,4与与1比较,对调。最后使比较,对调。最后使a排好序,为排好序,为a=1,4,5,7,8例子:0 2 4 5 8 9第一轮第一轮一维数组程序实例一维数组程序实例-3(续续)n冒泡排序冒泡排序 - 例如例如n用言语描画上述排序过程如下用言语描画上述排序过程如下n for(i = 0; i n-1; i+) /* 控制控制n-1次比较次比较调整遍历调整遍历 */

23、n for(j=0;jaj+1) /* aj与与aj+1 交交换换 */n temp = aj;n aj = aj+1;n aj+1 = temp;n 一维数组程序实例一维数组程序实例-3(续续)n完好程序:完好程序:从文件输入从文件输入一批数据到一批数据到数组,对数数组,对数组的元素用组的元素用冒泡法排序,冒泡法排序,然后输出然后输出#include #define MAXN 1000FILE *fp; char fname40;int main() int i, n, j, temp, k; int x, aMAXN; printf(输入文件名。n); scanf(%s,fname); i

24、f (fp = fopen(fname, r) = NULL) printf(不能翻开文件%s。n, fname); return 0; n = 0;一维数组程序实例一维数组程序实例-3(续续) while (n MAXN & fscanf(fp, %d, &x) = 1) /* 当还能从文件读入数时,循环 */ an+ = x; fclose(fp); /* 对数组a的前n个元素采用冒泡排序算法排序 */ for(i = 0; i n-1; i+) for(j = 0; j aj+1) temp = aj; aj = aj+1; aj+1 = temp; n完好程序完好程序(

25、 (续续):):从文件输入一从文件输入一批数据到数组,批数据到数组,对数组的元素对数组的元素用冒泡法排序,用冒泡法排序,然后输出然后输出一维数组程序实例一维数组程序实例-3(续续)n完好程序完好程序( (续续):):从文件输入一从文件输入一批数据到数组,批数据到数组,对数组的元素对数组的元素用冒泡法排序,用冒泡法排序,然后输出然后输出for(k = 0, i = 0; i n; i+) if (k % 5 = 0) printf(“n); printf(%dt, ai); printf(nn); return 1;冒泡排序法的改良冒泡排序法的改良n在冒泡排序过程中,假设某次遍历未发生交换调整情

26、况,这时数组实践上已排好序。程序假设发现这种情况后,应提早终了排序过程n为此,程序引入一个起标志作用的变量n每次遍历前,预置该变量的值为0n当发生交换时,置该变量的值为1n一次遍历终了时,就检查该变量的值,假设其值为1,阐明发生过交换,继续下一次遍历;n如该变量的值为0,阐明未发生过交换,那么立刻终了排序循环冒泡排序法的改良冒泡排序法的改良(续续)n引入标志变量后相应的排序代码引入标志变量后相应的排序代码n for(i=0;i n-1;i+) /* 控制控制 n-1 次比较调整遍历次比较调整遍历 */n for(flg=j=0;j aj+1) n temp = aj; aj = aj+1;n

27、aj+1 = temp; flg = 1;n n if (flg = 0) break;n 冒泡排序法的改良冒泡排序法的改良(续续)n更好的改良:在冒泡排序过程中,假设某次遍历在某个位更好的改良:在冒泡排序过程中,假设某次遍历在某个位置置j发生最后一次交换,发生最后一次交换,j以后的位置都未发生交换,那么以后的位置都未发生交换,那么实践上实践上j以后位置的全部元素都是已排好序的以后位置的全部元素都是已排好序的n利用这个性质,后一次遍历的范围可立刻缩短至上一次遍利用这个性质,后一次遍历的范围可立刻缩短至上一次遍历的最后交换处历的最后交换处n程序为利用这个性质,引入每次遍历的上界变量程序为利用这个

28、性质,引入每次遍历的上界变量end,另引,另引入变量入变量k记录每次遍历的最后交换位置记录每次遍历的最后交换位置n为了思索到能够某次遍历时一次也不发生交换的情况,在为了思索到能够某次遍历时一次也不发生交换的情况,在每次遍历前时,预置变量每次遍历前时,预置变量k为为0。一次遍历终了后,将。一次遍历终了后,将k赋赋给给end,作为下一次遍历的上界。,作为下一次遍历的上界。n冒泡排序过程至冒泡排序过程至end为为0终了,终了,end的初值为的初值为n-1,表示第一,表示第一次遍历至最后一个元素次遍历至最后一个元素冒泡排序法的改良冒泡排序法的改良(续续)n更好的改良:按上述想法把冒泡排序代码改良如下更

29、好的改良:按上述想法把冒泡排序代码改良如下n end = n-1; /* end 用于记录本次遍用于记录本次遍历范围的上界历范围的上界 */n while (end 0) /* 审视范围非空时循环审视范围非空时循环 */n for(k = j = 0; j aj+1) n temp = aj; aj = aj+1;n aj+1 = temp;n k = j; /* 记录发生交换的位置记录发生交换的位置 */n n end = k;n 一维数组程序实例一维数组程序实例-4n输入输入n个整数,找出其中出现次数最多的整数,并输出其在个整数,找出其中出现次数最多的整数,并输出其在数组中最早出现的位置数

30、组中最早出现的位置n n #include n #define MAXN 1000n void main()n int i, n, tc, c, j, pos; int aMAXN;n printf(“Enter n ); scanf(“%d, &n); /* 输入参数输入参数n*/n for(i = 0; i n; i+) /* 输入数组数据输入数组数据*/n printf(Enter a%d , i);n scanf(%d, &ai);n 一维数组程序实例一维数组程序实例-4(续续)n for(c = i = 0; i n-1; i+) for(c = i = 0; i n

31、-1; i+) n for(tc = 1, j = i+1; j n; j+) / for(tc = 1, j = i+1; j c) / if (tc c) /* * 找到出现次数更多找到出现次数更多的数的数 * */ /n c = tc; pos = i; / c = tc; pos = i; /* * 记录当前记录当前找到的出现次数最多的数找到的出现次数最多的数 * */ /n n n printf(COUNT = %d VALUE = %dnnn, c, printf(COUNT = %d VALUE = %dnnn, c, apos);apos);n 一维数组程序实例一维数组程序实例

32、-5n输入输入n个整数存于数组个整数存于数组, 对数组作整理对数组作整理, 使其中小于使其中小于0的元的元素移到前面素移到前面,等于等于0的元素留在中间的元素留在中间, 大于大于0的元素移到后面的元素移到后面n程序实例分析程序实例分析n引入变量引入变量k、h,设在整理过程中,设在整理过程中,a0ak-1都小于都小于0,ah+1an-1都大于都大于0。n从从a0开场顺序调查,设当前正要调查开场顺序调查,设当前正要调查aj。那么有。那么有ak至至aj-1=0, aj至至ah还未调查过。对元素还未调查过。对元素aj有以下情况有以下情况naj 0 : aj与与ah交换,并且交换,并且h-;n初始时,初

33、始时,j = 0, k = 0, h = n-1;整理终了后满足;整理终了后满足: j h一维数组程序实例一维数组程序实例-5(续续)n续数组整理程序续数组整理程序n #include n #define MAXN 1000n void main()n int j, n, k, temp, h, m; int aMAXN;n printf(“Enter nn); scanf(“%d, &n); /* 输入数组中实践数据输入数组中实践数据*/n printf(Enter a0 - a%dn, n-1);n for(j = 0; j n; j+) scanf(%d, &aj);一维

34、数组程序实例一维数组程序实例-5(续续)n续数组整理程序续数组整理程序n j = k = 0; h = n-1;n while (j = h)n if (aj 0) temp=aj; aj=ak; ak=temp;n j+; k+;n n else if (aj = 0) j+;n else temp=aj; aj=ah; ah=temp; n h-;n n for(j = 0; j n; j+) printf(“%4d, aj);/* 输出结果输出结果*/n printf(nnn);n 一维数组程序实例一维数组程序实例-6n编一个程序,输入编一个程序,输入n个互不相等的整数存于数组,个互不相

35、等的整数存于数组,并输出。程序如发现输入的数据已输入过,那么要并输出。程序如发现输入的数据已输入过,那么要求重新输入求重新输入n #include n #define MAXN 1000n void main()n int i, n, k; int aMAXN;n printf(Enter n ); scanf(%d, &n);一维数组程序实例一维数组程序实例-6(续续)n续输入续输入n个互不相等的整数存于数组,并输出个互不相等的整数存于数组,并输出n i = 0;n while (i n) n printf(Enter a%d , i);n scanf(%d, &ai);n

36、for(k=0;ak!=ai;k+); /* 查能否查能否有反复有反复 */n if ( k i ) /* 假设反复假设反复 */n printf(Error, input again!n);n else i+ ; /* 对于不反复情况对于不反复情况 */n n for(i = 0; i n; i+) printf(%4d, ai);n printf(nnn);n 一维数组程序实例一维数组程序实例-7n按递增顺序生成集合按递增顺序生成集合M的前的前n个元素。个元素。n集合集合M定义如下定义如下n整数整数1属于属于Mn假设整数假设整数X属于属于M,那么整数,那么整数2x+1和和3x+1也属于也属

37、于Mn再没有别的整数属于再没有别的整数属于Mn程序实例分析程序实例分析n根据集合根据集合M的定义,前几个元素为的定义,前几个元素为 M=1,3,4,7,9,n为存储为存储M的元素设计一个足够大的整数组的元素设计一个足够大的整数组m,用,用j表表示集合示集合M中已生成的元素个数。按题意,首先将中已生成的元素个数。按题意,首先将1放入集合放入集合M中,然后按递增顺序用中,然后按递增顺序用M中的现有元素中的现有元素枚举出枚举出M的新元素的新元素一维数组程序实例一维数组程序实例-7(续续)n程序实例分析续n每个元素可以施行两种枚举方法。在按递增顺序枚举出M的新元素过程中,把M的元素分成以下四部分n已执

38、行过2x+1枚举操作的元素n已执行过3x+1枚举操作的元素n已被枚举生成,但还未执行过任何枚举操作n因还未被枚举出来,其值还未定义n引进辅助变量e2 和e3,分别用于指出m中下一个要执行2x+1枚举的元素的下标和要执行3x+1枚举的元素的下标。为了按递增顺序生成m的元素,下一个能够执行枚举操作的元素是me2和me3,选择哪一个由它们枚举出来的值更小来确定n另设j为m中已有元素个数一维数组程序实例一维数组程序实例-7(续续)n以下代码能描画m在第一次枚举之前的形状n m0 = j = 1; e2 = e3 = 0;n而一系列的枚举生成m的n个元素的代码描画如下n while (j = me2*2

39、+1) /* 对me2执行2x+1枚举 */n mj = me2+*2+1;n if (me3*3+1 = mj)n e3+; /* 当两个元素枚举值一样时,同时枚举 */n n else mj = me3+*3+1 ;n j+; n n数组的根本概念n一维数组n多维数组提要提要多维数组多维数组 例如例如二维数组二维数组a46a46三维数组三维数组a546a546行下标行下标 i;列下标;列下标 j页下标页下标 i; 行下标行下标 j; 列下标列下标 k多维数组定义多维数组定义n二维数组的定义方式为二维数组的定义方式为n类型阐明符类型阐明符 数组名数组名 常量表达式常量表达式常量表达式常量表达

40、式;n多维数组例如多维数组例如nfloat a23,b34; /* 两个二维数组两个二维数组 */nfloat c223; /* 一个三维数组一个三维数组 */n二维数组的元素的存放顺序是按行存放,即从数组二维数组的元素的存放顺序是按行存放,即从数组首地址开场,先顺序存放第一行元素,再存放第二首地址开场,先顺序存放第一行元素,再存放第二行元素行元素n例如,对于上面数组例如,对于上面数组a23,其元素在内存中的,其元素在内存中的存放顺序为:存放顺序为:na00、a01、a02、a10、a11、a12多维数组存放特点多维数组存放特点n一个多维数组的元素在内存中的存放顺序有这样的特点:第一维的下标变

41、化最慢,最右边的下标变化最快n例如,对于前面例子中的三维数组c223,其元素的存放顺序为nc000、c001、c002、c010、nc011、c012、c100、c101、nc102、c110、c111、c112。多维数组元素援用多维数组元素援用n援用二维数组元素的表示方式为援用二维数组元素的表示方式为n数组名数组名 下标下标下标下标 n在用下标援用数组的元素时,应该留意下标值的在用下标援用数组的元素时,应该留意下标值的有效性,应在已定义的对应维大小的范围内,即有效性,应在已定义的对应维大小的范围内,即大于等于大于等于0 0,和小于对应维的元素个数,和小于对应维的元素个数多维数组初始化多维数组

42、初始化n按行给二维数组的全部元素赋初值按行给二维数组的全部元素赋初值n int a123= 1, 2, 3,4, 5, 6;n按元素存储顺序给数组元素赋初值按元素存储顺序给数组元素赋初值n int a223 = 1, 2, 3, 4, 5, 6;n按行给数组的部分元素赋初值按行给数组的部分元素赋初值n int a323= 1, 2, 0, 5; /*其他均为其他均为 0*/n按元素存储顺序给前面部分元素赋初值按元素存储顺序给前面部分元素赋初值n int a423 = 1, 2, 3, 4; /*其他均为其他均为 0*/n按元素存储顺序,给数组部分或全部元素赋初值,并且不指定第一维按元素存储顺序

43、,给数组部分或全部元素赋初值,并且不指定第一维的元素个数的元素个数n int a53 = 1, 2, 3, 4, 5;/* 两行两行 */n用按行赋初值方法,对各行的部分或全部元素赋初值,并省略第一维用按行赋初值方法,对各行的部分或全部元素赋初值,并省略第一维的元素个数的元素个数n int a63 = 0, 2, ;/* 两行两行 */多维数组程序例如多维数组程序例如-0n二维数组元素按行输入和按行输出表示程序二维数组元素按行输入和按行输出表示程序n #include #include n void main() void main()n int a23, i, j; int a23, i,

44、j;n for(i=0; i 2; i+) / for(i=0; i 2; i+) /* * 二维数组元素二维数组元素按行输入按行输入 * */ /n for(j = 0; j 3; j+) for(j = 0; j 3; j+) n printf(Enter a%d%d , i, j); printf(Enter a%d%d , i, j); scanf(%d, &aij);scanf(%d, &aij);n n for(i=0; i 2; i+) / for(i=0; i 2; i+) /* * 二维数组元素二维数组元素按行输出按行输出 * */ /n for(j = 0;

45、 j 3; j+) for(j = 0; j 3; j+)n printf(%dt, aij); printf(%dt, aij);n printf(n); / printf(n); /* * 按行换行按行换行 * */ /n n 多维数组程序例如多维数组程序例如-1n有一个34的矩阵,求出其中值最大的那个元素及其所在的行号和列号#includevoid main()int i,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; r

46、ow=i; colum=j; printf(max=%d,row=%d,colum=%dn,max,row,colum); 输出结果为:输出结果为: max=10,row=2,colum=1多维数组程序例如多维数组程序例如-2n把某月的第几天转换成年的第几天把某月的第几天转换成年的第几天n程序实例分析程序实例分析n为确定一年中的第几天,需求一张每月的天为确定一年中的第几天,需求一张每月的天数表,该表给出每个月份的天数。数表,该表给出每个月份的天数。n由于二月份天数因闰年和非闰年有所不同,由于二月份天数因闰年和非闰年有所不同,为程序处置方便,把月份天数表组织成一个为程序处置方便,把月份天数表组织

47、成一个二维数组二维数组多维数组程序例如多维数组程序例如-2(续续)n续把某月的第几天转换成年的第几天续把某月的第几天转换成年的第几天n #include #include n int day_table12 = int day_table12 =n 31,28,31,30,31,30,31,31,30,31,30,31, 31,28,31,30,31,30,31,31,30,31,30,31,n 31,29,31,30,31,30,31,31,30,31,30,31; 31,29,31,30,31,30,31,31,30,31,30,31;n void main() void main()n

48、int year, month, day, leap, i; int year, month, day, leap, i;n printf(Input year, month, day.n); printf(Input year, month, day.n);n scanf(%d%d%d, &year, &month, &day); scanf(%d%d%d, &year, &month, &day);n leap=year%4=0 & year%100 | year%400=0; leap=year%4=0 & year%100

49、 | year%400=0;n for(i = 0; i month-1; i+) for(i = 0; i month-1; i+)n day += day_tableleapi; day += day_tableleapi;n printf(nThe days in year is %d.n, day); printf(nThe days in year is %d.n, day);n 多维数组程序例如多维数组程序例如-3n知年份与年中的第几天,计算该天是这年的哪一月知年份与年中的第几天,计算该天是这年的哪一月和哪一日和哪一日n #include #include n int day_ta

50、ble12 = int day_table12 =n 31,28,31,30,31,30,31,31,30,31,30,31,31,28,31,30,31,30,31,31,30,31,30,31,n 31,29,31,30,31,30,31,31,30,31,30,31;31,29,31,30,31,30,31,31,30,31,30,31;n char monthname10 = January, char monthname10 = January, February, March, April, May, June, February, March, April, May, June,

51、 July, August, September, Octorber, July, August, September, Octorber, November, December;November, December;多维数组程序例如多维数组程序例如-3(续续)n续知年份与年中的第几天,计算该天是这年的哪一月续知年份与年中的第几天,计算该天是这年的哪一月和哪一日和哪一日n void main()void main()n int year, day, leap, i; int year, day, leap, i;n printf(Input year, day of year.n); prin

52、tf(Input year, day of year.n);n scanf(%d%d, &year, &day); scanf(%d%d, &year, &day);n leap=year%4=0 & year%100 | year%400=0; leap=year%4=0 & year%100 | year%400=0;n for(i = 0; day day_tableleapi; i+) for(i = 0; day day_tableleapi; i+)n day -= day_tableleapi; day -= day_tablele

53、api;n printf(The month is %s,the Day is printf(The month is %s,the Day is %d.n,monthnamei, day);%d.n,monthnamei, day);n 多维数组程序例如多维数组程序例如-4n输入整数输入整数 n n ,输出以下方式的二维数组,输出以下方式的二维数组n 1 2 3 . n1 2 3 . nn n 1 2 . n-1 n 1 2 . n-1n n-1 n 1 . n-2 n-1 n 1 . n-2n . .n 2 3 4 . 1 2 3 4 . 1n注:上面问题有多种解法注:上面问题有多种解法多

54、维数组程序例如多维数组程序例如-4(续续)n解法解法1:先给出第:先给出第0行行, 然后利用然后利用i行与行与i-1行的关系行的关系,求出求出i行行n for(j = 0; j n ; j+) /* 先构成第先构成第0行行 */n a0j = j+1;n for(i = 1; i n; i+) n ai0=ai-1n-1; /* 生成生成i行的行的第第0列列 */n for(j = 1; j n; j+) /* 生成生成i行行的其他列的其他列 */n aij = ai-1j-1;n 多维数组程序例如多维数组程序例如-4(续续)n解法解法2:将:将i行的内容分成两部分行的内容分成两部分ni行内容

55、行内容: n-i+1 . n 1 . n-in for(i = 0; i n; i+) n k = 1;n for(j = i; j n; j+) /*右右上部分上部分*/n aij = k+;n for(j = 0; j i; j+) /*左左下部分下部分*/n aij = k+;n 多维数组程序例如多维数组程序例如-4(续续)n解法解法3:将方法:将方法2中的变量中的变量k去掉去掉, 直接代入算式直接代入算式n for(i = 0; i n; i+) n for(j = i; j n; j+) aij = j-i+1;n for(j = 0; j i; j+) aij = j-i+1+n;

56、n n解法解法4:将方法:将方法3中的两个中的两个j循环合并循环合并n for(i = 0; i n; i+)n for(j = 0; j n; j+)n aij = j i ? j-i+1+n : j-i+1 ;多维数组程序例如多维数组程序例如-4(续续)n解法解法5:将:将4中的条件表达式简化中的条件表达式简化n for(i = 0; i n; i+)n for(j = 0; j n; j+)n aij = (j - i + n) % n + 1;n解法解法6:先给出第:先给出第0行行,再由再由i行与行与0行的关系求出行的关系求出i行行n for(j = 0; j n; j+) a0j = j + 1;n for(i = 1; i n; i+) n for(j = 0; j n; j+)n

温馨提示

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

评论

0/150

提交评论