2009-7-28 1
第 6章 数组
2009-7-28 2
数组 (array)的定义及应用什么是数组? 保存相同类型数据的内存单元集合。
定义格式?
类型名 数组名 [常量表达式 1]
[,数组名 2[常量表达式 2]……] ;
即,type ArrayName1[size1],
ArrayName2[size2],…;
一维数组的定义
2009-7-28 3
注,( 1)数组必须先定义后使用。
( 2)“数据类型”是指数组元素的数据类型,

int,char,register,static,auto等。
( 3)数组名与变量名一样,必须遵循标识符命名规则。
( 4) 数组元素的下标,是元素相对于数组起始地址的偏移量,所以从 0开始顺序编号 。
如,int a[5]; //定义了一个整数型数组,数组名为 a,数组
//的大小为 5,即有 5个元素,a[0],a[1],a[2],a[3],a[4]。
static float y[50]; //定义了数组 y,每个元素的
//值为实型,存储类型为静态的。
char str[10]; //定义了数组 str,有 10个元素,
//每个元素的值为字符。
2009-7-28 4
( 5)“常量表达式”必须用方括号括起来,指的是数组的元素个数(又称 数组长度 ),它是一个整型值,其中可以包含常数、符号常量,还可以用宏定义标识符常量或用 const说明的标识符常量,但不能包含变量。
如,#define ASD 256
const int SIZE=500;

int x1[ASD*2]; //定义 x1,含 512个元素
float yy[ASD+SIZE]; //定义 yy,含 756个元素
char cs[?a?]; //定义 cs,含 97个元素如下说明不允许,int n;
cin>>n;
float t[n]; //定义 t前不知道 n的值
2009-7-28 5
( 6)数组元素的个数必须是一个正整数。
如,#define PI 3.14

int a1 [PI*3]; //错误,因为 PI*3是实数
float a2[int( PI*3) ]; //正确
( 7)数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,
按其下标的顺序占用一段连续的存储单元。
( 8)数组名的作用域与变量的作用域相同。当把数组定义为局部变量时,作用域为块作用域,
当定义为全局变量时,作用域为文件作用域。
2009-7-28 6
一维数组的使用引用一维数组的形式:
数组名 [下标表达式 ]
注,1.“下标表达式”可以是任何非负整型数据,
取值范围是 0~(元素个数 -1)。
如,int i,j;
float x[20],y,z;

x[i+j*2]=i+j; //元素引用是合法的
z=x[y*2]; //元素引用是不允许的
2009-7-28 7
特别强调,在运行 C++语言程序过程中,系统并不自动检验数组元素的下标是否越界。因此在编写程序时,保证数组下标不越界是十分重要的。
如,int m,aa[20];

