为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

数组

2012-05-23 50页 ppt 327KB 11阅读

用户头像

is_949523

暂无简介

举报
数组nullnull7.1 一维数组 7.2 二维数组 7.3 数组的应用 7.4 字符数组与字符串 7.5 数组作为函数的参数第七章 数组null1.数组的引入 在前面的程序设计中,所涉及和处理的数据都非常简单,对这些数据采用C语言的基本类型(整型、实型、字符型)来描述就行,但在实际应用中,需要处理的数据往往是复杂多样的。 问题:输入某班级110名学生的某门课程的成绩,按成绩从高分到低分排序,输出平均成绩及高于平均成绩的学生成绩。 如何编程呢? C语言提供了用户自定义数据的描述方法,即构造类型...
数组
nullnull7.1 一维数组 7.2 二维数组 7.3 数组的应用 7.4 字符数组与字符串 7.5 数组作为函数的参数第七章 数组null1.数组的引入 在前面的程序设计中,所涉及和处理的数据都非常简单,对这些数据采用C语言的基本类型(整型、实型、字符型)来描述就行,但在实际应用中,需要处理的数据往往是复杂多样的。 问题:输入某班级110名学生的某门课程的成绩,按成绩从高分到低分排序,输出平均成绩及高于平均成绩的学生成绩。 如何编程呢? C语言提供了用户自定义数据的描述方法,即构造类型:由若干基本类型数据按一定的规则构成复杂数据对象,如数组。数组的引入,使我们能较方便地解决上面的问题。null2.数组的概念 数组:具有相同类型的数据组成的序列。 数组中的每一个数据称数组元素:由其所在的位置序号(称数组元素的下标)来区分。 用数组名与下标可以用统一的方式来处理数组中的每一个元素, 从而方便的实现处理一批具有相同性质数据的 问题。 null7.1 一维数组 7.1.1 一维数组的定义 一维数组:只有一个下标的数组。 定义格式 : 存储类别 类型标识符 数组名[常量表达式]; 说明: 1.存储类别:说明数组的存储属性,即数组的作用域与生存期,可以是静态型(static),自动型(auto)及外部型(extern)。当使用auto型时可以省略。 2.类型标识符:数组元素的类型。 3.数组名的命名规则:与标识符的命名规则相同。 4.常量表达式:即数组长度,只能是一个整型常量表达式。可以是符号常量。null 例: int a[5]; 定义了一个自动型整型数组: 数组的元素为整型;数组名为a;元素个数为5; 下面是合法的一维数组定义: ① char str1[20],str2[10]; ②static float score[8]; ③ #define N 5  long data[N]; /* 定义一个有5个元素的长整型数组data */  int z[4*N]; /* 定义了一个有20个元素的整型数组z */ 其中③的数组长度使用的是符号常量 下面的定义是非法的: int n=10; char c[n]; /*数组长度不能使用变量 */ int person(10);7.1.2 数组元素的引用7.1.2 数组元素的引用 定义了数组以后,就可对其进行使用,但不能利用数组名来 整体引用一个数组,只能单个的使用数组元素。 数组元素的描述 : 由数组名加方括号中的下标组成,即: 数组名[下标] 下标:数组元素在数组中的顺序号。 下标的取值范围:从0到数组长度-1。 注意:( C语言不对下标越界作语法检查。)若有定义: int a[4]; 则数组a的元素分别为: a[0]、a[1]、a[2]、a[3] ;但a[4]不是。 每个元素都可作为一个整型变量来使用。 如: a[1]=5;a[3]=a[1]+4;a[’C’-’B’]=3;scanf(“%d”,&a[0]);null#include main() { int n,a[15]; for(n=0;n<15;n++) scanf(“%d”,&a[n]); printf(“\n”); for(n=14;n>=0;n--) printf(“%4d”,a[n]); } 输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  输出:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 根据数组的特点(利用下标来对其元素进行访问),往往使用循环语句来对数组进行处理,用循环控制变量作为数组下标,从而可以以统一的方式来访问数组元素。 例7.1 从键盘输入15个整数,再反序输出。 问:不用数组能否完成,如何实现?假设是1000个数据呢?注意: 1. 循环控制变量的初值、终值及控制条件。 2.不能整体输入/出数组 如:printf(“%d”,a); 学会如何对数组进行输入输出null7.1.3 一维数组的存储结构与初始化 1.一维数组的存储结构 数组变量在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放。数组名代表首地址(数组起始地址),每个元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存的地址,并可对数组元素进行随机存取。 数组元素地址=数组首地址+元素下标*sizeof(数组类型) 例 int a[5]; 设a的首地址为1000,数组a存储示意图如右图所示1006 a[3]的地址=1000+3×2=1006null 2. 一维数组的初始化 含义:在定义数组的同时,对数组各元素指定初值。 注意:用赋值语句或输入语句也可给数组元素指定初值。 初始化数组格式: 存储类别 类型标识符 数组名[常量表达式]={初值列表}; 说明: ①<初值列表>是用逗号分隔的数组元素的初始值(常量)。 ②<初值列表>中数值的类型应与<类型标识符>一致。null 若不对auto数组进行初始化,则其初值是不可知的。 若一个static数组未进行初始化,则对数值型数组元素,初值为0,而对字符型数组元素,初值为空字符‘\0’.对数组初始化的几种方法: ①在定义数组时,对全部数组元素赋予初值。 例:int a[5]={0,1,2,3,4}; ②在定义数组时,对部分数组元素赋予初值。 例:int a[5]={1,2}; 等价 a[0]=1,a[1]=2; 其它赋0 ③对全部数组元素赋初值时,可省数组长度,系统自动确定。 例:int a[ ]={1, 2,3,4} ;等价于 int a[4]={1,2,3,4};null例7.2 数组初始化与未初始化比较 #include main() {int i,a[5]={3,4,5},b[5]; printf(“\narray a is:”) for(i=0;i<5;i++) printf(“%6d”,a[i]); printf(“\narray b is:”) for(i=0;i<5;i++) printf(“%6d”,b[i]); }  运行结果: array a is:3 4 5 0 0 array b is:-32 1398 40 1170 454考虑数组b中值的含义例7.3 从键盘上输入5个数,输出最大、最小的元素以 及它们的下标例7.3 从键盘上输入5个数,输出最大、最小的元素以 及它们的下标#define N 5 #include main( ) { int i,j,k, max,min; int a[N]; for (i=0;ia[i]) { min=a[i];k=i;} } printf("max:a[%d]=%d,min:a[%d]=%d",j,max,k,min); } 若输入: 8 2 312 0 -10↙ 输出为: max:a[2]=312,min:a[4]=-10 null若一个一维数组,它的每一个元素亦是类型相同的一维数组时,便构成二维数组。 7.2.1 二维数组的定义 存储类别 类型标识符 数组名[行常量表达式][列常量表达式]; 例:float x[3][2]; 定义了一个3×2的数组b,即数组为3行2列,可存放6个实型数据。7.2 二维数组 ★可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。 例如,对x[3][2],可以把x看作是一个一维数组,它有3个元素:x[0]、x[1]、x[2],每个元素又是一个包含2个元素的一维数组,即把x[0]、x[1]、x[2]看作是3个一维数组的名字。null7.2.2 二维数组元素的引用1.二维数组元素的引用形式: 数组名[下标1][下标2] 下标1称第一维下标(或称行),下标2称第二维下标(或称列)。下标从0开始变化,其值的范围分别为(0~行常量表达式-1)与(0~列常量表达式-1)。二维数组的每一个元素都可以作一个变量来使用。 如: int a[3][2]; printf(“%d”,a[0][0]); scanf("%d",&a[1][1]);   a[1][0]+=a[0][0]+3*a[0][1];  例7.4 二维数组输入输出例7.4 二维数组输入输出main( ) {int a[2][3]; printf(”\nInput array a:”); for (j=0;j<2;j++) for (k=0;k<3;k++) scanf(“%d”, &a[j][k]); printf(”\nOutput array a:\n”); for (j=0;j<2;j++) { for (k=0;k<3;k++) printf(“%4d”,a[j][k]); printf(“\n”); /*输出一行后换行,再输出下一行*/ } }输入:Input array a:1 2 3 4 5 6↙ 输出:Output array a: 1 2 3 4 5 6 对二维数组的输入输出多使用二层循环结构来实现。外层循环处理各行,循环控制变量j作为数组元素的第一维下标;内层循环处理一行的各列元素,循环控制变量k作为元素的第二维下标。null 7.2.3 二维数组的存储结构 设有定义 int a[2][3]; float b[3][2]; 系统为数组在内存中分配一片连续的内存空间,将二维数组元素按行优先的顺序存储在所分配的内存区域。 数组a与b的各元素的存储顺序如右图所示 若有数组a[m][n]则元素 a[i][j]的地址为: a+(i×n+j)×元素字节数 null 7.2.4 二维数组的初始化 ① 分行给二维数组赋初值,每个花括号内的数据对应一行元素。 例:int a[2][3]={{1,2,3},{2,3,4}}; ② 将所有初值写在一个花括号内,顺序给各元素赋值。 例:int a[2][3]={1,2,3,2,3,4}; ③只对部分元素赋值,没有初值对应的元素赋0值或空字符(字符数组)。 例:int a[2][3]={{1,2},{4}}; ④给全部元素赋初值或分行初始化时,可不指定第一维大小,其大小系统可根据初值数目与列数(第二维)自动确定;但必须指定第二维的大小。 例:int a[][3]={1,2,3,4,5,6}; int a[][3]={{0},{0,5}};第一维的大小为多少?null 例7.5 用如下的3×3矩阵初始化数组a[3][3],求矩阵的转置矩阵。 1 2 3 1 4 7 4 5 6 2 5 8 7 8 9 3 6 9 转置矩阵:是将原矩阵元素按行列互换形成的矩阵 方法1:转置矩阵是将原矩阵元素按行列互换形成的。 1 2 3 1 4 7 4 5 6 2 5 8 7 8 9 3 6 9 方法2:沿主对角线将对称位置元素互换即可。null程序如下: #include main() {int j,k; int a[3][3]={1,2,3,4,5,6,7,8,9},b[3][3]; for (j=0;j<3;j++) for(k=0;k<3;k++) b[j][k]=a[k][j]; for(j=0;j<3;j++) { for(k=0;k<3;k++) printf(“%6d”,b[j][k]); printf(“\n”); } } 7.2.5 多维数组的定义与存储 7.2.5 多维数组的定义与存储 根据二维数组的定义,我们可以类推出多维数组的定义。 int a[2][3][2]; float c[2][3][2][2]; 在数组定义时,多维数组的维从左到右第一个[]称第一维,第二个[]称第二维,依此类推。多维数组元素的顺序仍由下标决定。下标的变化是先变最右边的,再依次变化左边的下标。 三维数组a的12个元素按左图方式存储: 第一页: 第二页:null1. 利用数组排序 例7.6 从键盘上输入10个整数,用选择法 将其按由小到大的顺序排列并输出基本思想: (1)从第0个位置到第9个位置中选择出最小的一个与第0个位置的数交换。 (2)从第1个位置到第9个位置中选择出最小的一个与第1个位置的数交换。 … (9) 从第8个位置到第9个位置中选择出最小的一个与第8个位置的数交换。7.3 数组的应用 null: 1.程序使用两重循环来实现排序。 2.外循环控制排序趟数。若数组有N个元素,则共进行N-1趟排序。第一趟,I=0;第二趟,I=1,···第N-1趟,I=N-2; 3.内循环完成在[ I,9]的区间内选择最小数。比较次数随趟数增大而减少。 4.在每一趟选择中,只要记住较小元素的位置,即下标,在内循结束后做一次交换,这样可大大节省程序运行时间。排序过程如下:排序过程如下: 5 13 3 9 32 22 8 1 23 21 ① 1 13 3 9 32 22 8 5 23 21 ② 1 3 13 9 32 22 8 5 23 21 ③ 1 3 5 9 32 22 8 13 23 21 ④ 1 3 5 8 32 22 9 13 23 21 ⑤ 1 3 5 8 9 22 32 13 23 21 ⑥ 1 3 5 8 9 13 32 22 23 21 ⑦ 1 3 5 8 9 13 21 22 23 32 ⑧ 1 3 5 8 9 13 21 22 23 32 ⑨ 1 3 5 8 9 13 21 22 23 32 null#include main() {int I,j,k,a[10]; for(I=0;I<10;I++) scanf(“%d”,&a[I]); for(I=0;I<9;I++) {k=I; for(j=I+1;j<10;j++) if(a[k]>a[j]) k=j; if(k!=I){t=a[I];a[I]=a[k];a[k]=t;} } printf(“\n”); for(I=0;I<10;I++) printf(“%6d”,a[I]); } 内循环外循环K是最小元素之下标2.利用数组进行数据查找--折半查找法介绍2.利用数组进行数据查找--折半查找法介绍适应情况:在一批有序 数据中查找某数 基本思想:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据中元素的有序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,从而较快地找到目的数。 null查找过程: 设待找数组为a,数据的个数为num,被查找范围的头为low,尾为high,中间位置为 mid。初始时,low=1,high=num。n为所要查找的值,根据折半查找的思想,其查找过程如下: (1)mid=(low+high)/2,取整。 (2)若n=a[mid],查找成功,否则: 若na[mid], 则low=mid+1,重复(1); 直到成功或不成功(此时low>high)。 null例7.7 假设数组a中的数据按由小到大顺序排列 -121 -21 -5 1 34 46 50 90 123 200 现利用折半查找方法查找50是否在其中。 (1)第一次查找:lowhighmid查找结果:由于50>34,因此查找范围在后半部分,修改low=mid+1=6,high不变,mid=(6+10)/2=8位置: 1 2 3 4 5 6 7 8 9 10 数据:-121 -21 -5 1 34 46 50 90 123 200例题讲解:null(2)第二次查找:lowhighmid查找结果:由于50<90,因此查找范围在前半部分,修改high=mid-1=7,low不变,mid=(6+7)/2=6位置: 1 2 3 4 5 6 7 8 9 10 数据:-121 -21 -5 1 34 46 50 90 123 200null(3)第三次查找:lowhighmid查找结果:由于50>46,因此查找范围在后半部分,修改low=mid+1=7,high不变,mid=(7+7)/2=7位置: 1 2 3 4 5 6 7 8 9 10 数据:-121 -21 -5 1 34 46 50 90 123 200null(4)第四次查找:highlow查找结果:由于50=50,因此查找成功,50在 mid位置,即其位置号为7mid位置: 1 2 3 4 5 6 7 8 9 10 数据:-121 -21 -5 1 34 46 50 90 123 200null程序描述:#define M 10 main() {int a[M+1]; int n,j,place; printf(“\nPlease input array of a:”); for(j=1;j<=M;j++) scanf(“%d”,&a[j]); printf("Input a number to be searched:"); scanf("%d",&n); place=find(a,n) if(place!=0) printf("%d is placed %d",n,place); else printf("There is not %d",n); }nullint find(int a[],int n) { int low,mid,high; low=1; high=M; /*置区间初值*/ while(low<=high) { mid=(low+high)/2;/*求中点*/ if (n==a[mid]) /*已查到*/ return mid; /*查找成功,返回找到元素的位置*/ else if (n>a[mid]) low=mid+1; /*在后半区间查找*/ else high=mid-1;/*在前半区间查找*/ } return 0; /*查找不成功,返回0标记*/ }输入:50↙ 输出:50 is placed 6输入:40↙ 输出:There is not 407.4 字符数组与字符串7.4 字符数组与字符串7.4.1 字符数组的定义与初始化 1. 字符数组的定义 字符数组:其元素类型为字符类型的数组,其定义与前面介 绍的数组定义相同。 例如: char str[40]; 定义一个有40个元素的字符数组,每个元素相当于一个字符变量。 char ch[5][30];2. 字符数组的初始化 char ch1[]={‘a’,’b’,’c’,’d’}; char ch2[6]={‘a’,’b’}; char ch3[10]={‘\0’}; 7.4.2 字符串的概念及存储7.4.2 字符串的概念及存储1.字符串及其相关概念 字符串: 若干有效字符的序列; 可包含转义字符、ASCⅡ码表中的字符; 形式为: 用双引号括起来的字符序列; 例:"I am a student." , "Hello "      "a[5]= ", "%f\n"。 字符串的长度:字符串中所包含的字符的个数。 空串:没有一个字符的串。 空格串:包含一个或多个空格的串 字符串的结束标志:‘\0’。 注:C语言无字符串类型,字符串是存放在字符数组中的。 null2. 可以用字符串来直接初始化字符数组 直接把字符串写在花括号中来初始化字符数组. 如:char ch[9]={“student”}; 花括号可以省略 几点说明: (1)字符串结束标志'\0'仅用于判断字符串是否结束,输出字符串时不会输出。 (2)在对有确定大小的字符数组用字符串初始化时,数组长度应大于字符串长度。如: char s[7]={"student"};是错误的. (3)如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于,其余的元素自动赋初值为空字符(‘\0’) ( 4 )不能直接将字符串赋值给字符数组。下面的操作是错误的。 s=”student”; 系统将双撇号括起来的字符依次赋给字符数组的各个元 素, 并自动在末尾补上字符串结束标志字符'\0'。7.4.3 字符串的输入输出7.4.3 字符串的输入输出1.字符串的输出方法 (1)用printf函数 用printf输出字符串时,要用格式符“%s”,输出时输出项表中对应的应是所要输出的字符串的起始地址,从该起始地址所对应的字符开始逐个字符输出,直到遇到第一个‘\0’为止。 例: char st[15]=“I am a boy!” printf(“%s\n%s%c”,st,&st[7],st[7]); 输出结果: I am a boy! boy!b 注意:若用%s的格式输出字符串,输出项表中对应的应是 所要输出的字符串的起始地址,或字符串常量。例7.8 字符串输出示例例7.8 字符串输出示例#include main() { char str[20]={”How do you do ?”}; int k; printf(“%s”,str); /*输出str中的字符串*/ for (k=0;str[k]!=’\0’;k++) printf(“%c”,str[k]); } /*一个一个地输出字符*/ 输出结果为:How do you do ?How do you do ? 用格式符“%s”输出时,输出项表中对应的应是所要输出的字符串的起始地址,从该起始地址所对应的字符开始逐个字符输出,直到遇到第一个‘\0’为止。 使用”%c”格式时,用循环实现每个元素的输出。(2)用puts函数输出字符串(2)用puts函数输出字符串调用格式:puts(str); 函数功能:将字符串str输出。str应是所要输出字符串的起始地址,或字符串常量。从该地址所对应的字符开始逐个字符输出,直到遇到第一个‘\0’为止,同时将‘\0’转换成换行符。因此,用puts()输出一行,不必另加换行符'\n'。 例:char ch[]="student"; puts(ch); puts(&ch[3]);puts("Hello"); 函数puts每次只能输出一个字符串,而printf可以输出几个:printf("%s%s",str1,str2);输出结果为: student dent Hellonull 2. 字符串的输入 (1)使用scanf函数输入字符串 例:char st[15]; scanf(“%s”,st); /*把所输入的字符串读到以st为起始地 址的、连续的内存单元中。*/ 但:scanf(“%s”,&st)是错误的,因为st就代表了该字 符数组的首地址。 注:输入时,以回车或空格作为结束标志; 即:用scanf输入的字符串中不能含有空格。若按如下方法输入: How do you do?↙ 执行语句 : scanf("%s",st) ; 则st的为: How\0 使用格式字符串"%s"时会自动加上结束标志'\0'。第一个空格后的字符没有输入st中。(2)使用函数gets()输入字符(2)使用函数gets()输入字符调用格式: gets(str); 函数功能:从键盘读入一个字符串到以str为起始地址的、连续的内存单元中,并自动在末尾加字符串结束标志符’\0’。 输入字符串时以回车结束输入,这种方式可以读入含空格符的字符串如: char s[14]; gets(s); 若输入的字符串为: How do you do?↙ 则s 的内容为: How do you do?\0例7.9 字符串输入输出示例例7.9 字符串输入输出示例#include main() {char s[20],s1[20]; scanf(“%s”,s); printf(“%s\n”,s); scanf(“%s%s”,s,s1); printf(“s=%s,s1=%s”,s,s1); puts(“\n”); gets(s); puts(s); }程序运行过程: How do you do?↙ How s=do,s1=you □do?7.4.4 字符串处理函数7.4.4 字符串处理函数 C语言库函数中除了前面用到的库函数gets()与puts() 之外,还提供了一些常用的库函数,其函数在string.h中 字符串拷贝函数:strcpy() 调用格式:strcpy(d_str,s_str); 功 能:将以s_str为起始地址的字符串或字符串常量(连同 ‘\0’)复制到以d_str为起始地址的、连续的内存中。 说 明:d_str在内存中所占的字节数应不小于s_str在内存 中所占的字节数。 例: char s1[10],s2[8]=“student”,s3[6]; strcpy(s1,s2); strcpy(s3,"okey"); 将s2中的“student”赋给s1(连同结束标志‘\0’), s2的值不变,"okey"赋给s3;注意:不能直接使用赋值语句来实现拷贝或赋值。 如: s1=s2; s1=“student”;都是不允许的null2.字符串连接函数strcat() 调用格式:strcat(d_str,s_str); 功能:将s_str连同‘\0’连接到d_str的最后一个字符(非‘\0’字符)后面。结果放在d_str中。 例: char s1[14]=“I am a ”; char s2[5]=“boy.”; strcat(s1,s2); 连接前:s1: s2: 连接后:s1 null 3.字符串比较函数strcmp() 调用格式:strcmp(str1,str2); 功能:若str1=str2,则函数返回值为0; 若str1>str2,则函数返回值为正整数; 若str1检测
程序 例7.10 简单密码检测程序 #include "stdio.h“ #include “conio.h” main() { char pass_str[80];int i=0; while(1) { clrscr(); printf(“please input password:\n"); gets(pass_str); if(strcmp(pass_str,“password”)!=0) printf(“password is wrong,press any key"); else break; getch(); i++; if(i==3) exit(0); } } 7.5 数组作为函数的参数7.5 数组作为函数的参数数组作为函数参数主要有两种情况: 数组元素作为函数的实参:这种情况与普通变量作实参一样,是将数组元素的值传给形参。形参的变化不会影响实参数组元素,我们称这种参数传递方式为“值传递”。 数组名作实参:要求函数形参是相同类型的数组或指针,这种方式是把实参数组的起始地址传给形参数组,形参数组的改变也是对实参数组的改变,称这种参数传递方式为“地址传递”。null1.数组元素做函数实参 数组元素作为函数实参与简单变量相同,是将元素的值传给函数形参,是单向值传递;函数形参使用简单变量。 例7.11 从键盘上输入两个字符串,不用字符串函数strcmp()比较两者的大小 分析: (1)输入两个字符串,分别存放在str1与str2中; (2)设计函数compstr()比较两字符,返回ASCII 码之差,赋给主函数的变量flag; (3)用do……while循环依次比较两个字符串的对应字符,结束的条件是两字符串至少有一个结束,或者比较字符不相等。 (4)当循环结束时flag 的值为0或为第一个不相等的字符的ASCII码值之差,由此可以判断出字符串的大小 。null程序如下:#include main( ) {int i,flag; char str1[80],str2[80]; gets(str1); gets(str2); i=0; do {flag=compstr(str1[i],str2[i]);/*数组元素作实参*/ i++; }while((str1[i-1]!='\0')&&(str2[i-1]!='\0')&&(flag==0)); /*只要有一个字符串到了末尾或遇到第一对不相等字符时,比较就结束*/ null if (flag==0) printf("%s = %s",str1,str2); else if (flag>0) printf("%s > %s",str1,str2); else printf("%s < %s",str1,str2); } int compstr (char c1, char c2) { int t; t=c1-c2; return t; }输入:very well↙ very good↙ 输出:very well>very goodnull2、数组名作函数参数 数组名作函数参数时形参与实参都应使用数组名,且分别在被调用函数与主调函数中进行说明。 实参与形参类型要一致。 实参数组与形参数组大小可以不一致,形参数组可不指定大小。 C编译程序不检查形参数组的大小。 (1)在一维形参数组名后面可只跟一对空方括号。 为在被调用函数中处理数组元素的需要,可另设一参数来传递数组元素个数。如: int lenstr(char str1[],int k);/*k为要处理的字符数*/ (2)对多维数组而言,形参的第一维可不指定,但其它维必须指定。如: char grade(float score[][4],int k);k为数组行数null数组名做函数参数时是把实参数组的起始地址传给了形参数组,即:形参数组与实参数组对应同一段内存单元。 利用这个特点,可用数组返回多个已经改变了的值。例7.12 用冒泡法将10个数按由小到大排序 冒泡法的基本思想:相邻两数比较,若前面数大,则两数交换位置,直至最后一个元素被处理,最大的元素就“沉”到最下面,即在最后一个元素位置。这样,如有n个元素,共进行n-1轮(趟),每轮(趟)让剩余元素中最大的元素“沉”到下面,从而完成排序。 事实上, n-1轮是最多的排序轮数,只要在某一轮排序中没有进行元素交换,说明已排好序,可以提前退出外循环,结束排序。null第一次5和13比较后结果: ①5 13 3 9 32 22 8 1 23 21 第二次13和3比较后结果: ②5 3 13 9 32 22 8 1 23 21 第三次13和9比较后结果: ③ 5 3 9 13 32 22 8 1 23 21 第四次13和32比较后结果: ④5 3 9 13 32 22 8 1 23 21 第五次32和22比较后结果: ⑤5 3 9 13 22 32 8 1 23 21 第六次32和8比较后结果: ⑥5 3 9 13 22 8 32 1 23 21 第七次32和1比较后结果: ⑦5 3 9 13 22 8 1 32 23 21 第八次32和23比较后结果: ⑧ 5 3 9 13 22 8 1 23 32 21 第九次32和21比较后结果: ⑨5 3 9 13 22 8 1 23 21 32 输入数据: 5 13 3 9 32 22 8 1 23 21 第一轮排序过程如下:null程序如下:#include #define N 80 main() {int a[N]; int i, m; void sort(int b[],int k); void print(int b[],int k); printf("\nInput m(<80):"); scanf("%d",&m); /*输入要排序的元素的个数*/ for (i=0;ib[i+1]) { t=b[i]; /*相邻元素交换位置*/ b[i]=b[i+1]; b[i+1]=t; flag=1; /*有元素交换,标志置1*/ } if (flag==0) break; /*没有交换元素,结束循环*/ } }null void print(int b[],int k) { int i; for (i=0;i
/
本文档为【数组】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索