• 1. 第七章 多维数组 §7.1 一维数组初始化 §7.2 一维数组使用 §7.3 多维数组 §7.4 字符数组 §7.5 数组作为函数的参数 §7.6 程序范例 10/23/20181
  • 2. 在程序设计中,常需要大量相同数据类型的变量来保存数据。 例如:一个班有50个学生,统计这个班学生的成绩需要50个变量。 若定义成具有50个元素的数组(如int score[50];),在程序中解决问题就很方便。数组特点: 1.数组元素的个数必须在定义时确定,程序中不可改变。 2.同一数组中的数组元素的类型是相同的。 3.数组元素的作用相当于简单变量。 4.同一数组中的数组元素在内存中占据的地址空间是连续的。10/23/20182
  • 3. §7.1 一维数组初始化 数组的初始化:对数组元素赋初值。初始化数组格式:[static] <类型标识符> <数组名[元素个数]>={<初值列表>} 或 <类型标识符> <数组名[元素个数]>={<初值列表>} [static] int num[4] ={2, 4, 6, 8}; /* 初始化① */ [static] char wod[]={‘a’, ‘b’, ‘c’, ‘d’}; /* 初始化② */例如:10/23/20183
  • 4. 说明: ①<初值列表>是用逗号分隔的数值。 ②若对数组中的所有元素都赋以初值,可不必指出元素个数。见上面的初始化② ③<初值列表>中数值的类型必须与<类型标识符>一致。 ④C语言中,在n个元素组成的一维数组中,数组元素的下标值依次为0,1,2,…(n-1)。 ⑤上面的初始化数组的实际含义是: num[0]=2; num[1]=4; num[2]=6; num[3]=8; wod[0]=‘a’; wod[1]=‘b’; wod[2]= ‘c’; wod[3]=‘d’;10/23/20184
  • 5. ⑥对存储类型为静态的,若<初值列表>的个数少于元素个数,则只能给前面的元素赋值,后面的元素的值自动为零(对数值数组)或自动为空字符(对字符数值)。 “空字符”是指ASCⅡ码为零的字符。如:static int var[5]={12, 17, 19}; static char str[5]={ ‘A’, ‘B’, ‘C’}; 其实际含义为: var[0]=12; var[1]=17; var[2]=19; var[3]=var[4]=0; str[0]=‘A’; str[1]=‘B’; str[2]=‘C’; str[3]=str[4]=‘NULL ’;⑦元素个数代表着数组的长度。 10/23/20185
  • 6. §7.2 一维数组使用 数组一经定义后,就可在程序中使用,使用格式如下: 数组名[下标] 例如 : var[3]=28; var[4]=var[2]; str[3]= ‘d’; str[2]=str[4]; printf(“%d”, a[0]);说明: ①下标可以是整数或整型表达式 。如:var[i+j]=2; ②C编译不检查下标是否“出界”。 下标的值不应超过数组的长度,如var数组的长度为5,则下标的取值在0~4的范围内。10/23/20186
  • 7. 【例7-1】 一维数组在程序中的使用/*exam7_1.c 一维数组在程序中的使用*/ #include main() { int i,a[5]={1,2,3,4,5}; /*初始化数组*/ printf("输出数组元素的正确值: \n"); for(i=0;i<5;i++) printf("%d\t",a[i]); printf("\n输出超出下标的元素的值:\n"); for(i=5;i<10;i++) /*使用超出下标的元素*/ printf("%d\t",a[i]); printf("\n改变数组元素的值:\n");10/23/20187
  • 8. a[0]=(a[1]+a[2])*(a[3]+a[4]); printf("a[0]=%d\n",a[0]); }程序运行结果: 输出数组元素的正确值: 1 2 3 4 5 输出超出下标的元素的值: 0 320 2594 0 0 改变数组元素的值: a[0]=4510/23/20188
  • 9. 【例7-2】 求fiboncaci数列的前20项: F0=0 F1=1 ┆ Fi=Fi-1+Fi-2 (i=2, 3,…n) 将前20项输出到屏幕上,每行五项,一共四行。分析:看一看这个数列的组成,规律是从第三项开始的,每个数据项的值为前两个数据项的和,可以考虑用一个一维整型数组fbnc[20]来保存这个数列的前20项。10/23/20189
  • 10. 程序如下: /*exam7_2.c Fibonaci数列的前20项*/ #include #include main() { int i,FBNC[20]; FBNC[0]=0; FBNC[1]=1; for(i=1; i<=19;i++) FBNC[i+1]=FBNC[i]+FBNC[i-1]; printf("FBNC Number is:\n"); for(i=1;i<=20;i++)10/23/201810
  • 11. { if (i==6 || i==11 || i==16) printf("\n"); printf("%7d",FBNC[i]); } getch(); }程序运行结果: FBNC Number is: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 676510/23/201811
  • 12. 【例7-3】 输入8种商品的价格,求平均价格、最高价、最低价,并将高于平均价格的商品数及价格打印出来。分析:可以用一个数组把不同商品的价格保存起来,为了程序的通用性,可定义不同的函数来实现对商品的价格输入、输出;求平均价格、最高价、最低价。 用数组wares来保存8种商品的价格,其他各函数的功能如下: readprice( )——输入8种商品的价格并打印输出。 averprice( )——求商品的平均价格。 highprice( )——求商品的最高价。 lowerprice( )——求商品的最低价。 prtprice( )——打印商品平均价的商品数及价格。10/23/201812
  • 13. 程序如下: /*exam7_3.c 对八种商品价格的统计*/ #include #include main() { float wares[8]; float aver,highestP,lowestP; void readprice(float price[8]); float averPrice(float price[8]); float highPrice(float price[8]); float lowePrice(float price[8]); void prtprice(float price[8],float ave);10/23/201813
  • 14. readprice(wares); aver=averPrice(wares); highestP=highPrice(wares); lowestP=lowePrice(wares); printf("The highest Price=%6.2f\n",highestP); printf("the lowest Price=%6.2f\n",lowestP); printf("The average Price=%6.2f\n",aver); prtprice(wares,aver); getch(); }10/23/201814
  • 15. void readprice(float price[8]) { int i; printf("Enter 8 ware's price:\n"); for (i=0;i<8;i++) scanf("%f",&price[i]); printf("The price of 8 wares is :\n"); for (i=0;i<8;i++) printf("%6.2f\t",price[i]); printf("\n"); return; }10/23/201815
  • 16. float averprice(float price[8]) { float sum=0.0; float ave; int i; for (i=0;i<8;i++) sum=sum+price[i]; ave=sum/8; return (ave); }10/23/201816
  • 17. float highprice(float price[8]) { float high_temp; int i; high_temp=price[0]; for (i=0;i<7;i++) if (price[i]
  • 18. float loweprice(float price[8]) { float lowe_temp; int i; lowe_temp=price[0]; for (i=0;i<7;i++) if (price[i]>price[i+1]) lowe_temp=price[i+1]; return (lowe_temp); }10/23/201818
  • 19. void prtprice(float price[8],float ave) { int i; printf("The ware which are higher than average price:\n"); for (i=0;i<8;i++) if (price[i]>ave) printf("%6.2f\t",price[i]); return; }10/23/201819
  • 20. 程序运行结果: Enter 8 ware's price: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 The price of 8 wares is : 1.10 2.20 3.30 4.40 5.50 6.60 7.70 8.80 The highest Price= 8.80 the lowest Price= 1.10 The average Price= 4.95 The ware which are higher than average price: 5.50 6.60 7.70 8.8010/23/201820
  • 21. §7.3 多维数组 在计算机中多维数组其实只是一个逻辑上的概念,在内存中,多维数组只按元素的排列顺序存放,形成一个序列,就好似一维数组一样。 §7.3.1 二维数组的概念 二维数组的应用很广,例如平面上的一组点的集合就可用二维数组表示,平面上的点可用二维数组来表示: 10/23/201821
  • 22. §7.3.2 二维数组定义 二维数组的定义格式为:<类型标识符> 数组名[行数][列数]:例如:char word[3][2]; /* 数组word,具有3行2列,每一个数组元素的值都是字符型数据。 */ int num[2][4]; /* 数组num,具有2列4行,每一个数组元素的值都是整型数据。 */ 必须记住,数组元素的下标从0开始,因此,数组word中的元素为: word[0][0] word[0][1] word[1][0] word[1][1] word[2][0] word[2][1]10/23/201822
  • 23. 二维数组在内存中的存放顺序是“按行优先”,即先存放第一行,然后是第二行、第三行……直到最后一行。例如,前面的word数组在内存中的存放顺序如图所示: 10/23/201823
  • 24. 从二维数组中各元素在内存中的排列顺序可以计算出数组元素在数组中的顺序号。假设有一个m×n的二维数组a,其中i行,j列元素a[i][j]在数组中排列的位置为:i×n+j(其中 i=0, 1, 2, ……, n-1, j=0, 1, ……, n-1) §7.3.3 多维数组的定义 多维数组的定义格式为:<类型标识符> 数组名[元素1的个数][ 元素2的个数][ 元素3的个数]……[元素n的个数];10/23/201824
  • 25. 例如:int Tel[3][2][3]; /* 三维数组Tel,每个数组元素的值都是整型数据,共有18个元素 */多维数组在内存中的存放顺序仍然是“按行优先”,上面Tel数组的元素为: 思考在内存中的存放顺序? 10/23/201825
  • 26. 【例7-4】 向一个具有三行四列的二维数组ary[3][4]输入数值并输出全部数组的元素。/*exam7_4.c 二位数组元素的输入与输出*/ #include main() { int i,j; int ary[3][4]; printf("Please input number of array:\n"); for (i=0;i<3;i++) for (j=0;j<4;j++) scanf("%d",&ary[i][j]); printf("The number of ary is:\n");10/23/201826
  • 27. for (i=0;i<3;i++) { for (j=0;j<4;j++) printf("ary[%d][%d]=%d\t",i,j,ary[i][j]); printf("\n"); } }程序运行结果:Please input number of array: 1 2 3 4 5 6 7 8 9 10 11 12 The number of ary is: ary[0][0]=1 ary[0][1]=2 ary[0][2]=3 ary[0][3]=4 ary[1][0]=5 ary[1][1]=6 ary[1][2]=7 ary[1][3]=8 ary[2][0]=9 ary[2][1]=10 ary[2][2]=11 ary[2][3]=1210/23/201827
  • 28. §7.3.4 二维数组及多维数组的初始化 对二维数组及多维数组的元素赋值初值时,采用“按行优先”。赋值时可采用对元素全部赋值和部分赋值两种方式,以二维数组arr[3][2]为例:一、对全部元素赋初值: 赋初值格式: <类型标识符> arr[3][2]= {{a1, a2}, {a3, a4}, {a5, a6}}; ——① 或:<类型标识符> arr[3][2] ={a1, a2, a3, a4, a5, a6}; ——② 或:<类型标识符> arr[ ][2]= {{a1, a2, a3, a4, a5, a6}; ——③ 式①称为分行赋值方式;式②、式③称为按顺序赋值。10/23/201828
  • 29. 例如: int arr[3][2]={{1,2}, {3, 4}, {5, 6}}; /*采用第①种赋值方式*/ int arr[3][2]={ 1,2, 3, 4, 5, 6}; /*采用第②种赋值方式*/ int arr[ ][2]={ 1,2, 3, 4, 5, 6}; /*采用第③种赋值方式*/ 上面三种对数组arr元素赋初值的结果都是相同的,程序在编译时会按数组在内存中的排列顺序将各初值赋给数组元素。 在元素个数确定的情况下,缺省维数元素个数只能是最前面的。思考arr[3][2]中数组元素在内存中的顺序和数组元素的值?10/23/201829
  • 30. 二、对部分元素赋初值: 赋初值格式:<类型标识符> arr[3][2]={{a1, a2},{a3}}; ① <类型标识符> arr[3][2]={ a1, a2, a3}; ② 式①称为分行赋值方式,式②称为按顺序赋值。static int arr[3][2]={{1, 2},{3}}; /*采用第①种赋初值方式*/ static int arr[3][2]={ 1, 2, 3}; /*采用第②种赋初值方式*/例如: 上面二种对数组arr部分元素赋初值的结果是相同的,都是对数组arr的前面3个元素赋初值,后面叁个元素未赋初值,系统自动化赋以0值。 10/23/201830
  • 31. 数组arr中各元素的值为: 例如:static int brr[3][4]={{1},{2, 3},{4,5,6};? 采用分行赋值的方法概念清楚、含义明确,尤其在初始值比较多的情况下不易出错,也不需一个一个地数,只需找到相应行的数据即可。 注意:10/23/201831
  • 32. §7.4 字符数组 “字符串”是指若干有效字符的序列。 C语言中的字符串可以包括字母、数字、专用字符、转义字符等。 例如: “Hello”;“C_Language”;“ax+b=c”;“78.6”;“%f\n”。 C语言中字符串存放在一个字符型数组中,用字符’\0’作为字符串的结束标志。 “\0”是指ASCⅡ代码为0的字符。从ASCII码表可以看到,ASCII码为0的字符不是一个普通的可显示字符,它不进行任何操作,只是作为一个标记。 10/23/201832
  • 33. 注意字符数组与字符串这两个术语的含义和它们的区别: 字符串存放在字符数组中。 字符数组与字符串可以不等长,但字符数组的大小不能小于字符串的长度。 字符串常量以符号“\0”作为结束标记。10/23/201833
  • 34. §7.4.1 字符数组的初始化 逐个地为数组中各元素指定初值字符。 即一个字符一个字符地分别赋给各元素。 如: char word[10]={ ‘C’, ‘_’, ‘L’, ‘a’, ‘n’, ‘g’, ‘u’, ‘a’, ‘g’, ‘e’};数组word中各元素的值如图所示: 注意:这种初始化未将结束标记‘\0’存入数组中。 10/23/201834
  • 35. 2. 将字符串赋给指定的数组。 例如: char word[]={“C_language”}; 或:char word[11]={“C_Language”}; char word[11]= “C_Language”; char word[]= “C_Language”; 数组word中各元素的值如右图 :注意区别: 单个字符用单引号括起来,字符串用双引号括起来。采用将字符串赋给数组时 ,系统还自动地在最后一个字符后面加一个‘\0’字符作为字符串的结束标志 。10/23/201835
  • 36. §7.4.2 字符串的输入可用scanf函数来输入字符或字符串。假定有一字符数组:char name[9]; (1)向数组元素name[0]输入一个字符,其概念与简单字符变量的输入相同,即: scanf(“%c”, & name[0]); (2)向数组输入整个字符串: scanf(“%s”, name); 在scanf函中用“%s”作为输入一个字符串的格式符,注意数组名代表数组的首地址。10/23/201836
  • 37. scanf函数向数组输入字符串时必须注意两个问题 :第一个问题就是输入的字符串中不能包含有空格,因为用scanf函数输入字符串时,以空格或回车符作为数据分隔符 。第二个问题就是输入字符串时两边不要用双引号括起来。 例如输入: China word  只会把“China”作为一个字符串输入,系统自动在最后加一个字符串结合标志“\0”,这时输入给数组name中的字符个数是6而不是12,见图 :10/23/201837
  • 38. C语言提供了一个专门用于读字符的函数gets,它读入全部字符(包括空格),直到遇到回车符为止。 例如: char name[9]; gets(name);思考 : 若有:char name[ ], name2[ ]; 则采用不同的输入方式: scanf (“%s %s”, name1, name2); gets(name1); 当输入了China HongKong后,数组name1、name2各有何不同?10/23/201838
  • 39. §7.4.3 字符串的输出 用printf函数可输出一个或几个数组元素,也可以将存放在字符数组中的字符输入。 例如: printf(“%c, %s”, name[0], name);先输出一个字符数组元素的值name[0],然后输出name数组中整个字符串。 C提供了一个字符串输出函数puts(),用于输出字符串和由gets()函数接收的字符串,用它可输出字符串的空格。10/23/201839
  • 40. 【例7-5】 用多种方式输入输出字符串/*exam7_5.c 多种方法输入输出字符串*/ #include main() { char str1[12],str2[12],str3[12]; int i; printf("imput str1:\n"); gets(str1); puts(str1); printf("imput str2:\n"); for(i=0;i<12;i++) scanf("%c",&str2[i]); for(i=0;i<13;i++) printf("%c",str2[i]); printf("imput str3:\n"); scanf("%s",str3); printf("%s",str3); }10/23/201840
  • 41. §7.4.4 二维字符数组 二维数组可以认为是由若干个一维数组组成的,因此一个n×m的二维字符数组可以存放n个字符串,每个字符串最大长度为m-1(因为还要留一个位置存放‘\0”)。 例如: char name[7][4]={“SUN”, “MON”, “TUE”, “WED”, “THU”, “FRI”, “SAT”}; 数组name是一个二维字符数组,可以看成是7个一维字符数组。10/23/201841
  • 42. 数组name如图所示: 如果要输入“MON”这个字符串,可使用下面的语句: printf(“%s”, name[1]); name[1]相当于一维数组名,name[1]是字符串“MON”的起始地址,也就是二维数组第1地的起始地址(注意行数是从0算起的)。 10/23/201842
  • 43. 【例7-6】 阅读下面的程序,了解二维字符数组与一维数的关系。/*exam7_6.c 二位字符数组的改变*/ #include #include main() { int i; char name[7][4]={"sun","mon","tue","wed","thu","wen","sat"}; printf("Result is:\n"); name[0][3]='&'; name[2][3]='&'; name[5][3]='&'; for (i=0;i<7;i++) printf("string of name[%d]=%s\n",i,name[i]); getch(); }10/23/201843
  • 44. 程序运行结果: Result is: string of name[0]=sun&mon string of name[1]=mon string of name[2]=tue&wed string of name[3]=wed string of name[4]=thu string of name[5]=wen&sat string of name[6]=sat程序中,人为地将name[0][3]和name[2][3]元素的字符由原来的“\0”改为“&”,这样在输出每一行的字符串时,它就要寻找到第1个行结束标志“\0”,然后把该行输出。 10/23/201844
  • 45. name 字符数组改变前和改变后对比图: 10/23/201845
  • 46. C语言的库函数中提供了一些用于字符串运算的函数,这些函数大部分放在头文件string.h中。除gets和puts函数以外,常用的函数有以下几种: 1. 字符串拷贝函数strcpy。将一个字符串复制到一个字符数组中。 例如: strcpy(name1, “Apple”); 其作用是将“Apple”这个字符串复制到name1数组中。 说明: ①在向name1数组复制时,字符串结束标志“\0”一起被复制到name1中。 10/23/201846
  • 47. ②可以将一个字符数组中的字符串复制到另一个字符数组中去。 例如:strcpy(name1, name2); 注意: 使用strcpy(name1, name2)函数时,数组name2的大小不能大于数组name1的大小。【例7-7】 字符串拷贝,将一个字符串复制到另一个数组中去。 /*exam7_7.c 字符串拷贝*/ #include #include #include 10/23/201847
  • 48. main() { int i; char name1[6]={"apple"}; char name2[11]={"C_Lanquage"}; printf("Result is:\n"); printf("1---%s\n",name2); strcpy(name2,name1); printf("2---%s\n",name2); for (i=0;i<11;i++) printf("%c",name2[i]); }程序运行结果: Result is: 1---C_Lanquage 2---apple apple uage10/23/201848
  • 49. 2. 字符串连接函数strcat。 将两个字符串连接成一个字符串。 语法形式为: strcat(name1, name2); 结果是将name2中的内容连同结束符连接到name1数组的后面。 例如:有数组name1和name2分别如下: char name1[13]={“pear”}; char name2[6]={Apple}; 执行:strcat(name1, name2);后,name中的内容如图: 10/23/201849
  • 50. 3. 字符串比较函数strcmp。 比较两个字符,其语法形式为: strcmp(字符串1,字符串2)如果字符串1=字符串2,则函数值为0, 如果字符串1>字符串2,则函数值为一个正整数; 如果字符串1<字符串2,则函数值为一个负整数;从两个字符串中第一个字符开始逐个进行比较(按字符的ASCII码大小比较),直到出现不同的字符或遇到“\0”为止。 10/23/201850
  • 51. 【例7-8】 输入两个字符串,并比较它们的大小。/*exam7_8.c 字符串比较*/ #include #include #include main() { char name1[10],name2[10]; int k; printf("Please input name1:\n"); gets(name1); printf("Please input name2:\n"); gets(name2); k=strcmp(name1,name2);10/23/201851
  • 52. printf("k=%d\n",k); if (k>0) printf("The string of \"%s\" > \"%s\"",name1,name2); else if (k<0) printf("The string of \"%s\" < \"%s\"",name1,name2); else printf("The string of \"%s\" = \"%s\"",name1,name2); }程序运行结果: Please input name1: education Please input name2: educated k=4 The string of "education" > "educated"10/23/201852
  • 53. 4. 大小写字母转换函数。作用:把字符串中的大写字母改成小写,或把小写改成大写。 语法: strlwr(name); strupr(name); 其中name为字符串数组名。10/23/201853
  • 54. §7.5 数组作为函数的参数 §7.5.1 数组元素作为函数的参数将数组元素作为函数的实参,函数的形参为简单变量。 这种方法又称为“传值”方式,数组元素的作用相当于简单变量。实参的值单向传递给形参。【例7-9】 阅读下面的程序,观察数组元素作为实参的作用。/*exam7_9.c 数组元素作为实参*/ #include #include float Expfun1(float a,float b,float c);10/23/201854
  • 55. main() { float b[3]; float ave; b[0]=21.3; b[1]=b[0]/3; b[2]=8.2; printf(" b[0]=%4.1f\n b[1]=%4.1f\n b[2]=%4.1f\n",b[0],b[1],b[2]); ave=Expfun1(b[0],b[1],b[2]); printf(" ave=%4.1f\n",ave); printf(" b[0]=%4.1f\n b[1]=%4.1f\n b[2]=%4.1f\n",b[0],b[1],b[2]); getch(); }10/23/201855
  • 56. float Expfun1(float a,float b,float c) { float sum,aver; sum=a+b+c; a=a+5.5; b=b+5.5; c=c+5.5; aver=sum/3.0; printf(" a=%4.1f\n b=%4.1f\n c=%4.1f\n",a,b,c); return (aver); }10/23/201856
  • 57. 程序运行结果: b[0]=21.3 b[1]=7.1 函数调用前数组的值 b[2]=8.2 a=26.8 b=12.6 c=13.7 ave=12.2 b[0]=21.3 b[1]=7.1 函数调用后数组的值 b[2]=8.2 在调用Expfun1函数时,将b[0], b[1], b[2]的值分别传送给函数Expfun1中的形参a, b, c,求出平均值aver后,将aver的值返回main函数,赋给变量ave。 10/23/201857
  • 58. §7.5.2 数组名作为函数的参数将数组名作为函数的实参,函数的形参为数组。这种方法又称为“传址”方式,因为数组名代表的就是数组在内存中的首地址,实参与形参可以“双向传递”,调用函数时,是把实参在内存中的首地址传递给形参,其结果相当于同一数组采用了两个不同的数组中。 【例7-10】 阅读下面的程序,观察数组名作为实参的作用。 /*exam7_10.c 数组名作为实参*/ #include #include 10/23/201858
  • 59. main() { float Expfun2(float a[4]); float s[4]={88.5,90.5,70,71}; float ave; printf(" s[0]=%4.1f\n s[1]=%4.1f\n s[2]=%4.1f\n s[3]=%4.1f\n",s[0],s[1],s[2],s[3]); ave=Expfun2(s); printf(" ave=%4.1f\n",ave); printf(" s[0]=%4.1f\n s[1]=%4.1f\n s[2]=%4.1f\n s[3]=%4.1f\n",s[0],s[1],s[2],s[3]); getch(); }10/23/201859
  • 60. float Expfun2(float a[4]) { float sum,aver; sum=a[0]+a[1]+a[2]+a[3]; aver=sum/3.0; a[0]=a[0]/10; a[1]=a[1]/10; a[2]=a[2]/10; a[3]=a[3]/10; printf("a[0]=%4.1f\n a[1]=%4.1f\n a[2]=%4.1f\n a[3]=%4.1f\n",a[0],a[1],a[2],a[3]); return (aver); }10/23/201860
  • 61. 程序运行结果: s[0]=88.5 s[1]=90.5 函数调用前数组的值 s[2]=70.0 s[3]=71.0 a[0]= 8.9 a[1]= 9.1 a[2]= 7.0 函数调用中数组的值 a[3]= 7.1 ave=106.7 s[0]= 8.9 s[1]= 9.1 函数调用后数组的值 s[2]= 7.0 s[3]=7.1数组元素的值在调用前后发生了变化 。10/23/201861
  • 62. 形参数组和实参数组共占用一段内存单元。 如图所示:形参数组并不另外分配内存单元,只是共享实参数组的数据。 10/23/201862
  • 63. §7.6 程序范例 例7-11 线性查找,利用随机函数生成20个50以内大小的数据,从键盘输入一个整数,用线性查找方法在数组中查找,根据查找的结果,输出相应的信息。 注:线性查找法,把数组中的每一个元素与输入的关键字作比较。/*exam7_11.c 线性查找随机数*/ #include #include #include 10/23/201863
  • 64. main() { int i,array[20],num; srand(time(NULL)); for(i=0;i<20;i++) { array[i]=rand()%50; } printf("Enter your number:"); scanf("%d",&num); for(i=0;i<20;i++) { if(array[i]==num)10/23/201864
  • 65. { printf("Found in a[%d]\n",i); printf("Array element is:\n"); for(i=0;i<20;i++) { printf("%d\t",array[i]); } exit(0); } } printf("Not found!!"); }10/23/201865
  • 66. 程序运行结果:Enter your number:34 Found in a[1] Array element is: 47 34 26 2 17 38 49 49 47 45 3 47 17 8 38 46 37 49 9 40【例7-12】 有一个4×5的矩阵如下所示: 求:(1)所有元素的和; (2)打印出所有大于平均值的元素。10/23/201866
  • 67. 可以设计两个函数,一个用于计算机所有元素的和及平均值add-ave(),另一个用于打印所有大于平均值的元素Prt-up()。 程序如下: /*exam7_12.c 矩阵计算*/ #include #include int add_ave(int m,int n,int arr[ ]); void Prt_up(int m,int n,float average,int arr[ ]);10/23/201867
  • 68. main() { int A[4][5]={{2,6,4,9,-13},{5,-1,3,8,7},{12,0,4,10,2},{7,6,-9,5,2}}; int i=4,j=5,sum; float ave; sum=add_ave(i,j,A[0]); printf("The number of sum=%d\n",sum); ave=(float)((sum)/(i*j)); printf("The number of average=%5.2f\n",ave); Prt_up(i,j,ave,A[0]); getch(); }10/23/201868
  • 69. int add_ave(int m,int n,int arr[ ]) { int i; int total=0; for (i=0;i
  • 70. void Prt_up(int m,int n,float average,int arr[ ]) { int i,j; printf("The number of Bigger then average are:"); for (i=0;iaverage) printf("arr[%d][%d]=%d\t",i,j,arr[i*n+j]); } }10/23/201870
  • 71. 程序运行结果:The number of sum=69 The number of average= 3.45 The number of Bigger then average are: arr[0][1]=6 arr[0][2]=4 arr[0][3]=9 arr[1][0]=5 arr[1][3]=8 arr[1][4]=7 arr[2][0]=12 arr[2][2]=4 arr[2][3]=10 arr[3][0]=7 arr[3][1]=6 arr[3][3]=5add_ave 的作用是对任意大小的矩阵求出它所有元素的和,Prt_up的作用是打印所有大于某个值的数值元素。形参m和n是矩阵的行数和列数,形参average代表某个值,在此代表数组元素的平均值,形参arr[ ]为一个维数组。 10/23/201871
  • 72. 【例7-13】 输入一系列字符(不大于1200个),计算并输出所输入的字符个数与行数,输入时以感叹号“!”作为结束符。分析:可使用一个数组string来接收所输入的字符。 Winput()——把输入的字符放到数组string中 Findline_char()——计算输入字符的行数和字符数(以回车换行为标志)。 Output()——打印输入的行数和字符数。程序如下: /*exam7_13.c 字符输入计数*/ #include #include 10/23/201872
  • 73. #include #define Max 1200 #define End '!' void Winput(); void FindLine_Char(); void Output(int m,int n); char c,string[Max+1]; int i=0,Line=0,Num; main() { Winput(); FindLine_Char(); Output(Line,Num); getch(); }10/23/201873
  • 74. void Winput() { c=getchar(); while(i
  • 75. void FindLine_Char() /*行计数*/ { i=0; Num=0; c=string[i]; while(c!='\0') { if(c=='\n') Line++; else Num++; i++; c=string[i]; } }10/23/201875
  • 76. void Output(int m,int n) { printf("Lines=%d\n",m); printf("words number=%d\n",n); }程序运行结果: We are learning The C programing language. This is to count the words and lines.  Do you know what is result?  !  Line=3 Words number=106注意:输入时回车换行符没有作为字符计入字数个数中。10/23/201876
  • 77. 小结 :本章介绍了数组的概念及使用方法,应重点掌握以下几个方面的内容: (1)数组元素的作用和数组名的作用。 (2)字符串的含义及处理方式。 (3)多维数组的定义及使用方法。 (4)数组元素在内存中的存放方式及占用多少内存空间。 (5)数组元素与数组名作为函数参数有什么区别。10/23/201877