aa[m*2+1]=200; //应保证 0<=m*2+1<20
cout<<aa[21];
//下标出界,输出一个不确定的值
2009-7-28 8
2.一个数组元素,实质上就是 1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。
3.在 C++中,数组作为一个整体,不能参加数据运算,只能对单个的元素进行处理。
如,int aa[5],bb[5];
cin>>aa; //错误
cout<<aa; //错误
4,同类型的数组之间不能相互赋值。
如,bb=aa; //错误
2009-7-28 9
例 1,输入五个实数,并求出这五个实数的平均值。
若输入数,4 8 6.5 6 10
则输出:
这五个数的平均值为,6.9
61
2009-7-28 10
一维数组的初始化初始化格式:
数据类型 数组名 [常量表达式 ]= {初值表 }
( 1)如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。
如果被定义数组的长度,与初值个数不同,则数组长度不能省略。
如,int z[ ]={0,1,2,3,4,5,6,7,8};
//编译器认定 z的元素个数为 9
int x[10]={0,1,2,3,4,5,6,7,8,9};
2009-7-28 11
( 2)“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值。
如,int y[10]={1,2,3};
//前三个元素赋值,其余元素值为 0
int arr1[20]={0,0,0,4,5,6};
//arr1[3]=4,arr1[4]=5,
//arr1[5]=6,其余元素值为 0
2009-7-28 12
( 3)根据存储类型的不同,数组有 静态数组
( static)和 动态数组 ( auto)之分;根据定义的位置不同,数组有 内部数组 (在函数内部定义的数组)和 外部数组 (在函数外部定义的数组)之分。
( 4)当把数组定义为 全局变量 或 静态变量 时,
C++编译器自动地将所有元素的初值置为 0。当把数组定义为 其他存储类型的局部变量 时,数组的元素没有确定的初值,即值是随机的。
例 2,输出数组为全局变量和局部变量时的初值。
62
2009-7-28 13
一维数组的应用举例例 3,求出 3~100之间的所有素数(质数),并要求每行输出 5个素数。
分析,一种求素数的方法 。由于大于 3的素数一定是奇数,为此先说明一个数组 prime[49],各个元素的初值分别为:
3,5,7,9,11,13,…,97,99。从第 0个元素开始,其后的各个元素若是第 0个元素的倍数,则该数不是素数,将其值置为 0。再从第 1个元素开始,其后的各个元素若是第 1个元素的倍数,则将其置为 0。
依次类推,直至从第 47个元素开始,其后元素若是第
47个元素的倍数,则将其值置为 0。这时数组 prime中不为 0的元素为素数。 63
2009-7-28 14
例 4,用选择排序的方法对输入的 10个整数进行排序(从小到大)。
分析,排序分 升序 和 降序 两种。 升序 指从小到大,
降序 指从大到小。 选择排序 思想:首先找出最小的数,放到 0下标位置。再从第 1个元素开始,用同样的方法,找出次小的元素放到 1下标位置。依次类推,直到将次大的数放到 8下标位置,此时 9下标位置即为最大数。 64
2009-7-28 15
例 5,从键盘上任意输入 10个整数,要求按从小到大的顺序在屏幕上显示出来。
分析,排序的方法有很多,本题采用 冒泡法 。
冒泡法的基本思想,通过相邻两个数之间的比较和交换,使排序码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从顶部移向底部。
由 A[n]~A[1]组成的 n个数据,进行冒泡排序的过程可以描述为:
( 1)首先将相邻的 A[n]与 A[n-1]进行比较,如果
A[n]的值小于 A[n-1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着比较 A[n-1]与 A[n-2],
同样使小的上浮,大的下沉。依此类推,直到比较完 A[2]和 A[1]后,A[1]为具有最小排序码(数值)的元素,称 第一趟排序 结束。
2009-7-28 16
例 6,已知某课程的平时、实习、测验和期末成绩,
求该课程的总评成绩。其中平时、实习、测验和期末分别占 10%,20%,20%,50%。
功能,从键盘上循环输入某课程的平时、实习、测验和期末成绩,按 10%,20%,20%,50%的比例计算总评成绩,并在屏幕上显示出来。按 -1终止循环,其他继续。
642
( 2)在 A[n]~A[2]区间内,进行第二趟排序,使剩余元素中排序码最小的元素上浮到 A[2];重复进行
n-1趟后,整个排序过程结束。
641
2009-7-28 17
二维数组的定义方式如下:
,存储类型,数据类型 数组名 [行常量表达式 ][列常量表达式 ][,数组名 2[行常量表达式 2][列常量表达式 2]……];
如,float b[2][3]; //定义了一个二维实型数组 b,有 6个元
//素,b[0][0],b[0][1],b[0][2],b[1][0],b[1][1],b[1][2].
int x[3][4]; //定义了二维整型数组 x,有 3行 4列。
多维数组的定义及使用二维数组的定义两个或两个以上下标的数组称为 多维数组 。
2009-7-28 18
注,1.数组元素在内存中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,
以此类推。
2,设有一个 m*n的数组 x,则第 i行第 j列的元素 x[i][j]在数组中的位置为,i*n+j( 注意,行号、
列号均从 0开始计数)。
3.可以把二维数组看作是一种特殊的 1维数组:
它的元素又是一个一维数组。
如:对 x[3][2],可以把 x看作是一个一维数组,
它有 3个元素,x[0],x[1],x[2],每个元素又是一个包含 2个元素的一维数组,如下页图所示 。 即把 x[0]、
x[1],x[2]看作是 3个一维数组的名字 。
2009-7-28 19
4,C++允许定义多维数组,如:
int b[2][3][4];
在内存中存放的顺序为:
b[0][0][0],b[0][0][1],b[0][0][2],b[0][0][3],b[0][1][0],b[0][1][1]
b[0][1][2],b[0][1][3],b[0][2][0],b[0][2][1],b[0][2][2],b[0][2][3]
b[1][0][0],b[1][0][1],b[1][0][2],b[1][0][3],b[1][1][0],b[1][1][1]
b[1][1][2],b[1][1][3],b[1][2][0],b[1][2][1],b[1][2][2],b[1][2][3]
数组 x的各个元素的存放顺序
x[0][0] x[0][1]
x[1][0] x[1][1]
x[2][0] x[2][1]
X[0]
X[1]
X[2]
2009-7-28 20
多维数组的引用二维数组元素的引用形式为:
数组名 [行下标表达式 ][列下标表达式 ]
注,1.“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。
2.“行下标表达式”和“列下标表达式”的值,
都应在已定义数组大小的范围内。假设有数组 x[3][4],
则可用的行下标范围为 0~2,列下标范围为 0~3。
3.对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的 2维数组元素。
2009-7-28 21
多维数组的初始化
1,按行赋初值数据类型 数组名 [行常量表达式 ][列常量表达式 ]=
{{第 0行初值表 },{第 1行初值表 },……,{最后 1行初值表 }};
赋值规则,将,第 0行初值表,中的数据,依次赋给第 0行中各元素;将,第 1行初值表,中的数据,依次赋给第 1行各元素;以此类推 。
如,int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2009-7-28 22
2.按二维数组在内存中的排列顺序给各元素赋初值数据类型 数组名 [行常量表达式 ][列常量表达式 ]
= {初值表 };
赋值规则,按二维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。
2009-7-28 23
如果对全部元素都赋初值,则“行数”可以省略。
注意,只能省略“行数”。
如,int y[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
如,float b[ ][4]={{1,2,3},{4,5,6},{10,11,12,14}};
//3行 4列
int aa[ ][3]={1,2,3,4,5,6};
//定义 2行 3列的数组
2009-7-28 24
又如,int b[ ]={2,4,9,15};
等价于 int b[4]={2,4,9,25};
int c[ ][2]={2,4,5,9,11,19};
等价于 int c[3][2]={2,4,5,9,11,19};
第二个下标不能省,int c[ ][ ]={2,4,5,9,11,19}是错 的。在上例中,我们有:
c[0][0]=2,c[0][1]=4,c[1][0]=5,c[1][1]=9,
c[2][0]=11,c[2][1]=19。
2009-7-28 25
3.只对部分元素赋初值,可有两种说明方式:
一种是以行为单位,依次列出部分元素的值;另一种是以数组元素的排列顺序依次列出前面部分元素的值。
如,int x[3][4]={{1,2},{3},{4,5,6}};
//没有列举的为 0
等同于,int
x[3][4]={{1,2,0,0},{3,0,0,0},{4,5,6,0}};
又如,int xx[3][4]={1,2,3};
即,xx[0][0]=1,xx[0][1]=2,xx[0][2]=3,其余的值为 0
2009-7-28 26
4.当说明为静态的多维数组或全局变量的多维数组时,系统自动地将数组的各个元素的初值置为 0。
同类型的同维数组之间也不能直接相互赋值。要将一个数组赋组另一个数组时,必须逐个元素赋值。
如,int a[5][3],b[5][3];
for( int i=0; i<5; i++)
for( int j=0; j<3; j++) b[i][j]=a[i][j];
二维数组程序举例例 7,输入一个 3行 4列的二维数组,设计一程序,求出数组元素中的最大值和最小值,以及最大值元素和最小值元素所在的行号和列号。
65
2009-7-28 27
例 8,设计一程序,将一个 4行 4列的二维数组中行和列元素互换(数学上称为 矩阵的转置 ),并存放到另一数组中。例如,
11 12 13 14 11 15 19 23
15 16 17 18 12 16 20 24
a= 19 20 21 22 b= 13 17 21 25
23 24 25 26 14 18 22 26
将数组 a的行列互换后,存入数组 b中。 66
执行结果 如下:
数组 a,数组 b:
11 12 13 14 11 15 19 23
15 16 17 18 12 16 20 24
19 20 21 22 13 17 21 25
23 24 25 26 14 18 22 26
2009-7-28 28
若直接将数组 a中的行列互换,只要将主对角线上的上、下三角形的行列元素互换即可。 661
例 9,有 M个学生,学习 N门课程,已知所有学生的各科成绩,编程:分别求每个学生的平均成绩和每门课程的平均成绩。
662
Score[0][0] Score[0][1] Score[0][2] Score[0][3] Score[0][4]
Score[1][0] Score[1][1] Score[1][2] Score[1][3] Score[1][4]
Score[2][0] Score[2][1] Score[2][2] Score[2][3] Score[2][4]
Score[3][0] Score[3][1] Score[3][2] Score[3][3] Score[3][4]
Score[4][0] Score[4][1] Score[4][2] Score[4][3] Score[4][4]
Score[5][0] Score[5][1] Score[5][2] Score[5][3] Score[5][4]
学生 1
学生 2
学生 3
学生 4
学生 5
每门总成绩第一门 第二门 第三门 第四门 每人平均
2009-7-28 29
数组和函数定义函数时,形参可为数组。调用函数时,将数组的一个元素作为函数的实参,也可将整个数组作为函数的实参。
注,1,数组元素作为函数的实参时,将该元素的值传递给函数。
2,数组名作为函数的实参时,将数组中所有元素的值传递给函数,还可将数组给元素的值作为输出参数。
例 10,设计一程序,输入一个数组,按升序排序后输出。要求用一个函数实现数组的排序。
67分析,仍采用选择排序的方法。
2009-7-28 30
定义函数时还可仅指明形参是数组,但不指定数组的大小,只用一个形参说明数组的大小。调用时,
一个实参为数组名,另一个实参指明数组的实际大小。
如上例可中的排序函数 sort()可改为:
void sort( int a[ ],int n) //定义函数
{int t,i,j;
for (int i=0; i<n-1; i++)
for(int j=i+1;j<n;j++) //把最小的放到 a[i]
if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t;}
}
相应主函数中的语句,sort( b);
改为,sort( b,10);
2009-7-28 31
函数经如此修改后,为一个通用的一维数组的排序程序。如说明数组 x的大小为 100时,可用如下语句:
int x[100];
主函数中的调用语句为:
sort( x,100);
2009-7-28 32
多维数组用作函数参数时,用法与一维数组类似。
如:
void fun1( float a[20][30])
{…} // 函数体调用时其实参为任一 20行 30列的数组。如:
float x[20][30],y[20][30];

fun1( x);

fun1( y);

2009-7-28 33
例 11,输入一个 3行 4列的二维数组,排序后输出各个元素,并求出平均值。要求函数实现数组的排序和求平均值。
分析,用一个函数 input()实现数据的输入;用函数 sort()实现数据的排序;用函数 ave()求平均值,并返回平均值。
68
函数的输入结果为:
输入 3行 4列的二维数组:
23 45 67 89
2 34 66 100
1 65 33 21
排序后的结果为:
1 2 21 23
33 34 45 65
66 67 89 100
平均值为,45.5
2009-7-28 34
字符数组的定义及应用字符数组的定义一般定义格式:
,存储类型,char <数组名 >[常量表达式 ];
注,C++中可将字符的值作为整数处理,整数(值在 0~255之间)也可作为字符处理。因而字符型和整数型可通用,但又有区别。
如,char s1[100];
//为 s1分配 100个字节的存储空间
int s2[100];
//为 s2分配 400个字节的存储空间
2009-7-28 35
字符数组的初始化几种方法:
1,依次列出各字符,用逗号分隔。
如 char s[10]={?I?,‘’,‘ a?,‘ m?,‘’,‘ s?,
‘ t?,‘ u?};
表示,s[0]=I,s[1]=0,…,s[9]=0
注,( 1)仅列出一部分值时,其余部分为空 (ASCII
码值为 0)。
( 2)列举的字符个数大于数组的大小时,编译时给出语法错误。
2,定义时不指定数组的大小,由系统根据所列的字符个数来确定字符数组的大小。
如,char ss1[ ]= {?I?,‘’,‘ a?,‘ m?,‘’,
‘ a?,‘ s?,‘ t?,‘ u?};
表示定义了大小为 9的数组 ss1。
2009-7-28 36
3,将用双引号括起来的字符串作为字符数组的初值。
如,char c[20]={“Hi world”};
或 char c[20]=“Hi world”;
注,( 1)没有列出的元素值为 0。
( 2)置初值时可不指定字符数组的大小。
如,char s4[ ]=,Hi world”;
表示指定数组 s4的元素个数为 9,最后一个位置放结束符 \0,其值为 0。
又如,char ss1[ ]={?H?,‘ i?,‘’,
‘ w?,‘ o?,‘ r?,‘ i?,‘ d?};
表示定义了数组 ss1,大小为 8。
注意,用字符串置初值与依次列举字符置初值的区别。
2009-7-28 37
字符数组的使用字符数组的使用同一般数组。
如,char x[20],s1[20][15];

x[5]=?a?; s1[2][5]=?T?;
例 12,依次输出字符数组中的每一个字符。
69
输出结果:
I am a student!
2009-7-28 38
字符数组的输入 /输出两种方法:( 1)逐个字符的输入 /输出。
如,char str[10];
cout<<“输入十个字符:”;
for(int i=0; i<10; i++)
//将输入的 10个
cin>>str[i];
//字符依次输入数组中

( 2)将字符数组作为字符串输入 /输出。
2009-7-28 39
610在出现提示符“输入两个字符串:”后,输入:
strints is abc.
输出,s1=strings
s2=is
例 13,将两个字符串分别输至两个字符数组中,并把这两个数组中的字符串输出。
2009-7-28 40
注,( 1)输入字符串时,空格或换行符( Enter键)
作为字符串结束。
例 14,数组的读入。
#include<iostream.h>
void main( ){
char buffer[80];
cout << "Enter a string," ;
cin >> buffer;
cout << "Here is the buffer,"<< buffer;}
2009-7-28 41
结果,Enter a string,Hi world
Here is the buffer,Hi
程序有两个问题:
a,若用户输入一个多于 79个字符的串,buffer 不够写。
b,如果输入了空格,将被认为是串的结束。
2009-7-28 42
若数组的读入改为:
#include <iostream.h>
void main( )
{ char buffer[80];
cout << "Enter a string," ;
cin.getline(buffer,79); //调用 cin中的方法 get
cout << "Here is the buffer,"<< buffer;
cout<<?\n?;
}
结果,Enter a string,Hi world
Here is the buffer,Hi world
2009-7-28 43
例 15,使用函数 cin.getline()实现字符串的输入。
611在出现提示“输入一个字符串:”后输入,You are students.
输出,s3=You are students.
s4=sjfsklfjYou are students.
( 2)字符数组中的字符作为字符串输出时,‘ \0?
作 示一个,空操作”,只起一个标志作用) 。 由系统自动在存储字符串常量时加上,故不需人为地再加。
( 3)将输入的一行作为一个字符串送到字符数组中时,需用函数 cin.getline()。函数有两个参数,
第一个参数为字符数组名,第二个为允许输入的最大字符个数。
2009-7-28 44
字符串处理函数字符串处理函数包含在头文件 string.h中。主要函数如下。
字符串处理函数
1,字符串拷贝函数
strcpy(字符数组名 1,字符数组名 2)
功能,把字符数组 2中的字符串拷贝到字符数组 1中。
串结束标志,\0”也一同拷贝。字符数组名 2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
2009-7-28 45
使用说明:
1)字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志 '\0'一起复制。
2)不能用赋值运算符“=”将一个字符串直接赋值给一个字符数组,只能用 strcpy( )函数来处理。如,char str1[80]=“I am a student.”;
char str2[70];
strcpy( str2,str1); //将 str1拷贝到 str2中又如,char ss[90];
strcpy( ss,“我们是教师”);
2009-7-28 46
2,实现两个字符串拼接的函数
strcat(字符数组名 1,字符数组名 2)
功能,把字符数组 2中的字符串连接到字符数组 1中字符串的后面,并删去字符串 1后的串标志,\0”。本函数返回值是字符数组 1的首地址。
使用说明:
1)由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题。
2)连接前两个字符串都有结束标志 '\0',连接后
“字符数组”中存储的字符串的结束标志 '\0'被舍弃,
只在目标串的最后保留一个 '\0'。
2009-7-28 47
如,char s1[80]=“学生”;
char s2[40]=“学习课程”;
strcat( s1,s2);
又如,char s3[60]=“You”;
strcat( s3,,are a student!”);
3,字符串比较函数
strcmp(字符串 1,字符串 2)
功能,比较两个字符串的大小。
如果,字符串 1=字符串 2,函数返回值等于 0;
字符串 1<字符串 2,函数返回值负整数;
字符串 1>字符串 2,函数返回值正整数。
2009-7-28 48
使用说明:
1)如果一个字符串是另一个字符串从头开始的子串,则母串为大。
2)不能使用关系运算符“==”来比较两个字符串,只能用 strcmp( ) 函数来处理。
下面所定义的函数实现了与函数 strcmp()相同的功能:
int stringcomp( char s1[ ],char s2[ ]) {
int j=0,k;
while(( k=s1[j]-s2[j]) = =0&&s1[j]) j++;
return k;
}
2009-7-28 49
例 16,strcmp函数的应用举例。
#include <iostream.h>
#include <string.h>
void main( ) //功能:简单密码检测程序
{char pass_str[80];char
pass[9]={'p','a','s','s','w','o','r','d','\0'};
//定义字符数组 pass_str
int i=1;
cout<<"请输入密码,"<<'\n';
cin.getline(pass_str,79); //输入密码
while(1) //检验密码
{if(strcmp(pass_str,pass)){ //口令错
cout<<"口令错误,请重新输入密码,";
cin.getline(pass_str,79); }
else break; //输入正确的密码,中止循环
i++;
if(i==3) return; //输入三次错误的密码,退出程序
cout<<"\n";
}
cout<<"可进入程序 !"<<"\n"; //输入正确密码所进入的程序段
}
2009-7-28 50
4,求字符串的长度函数
strlen(字符串)
功能,求字符串(常量或字符数组)的实际长度
(不包含结束标志),并返回该值。
如,char s6[80]=“People”;
cout<<strlen( s6) <<?\n?; //输出结果为 6
cout<<strlen(“教师”) <<?\n?; //输出结果为 4下列函数实现了与 strlen()相同的功能:
int strlength( char s[ ]) {
int len=0;
while( s[len++]);
return len-1; }
2009-7-28 51
5,大写字母变换成小写字母函数
strlwr(字符数组名)
功能,将字符串中的大写字母转换成小写,其它字符(包括小写字母和非字母字符)不转换。
6,小写字母变换成大写字母函数
strupr (字符数组名)
功能,将字符串中的小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换。
2009-7-28 52
7,函数 strncmp(字符串 1,字符串 2,maxlen)
其中字符串 1和字符串 2也可以是字符数组名。
maxlen为正整数。
功能,当字符串 1或字符串 2的长度小于 maxlen
时,该函数的功能同 strcmp()函数,当两个字符串的长度均大于 maxlen时,maxlen限定最多可比较的字符个数。
如,cout<<strncmp(,China”,,Chifjsl; kf”,3)
<<?\n?;
因前三个字符相同,故输出结果为 0。
8.函数 strncpy(字符数组名 1,字符串 2,maxlen)
其中字符串 2也可以是字符数组名,maxlen为正整数。
2009-7-28 53
功能,当字符串 2的长度小于 maxlen时,该函数的功能同 strcpy()函数,当字符串 2的长度大于
maxlen时,只将字符串 2中前面的 maxlen个字符拷贝给第一个参数所指定的数组中。
如,char s[90],s1[90];
strncpy( s,,abcdssfsdfk”,3);
//只拷贝前三个字符
strncpy( s1,,abcdef”,90); //全部拷贝字符数组的应用举例例 17,输入三个字符串,按升序排序后输出。
612
2009-7-28 54
例 18,输入一行字符串,设计一程序,统计其中有多少个单词,单词之间用一个或多个空格隔开。
分析,假定每次输入一行字符串中均包含了合法的英语单词,并且只包含单词和空格,而不包含其他字符。
设输入的字符串放在数组 s中。求单词个数可分为两步:
( 1)跳过开头的一个或多个空格字符,下标移到一个单词的开始位置。可用如下的循环语句实现:
int i=0,count=0;
while( s[i]= =) i++;
( 2)单词的计数器 count加 1,接着跳过该单词,下标移到该单词之后的第一个空格字符处。可用如下语句实现:
count++;
while( s[i]!=) i++;
613
2009-7-28 55
程序执行时,若输入的一行字符串为,You are a worker.
则输出:
字符串中包含的单词数为,4
例 19,输入五个国家的名称按字母顺序排列输出。
6131
分析,五个国家名应由一个二维字符数组来处理。然而C ++规定可以把一个二维数组当成多个一维数组处理。
因此本题又可以按五个一维数组处理,而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结果即可。
2009-7-28 56
例 20,在二维数组 a中选出各行最大的元素组成一个一维数组 b。
如设,a={{3,16,87,65},{4,32,11,108},
{10,25,12,37}},则 b={87,108,37}。
6132
分析,在数组 A的每一行中寻找最大的元素,找到之后把该值赋予数组 B相应的元素即可。
2009-7-28 57
课堂总结
1.数组是程序设计中最常用的数据结构。数组可分为 数值数组 (整数组,实数组 ),字符数组 以及后面将 要介绍的 指针数组,结构数组 等。
2.数组可以是一维的,二维的或多维的。
3.数组类型说明由 类型说明符,数组名,数组长度 (数组元素个数 )三部分组成。数组元素又称为下标变量 。 数组的类型是指下标变量取值的类型。
2009-7-28 58
4.对数组的赋值可以用 数组初始化赋值,输入函数动态赋值 和 赋值语句赋值 三种方法实现。 对 数值数组不能用赋值语句整体赋值、
输入或输出,而 必须用循环语句逐个对数组元素进行操作 。
5.字符数组可作为字符串输入 /输出;
6.字符数组的操作可用字符串处理库函数来完成。