第七章 数 组
第七章 数 组
7.1 一维数组
7.2 二维数组
7.3 字符数组
7.4 程序举例
第七章 数 组
7.1 一 维 数 组
7.1.1 一维数组的定义和引用
类型标识符 数组名[常量表达式];
例如, int a[10];
第七章 数 组
在定义数组时, 需要注意的是:
? 同变量一样, 数组也必须先定义, 后使用 。
? 定义内容,·数组名 ( 同变量名:字母, 下划线, 数字;
字母或下划线开头;长度 ≤ 32)
? 数组名后用方括号括起常量表达式,不能用圆括号,所以
写成 int a(10);是错误的,应该写成 int a[10];
? 常量表达式表示元素的个数,即数组长度,例如在 a[5]
中,5表示该数组有 5个元素,下标从 0开始,这 5个元素是
a[0],a[1],a[2],a[3],a[4].注意不能使用数组元素 a[5].
? 相同类型的数组或变量可以在一个类型说明符下一起说
明,互相之间用逗号隔开,例如,int a[ 5],b[10],i;
? 数组元素只能逐个引用而不能一次引用整个数组
第七章 数 组
? 常量表达式:常量或符号常量, 其值必须为正, 不能为变
量, 例如,
1) 表示数组长度的常量表达式, 必须是正的整型常量表达式
2) C语言不允许定义动态数组, 即数组的长度不能依赖于程
序运行过程中变化着的量, 下面这种数组定义方式是不允许的 。
int i;
scanf("%d",&i);
int a[ i] ;
a) 常量表达式为常量, int a[10];
b) 常量表达式为符号常量,
#define N 10
int a[N];
第七章 数 组
例 7.1 输入 5个学生某门课的成绩, 要求按与输入次序相
反的顺序输出 。
main()
{float s1,s2,s3,s4,s5;
printf("Enter five scores,");
scanf("%f,%f,%f,%f,%f",&s1,&s2,&s3,&s4,&s5);
printf("\nThe score in reverse order are,");
printf("%f\n",s5);
printf("%f\n",s4);
printf("%f\n",s3);
printf("%f\n",s2);
printf("%f\n",s1);
}
第七章 数 组
例 7.2 用数组实现例 7.1。
main()
{ int i;
float score[ 5] ;
printf("Enter five scores,");
for (i=0; i<5; i++)
scanf("%f",&score[ i] );
printf("\nThe scores in reverse order are,");
for (i=4; i>=0; i--)
printf("%4.2f\n",score[ i] );
}
第七章 数 组
7.1.2
可以在程序运行后用赋值语句或输入语句使数组中的元素
得到值, 也可以使数组在程序运行之前 ( 即编译阶段 ) 就得到
初值, 后者称为数组的初始化 。
对数组元素的初始化可以用以下方法实现,
1,在定义数组时对数组元素赋以初值, 如:
int s[ 5] ={78,87,77,91,60};
2,也可以只给一部分元素赋值 。 例如:
int s[ 5] ={78,87,77};
其结果是,s[ 0] =78,s[ 1] =87,s[ 2] =77,s[ 3] =0,
s[ 4] =0,即花括号内的值只赋给了数组的前几个元素, 后
几个元素的值为 0。
第七章 数 组
3,如果想使一个数组中全部元素值为 0,可写成,
int s[5]={0,0,0,0,0}; 或 int s[5]={0};
不能写成, int s[5]={0*10}; (不能给数组整体赋初值 )
4,若对全部数组元素赋初值时,可以不指定数组长度。例
如, int s[ 5] ={1,2,3,4,5}; 可以写成,
int s[ ] ={1,2,3,4,5}; (系统自动定义数组长度为 5)
但若被定义的数组长度与提供的初值的个数不等,则数组
长度不能省略, 如想定义数组长度为 10,而初值只有 5个,
则数组长度不能省略,必须写成,int a[10]={1,2,3,4,5};
第七章 数 组
5,一维数组元素是按下标递增的顺序连续存放的,即数
组占有连续的存贮空间。如 s数组在内存中的存贮示意
如图 6.1所示。
S[0] S[1] S[2] S[3] S[4]
图 7.1 s数组存贮示意图
第七章 数 组
例 7.3 用数组来处理求 Fibonacci数列问题 P124
main()
{
int i,f [20]={1,1};
for (i=2; i<20; i++)
f [i]=f [i –2] + f [i – 1];
for (i=0; i<20; i++)
{
if ( i %5 = =0 )
printf(―\n");
printf(―%12d‖,f [i] );
}
}
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
规律,下一项是前两项之和
第七章 数 组
常用排序算法之 ------起泡法(冒泡法 /气泡法) P124
有 n个杂乱无序的数,要求将这 n个数从小到大(或从大到小)
排序后输出。 这种排序方法之所以叫, 冒泡法,,是因为在排序
过程中,较小的数像气泡一样逐渐往前冒(向上冒),大的数逐
渐
向后沉,最终完成排序。
例 7.4 用起泡法对 5个数排序 (由小到大 )
第
1
次
第
2
次
第
3
次
第
4
次
结
果
第
1
次
第
2
次
第
3
次
结
果
? 共需进行 n-1
=4轮 ;
? 每一轮从第 1个
开始,两两比
较,大者交换
到后面 ;
? 第 i轮从第 1个
比到第 n-i个,要
进行 n-i次两两
比较。
9 8 8 8 8 8 5 5 5
8 9 5 5 5 5 8 4 4
5 5 9 4 4 4 4 8 2
4 4 4 9 2 2 2 2 8
2 2 2 2 9
第
二
轮
第
一
轮
第七章 数 组
#define N 5
main()
{
int i,j,t,a[N+1];
printf(“请输入 5个数,”);
for (i=1;i<=N;i++)
scanf("%d",&a[i]);
for (i=1;i<=N-1;i++)
for (j=1;j<=N-i;j++)
if (a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for (i=1;i<=N;i++)
printf("%d,a[i]);
}
程
序
如
右
为什么定义数组长度为 6?
当 int a[6]; 则 a数组有
a[0],a[1],a[2],a[3],a[4],a[5]
这 6个元素,因为本例中为了
符合人们的习惯,对 a[0]不用,
只用 a[1]到 a[5].
第七章 数 组
② 选择法
? 从算法优化的角度对“冒泡法”进行改
进。
? 冒泡法每一轮都要将数组中的数两两比
较,并根据大小交换之 —— 效率低。
? 选择法改进处:两两比较后并不马上交
换,而是找到最小数后记下其下标。在
一轮比较完毕后,再将最小的数一次交
换到位。 —— 比较次数不变,交换次数
减少。
第七章 数 组
程序如下,从左到右依次从小到大排放
#define N 6
main()
{
int i,j,t,p,a[N] ={0,5,10,-7,3,7};
for (i=0;i<N-1;i++)
{ p=i;
for (j=i+1;j<N;j++)
if (a[p]>a[j]) p=j;
if(p!=i)
{ t=a[p];a[p]=a[i]; a[i]=t; }
}
for (i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
第七章 数 组
7.2 二 维 数 组
7.2.1 二维数组的定义和引用
类型标识符 数组名[常量表达式][常量表达式] ;
例如,int a[3][2];
表示数组 a是一个 3× 2( 3行 2列)的数组,共有 6个元素,
每个元素都是 int型。
第七章 数 组
二维数组的应用之一是矩阵和行列式 。 其中, 左起
第一个下标表示行数, 第二个下标表示列数 。 我们也可以把
二维数组看成是一种特殊的一维数组:它的元素又是一个一
维数组 。 例如, 可将以上的 a数组看成是一个一维数组, 它
有 3个元素, 分别是 a[ 0], a[ 1], a[ 2], 每个元素又
是一个包含 2个元素的一维数组, 如图 6.2所示, 因此可以
把 a[ 0], a[ 1], a[ 2] 看作是三个一维数组的名字 。 上
面定义的二维数组就可理解为定义了三个一维数组, 即相当
于
图 7.2 二维数组 a[ 3][ 2]
第七章 数 组
图 7.3 数组元素的排列方式
C语言中,二维数组中元素排列的顺序是,按
行存放,即在内存中先顺序存放第一行的元
素,再存第二行的元素,
第七章 数 组
7.2.2 二维数组的初始化 P127
1,对二维数组元素赋初值, 可以用分行赋值的方法, 例如:
int a[ 3] [ 2] ={{1,2},{3,4},{5,6}};
其中内 { }代表一行元素的初值 。 经过如此的初始化后, 每
个数组元素分别被赋以如下各值:
a[ 0] [ 0] =1,a[ 0] [ 1] =2,a[ 1] [ 0] =3,
a[ 1] [ 1] =4,a[ 2] [ 0] =5,a[ 2] [ 1] =6
写成行列式形如,1 2
3 4
5 6
第七章 数 组
2,可以只为数组的部分元素赋值
例如,int a[ 3] [ 2] ={{1},{2,3},{4}};
这样, 数组的前几个元素的值为:
a[ 0] [ 0] =1,a[ 1] [ 0] =2,a[ 1] [ 1] =3,
a[ 2] [ 0] =4 而其余元素的初值将自动设为 0。
3,在初始化时, 也可将所有数据写在一个花括号内, 按
数组的排列顺序对各元素赋初值 。 如:
int a[ 3] [ 2] ={1,2,3,4};
其结果是,
a[ 0] [ 0] =1,a[ 0] [ 1] =2,a[ 1] [ 0] =3,
a[ 1] [ 1] =4,其余元素的值自动设为 0。
1 0
2 3
4 0
1 2
3 4
0 0
第七章 数 组
4,若对全部元素都赋初值, 则定义数组时对第一维的长度可
以不指定, 但对第二维的长度不能省 。
如,int a[ 3] [ 2] ={1,2,3,4,5,6};
等价于, int a[ ] [ 2] ={1,2,3,4,5,6};
系统会根据数据总个数分配空间,一共 6个数据,每行 2列,当然可
确定为 3行,
1 2
3 4
5 6
第七章 数 组
例 7.4 从键盘为一个 N× N的整型数组输入数据, 并将
每一行的最小值显示出来 。
# define N 6
main()
{ int a[ N][ N],m[ N],i,j;
printf("Input numbers,\n");
for (i=0; i<N; i++)
for (j=0; j<N; j++)
scanf("%d",&a[ i][ j] );
for (i=0; i<N; i++)
{m[ i] =a[ i][ 0] ;
for (j=1; j<N; j++)
if (m[ i] >a[ i][ j] ) m[ i] =a[ i][ j] ;
}
第七章 数 组
printf("Min is,");
for (i=0; i<N; i++)
printf("%d ",m[ i] );
}
运行结果:
Input numbers,
12 3 4 67 22 9
8 23 61 19 20 8
3 78 5 7 12 15
19 89 1 6 8 2
11 22 81 36 2 4
53 32 17 19 11 5
Min is,3 8 3 1 2 5
第七章 数 组
7.3 字 符 数 组
7.3.1 字符数组的定义和初始化 P130
定义方式与前面介绍的类似, 形式如下:
char 数组名 [ 常量表达式 ] ;
如,char c[ 6] ;
则定义 c为字符数组, 包含 6个元素 。 赋值方法与一般的一维
数组是一样的, 例如:
c[ 0] =′s′; c[ 1] =′t′; c[ 2] =′r′;
c[ 3] =′i′; c[ 4] =′n′; c[ 5] =′g′;
第七章 数 组
需要说明的是, 由于字符型与整型是互相通用的, 故
字符数组的处理基本上与整型数组相同, 只不过每个元素
的值都是小于 255的整数而已 。
字符数组的初始化即是在定义时将字符逐个赋给数组
中各元素 。 例如:
char c[ 6] ={′s′,′t′,′r′,′i′,′n′,′g′};
**但应注意的是, 初值个数应小于等于数组长度, 否则
作语法错误处理 。
第七章 数 组
如果提供的初值个数与预定的数组长度相同, 在定义时
可省略数组长度, 系统会自动根据初值个数确定数组长
度 。 如:
char c[ ] ={′s′,′t′,′r′,′i′,′n′,′g′};
对于二维字符数组的定义与初始化, 我们不难以此
为基础类推 。 例如:
char ch[ 3] [ 2] ={{′1′,′2′},{′2′,′2′},{′3′,′2′}};
第七章 数 组
7.3.2 字符串和字符串结束标志
字符串常量是用双引号括起来的字符序列 。 在 C语言中,
没有字符串变量, 字符串是作为一维字符数组来处理的 。
在处理字符数组时, 为了测定数组中实际存放的字符个
数, C语言规定了一个, 字符串结束标志,, 用字符 ′\0′代表
( 其 ASCII码值为 0,是一个, 空操作符,,即无任何操作 ),
也就是说, 一个字符串是由有效字符, 加上字符 ′\0′组成的 。
系统对字符串常量也自动加一个 ′\0′作为结束符 。 例, string‖
共有 6个字符, 但在内存中占 7个字节, 最后一个字节存放 ′\0′。
需要提醒读者注意字符串与字符的区别:, 0‖为一字符串,
在内存中占两个字节, 而 ‘ 0 ’为字符, 只占一个字节, 其
ASCII码值为 48。
第七章 数 组
为了方便处理字符数组, C语言还允许用一个简单的字符
串常量来初始化一个字符数组, 而不必使用一串单个字符 。
如, char c[ ] ={"string"};
或 char c[ ] =″string″; (省略花括号 )
经过上述初始化后, c数组中每个元素的初值如下:
c[ 0] =′s′,c[ 1] =′t′,c[ 2] =′r′,c[ 3] =′i′,c[ 4] =′n′,c[ 5]
=′g′,c[ 6] =′\0′
应注意的是, 字符串常量的最后由系统自动在末尾加上结束字符 ′\0′,所
以 c数组有 7个元素 。 但若如上节逐个元素初始化, 则要显式加 ′\0′.
即 char c[ ] ={′s′,′t′,′r′,′i′,′n′,′g′,′\0′};
而与 charc[ ] ={′s′,′t′,′r′,′i′,′n′,′g′};是不同的,
第七章 数 组
图 7.4 字符串存贮示例
第七章 数 组
例 7.5 检测某一给定字符串中的字符数, 不包括结束符 ′\0′。
main()
{ static char str[] ={"string"};
int i=0;
while (str[ i] ! =′\0′) i++;
printf("The length of string is,%d\n",i);
}
运行结果:
The length of string is, 6
第七章 数 组
7.3.3 字符数组的输入和输出
(1) 采用, %c‖格式符, 逐个输入输出一个字符 。
如, char str[ ] ={"string"};
printf("%c",str[ 5] ); 输出结果为 g
(2) 采用, %s‖格式符, 整个字符串一次输入输出 。
如, char str[ ] ={"string"};
printf(―%s‖,str); 输出结果为 string
请注意,
1,输出字符不包括结束字符 ‘ \0’,
第七章 数 组
2,用, % s‖格式符输出字符时,printf函数中的输出项是字符
数组名,而不是数组元素名,写成这样是不对的,
printf(―%s‖,str[0]);
3,scanf函数中的输入项是字符数组名,输入项为字符数组名时,
不要再加地址符 &,因为在 C语言中数组名代表该数组的起始
地址,下面的写不对 scanf(―%s‖,&str);
应该写成, scanf(―%s‖,str); P134
4,如果数组长度大于字符串实际长度,也只输出到遇 ‘ \0’结束,
如, char s[10]={―china‖}; printf(―%s‖,s ); 也只输出
,china‖5个字符,而不是 10个字符,这就是用字符串结束标志
的好处,
第七章 数 组
5,如果一个字符数组中包含一个以上 ‘ \0’,则遇第一个
‘ \0’时输出就结束, 如果利用一个 scanf函数输入多个
字符串,则以空格分隔,例如, char s1[5],s2[5],s3[5];
scanf(―%s %s %s‖,s1,s2,s3);
输入数据, How are you? 输入后 s1,s2,s3数组状态
见图 7.5.数组中未被赋值的元素的值自动置 ‘ \0’,
若改为, char s[13]; scanf(―%s‖,s );如果输入以下 12个
字符,How are you? 实际上并不是把这 12个字符加上
‘ \0’送到 s中,而只将空格前的字符, How‖送到 s中,由
于把, How‖作为一个字符串处理,因此在其后加 ‘ \0’,s
数组状态见图 7.6.
图 7.6
图 7.5
第七章 数 组
7.3.4 常用字符串处理函数 P135
1) gets
调 用 形 式, gets( 字 符 数 组 ) 例,gets(str)
功能,从终端输入一个字符串数组, 并且得到一个函数值,
该函数的返回值是字符数组的起始地址 。
2) puts
调 用 形 式, puts( 字 符 串 ) 例,puts(str)
不能用 puts(str[5]) puts 找到 \0 就结束,
功能:将一字符串 ( 以 ′\0′为结束符 ) 输出到终端 。 输出
时将字符串结束标志转换成 ′\n′,即输出完毕后换行 。
第七章 数 组
3) strcmp 字符串比较函数
调用形式,strcmp(字符串 1,字符串 2)
功能, 将两个字符串从左至右逐个进行比较 (按 ASCII码值大小比
较 ) 直到出现不同的字符或遇到 ′ \0′ 为止, 若全部字符相同,则
认为相等 ;若出现不同的字符,则以第一个不相同的字符的比较结
果为准,例如,―china‖?‖chine ‖ 比较的结果由函数值带回,
函数值 =0 —— 字符串 1=字符串 2
函数值 >0 —— 字符串 1>字符串 2
函数值 <0 —— 字符串 1<字符串 2
注意, 对两个字符串比较,不能用以下形式,
if(s1==s2) printf(“yes”); 而只能写成
if(strcmp(s1,s2)==0) printf(“yes”);
第七章 数 组
4) strcpy
调用形式 1,strcpy(字符数组 1,字符串 2)
功能,将字符串 2拷贝到字符数组 1中去 。
说明,a)字符数组 1必须定义得足够大,以便容纳被拷贝的字符串,
字符数组 1的长度不应小于字符数组 2的长度, b) 复制时连同
字符串后面的 ‘ \0’一起复制到字符数组 1中, c) 不能用赋值语句
将一个字符串常量或字符数组直接给一个字符数组,如以下是不合
法的, s1={―china‖};s1=s2;只能用 strcpy函数, d) 也可以用 strcpy
函数将字符串 2前若干个字符拷贝到字符数组 1中去 。 调用形
式 2,strcpy(字符数组 1,字符串 2,n) 例如,
strcpy(str1,str2,2); 即是将 str2中前 2个字符拷贝到 str1中, 然后
再加一个 ′\0′。
第七章 数 组
5) strcat
调用形式,strcat(字符数组 1,字符数组 2)
功能,将字符数组 2中字符串接到字符数组 1中字符串的后面,
结果放在字符数组 1中, 函数的返回值是字符数组 1的地址 。
说明,a)字符数组 1必须足够大, 以便容纳连接后的新字符串 。
b)连接前两个字符串的后面都有一个 ‘ \0’,连接时将字符串 1后面
的 ‘ \0’取消,指在新串最后保留一个 ‘ \0’.
6) strlen
调用形式,strlen(字符串 )
功能,测试字符串的长度,函数的返回值为字符串的实际长
度(不包括 ′\0′)。
第七章 数 组
例如, char s[10]={―student‖};
printf(―%d‖,strlen(s));的输出结果?
7) strlwr
调用形式,strlwr(字符串 )
功能,将字符串中大写字母转换成小写字母 。
8) strupr
调用形式,strupr(字符串 )
功能,将字符串中的小写字母转换成大写字母。
结果,7
第七章 数 组
例 7.6 有三个字符串,要求找出其中最大者。
# include <stdio.h>
# include <string.h>
main()
{ char string[ 20] ;
char str[ 3][ 20] ;
int i;
for (i=0; i<3; i++)
gets(str[ i] );
if (strcmp(str[ 0],str[ 1] )>0) strcpy(string,str[ 0] );
else strcpy(string,str[ 1] );
if (strcmp(str[ 2],string)>0) strcpy(string,str[ 2] );
printf("\n the largest string is, %s\n",string);
}
第七章 数 组
运行结果:
CHINA
HOME
A CHINESE
the largest string is,HOME
第七章 数 组
7.4 程 序 举 例
例 7.7从键盘输入 15个整数, 并检查整数 10是否
包含在这些数据中, 若是的话, 它是第几个被输入
的 。
第七章 数 组
main()
{ int i,flag,data[ 15] ;
flag=0;
printf("Input numbers,\n");
for (i=0; i<15; i++)
scanf("%d",&data[ i] );
for (i=0; i<15; i++)
if (data[ i] ==10)
{printf("10 is inputed in the position %d.\n",i+1);
flag=1; /* 标记 10在输入数据中 */
break;
}
if(flag==0) printf("10 is not in numbers");
}
第七章 数 组
运行结果:
Input numbers:
12 13 23 89 77 90 56 1 6 11 5 9 10 17 65
10 is inputed in the position 13,
第七章 数 组
例 7.8 将数组 a的内容逆置重放 。 要求不得另外开辟数组,
只能借助于一个临时存贮单元 。
分析,假定 a数组有 8个元素,它们原始存放的内容如下:
第七章 数 组
完成以上操作, 只需按以下箭头所指的形式, 将两个元素中
的内容对调就行了 。 若用 i,j分别代表进行对调的两个元素
的下标, 则首先需要确定 i和 j的关系, 其次需要确定 i变化的
范围 。
第七章 数 组
# define N 8
main()
{ int a[ N],i,j,p,t;
printf("Input %d number to the array,",N);
for(i=0; i<N; i++)
scanf("%d",&a[ i] );
p=N/2-1;
for (i=0; i<=p; i++)
{j=N-i-1;
t=a[ i] ; a[ i] =a[ j] ; a[ j] =t;
}
第七章 数 组
printf("\nThe array has been inverted,");
for(i=0; i<N; i++)
printf("%d ",a[ i] );
}
运行结果:
Input 8 number to the array,4 7 2 8 12 5 10 3
The array has been inverted,3 10 5 12 8 2 7 4
第七章 数 组
例 7.9 输入 3行 4列的矩阵, 找出在行上最大, 在列上最
小的那个元素 。 如果没有这样的元素, 则打印出相应的信息 。
main()
{ int a[ 3][ 4],i,j,r,c,k,rmax,find;
printf(―Input the matrix, \n");
for(i=0; i<3; i++)
for(j=0; j<4; j++)
scanf("%d",&a[ i][ j] );
find=0; i=0; /* find为 1,标志找到了鞍点 */
while(i<3 && (find= =0)) /* 外循环查三行 */
{rmax=a[ i][ 0] ; c=0;
for(j=1; j<4; j++)
第七章 数 组
if (rmax<a[ i][ j] )
{ rmax=a[ i][ j] ; c=j; } /* 某行最大值 → ramx,所在列号 → c */
find=1; k=0;
while(k<3 && find= =1) /* 内循环查 rmax是否为 c列上的最小数 */
{ if (k! =i)
if (a[ k][ c] <=rmax) find=0; /* c列上有一数小于 rmax,结束循环 */
k++;
}
if (find= =1)
printf("The saddle pointer is,a[ %d][ %d] =%d\n",i,c,a[ i][ c] );
i++;
}
if (find= =0) printf("not been found");
}
第七章 数 组
运行结果:
The matrix is,
18 12 19 13
79 65 52 38
63 88 71 49
The saddle pointer is,a[ 0][ 2] =19
第七章 数 组
例 7.10 输入一个由若干单词组成的文本行 ( 最多 80个字
符 ), 每个单词之间用若干个空格隔开, 统计此文本行中单
词的个数 。
# include <stdio.h>
main()
{char str[ 80],prec,nowc;
int i,num;
printf("Input a text line,");
gets(str);
prec=′ ′; num=0; i=0;
第七章 数 组
while (str[ i] ! =′\0′)
{nowc=str[ i] ;
if (nowc! =′ ′ && prec= = ′ ′) num++; /* 是新单词,个数加 1 */
prec=nowc; /* 继续查 */
i++;
}
printf("\nThe number of words is,%d",num);
}
运行结果,
Input a text line,the big car
The number of words is, 3
第七章 数 组
1.编写程序完成以下功能,删除 str所指字符串中
的数字字符;
串中剩余字符形成一个新串放在 t所指字符串中。
例如,str, ab1c4E3F#g
t, abcEF#g
2.编写程序完成以下功能,将字符串中所有下标
为偶数位置上的字母更换大小写,并保存到新的
字符串 t中。
例如,str, abc4EFg
t, AbC4eFG
第七章 数 组
3,编写程序完成以下功能,让用户输入 5个元素 (整型
或实型 )放到数组 a中,
(1)求出 a 数组元素的平均值 aver
(2)找出满足 |aver-a[i]| 值最大的元素 a[i]并输出,
(3)用 x 替换 a[i]元素 ( 如果在 a 数组中有多个元素 a[i]
满足上述条件,则应全部用 x 替换 。 x由用户输入 ),输
出替换后的数组,
例如:用户输入 1.0,9.0,-3.0,2.0,4.0 ; x=3.0;
则 aver=2.6,满足 |2.6-a[i]|值最大的元素为 9.0,用 3.0
替换元素 9.0 之后 a 数组成为,
1.0,3.0,-3.0,2.0,4.0 。 ( 注意, C语言中 abs( x )
函数不能用于实型计算 ) 。
第七章 数 组
1,若 int a[ ][3]={1,2,3,4,5,6,7},则 a数组的第一维大小是
_____
2,以下程序的运行结果是什么?
main(){
int a[ ][3]={{1,2,3},{4,5},{6},{0}};
printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);
}
3,int k; int a[3][3]={1,2,3,4,5,6,7,8,9};
则下面语句的输出结果是
for(k=0;k<3;k++)
printf(―%d‖,a[k][2-k]);
第七章 数 组
4,合法的数组定义是 ()
A)int a[ ]=“string”; B)int a[5]={0,1,2,3,4,5};
C)char a=“string”; D)char a[ ]={0,1,2,3,4,5};
5.main()
{ int n[3],i,j,k=2;
for( i=0; i<3; i++)
n[ i]=0;
for( i=0; i<k; i++)
for( j=0; j<k; j++)
n[ j ]=n[ i ]+1;
printf(“%d\n”,n[1]); }
上述程序运行后,输出结果是 _____
第七章 数 组
6.下列程序的功能是显示如右下图形,找出规律进行 填空,
main()
{ int a[5][5],i,j;
for (i=0;i<5;i++)
{ for (j=0;j<5;j++)
{ if (_____ )
a[i][j]=0;
else
a[i][j]= _____;
printf("%3d",a[i][j]);
}
printf("\n");
}
}
1 0 0 0 0
2 1 0 0 0
3 2 1 0 0
4 3 2 1 0
5 4 3 2 1
第七章 数 组
7.1 一维数组
7.2 二维数组
7.3 字符数组
7.4 程序举例
第七章 数 组
7.1 一 维 数 组
7.1.1 一维数组的定义和引用
类型标识符 数组名[常量表达式];
例如, int a[10];
第七章 数 组
在定义数组时, 需要注意的是:
? 同变量一样, 数组也必须先定义, 后使用 。
? 定义内容,·数组名 ( 同变量名:字母, 下划线, 数字;
字母或下划线开头;长度 ≤ 32)
? 数组名后用方括号括起常量表达式,不能用圆括号,所以
写成 int a(10);是错误的,应该写成 int a[10];
? 常量表达式表示元素的个数,即数组长度,例如在 a[5]
中,5表示该数组有 5个元素,下标从 0开始,这 5个元素是
a[0],a[1],a[2],a[3],a[4].注意不能使用数组元素 a[5].
? 相同类型的数组或变量可以在一个类型说明符下一起说
明,互相之间用逗号隔开,例如,int a[ 5],b[10],i;
? 数组元素只能逐个引用而不能一次引用整个数组
第七章 数 组
? 常量表达式:常量或符号常量, 其值必须为正, 不能为变
量, 例如,
1) 表示数组长度的常量表达式, 必须是正的整型常量表达式
2) C语言不允许定义动态数组, 即数组的长度不能依赖于程
序运行过程中变化着的量, 下面这种数组定义方式是不允许的 。
int i;
scanf("%d",&i);
int a[ i] ;
a) 常量表达式为常量, int a[10];
b) 常量表达式为符号常量,
#define N 10
int a[N];
第七章 数 组
例 7.1 输入 5个学生某门课的成绩, 要求按与输入次序相
反的顺序输出 。
main()
{float s1,s2,s3,s4,s5;
printf("Enter five scores,");
scanf("%f,%f,%f,%f,%f",&s1,&s2,&s3,&s4,&s5);
printf("\nThe score in reverse order are,");
printf("%f\n",s5);
printf("%f\n",s4);
printf("%f\n",s3);
printf("%f\n",s2);
printf("%f\n",s1);
}
第七章 数 组
例 7.2 用数组实现例 7.1。
main()
{ int i;
float score[ 5] ;
printf("Enter five scores,");
for (i=0; i<5; i++)
scanf("%f",&score[ i] );
printf("\nThe scores in reverse order are,");
for (i=4; i>=0; i--)
printf("%4.2f\n",score[ i] );
}
第七章 数 组
7.1.2
可以在程序运行后用赋值语句或输入语句使数组中的元素
得到值, 也可以使数组在程序运行之前 ( 即编译阶段 ) 就得到
初值, 后者称为数组的初始化 。
对数组元素的初始化可以用以下方法实现,
1,在定义数组时对数组元素赋以初值, 如:
int s[ 5] ={78,87,77,91,60};
2,也可以只给一部分元素赋值 。 例如:
int s[ 5] ={78,87,77};
其结果是,s[ 0] =78,s[ 1] =87,s[ 2] =77,s[ 3] =0,
s[ 4] =0,即花括号内的值只赋给了数组的前几个元素, 后
几个元素的值为 0。
第七章 数 组
3,如果想使一个数组中全部元素值为 0,可写成,
int s[5]={0,0,0,0,0}; 或 int s[5]={0};
不能写成, int s[5]={0*10}; (不能给数组整体赋初值 )
4,若对全部数组元素赋初值时,可以不指定数组长度。例
如, int s[ 5] ={1,2,3,4,5}; 可以写成,
int s[ ] ={1,2,3,4,5}; (系统自动定义数组长度为 5)
但若被定义的数组长度与提供的初值的个数不等,则数组
长度不能省略, 如想定义数组长度为 10,而初值只有 5个,
则数组长度不能省略,必须写成,int a[10]={1,2,3,4,5};
第七章 数 组
5,一维数组元素是按下标递增的顺序连续存放的,即数
组占有连续的存贮空间。如 s数组在内存中的存贮示意
如图 6.1所示。
S[0] S[1] S[2] S[3] S[4]
图 7.1 s数组存贮示意图
第七章 数 组
例 7.3 用数组来处理求 Fibonacci数列问题 P124
main()
{
int i,f [20]={1,1};
for (i=2; i<20; i++)
f [i]=f [i –2] + f [i – 1];
for (i=0; i<20; i++)
{
if ( i %5 = =0 )
printf(―\n");
printf(―%12d‖,f [i] );
}
}
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
规律,下一项是前两项之和
第七章 数 组
常用排序算法之 ------起泡法(冒泡法 /气泡法) P124
有 n个杂乱无序的数,要求将这 n个数从小到大(或从大到小)
排序后输出。 这种排序方法之所以叫, 冒泡法,,是因为在排序
过程中,较小的数像气泡一样逐渐往前冒(向上冒),大的数逐
渐
向后沉,最终完成排序。
例 7.4 用起泡法对 5个数排序 (由小到大 )
第
1
次
第
2
次
第
3
次
第
4
次
结
果
第
1
次
第
2
次
第
3
次
结
果
? 共需进行 n-1
=4轮 ;
? 每一轮从第 1个
开始,两两比
较,大者交换
到后面 ;
? 第 i轮从第 1个
比到第 n-i个,要
进行 n-i次两两
比较。
9 8 8 8 8 8 5 5 5
8 9 5 5 5 5 8 4 4
5 5 9 4 4 4 4 8 2
4 4 4 9 2 2 2 2 8
2 2 2 2 9
第
二
轮
第
一
轮
第七章 数 组
#define N 5
main()
{
int i,j,t,a[N+1];
printf(“请输入 5个数,”);
for (i=1;i<=N;i++)
scanf("%d",&a[i]);
for (i=1;i<=N-1;i++)
for (j=1;j<=N-i;j++)
if (a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for (i=1;i<=N;i++)
printf("%d,a[i]);
}
程
序
如
右
为什么定义数组长度为 6?
当 int a[6]; 则 a数组有
a[0],a[1],a[2],a[3],a[4],a[5]
这 6个元素,因为本例中为了
符合人们的习惯,对 a[0]不用,
只用 a[1]到 a[5].
第七章 数 组
② 选择法
? 从算法优化的角度对“冒泡法”进行改
进。
? 冒泡法每一轮都要将数组中的数两两比
较,并根据大小交换之 —— 效率低。
? 选择法改进处:两两比较后并不马上交
换,而是找到最小数后记下其下标。在
一轮比较完毕后,再将最小的数一次交
换到位。 —— 比较次数不变,交换次数
减少。
第七章 数 组
程序如下,从左到右依次从小到大排放
#define N 6
main()
{
int i,j,t,p,a[N] ={0,5,10,-7,3,7};
for (i=0;i<N-1;i++)
{ p=i;
for (j=i+1;j<N;j++)
if (a[p]>a[j]) p=j;
if(p!=i)
{ t=a[p];a[p]=a[i]; a[i]=t; }
}
for (i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
第七章 数 组
7.2 二 维 数 组
7.2.1 二维数组的定义和引用
类型标识符 数组名[常量表达式][常量表达式] ;
例如,int a[3][2];
表示数组 a是一个 3× 2( 3行 2列)的数组,共有 6个元素,
每个元素都是 int型。
第七章 数 组
二维数组的应用之一是矩阵和行列式 。 其中, 左起
第一个下标表示行数, 第二个下标表示列数 。 我们也可以把
二维数组看成是一种特殊的一维数组:它的元素又是一个一
维数组 。 例如, 可将以上的 a数组看成是一个一维数组, 它
有 3个元素, 分别是 a[ 0], a[ 1], a[ 2], 每个元素又
是一个包含 2个元素的一维数组, 如图 6.2所示, 因此可以
把 a[ 0], a[ 1], a[ 2] 看作是三个一维数组的名字 。 上
面定义的二维数组就可理解为定义了三个一维数组, 即相当
于
图 7.2 二维数组 a[ 3][ 2]
第七章 数 组
图 7.3 数组元素的排列方式
C语言中,二维数组中元素排列的顺序是,按
行存放,即在内存中先顺序存放第一行的元
素,再存第二行的元素,
第七章 数 组
7.2.2 二维数组的初始化 P127
1,对二维数组元素赋初值, 可以用分行赋值的方法, 例如:
int a[ 3] [ 2] ={{1,2},{3,4},{5,6}};
其中内 { }代表一行元素的初值 。 经过如此的初始化后, 每
个数组元素分别被赋以如下各值:
a[ 0] [ 0] =1,a[ 0] [ 1] =2,a[ 1] [ 0] =3,
a[ 1] [ 1] =4,a[ 2] [ 0] =5,a[ 2] [ 1] =6
写成行列式形如,1 2
3 4
5 6
第七章 数 组
2,可以只为数组的部分元素赋值
例如,int a[ 3] [ 2] ={{1},{2,3},{4}};
这样, 数组的前几个元素的值为:
a[ 0] [ 0] =1,a[ 1] [ 0] =2,a[ 1] [ 1] =3,
a[ 2] [ 0] =4 而其余元素的初值将自动设为 0。
3,在初始化时, 也可将所有数据写在一个花括号内, 按
数组的排列顺序对各元素赋初值 。 如:
int a[ 3] [ 2] ={1,2,3,4};
其结果是,
a[ 0] [ 0] =1,a[ 0] [ 1] =2,a[ 1] [ 0] =3,
a[ 1] [ 1] =4,其余元素的值自动设为 0。
1 0
2 3
4 0
1 2
3 4
0 0
第七章 数 组
4,若对全部元素都赋初值, 则定义数组时对第一维的长度可
以不指定, 但对第二维的长度不能省 。
如,int a[ 3] [ 2] ={1,2,3,4,5,6};
等价于, int a[ ] [ 2] ={1,2,3,4,5,6};
系统会根据数据总个数分配空间,一共 6个数据,每行 2列,当然可
确定为 3行,
1 2
3 4
5 6
第七章 数 组
例 7.4 从键盘为一个 N× N的整型数组输入数据, 并将
每一行的最小值显示出来 。
# define N 6
main()
{ int a[ N][ N],m[ N],i,j;
printf("Input numbers,\n");
for (i=0; i<N; i++)
for (j=0; j<N; j++)
scanf("%d",&a[ i][ j] );
for (i=0; i<N; i++)
{m[ i] =a[ i][ 0] ;
for (j=1; j<N; j++)
if (m[ i] >a[ i][ j] ) m[ i] =a[ i][ j] ;
}
第七章 数 组
printf("Min is,");
for (i=0; i<N; i++)
printf("%d ",m[ i] );
}
运行结果:
Input numbers,
12 3 4 67 22 9
8 23 61 19 20 8
3 78 5 7 12 15
19 89 1 6 8 2
11 22 81 36 2 4
53 32 17 19 11 5
Min is,3 8 3 1 2 5
第七章 数 组
7.3 字 符 数 组
7.3.1 字符数组的定义和初始化 P130
定义方式与前面介绍的类似, 形式如下:
char 数组名 [ 常量表达式 ] ;
如,char c[ 6] ;
则定义 c为字符数组, 包含 6个元素 。 赋值方法与一般的一维
数组是一样的, 例如:
c[ 0] =′s′; c[ 1] =′t′; c[ 2] =′r′;
c[ 3] =′i′; c[ 4] =′n′; c[ 5] =′g′;
第七章 数 组
需要说明的是, 由于字符型与整型是互相通用的, 故
字符数组的处理基本上与整型数组相同, 只不过每个元素
的值都是小于 255的整数而已 。
字符数组的初始化即是在定义时将字符逐个赋给数组
中各元素 。 例如:
char c[ 6] ={′s′,′t′,′r′,′i′,′n′,′g′};
**但应注意的是, 初值个数应小于等于数组长度, 否则
作语法错误处理 。
第七章 数 组
如果提供的初值个数与预定的数组长度相同, 在定义时
可省略数组长度, 系统会自动根据初值个数确定数组长
度 。 如:
char c[ ] ={′s′,′t′,′r′,′i′,′n′,′g′};
对于二维字符数组的定义与初始化, 我们不难以此
为基础类推 。 例如:
char ch[ 3] [ 2] ={{′1′,′2′},{′2′,′2′},{′3′,′2′}};
第七章 数 组
7.3.2 字符串和字符串结束标志
字符串常量是用双引号括起来的字符序列 。 在 C语言中,
没有字符串变量, 字符串是作为一维字符数组来处理的 。
在处理字符数组时, 为了测定数组中实际存放的字符个
数, C语言规定了一个, 字符串结束标志,, 用字符 ′\0′代表
( 其 ASCII码值为 0,是一个, 空操作符,,即无任何操作 ),
也就是说, 一个字符串是由有效字符, 加上字符 ′\0′组成的 。
系统对字符串常量也自动加一个 ′\0′作为结束符 。 例, string‖
共有 6个字符, 但在内存中占 7个字节, 最后一个字节存放 ′\0′。
需要提醒读者注意字符串与字符的区别:, 0‖为一字符串,
在内存中占两个字节, 而 ‘ 0 ’为字符, 只占一个字节, 其
ASCII码值为 48。
第七章 数 组
为了方便处理字符数组, C语言还允许用一个简单的字符
串常量来初始化一个字符数组, 而不必使用一串单个字符 。
如, char c[ ] ={"string"};
或 char c[ ] =″string″; (省略花括号 )
经过上述初始化后, c数组中每个元素的初值如下:
c[ 0] =′s′,c[ 1] =′t′,c[ 2] =′r′,c[ 3] =′i′,c[ 4] =′n′,c[ 5]
=′g′,c[ 6] =′\0′
应注意的是, 字符串常量的最后由系统自动在末尾加上结束字符 ′\0′,所
以 c数组有 7个元素 。 但若如上节逐个元素初始化, 则要显式加 ′\0′.
即 char c[ ] ={′s′,′t′,′r′,′i′,′n′,′g′,′\0′};
而与 charc[ ] ={′s′,′t′,′r′,′i′,′n′,′g′};是不同的,
第七章 数 组
图 7.4 字符串存贮示例
第七章 数 组
例 7.5 检测某一给定字符串中的字符数, 不包括结束符 ′\0′。
main()
{ static char str[] ={"string"};
int i=0;
while (str[ i] ! =′\0′) i++;
printf("The length of string is,%d\n",i);
}
运行结果:
The length of string is, 6
第七章 数 组
7.3.3 字符数组的输入和输出
(1) 采用, %c‖格式符, 逐个输入输出一个字符 。
如, char str[ ] ={"string"};
printf("%c",str[ 5] ); 输出结果为 g
(2) 采用, %s‖格式符, 整个字符串一次输入输出 。
如, char str[ ] ={"string"};
printf(―%s‖,str); 输出结果为 string
请注意,
1,输出字符不包括结束字符 ‘ \0’,
第七章 数 组
2,用, % s‖格式符输出字符时,printf函数中的输出项是字符
数组名,而不是数组元素名,写成这样是不对的,
printf(―%s‖,str[0]);
3,scanf函数中的输入项是字符数组名,输入项为字符数组名时,
不要再加地址符 &,因为在 C语言中数组名代表该数组的起始
地址,下面的写不对 scanf(―%s‖,&str);
应该写成, scanf(―%s‖,str); P134
4,如果数组长度大于字符串实际长度,也只输出到遇 ‘ \0’结束,
如, char s[10]={―china‖}; printf(―%s‖,s ); 也只输出
,china‖5个字符,而不是 10个字符,这就是用字符串结束标志
的好处,
第七章 数 组
5,如果一个字符数组中包含一个以上 ‘ \0’,则遇第一个
‘ \0’时输出就结束, 如果利用一个 scanf函数输入多个
字符串,则以空格分隔,例如, char s1[5],s2[5],s3[5];
scanf(―%s %s %s‖,s1,s2,s3);
输入数据, How are you? 输入后 s1,s2,s3数组状态
见图 7.5.数组中未被赋值的元素的值自动置 ‘ \0’,
若改为, char s[13]; scanf(―%s‖,s );如果输入以下 12个
字符,How are you? 实际上并不是把这 12个字符加上
‘ \0’送到 s中,而只将空格前的字符, How‖送到 s中,由
于把, How‖作为一个字符串处理,因此在其后加 ‘ \0’,s
数组状态见图 7.6.
图 7.6
图 7.5
第七章 数 组
7.3.4 常用字符串处理函数 P135
1) gets
调 用 形 式, gets( 字 符 数 组 ) 例,gets(str)
功能,从终端输入一个字符串数组, 并且得到一个函数值,
该函数的返回值是字符数组的起始地址 。
2) puts
调 用 形 式, puts( 字 符 串 ) 例,puts(str)
不能用 puts(str[5]) puts 找到 \0 就结束,
功能:将一字符串 ( 以 ′\0′为结束符 ) 输出到终端 。 输出
时将字符串结束标志转换成 ′\n′,即输出完毕后换行 。
第七章 数 组
3) strcmp 字符串比较函数
调用形式,strcmp(字符串 1,字符串 2)
功能, 将两个字符串从左至右逐个进行比较 (按 ASCII码值大小比
较 ) 直到出现不同的字符或遇到 ′ \0′ 为止, 若全部字符相同,则
认为相等 ;若出现不同的字符,则以第一个不相同的字符的比较结
果为准,例如,―china‖?‖chine ‖ 比较的结果由函数值带回,
函数值 =0 —— 字符串 1=字符串 2
函数值 >0 —— 字符串 1>字符串 2
函数值 <0 —— 字符串 1<字符串 2
注意, 对两个字符串比较,不能用以下形式,
if(s1==s2) printf(“yes”); 而只能写成
if(strcmp(s1,s2)==0) printf(“yes”);
第七章 数 组
4) strcpy
调用形式 1,strcpy(字符数组 1,字符串 2)
功能,将字符串 2拷贝到字符数组 1中去 。
说明,a)字符数组 1必须定义得足够大,以便容纳被拷贝的字符串,
字符数组 1的长度不应小于字符数组 2的长度, b) 复制时连同
字符串后面的 ‘ \0’一起复制到字符数组 1中, c) 不能用赋值语句
将一个字符串常量或字符数组直接给一个字符数组,如以下是不合
法的, s1={―china‖};s1=s2;只能用 strcpy函数, d) 也可以用 strcpy
函数将字符串 2前若干个字符拷贝到字符数组 1中去 。 调用形
式 2,strcpy(字符数组 1,字符串 2,n) 例如,
strcpy(str1,str2,2); 即是将 str2中前 2个字符拷贝到 str1中, 然后
再加一个 ′\0′。
第七章 数 组
5) strcat
调用形式,strcat(字符数组 1,字符数组 2)
功能,将字符数组 2中字符串接到字符数组 1中字符串的后面,
结果放在字符数组 1中, 函数的返回值是字符数组 1的地址 。
说明,a)字符数组 1必须足够大, 以便容纳连接后的新字符串 。
b)连接前两个字符串的后面都有一个 ‘ \0’,连接时将字符串 1后面
的 ‘ \0’取消,指在新串最后保留一个 ‘ \0’.
6) strlen
调用形式,strlen(字符串 )
功能,测试字符串的长度,函数的返回值为字符串的实际长
度(不包括 ′\0′)。
第七章 数 组
例如, char s[10]={―student‖};
printf(―%d‖,strlen(s));的输出结果?
7) strlwr
调用形式,strlwr(字符串 )
功能,将字符串中大写字母转换成小写字母 。
8) strupr
调用形式,strupr(字符串 )
功能,将字符串中的小写字母转换成大写字母。
结果,7
第七章 数 组
例 7.6 有三个字符串,要求找出其中最大者。
# include <stdio.h>
# include <string.h>
main()
{ char string[ 20] ;
char str[ 3][ 20] ;
int i;
for (i=0; i<3; i++)
gets(str[ i] );
if (strcmp(str[ 0],str[ 1] )>0) strcpy(string,str[ 0] );
else strcpy(string,str[ 1] );
if (strcmp(str[ 2],string)>0) strcpy(string,str[ 2] );
printf("\n the largest string is, %s\n",string);
}
第七章 数 组
运行结果:
CHINA
HOME
A CHINESE
the largest string is,HOME
第七章 数 组
7.4 程 序 举 例
例 7.7从键盘输入 15个整数, 并检查整数 10是否
包含在这些数据中, 若是的话, 它是第几个被输入
的 。
第七章 数 组
main()
{ int i,flag,data[ 15] ;
flag=0;
printf("Input numbers,\n");
for (i=0; i<15; i++)
scanf("%d",&data[ i] );
for (i=0; i<15; i++)
if (data[ i] ==10)
{printf("10 is inputed in the position %d.\n",i+1);
flag=1; /* 标记 10在输入数据中 */
break;
}
if(flag==0) printf("10 is not in numbers");
}
第七章 数 组
运行结果:
Input numbers:
12 13 23 89 77 90 56 1 6 11 5 9 10 17 65
10 is inputed in the position 13,
第七章 数 组
例 7.8 将数组 a的内容逆置重放 。 要求不得另外开辟数组,
只能借助于一个临时存贮单元 。
分析,假定 a数组有 8个元素,它们原始存放的内容如下:
第七章 数 组
完成以上操作, 只需按以下箭头所指的形式, 将两个元素中
的内容对调就行了 。 若用 i,j分别代表进行对调的两个元素
的下标, 则首先需要确定 i和 j的关系, 其次需要确定 i变化的
范围 。
第七章 数 组
# define N 8
main()
{ int a[ N],i,j,p,t;
printf("Input %d number to the array,",N);
for(i=0; i<N; i++)
scanf("%d",&a[ i] );
p=N/2-1;
for (i=0; i<=p; i++)
{j=N-i-1;
t=a[ i] ; a[ i] =a[ j] ; a[ j] =t;
}
第七章 数 组
printf("\nThe array has been inverted,");
for(i=0; i<N; i++)
printf("%d ",a[ i] );
}
运行结果:
Input 8 number to the array,4 7 2 8 12 5 10 3
The array has been inverted,3 10 5 12 8 2 7 4
第七章 数 组
例 7.9 输入 3行 4列的矩阵, 找出在行上最大, 在列上最
小的那个元素 。 如果没有这样的元素, 则打印出相应的信息 。
main()
{ int a[ 3][ 4],i,j,r,c,k,rmax,find;
printf(―Input the matrix, \n");
for(i=0; i<3; i++)
for(j=0; j<4; j++)
scanf("%d",&a[ i][ j] );
find=0; i=0; /* find为 1,标志找到了鞍点 */
while(i<3 && (find= =0)) /* 外循环查三行 */
{rmax=a[ i][ 0] ; c=0;
for(j=1; j<4; j++)
第七章 数 组
if (rmax<a[ i][ j] )
{ rmax=a[ i][ j] ; c=j; } /* 某行最大值 → ramx,所在列号 → c */
find=1; k=0;
while(k<3 && find= =1) /* 内循环查 rmax是否为 c列上的最小数 */
{ if (k! =i)
if (a[ k][ c] <=rmax) find=0; /* c列上有一数小于 rmax,结束循环 */
k++;
}
if (find= =1)
printf("The saddle pointer is,a[ %d][ %d] =%d\n",i,c,a[ i][ c] );
i++;
}
if (find= =0) printf("not been found");
}
第七章 数 组
运行结果:
The matrix is,
18 12 19 13
79 65 52 38
63 88 71 49
The saddle pointer is,a[ 0][ 2] =19
第七章 数 组
例 7.10 输入一个由若干单词组成的文本行 ( 最多 80个字
符 ), 每个单词之间用若干个空格隔开, 统计此文本行中单
词的个数 。
# include <stdio.h>
main()
{char str[ 80],prec,nowc;
int i,num;
printf("Input a text line,");
gets(str);
prec=′ ′; num=0; i=0;
第七章 数 组
while (str[ i] ! =′\0′)
{nowc=str[ i] ;
if (nowc! =′ ′ && prec= = ′ ′) num++; /* 是新单词,个数加 1 */
prec=nowc; /* 继续查 */
i++;
}
printf("\nThe number of words is,%d",num);
}
运行结果,
Input a text line,the big car
The number of words is, 3
第七章 数 组
1.编写程序完成以下功能,删除 str所指字符串中
的数字字符;
串中剩余字符形成一个新串放在 t所指字符串中。
例如,str, ab1c4E3F#g
t, abcEF#g
2.编写程序完成以下功能,将字符串中所有下标
为偶数位置上的字母更换大小写,并保存到新的
字符串 t中。
例如,str, abc4EFg
t, AbC4eFG
第七章 数 组
3,编写程序完成以下功能,让用户输入 5个元素 (整型
或实型 )放到数组 a中,
(1)求出 a 数组元素的平均值 aver
(2)找出满足 |aver-a[i]| 值最大的元素 a[i]并输出,
(3)用 x 替换 a[i]元素 ( 如果在 a 数组中有多个元素 a[i]
满足上述条件,则应全部用 x 替换 。 x由用户输入 ),输
出替换后的数组,
例如:用户输入 1.0,9.0,-3.0,2.0,4.0 ; x=3.0;
则 aver=2.6,满足 |2.6-a[i]|值最大的元素为 9.0,用 3.0
替换元素 9.0 之后 a 数组成为,
1.0,3.0,-3.0,2.0,4.0 。 ( 注意, C语言中 abs( x )
函数不能用于实型计算 ) 。
第七章 数 组
1,若 int a[ ][3]={1,2,3,4,5,6,7},则 a数组的第一维大小是
_____
2,以下程序的运行结果是什么?
main(){
int a[ ][3]={{1,2,3},{4,5},{6},{0}};
printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);
}
3,int k; int a[3][3]={1,2,3,4,5,6,7,8,9};
则下面语句的输出结果是
for(k=0;k<3;k++)
printf(―%d‖,a[k][2-k]);
第七章 数 组
4,合法的数组定义是 ()
A)int a[ ]=“string”; B)int a[5]={0,1,2,3,4,5};
C)char a=“string”; D)char a[ ]={0,1,2,3,4,5};
5.main()
{ int n[3],i,j,k=2;
for( i=0; i<3; i++)
n[ i]=0;
for( i=0; i<k; i++)
for( j=0; j<k; j++)
n[ j ]=n[ i ]+1;
printf(“%d\n”,n[1]); }
上述程序运行后,输出结果是 _____
第七章 数 组
6.下列程序的功能是显示如右下图形,找出规律进行 填空,
main()
{ int a[5][5],i,j;
for (i=0;i<5;i++)
{ for (j=0;j<5;j++)
{ if (_____ )
a[i][j]=0;
else
a[i][j]= _____;
printf("%3d",a[i][j]);
}
printf("\n");
}
}
1 0 0 0 0
2 1 0 0 0
3 2 1 0 0
4 3 2 1 0
5 4 3 2 1