数组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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。