1.05k likes | 1.2k Views
7 数组. 7.1 引言. 一、数组具有的特征. 数组名 数组元素的个数 数组元素的类型。. 二、数组的作用. 数组元素的作用相当于简单变量. 数组名代表的是数组在内存中的首地址. 同一个数组中的元素在内存中是按顺序连续存放的. 7.2 一维数组. 一、一维数组的定义. 形式 : 类型说明符 数组名 [ 常量表达式 ];. 代表数组元素的个数. 例 : int a [20]; float x [100];. 其中 a 和 x 都是数组名。. 1. 数组名的确定方法同变量名。.
E N D
7.1 引言 一、数组具有的特征 数组名 数组元素的个数 数组元素的类型。
二、数组的作用 数组元素的作用相当于简单变量 数组名代表的是数组在内存中的首地址 同一个数组中的元素在内存中是按顺序连续存放的
7.2 一维数组 一、一维数组的定义 形式:类型说明符 数组名[常量表达式]; 代表数组元素的个数 例: int a [20]; float x [100]; 其中 a 和 x 都是数组名。
1. 数组名的确定方法同变量名。 2. C语言用方括号[ ]表示数组元数个数。 对于 int a[5]; 表示有5个元素, 元素的下标从0开始. 数组a的元素分别为:a[0],a[1], a[2], a[3], a [4]
a[0]的值 a[1]的值 a[2]的值 a[3]的值 a[4]的值 数组 a 在内存中的存放顺序: 注意:在没有给数组元素赋值以前,没有确定的值。
二、一维数组的引用 1. 必须象使用变量那样,先定义,后使用 2. 引用数组元素的方式: 数组名[下标] 例:int a[5]; a[0]=1; a[1]=2; 则 a [0]5+a[1] 6 为正确的算术表达式
三、数组元素赋初值 对全部元素赋初值。如: int a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19} 表示数组元素的值为: a[0]=10; a[1]=11; a[9]=19;
对部分元素赋初值(前面的连续元素)。如: int b[10]={0,1,2,3,4}; 表示数组元素的值为: b[0]=0; b[1]=1; b[2]=2; b[3]=3; b[4]=4; 在此, 只有前5个元素初值确定。
注意:不能只对不连续部分元素或后面的连续元素赋初值。注意:不能只对不连续部分元素或后面的连续元素赋初值。 语句:int a[10]={, , , , ,1,2,3,4,5}; int a[10]={1, ,3, ,5 , ,7, ,9, ,}; 是错误的。
如对数组元素赋同一初值,必须一一写出: static int a[10]={2,2,2,2,2,2,2,2,2,2}; 不可写成任何其他形式。 若赋全部元素的初值,可省略常量表达式 int a [ ]={0,1,2,3}; 表示a[4],即只有4个元素。
7.3 数组应用实例 一、采用循环方式对数组元素赋初值 P. 80 例
二、内存与数组的关系 前面已讲过:数组元素在内存中是按顺序连续存放的; 重要特性:系统对超出数组元素的使用不查错。
例:# include <stdio.h> main( ) { int a[5]={0, 1, 2, 3, 4}, i; char ch[5]={'a', 'b', 'c', 'd', 'e'}; for (i=0; i<10; i++) printf("a[%d]=%d, ch[%d]=%c\n", i, a[i], i, ch[i]); printf("%s", ch); }
a[0]=0, ch[0]=a a[1]=1, ch[1]=b a[2]=2, ch[2]=c a[3]=3, ch[3]=d a[4]=4, ch[4]=e a[5]=25185, ch[5]=] a[6]=25699, ch[6]= a[7]=23909, ch[7]= a[8]= 22, ch[8]= a[9]=285, ch[9]=
三、一维数组的应用 求Fibonacci 数列的前20项。 fi=fi-1+fi-2 ,且f1 = f2= 1。 定义数组,并赋初值 static int f [20]={1,1}; /*定义数组的前两个元素*/
用循环for求数列的后18项: for (i=2; i<20; i++) f [i]=f [i –1]+f [i –2]; 注意: 下标越界问题: i =2且i<20
程序如下: #include <stdio.h> mian ( ) { int i; static int f [20]={1, 1}; for (i=2; i<20; i++) f [i]=f [i–1]+f [i–2]; for (i=0; i<20; i++) { if (i%5 = =0) printf("\n"); printf("%12d",f [i] ); } }
运行结果如下: 1 8 89 987 1 13 144 1597 2 21 133 1584 3 34 377 4181 5 55 610 6765
四、简单预处理指令 1. 指令格式: #define 符号常量 文本串 2. 指令作用 用整型表达式替换程序中所有的符号常量。
例:#define MAX 15 main ( ) main ( ) 相当于 { int a[MAX]; { int a[15]; } }
3. 预处理指令用于数组的特点 符号常数一般采用大写字母组成标识符 文本串采用整型值或整型表达式 预处理指令不是C语句 在数组中使用预处理指令可提高程序的可读性和可维护性。
7.4 二维数组 一、二维数组的定义 形式: 类型说明符 数组名[常量表达式1] [常量表达式2] 例: int a[4] [10]; float x[8] [20];
注意: 1. 不可将定义写为int a[4,10]。 2. 可将二维数组的元素看成为若干个特殊的一维数组。 如:int b[3] [4]; 可看成:有三个特殊的一维数组b[0],b[1], b[2],每一个又有四个元素: b[0][0], b[0][1], b[0][2], b[0][3], b[1][0], b[1][1], b[1][2], b[1][3], b[2][0], b[2][1], b[2][2], b[2][3],
3. 二维数组的存放方式为: 按行优先。由此可推广 至三维、n维数组的定义和存放。 即: 最右边的下标变化最快。 4. 初始化: 按行给二维数组赋初值: static int a[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 或: static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
可以对部分元素赋初值,但需表达清楚。 如: static int a[3][4]={{1,2},{3},{8}}。 则相当于 若:static int a[3][4]={1,2,3,8} 则相当于
可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小。 static int a[ ][4]={1,2,3,…,12};
二、二维数组元素的引用 形式: 数组名[下标1][下标2] 其中的下标为整型表达式,但不得越界。 与一维数组元素一样,二维数组元素相当于同类型的简单变量。
1 4 2 5 3 6 1 2 3 4 5 6 a= b= 三、程序举例 例7.4:将一个二维数组行和列元素互换,存到另一个二维数组中。例如:
程序如下: #include <stdio.h> main ( ) { static int a[2] [3]={{1, 2,3},{4, 5,6}}; static int b[3] [2], i, j; printf("array a: \n"); for (i=0; i<=1; i++) { for (j=0; j<=2; j++) { printf("%5d", a[i][j]); b[j][i]=a[i][j]; } printf("\n"); } printf("array b:\n"); for (i=0; i<=2; i++) { for (j=0; j<=1; j++) printf("%5d", b[i]j]); printf("\n"); } }
运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6
例7.5:有一个3X4的矩阵,要求编程序以求出其中值最大的那个元素的值,以及其所在的行号和列。例7.5:有一个3X4的矩阵,要求编程序以求出其中值最大的那个元素的值,以及其所在的行号和列。 main() {int i,j,row=0,colum=0,max; static int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; max=a[0][0]; for(i=0;i<=2;i++) for(j=0;j<=3;j++) if(a[i][j]>max) {max=a[i][j]; row=i;colum=j; } printf("max=%d,row=%d,colum=%d\n",max,row,colum); } 输出结果为: max=10,row=2,colum=1
7.5 字符数组 一、字符数组的特点: 用于存放字符或字符串。 如:char w[7]={'s', 't', 'u', 'd', 'e', 'n', 't'}; w是一个可以存放7个字符的数组 而:char u[8]={"student"}; (或写成:char u[ ]="student"; ) u是一个可存放8个字符的数组
对上面两种数组定义,有: w[0]=u[0]=s w[1]=u[1]=t w[2]=u[2]=u w[3]=u[3]=d w[4]=u[4]=e w[5]=u[5]=n w[6]=u[6]=t u[7]=\0
二、字符串的特点 字符串用双引号" "括起来。 字符串的结束标志为'\0', 由系统提供。 例:char bn[ ]="computer"; 则:数组bn的长度为9 bn[0]='c' bn[1]='o' bn[2]='m' bn[3]='p' bn[4]='u' bn[5]='t' bn[6]='e' bn[7]='r' bn[8]='\o'
三、字符数组的输入输出 格式符:%c –––逐个输入/输出字符。 %s ––– 整个串一次输入/输出。 1. 输出 (用%s) 用%s输出时,不输出‘ \0’. 在printf中须直接写数组名. static char c[ ]={"I am a student"}; printf("%s", c);
若数组长度大于字符串长度,则遇到‘ \0’ 即停止输出 static char c[10]=" china"; printf(" %s", c); 输出时遇到第一个‘\0’即结束。
2. 输入(用%s) 输入字符串时,系统自动加上‘ \0’ 输入多个字符串,可用空格隔开。 Static char str1[5], str2[5], str3[5]; scanf(" %s%s%s", str1, str2,str3); 则: 输入 How are you str1: H o w str2: a r e str3: y o u
str: H o w \0 …… 但若: static char str[13] scanf("%s", str); 输入: How are you 则只会将How输入,且存为
四、字符和字符串举例 例1. #include <stdio.h> main( ) { char st1[ ]="abcdefg"; char st2[ ]={'s', 't', 'u', 'd', 'e', 'n', 't'}; char bt1[4]="ABED"; char bt2[ ]={'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', '\0'}; printf("st1=%s\nst2=%s\n", st1, st2); printf("bt1=%s\nbt2=%s\n", bt1, bt2); } 结果:只有st1和bt2的结果是正确的。 st2和bt1的结果随系统不同而不同。
例2:采用不同的方式输入输出字符串 #include <stdio.h>main( ){ char name[13]; int i; for (i =0; i <=12; i ++)scanf(“ %c”,&name[i]); for (i =0; i <=12; i ++)printf(“ %c”,name[i]);scanf(“ %s”,name);printf(“ %s”,name);} 运行结果:Pear & Apple Pear & Apple Pear & Apple Pear scanf中须用地址量,数组名表示地址量。
7.6字符串处理函数 几种常用的函数。 1. puts(字符数组) 将一个字符串(以‘\0’结束的字符序列)输出 到终端。假如已定义str是一个字符数组名,该数组 已被初始化为“China”。则执行puts(str); 其结果是在终端上输出:China。
2. gets(字符数组) 从终端输入一个字符串到字符数组,并且得到 一个函数值,该函数值是字符数组的起始地址。 函数调用如 gets(str); 注意:用puts和gets函数只能输入或输出一个 字符串,不能写成:puts(str1,str2)或 gets(strl,str2)。
3. strcat(字符数组1,字符数组2) 连接两个字符数组中的字符串,把字符串接到字符串的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。 static char str1[30]={"People's Republic of "}; static char str2={"China"}; printf("%s",strcat(strl,str2)); 输出: People's Republic of China
4. strcpy(字符数组1,字符串2) 它是“字符串拷贝函数”。作用是将字符串2拷贝到字符数组1中去。例如: static char str1[10],str2[]={"China"}; strcpy(str1 ,str2);
5.strcmp(字符串1,字符串2) 作用是比较字符串1和字符串2。例如: strcmp(str1,str2); strcmp("China","Korea"); strcmp(str1,"Beijing"); ①如果字符串1=字符串2,函数值为0。 ②如果字符串1>字符串2,函数值为一正整数。 ③如果字符串1<字符串2,函数值为一负整数 注意: 对两个字符串比较,不能用以下形式: if(strl==str2) printf("yes"); 而只能用 if(strcmp(str1,str2)==0) prinif("yes");
6. strlen(字符数组) 是测试字符串长度的函数。函数的值为字符串中实际长度,不包括‘\0’在内。如: static char str[10]={"China"}; printf("%d",strlen(str)); 输出结果不是10,也不是6,而是5。 也可以直接测字符串常量的长度, strlen("China")
7. strlwr(字符串) 将字符串中大写字母转换成小写字母lwr1owercase(小写)的缩写。 8. strupr(字符串) 将字符串中的小写字母转换成大写字母。upr是uppercase(大写)的缩写。
字符数组应用举例 [例7.8] 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 程序如下: #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); } 运行情况如下: I am a boy. There are 4 words in the line 程序中变量i作为循环变量,num用来统计单词个数,word作为判别是否单词的标志。 若word=0表示未出现单词,如出现单词word就置成1。