1 / 105

7 数组

7 数组. 7.1 引言. 一、数组具有的特征. 数组名 数组元素的个数 数组元素的类型。. 二、数组的作用.  数组元素的作用相当于简单变量.  数组名代表的是数组在内存中的首地址.  同一个数组中的元素在内存中是按顺序连续存放的. 7.2 一维数组. 一、一维数组的定义. 形式 : 类型说明符 数组名 [ 常量表达式 ];. 代表数组元素的个数. 例 : int a [20]; float x [100];. 其中 a 和 x 都是数组名。. 1. 数组名的确定方法同变量名。.

Download Presentation

7 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 7 数组

  2. 7.1 引言 一、数组具有的特征 数组名 数组元素的个数 数组元素的类型。

  3. 二、数组的作用 数组元素的作用相当于简单变量  数组名代表的是数组在内存中的首地址  同一个数组中的元素在内存中是按顺序连续存放的

  4. 7.2 一维数组 一、一维数组的定义 形式:类型说明符 数组名[常量表达式]; 代表数组元素的个数 例: int a [20]; float x [100]; 其中 a 和 x 都是数组名。

  5. 1. 数组名的确定方法同变量名。 2. C语言用方括号[ ]表示数组元数个数。 对于 int a[5]; 表示有5个元素, 元素的下标从0开始. 数组a的元素分别为:a[0],a[1], a[2], a[3], a [4]

  6. a[0]的值 a[1]的值 a[2]的值 a[3]的值 a[4]的值  数组 a 在内存中的存放顺序: 注意:在没有给数组元素赋值以前,没有确定的值。

  7. 二、一维数组的引用 1. 必须象使用变量那样,先定义,后使用 2. 引用数组元素的方式: 数组名[下标] 例:int a[5]; a[0]=1; a[1]=2;  则 a [0]5+a[1]  6 为正确的算术表达式

  8. 三、数组元素赋初值  对全部元素赋初值。如: int a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19} 表示数组元素的值为: a[0]=10; a[1]=11;  a[9]=19;

  9. 对部分元素赋初值(前面的连续元素)。如: int b[10]={0,1,2,3,4}; 表示数组元素的值为: b[0]=0; b[1]=1; b[2]=2; b[3]=3; b[4]=4; 在此, 只有前5个元素初值确定。

  10. 注意:不能只对不连续部分元素或后面的连续元素赋初值。注意:不能只对不连续部分元素或后面的连续元素赋初值。 语句:int a[10]={, , , , ,1,2,3,4,5}; int a[10]={1, ,3, ,5 , ,7, ,9, ,}; 是错误的。

  11.  如对数组元素赋同一初值,必须一一写出: static int a[10]={2,2,2,2,2,2,2,2,2,2}; 不可写成任何其他形式。  若赋全部元素的初值,可省略常量表达式 int a [ ]={0,1,2,3}; 表示a[4],即只有4个元素。

  12. 7.3 数组应用实例 一、采用循环方式对数组元素赋初值 P. 80 例

  13. 二、内存与数组的关系 前面已讲过:数组元素在内存中是按顺序连续存放的; 重要特性:系统对超出数组元素的使用不查错。

  14. 例:# 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); }

  15. 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]=

  16. 三、一维数组的应用 求Fibonacci 数列的前20项。 fi=fi-1+fi-2 ,且f1 = f2= 1。 定义数组,并赋初值 static int f [20]={1,1}; /*定义数组的前两个元素*/

  17.  用循环for求数列的后18项: for (i=2; i<20; i++) f [i]=f [i –1]+f [i –2]; 注意: 下标越界问题: i =2且i<20

  18. 程序如下: #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] ); } }

  19. 运行结果如下: 1 8 89 987 1 13 144 1597 2 21 133 1584 3 34 377 4181 5 55 610 6765

  20. 四、简单预处理指令 1. 指令格式: #define 符号常量 文本串 2. 指令作用 用整型表达式替换程序中所有的符号常量。

  21. 例:#define MAX 15   main ( ) main ( ) 相当于 { int a[MAX]; { int a[15];   } }

  22. 3. 预处理指令用于数组的特点  符号常数一般采用大写字母组成标识符  文本串采用整型值或整型表达式  预处理指令不是C语句 在数组中使用预处理指令可提高程序的可读性和可维护性。

  23. 7.4 二维数组 一、二维数组的定义 形式: 类型说明符 数组名[常量表达式1] [常量表达式2] 例: int a[4] [10]; float x[8] [20];

  24. 注意: 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],

  25. 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};

  26. 可以对部分元素赋初值,但需表达清楚。 如: static int a[3][4]={{1,2},{3},{8}}。 则相当于 若:static int a[3][4]={1,2,3,8} 则相当于

  27. 可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小。 static int a[ ][4]={1,2,3,…,12};

  28. 二、二维数组元素的引用 形式: 数组名[下标1][下标2] 其中的下标为整型表达式,但不得越界。 与一维数组元素一样,二维数组元素相当于同类型的简单变量。

  29. 1 4 2 5 3 6 1 2 3 4 5 6 a= b= 三、程序举例 例7.4:将一个二维数组行和列元素互换,存到另一个二维数组中。例如:

  30. 程序如下: #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"); } }

  31. 运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6

  32. 例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

  33. 7.5 字符数组 一、字符数组的特点: 用于存放字符或字符串。 如:char w[7]={'s', 't', 'u', 'd', 'e', 'n', 't'}; w是一个可以存放7个字符的数组 而:char u[8]={"student"}; (或写成:char u[ ]="student"; ) u是一个可存放8个字符的数组

  34. 对上面两种数组定义,有: 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

  35. 二、字符串的特点  字符串用双引号" "括起来。  字符串的结束标志为'\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'

  36. 三、字符数组的输入输出 格式符:%c –––逐个输入/输出字符。 %s ––– 整个串一次输入/输出。 1. 输出 (用%s)  用%s输出时,不输出‘ \0’. 在printf中须直接写数组名. static char c[ ]={"I am a student"}; printf("%s", c);

  37. 若数组长度大于字符串长度,则遇到‘ \0’ 即停止输出 static char c[10]=" china"; printf(" %s", c); 输出时遇到第一个‘\0’即结束。

  38. 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

  39. str: H o w \0 …… 但若: static char str[13] scanf("%s", str); 输入: How are you  则只会将How输入,且存为

  40. 四、字符和字符串举例 例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的结果随系统不同而不同。

  41. 例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中须用地址量,数组名表示地址量。

  42. 7.6字符串处理函数 几种常用的函数。 1. puts(字符数组) 将一个字符串(以‘\0’结束的字符序列)输出 到终端。假如已定义str是一个字符数组名,该数组 已被初始化为“China”。则执行puts(str); 其结果是在终端上输出:China。

  43. 2. gets(字符数组) 从终端输入一个字符串到字符数组,并且得到 一个函数值,该函数值是字符数组的起始地址。 函数调用如 gets(str); 注意:用puts和gets函数只能输入或输出一个 字符串,不能写成:puts(str1,str2)或 gets(strl,str2)。

  44. 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

  45. 4. strcpy(字符数组1,字符串2) 它是“字符串拷贝函数”。作用是将字符串2拷贝到字符数组1中去。例如: static char str1[10],str2[]={"China"}; strcpy(str1 ,str2);

  46. 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");

  47. 6. strlen(字符数组) 是测试字符串长度的函数。函数的值为字符串中实际长度,不包括‘\0’在内。如: static char str[10]={"China"}; printf("%d",strlen(str)); 输出结果不是10,也不是6,而是5。 也可以直接测字符串常量的长度, strlen("China")

  48. 7. strlwr(字符串) 将字符串中大写字母转换成小写字母lwr1owercase(小写)的缩写。 8. strupr(字符串) 将字符串中的小写字母转换成大写字母。upr是uppercase(大写)的缩写。

  49. 字符数组应用举例 [例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) {

  50. 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。

More Related