第十章 数组第十章 数组
10.1 一维数组的定义与引用一、一维数组的定义
一维数组定义的一般形式为:
类型说明符 数组名 [常量表达式 ];
其中,类型说明符是任一种基本数据类型或构造数据类型,用于说明数组中存放的数据的类型。
数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
第十章 数组如:
int a[10];
float b[10],c[20];
char ch[20];
10.1 一维数组的定义与引用一、一维数组的定义对于数组类型定义应注意以下几点:
( 1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
( 2)数组名的书写规则应符合标识符的书写规定。
第十章 数组
( 3)数组名不能与其它变量名相同。
( 4)方括号中常量表达式表示数组元素的个数,必须是整数,在编译时用以确定分配给数组存储空间的大小。
( 5)定义数组时不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。引用数组元素时,方括号中可以使用变量。
( 6)允许在同一个类型定义中,定义多个数组和多个变量。
( 7)数组一旦说明,编译系统就要为其分配存储单元。
一维数组的存储结构按数组元素的先后顺序、数据类型分配一片连续的存储空间。
10.1 一维数组的定义与引用一、一维数组的定义第十章 数组数组元素也是一种变量,其标识方法为数组名后跟一个下标。
下标表示了元素在数组中的顺序号。数组元素的一般形式为:
数组名 [下标 ]
其中的下标只能为整型常量或整型表达式。
如,a[5],a[i+ j],a[i++ ]都是合法的数组元素。
10.1 一维数组的定义与引用二、一维数组元素的引用第十章 数组数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。
在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。
如,输出有 10个元素的数组必须使用循环语句逐个输出各下标变量:
for(i= 0; i<10; i++ )
printf("%d",a[i]);
而不能用一个语句输出整个数组,下面的写法是错误的,printf("%d",a);
10.1 一维数组的定义与引用二、一维数组元素的引用第十章 数组
说明:
( 1)数组名不是变量,数组元素是变量。
( 2) C规定下标从 0开始算起。数组的第
n-1个元素,下标值是 n-1。
( 3)定义数组时方括号中的数字与数组元素中方括号中的数字意义完全不同。前者的数字说明数组的长度,后者的数字说明该数组元素在数组中的位置。
10.1 一维数组的定义与引用二、一维数组元素的引用第十章 数组初始化赋值的一般形式为:
类型说明符 数组名 [常量表达式 ]={值,
值,…… 值 };
在 { }中的各数据值即为各元素的初值,各值之间用逗号间隔。
如:
int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
相当于 a[0]=0; a[1]=1...a[9]=9;
10.1 一维数组的定义与引用三、一维数组的初始化第十章 数组
几点规定:
( 1)可以只给部分元素赋初值。当 { }中值的个数少于元素个数时,只给前面部分元素赋值。
如,int a[10]={0,1,2,3,4};
( 2)只能给元素逐个赋值,不能给数组整体赋值。
如给十个元素全部赋 1值,只能写为:
int a[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为,int a[10]=1;
10.1 一维数组的定义与引用三、一维数组的初始化第十章 数组
( 3)对静态存储数组和外部存储数组,默认初值为 0。
如,static int a[10];
( 4)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。若仅给部分数组元素赋值,则不能省略数组长度。
如,int a[5]={1,2,3,4,5};
可写为,int a[ ]={1,2,3,4,5};
( 5)动态赋值。可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合 scanf函数逐个对数组元素赋值。
10.1 一维数组的定义与引用三、一维数组的初始化第十章 数组
[例 10.1]从键盘上输入 10个数,输出最大元素的值。
main( )
{ int i,max,a[10];
printf("input 10 numbers:\n");
for(i=0; i<10; i++ )
scanf("%d",&a[i]);
max=a[0];
for(i=1; i<10; i++ )
if(a[i]>max) max=a[i];
printf("maxmum=%d\n",max);
}
10.1 一维数组的定义与引用三、一维数组的初始化第十章 数组二维数组类型定义的一般形式是:
类型说明符 数组名 [常量表达式 1][常量表达式 2];
其中常量表达式 1表示第一维下标的长度,常量表达式 2 表示第二维下标的长度。
如,int a[3][4]; 定义了一个三行四列的数组,
数组名为 a,其下标变量的类型为整型。该数组的下标变量共有 3× 4个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
10.2 二维数组的定义与引用一、二维数组的定义第十章 数组二维数组是按行排列的。按行顺次存放,先存放 a[0]行,再存放 a[1]行,最后存放 a[2]行。
每行中有四个元素也是依次存放。由于数组 a定义为 int类型,该类型占两个字节的内存空间,
所以每个元素均占有两个字节 (图中每一格为两字节 )。
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
10.2 二维数组的定义与引用一、二维数组的定义第十章 数组
( 1)按行分段赋值可写为
int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},
{85,87,90},{76,77,85} };
( 2)按行连续赋值可写为
int a[5][3]={80,75,92,61,65,71,59,63,70,85,87,
90,76,77,85};
这两种赋初值的结果是完全相同的。
10.2 二维数组的定义与引用二、二维数组的初始化第十章 数组说明:
( 1)可以只对部分元素赋初值,未赋初值的元素自动取 0值。
如,int a[3][3]={{1},{2},{3}}; 是对每一行的第一列元素赋值,未赋值的元素取 0值。 赋值后各元素的值为:
1 0 0
2 0 0
3 0 0
10.2 二维数组的定义与引用二、二维数组的初始化第十章 数组
int a [3][3]={{0,1},{0,0,2},{3}}; 赋值后的元素值为
0 1 0
0 0 2
3 0 0
10.2 二维数组的定义与引用二、二维数组的初始化
( 2)如对全部元素赋初值,则第一维的长度可以不给出。
如,int a[3][3]={1,2,3,4,5,6,7,8,9};
可以写为,int a[ ][3]={1,2,3,4,5,6,7,8,9};
第十章 数组二维数组的元素也称为双下标变量,其表示的形式为:
数组名 [下标 ][下标 ]
下标应为整型常量或整型表达式。
如,a[3][4] 表示 a数组三行四列的元素。
10.2 二维数组的定义与引用三、二维数组元素的引用第十章 数组
[例 10.2]一个学习小组有 5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
课程成绩姓名
Math C VFP
张 80 75 92
王 61 65 71
李 59 63 70
赵 85 87 90
周 76 77 85
10.2 二维数组的定义与引用三、二维数组元素的引用第十章 数组
main( )
{ int i,j,s=0,l,v[3],a[5][3];
printf("input score\n");
for(i=0; i<3; i++ )
{ for(j=0; j<5; j++ )
{ scanf("%d",&a[j][i]); s=s+ a[j][i]; }
v[i]=s/5; s=0;
}
l=(v[0]+ v[1]+ v[2])/3;
printf(“math:%d \nc languag:%d\ndbase:
%d\n”,v[0],v[1],v[2]);
printf("total:%d\n",l);
}
10.2 二维数组的定义与引用三、二维数组元素的引用第十章 数组
用来存放字符量的数组称为字符数组。
符数组类型定义的形式与前面介绍的数值数组相同。
如,char c[10];由于字符型和整型通用,
也可以定义为 int c[10]但这时每个数组元素占
2个字节的内存单元。
字符数组也可以是二维或多维数组。
如,char c[5][10];即为二维字符数组。
10.3 字符数组第十章 数组
字符数组也允许在类型定义时作初始化赋值。
如,char c[10]={ 'c?,'?,'p?,'r?,'o?,'g?,'r?,'a?,'m'};
赋值后各元素的值为,c[0]=?c?,c[1]=,c[2]=
p?,c[3]=?r?,c[4]=?o?,c[5]=?g?,c[6]=?r?,c[7]=?a?,c[
8]=?m?,其中 c[9]未赋值,由系统自动赋予 0值。
当对全体元素赋初值时也可以省去长度定义。
如,char c[]={'c?,'?,'p?,'r?,'o?,'g?,'r?,'a?,'m'};
数组的长度自动定为 9。
10.3 字符数组第十章 数组
[例 10.3]字符数组输出
main( )
{
int i,j;
char a[][5]={{?B?,?A?,?S?,?I?,?C?,},{?d?,?B?,?A?,?S?,?E?}};
for(i=0; i<=1; i++ )
{
for(j=0; j<=4; j++ )
printf("%c",a[i][j]);
printf("\n");
}
}
10.3 字符数组第十章 数组
C语言允许用字符串的方式对数组作初始化赋值。
如,char c[]={?c?,,?p?,?r?,?o?,?g?,?r?,?a?,?m?,?\0?};
可写为,char c[]={“c program”};
或去掉 { }写为,char c[]="c program";
用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志 '\0'。数组 c在内存中的实际存放情况为:
10.3 字符数组
c p r o g r a m \0
第十章 数组
[例 10.4]字符串输出
main( )
{
char st[15];
printf("input string:\n");
scanf("%s",st);
printf("%s\n",st);
}
10.3 字符数组第十章 数组
1.字符串输出函数 puts
格式,puts (字符数组名 )
功能:把字符数组中的字符串输出到显示器。
即在屏幕上显示该字符串。
[例 10.5]字符串输出示例
#include "stdio.h"
main( )
{ char c[ ]="BASIC\ndBASE";
puts(c);
}
10.4 字符串常用函数第十章 数组
2.字符串输入函数 gets
格式,gets (字符数组名 )
功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。
[例 10.6]字符串输入示例
#include "stdio.h"
main( )
{ char st[15];
printf("input string:\n");
gets(st); puts(st);
}
10.4 字符串常用函数第十章 数组
3.字符串连接函数 strcat
格式,strcat (字符数组名 1,字符数组名 2)
功能:把字符数组 2中的字符串连接到字符数组 1中字符串的后面,并删去字符串 1后的串标志,\0”。本函数返回值是字符数组 1的首地址。
[例 10.7] 字符串连接示例
#include"string.h"
main( )
{ char st1[30]=“My name is,; char st2[10];
printf("input your name:\n");
gets(st2); strcat(st1,st2); puts(st1);
}
10.4 字符串常用函数第十章 数组
4.字符串拷贝函数 strcpy
格式,strcpy (字符数组名 1,字符数组名 2)
功能:把字符数组 2中的字符串拷贝到字符数组 1中。串结束标志,\0”也一同拷贝。字符数名 2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
[例 10.8]字符串拷贝示例
#include "string.h"
main( )
{ char st1[15],st2[]="C Language";
strcpy(st1,st2); puts(st1); printf("\n");
}
10.4 字符串常用函数第十章 数组
5.字符串比较函数 strcmp
格式,strcmp(字符数组名 1,字符数组名 2)
功能:按照 ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串 1=字符串 2,返回值= 0;
字符串 1 > 字符串 2,返回值 >0;
字符串 1 < 字符串 2,返回值 <0。
10.4 字符串常用函数第十章 数组
[例 10.9]字符串比较示例
#include"string.h"
main( )
{ int k;
char st1[15],st2[]="C Language";
printf("input a string:\n");
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf("st1=st2\n");
if(k>0) printf("st1>st2\n");
if(k<0) printf("st1<st2\n");
}
10.4 字符串常用函数第十章 数组
6.测字符串长度函数 strlen
格式,strlen(字符数组名 )
功能:测字符串的实际长度 (不含字符串结束标志‘ \0?)
并作为函数返回值。
[例 10.10]测字符串长度示例
#include "string.h"
main( )
{ int k;
char st[]="C language"; k=strlen(st);
printf("The lenth of the string is %d\n",k);
}
10.4 字符串常用函数第十章 数组
[例 10.11] 用数组来处理求 Fibonacci数列前 20项。
f[0]=1; f[1]=1; f[i]=f[i- 2]+ f[i- 1];
编程如下:
main( )
{ int i; int 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("%7d",f[i]);
}
}
10.4 字符串常用函数第十章 数组
[例 10.12] 用选择法对 6个整数按由小到大排序。
选择法的基本思想:把最小的数调到前面。
首先将数组中最小的元素与 a[0]对调,再从
a[1]~a[n- 1]中找出最小的元素与 a[1]对调 …
依次循环,从 a[i]~a[n- 1]中选出最小元素与
a[i]对调。
5
3
7
9
0
1
0
3
7
9
5
1
0
1
3
9
5
7
0
1
7
9
5
3
0
1
3
5
9
7
0
1
3
5
7
9
10.4 字符串常用函数第十章 数组
#include "stdio.h"
#define N 6
main()
{ int a[N],i,j,k,temp;
printf( "please input %d number,",N);
for ( i=0; i<N; i++ )
scanf ("%d",&a[i]);
for ( i=0; i<N- 1; i++ )
{ k=i;
for( j=k+ 1; j<N; j++ )
if(a[j]<a[k]) k=j;
temp = a[i]; a[i] = a[k]; a[k] = temp;
}
for (i=0; i<N; i++ )
printf("%6d",a[i]);
}
10.4 字符串常用函数第十章 数组
[例 10.13]从键盘上任意输入 10个整数,要求按从小到大的顺序在屏幕上显示出来。
分析:冒泡法的基本思想:通过相邻两个数之间的比较和交换,使较小的数逐渐从底部移向顶部,
就像水底的气泡一样逐渐向上冒,故而得名。
( 1)首先将相邻的 a[n- 1]与 a[n- 2]进行比较,
如果 a[n- 1]的值小于 a[n- 2]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着比较
a[n- 2]与 a[n- 3],同样使小的上浮,大的下沉。
依此类推,直到比较完 a[1]和 a[0]后,a[0]为具有最小排序码(数值)的元素,称第一趟排序结束。
10.4 字符串常用函数第十章 数组
( 2)然后在 a[n- 1]- a[1]区间内,进行第二趟排序,使剩余元素中排序码最小的元素上浮到
a[1];重复进行 n- 1趟后,整个排序过程结束。
总结:
( 1)若有 n 个数,需要重复进行 n- 1 趟排序。
在第 i 趟中,需要进行 n- i 次两两比较。
( 2)可以定义数组 a 来存放这 n 个数。
( 3)可以定义符号常量 N 来控制数组长度。
10.4 字符串常用函数第十章 数组
#include "stdio.h"
#define N 10
main( )
{ int a[N]; int i,j,temp;
clrscr( );
printf( "Please input %d numbers:",N );
for( i=0; i<N; i++ ) scanf( "%d",&a[i] );
/*冒泡法排序 */
for( i=0; i<N- 1; i++ )
for( j=N- 1; j>i; j-- )
if( a[j]< a[j- 1] )
{ temp= a[j]; a[j]= a[j- 1]; a[j- 1]=temp; }
printf( "\nthe result of sort:\n " );
for( i=0; i<N; i++ ) printf(,%d ",a[i]);
}
10.4 字符串常用函数第十章 数组
[例 10.14] 打印以下杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析,
( 1) 第一列和对角线上的元素值为 1,即 a[i][0]=1;
a[i][i]=1;
( 2)其它元素的值为前一行前一列元素+前一行同一列元素,即 a[i][j]=a[i- 1][j- 1]+ a[i- 1][j]
10.4 字符串常用函数第十章 数组
#include "stdio.h"
#define N 6
main( )
{
int i,j,a[N][N];
for ( i=0; i<N; i++ )
{ a[i][0]=1; a[i][i]=1; }
for ( i=2; i<N; i++ )
for ( j=1; j<i; j++ )
a[i][j]=a[i- 1][j- 1]+ a[i- 1][j];
for ( i=0; i<N; i++ )
{ for ( j=0; j<=i; j++ ) printf("%4d",a[i][j]);
printf(" \n");
}
}
10.4 字符串常用函数第十章 数组
[例 10.15]在二维数组 a中选出各行最大的元素组成一个一维数组 b。
3 16 87 65
4 32 11 108
10 25 12 37a=
10.4 字符串常用函数
b={87,108,37}
分析:在数组 A的每一行中寻找最大的元素,找到之后把该值赋予数组 b相应的元素即可。
第十章 数组
main( )
{ int a[][4]={3,16,87,65,4,32,11,108,10,25,12,37};
int b[3],i,j,l;
for(i=0; i<=2; i++ )
{ l=a[i][0];
for(j=1; j<=3; j++ )
if(a[i][j]>l) l=a[i][j]; b[i]=l;
}
printf("\narray a:\n");
for(i=0; i<=2; i++ )
{ for(j=0; j<=3; j++ ) printf("%5d",a[i][j]);
printf(“\n”);
}
printf("\narray b:\n");
for(i=0; i<=2; i++ ) printf("%5d",b[i]);
printf("\n");
}
10.4 字符串常用函数第十章 数组
[例 10.16]从键盘输入一行字符,统计单词个数,
单词之间用空格分隔。
#include "stdio.h"
main( )
{ char string[81]; int i,num=0,word=0;
char c; gets(string);
for(i=0;(c=string[i])!='\0?;i++ )
if(c==' ') word=0;
else if (word==0)
{ word=1; num++; }
printf(“There are %d words in the line \n”,
num);
}
10.4 字符串常用函数