PowerPoint 演示文稿

Download Report

Transcript PowerPoint 演示文稿

第七章多维数组
第七章 多维数组
§7.1 一维数组初始化
§7.2 一维数组使用
§7.3 多维数组
§7.4 字符数组
§7.5 数组作为函数的参数
§7.6 程序范例
1/77
18:44
C
程序设计基础教程
第七章多维数组
在程序设计中,常需要大量相同数据类型的变
量来保存数据。
例如:一个班有50个学生,统计这个班学生的成绩需要
50个变量。
若定义成具有50个元素的数组(如int score[50];),在
程序中解决问题就很方便。
数组特点:
1.数组元素的个数必须在定义时确定,程序中不可改变。
2.同一数组中的数组元素的类型是相同的。
3.数组元素的作用相当于简单变量。
4.同一数组中的数组元素在内存中占据的地址空间是连
续的。
2/77
18:44
C
程序设计基础教程
第七章多维数组
§7.1 一维数组初始化
数组的初始化:对数组元素赋初值。
初始化数组格式:
[static] <类型标识符> <数组名[元素个数]>={<初值列表>}
或
<类型标识符> <数组名[元素个数]>={<初值列表>}
例如:
[static] int num[4] ={2, 4, 6, 8};
/* 初始化① */
[static] char wod[]={‘a’, ‘b’, ‘c’, ‘d’}; /* 初始化② */
3/77
18:44
C
程序设计基础教程
第七章多维数组
说明:
①<初值列表>是用逗号分隔的数值。
②若对数组中的所有元素都赋以初值,可不必指出元素
个数。见上面的初始化②
③<初值列表>中数值的类型必须与<类型标识符>一致。
④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’;
4/77
18:44
C
程序设计基础教程
第七章多维数组
⑥对存储类型为静态的,若<初值列表>的个数少于
元素个数,则只能给前面的元素赋值,后面的元素
的值自动为零(对数值数组)或自动为空字符(对
字符数值)。
“空字符”是指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 ’;
⑦元素个数代表着数组的长度。
5/77
18:44
C
程序设计基础教程
第七章多维数组
§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的范围内。
6/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-1】 一维数组在程序中的使用
/*exam7_1.c 一维数组在程序中的使用*/
#include <stdio.h>
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");
7/77
18:44
C
程序设计基础教程
第七章多维数组
a[0]=(a[1]+a[2])*(a[3]+a[4]);
printf("a[0]=%d\n",a[0]);
}
程序运行结果:
输出数组元素的正确值:
1
2
3
4
输出超出下标的元素的值:
0
320
2594
0
改变数组元素的值:
5
0
a[0]=45
8/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-2】 求fiboncaci数列的前20项:
F0=0
F1=1
┆
Fi=Fi-1+Fi-2 (i=2, 3,…n)
将前20项输出到屏幕上,每行五项,一共四行。
分析:看一看这个数列的组成,规律是从第三项开始的,
每个数据项的值为前两个数据项的和,可以考虑用一个
一维整型数组fbnc[20]来保存这个数列的前20项。
9/77
18:44
C
程序设计基础教程
第七章多维数组
程序如下:
/*exam7_2.c Fibonaci数列的前20项*/
#include <stdio.h>
#include <conio.h>
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/77
18:44
C
程序设计基础教程
第七章多维数组
{
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 6765
11/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-3】 输入8种商品的价格,求平均价格、最高
价、最低价,并将高于平均价格的商品数及价格打印
出来。
分析:可以用一个数组把不同商品的价格保存起来,
为了程序的通用性,可定义不同的函数来实现对商品
的价格输入、输出;求平均价格、最高价、最低价。
用数组wares来保存8种商品的价格,其他各函数的
功能如下:
readprice( )——输入8种商品的价格并打印输出。
averprice( )——求商品的平均价格。
highprice( )——求商品的最高价。
lowerprice( )——求商品的最低价。
prtprice( )——打印商品平均价的商品数及价格。
12/77
18:44
C
程序设计基础教程
第七章多维数组
程序如下:
/*exam7_3.c 对八种商品价格的统计*/
#include <stdio.h>
#include <conio.h>
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);
13/77
18:44
C
程序设计基础教程
第七章多维数组
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();
}
14/77
18:44
C
程序设计基础教程
第七章多维数组
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;
}
15/77
18:44
C
程序设计基础教程
第七章多维数组
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);
}
16/77
18:44
C
程序设计基础教程
第七章多维数组
float highprice (float price[8])
{
float high_temp;
int i;
high_temp=price[0];
for (i=0;i<7;i++)
if (price[i]<price[i+1])
high_temp=price[i+1];
return (high_temp);
}
17/77
18:44
C
程序设计基础教程
第七章多维数组
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);
}
18/77
18:44
C
程序设计基础教程
第七章多维数组
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;
}
19/77
18:44
C
程序设计基础教程
第七章多维数组
程序运行结果:
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
20/77
6.60
7.70
8.80
18:44
C
程序设计基础教程
第七章多维数组
§7.3 多维数组
在计算机中多维数组其实只是一个逻辑上的概念,在内
存中,多维数组只按元素的排列顺序存放,形成一个序
列,就好似一维数组一样。
§7.3.1 二维数组的概念
二维数组的应用很广,例如平面上的一组点的集合就可
用二维数组表示,平面上的点可用二维数组来表示:
21/77
18:44
C
程序设计基础教程
第七章多维数组
§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]
22/77
18:44
C
程序设计基础教程
第七章多维数组
二维数组在内存中的存放顺序是“按行优先”,即
先存放第一行,然后是第二行、第三行……直到最
后一行。例如,前面的word数组在内存中的存放顺
序如图所示:
23/77
18:44
C
程序设计基础教程
第七章多维数组
从二维数组中各元素在内存中的排列顺序可以
计算出数组元素在数组中的顺序号。假设有一个
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的个数];
24/77
18:44
C
程序设计基础教程
第七章多维数组
例如:int Tel[3][2][3]; /* 三维数组Tel,每个数组
元素的值都是整型数据,共有18个元素 */
多维数组在内存中的存放顺序仍然是“按行优先”,上
面Tel数组的元素为:
思考在内存中的存放顺序?
25/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-4】 向一个具有三行四列的二维数组ary[3][4]
输入数值并输出全部数组的元素。
/*exam7_4.c 二位数组元素的输入与输出*/
#include <stdio.h>
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");
26/77
18:44
C
程序设计基础教程
第七章多维数组
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]=12
27/77
18:44
C
程序设计基础教程
第七章多维数组
§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};
——③
式①称为分行赋值方式;式②、式③称为按顺序赋值。
28/77
18:44
C
程序设计基础教程
第七章多维数组
例如:
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]中数组元素在内存中的顺序和数组元
素的值?
29/77
18:44
C
程序设计基础教程
第七章多维数组
二、对部分元素赋初值:
赋初值格式:<类型标识符> 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值。
30/77
18:44
C
程序设计基础教程
第七章多维数组
数组arr中各元素的值为:
例如:static int brr[3][4]={{1},{2, 3},{4,5,6};?
注意:
采用分行赋值的方法概念清楚、含义明确,尤其在
初始值比较多的情况下不易出错,也不需一个一个地
数,只需找到相应行的数据即可。
31/77
18:44
C
程序设计基础教程
第七章多维数组
§7.4 字符数组
“字符串”是指若干有效字符的序列。
C语言中的字符串可以包括字母、数字、专用字符、转
义字符等。
例如:
“Hello”;“C_Language”;“ax+b=c”;“78.6”;“%f\n”。
C语言中字符串存放在一个字符型数组中,用字符’\0’
作为字符串的结束标志。
“\0”是指ASCⅡ代码为0的字符。从ASCII码表可以
看到,ASCII码为0的字符不是一个普通的可显示字
符,它不进行任何操作,只是作为一个标记。
32/77
18:44
C
程序设计基础教程
第七章多维数组
注意字符数组与字符串这两个术语的含义和它们的
区别:
字符串存放在字符数组中。
字符数组与字符串可以不等长,但字符数组的大小
不能小于字符串的长度。
字符串常量以符号“\0”作为结束标记。
33/77
18:44
C
程序设计基础教程
第七章多维数组
§7.4.1
字符数组的初始化
1. 逐个地为数组中各元素指定初值字符。
即一个字符一个字符地分别赋给各元素。
如:
char word[10]={ ‘C’, ‘_’, ‘L’, ‘a’, ‘n’, ‘g’,
‘u’, ‘a’, ‘g’, ‘e’};
数组word中各元素的值如图所示:
注意:这种初始化未将结束标记
‘\0’存入数组中。
34/77
18:44
C
程序设计基础教程
第七章多维数组
2. 将字符串赋给指定的数组。
例如:
char word[]={“C_language”};
或:char word[11]={“C_Language”};
char word[11]= “C_Language”;
char word[]= “C_Language”;
数组word中各元素的值如右图 :
注意区别:
单个字符用单引号括起来,字符串
用双引号括起来。采用将字符串赋给
数组时 ,系统还自动地在最后一个字
符后面加一个‘\0’字符作为字符串的
结束标志 。
35/77
18:44
C
程序设计基础教程
第七章多维数组
§7.4.2
字符串的输入
可用scanf函数来输入字符或字符串。
假定有一字符数组:char name[9];
(1)向数组元素name[0]输入一个字符,其概念与
简单字符变量的输入相同,即:
scanf(“%c”, & name[0]);
(2)向数组输入整个字符串:
scanf(“%s”, name);
在scanf函中用“%s”作为输入一个字符串的格式符,
注意数组名代表数组的首地址。
36/77
18:44
C
程序设计基础教程
第七章多维数组
scanf函数向数组输入字符串时必须注意两个
问题 :
第一个问题就是输入的字符串中不能包含有空格,因
为用scanf函数输入字符串时,以空格或回车符作为数
据分隔符 。
第二个问题就是输入字符串时两边不要用双引号括起
来。
例如输入:
China word 
只会把“China”作为一个字符串
输入,系统自动在最后加一个字
符串结合标志“\0”,这时输入给
数组name中的字符个数是6而不
是12,见图 :
37/77
18:44
C
程序设计基础教程
第七章多维数组
C语言提供了一个专门用于读字符的函数gets,它读
入全部字符(包括空格),直到遇到回车符为止。
例如:
char name[9];
gets(name);
思考 :
若有:char name[ ], name2[ ];
则采用不同的输入方式:
scanf (“%s %s”, name1, name2);
gets(name1);
当输入了China HongKong后,数组name1、name2各
有何不同?
38/77
18:44
C
程序设计基础教程
第七章多维数组
§7.4.3
字符串的输出
用printf函数可输出一个或几个数组元素,也可以将
存放在字符数组中的字符输入。
例如:
printf(“%c, %s”, name[0], name);
先输出一个字符数组元素的值name[0],然后输出
name数组中整个字符串。
C提供了一个字符串输出函数puts(),用于输出字符
串和由gets()函数接收的字符串,用它可输出字符串
的空格。
39/77
18:44
C
程序设计基础教程
【例7-5】 用多种方式输入输出字符串
第七章多维数组
/*exam7_5.c 多种方法输入输出字符串*/
#include<stdio.h>
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);
}
40/77
18:44
C
程序设计基础教程
第七章多维数组
§7.4.4
二维字符数组
二维数组可以认为是由若干个一维数组组成的,因
此一个n×m的二维字符数组可以存放n个字符串,
每个字符串最大长度为m-1(因为还要留一个位置存
放‘\0”)。
例如:
char name[7][4]={“SUN”, “MON”, “TUE”, “WED”,
“THU”, “FRI”, “SAT”};
数组name是一个二维字符数组,可以看成是7个一维
字符数组。
41/77
18:44
C
程序设计基础教程
第七章多维数组
数组name如图所示:
如果要输入“MON”这个字符串,可使用下面的语句:
printf(“%s”, name[1]);
name[1]相当于一维数组名,name[1]是字符串“MON”
的起始地址,也就是二维数组第1地的起始地址(注意
行数是从0算起的)。
42/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-6】 阅读下面的程序,了解二维字
符数组与一维数的关系。
/*exam7_6.c 二位字符数组的改变*/
#include <stdio.h>
#include <conio.h>
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();
}
43/77
18:44
C
程序设计基础教程
第七章多维数组
程序运行结果:
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”,然后把该
行输出。
44/77
18:44
C
程序设计基础教程
第七章多维数组
name 字符数组改变前和改变后对比图:
45/77
18:44
C
程序设计基础教程
第七章多维数组
C语言的库函数中提供了一些用于字符串运算的函数,
这些函数大部分放在头文件string.h中。除gets和puts
函数以外,常用的函数有以下几种:
1. 字符串拷贝函数strcpy。
将一个字符串复制到一个字符数组中。
例如:
strcpy(name1, “Apple”);
其作用是将“Apple”这个字符串复制到name1数组中。
说明:
①在向name1数组复制时,字符串结束标志“\0”一起被
复制到name1中。
46/77
18:44
C
程序设计基础教程
第七章多维数组
②可以将一个字符数组中的字符串复制到另一个字
符数组中去。
例如:strcpy(name1, name2);
注意:
使用strcpy(name1, name2)函数时,数组name2的大
小不能大于数组name1的大小。
【例7-7】 字符串拷贝,将一个字符串复制到另一个
数组中去。
/*exam7_7.c 字符串拷贝*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
47/77
18:44
C
程序设计基础教程
第七章多维数组
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]);
}
48/77
18:44
程序运行结果:
Result is:
1---C_Lanquage
2---apple
apple uage
C
程序设计基础教程
第七章多维数组
2. 字符串连接函数strcat。
将两个字符串连接成一个字符串。
语法形式为: strcat(name1, name2);
结果是将name2中的内容连同结束符连接到name1数组
的后面。
例如:有数组name1和name2分别如下:
char name1[13]={“pear”};
char name2[6]={Apple};
执行:strcat(name1, name2);后,name中的内容如图:
49/77
18:44
C
程序设计基础教程
第七章多维数组
3. 字符串比较函数strcmp。
比较两个字符,其语法形式为:
strcmp(字符串1,字符串2)
如果字符串1=字符串2,则函数值为0,
如果字符串1>字符串2,则函数值为一个正整数;
如果字符串1<字符串2,则函数值为一个负整数;
从两个字符串中第一个字符开始逐个进行比较
(按字符的ASCII码大小比较),直到出现不同
的字符或遇到“\0”为止。
50/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-8】 输入两个字符串,并比较它们的大小。
/*exam7_8.c 字符串比较*/
#include <stdio.h>
#include <string.h>
#include <conio.h>
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);
51/77
18:44
C
程序设计基础教程
第七章多维数组
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"
52/77
18:44
C
程序设计基础教程
第七章多维数组
4. 大小写字母转换函数。
作用:把字符串中的大写字母改成小写,或把小写
改成大写。
语法: strlwr(name);
strupr(name);
其中name为字符串数组名。
53/77
18:44
C
程序设计基础教程
第七章多维数组
§7.5 数组作为函数的参数
§7.5.1 数组元素作为函数的参数
将数组元素作为函数的实参,函数的形参为简单变量。
这种方法又称为“传值”方式,数组元素的作用相当于
简单变量。实参的值单向传递给形参。
【例7-9】 阅读下面的程序,观察数组元素作为实参
的作用。
/*exam7_9.c 数组元素作为实参*/
#include <stdio.h>
#include <conio.h>
float Expfun1(float a,float b,float c);
54/77
18:44
C
程序设计基础教程
第七章多维数组
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();
}
55/77
18:44
C
程序设计基础教程
第七章多维数组
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);
}
56/77
18:44
C
程序设计基础教程
第七章多维数组
程序运行结果:
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。
57/77
18:44
C
程序设计基础教程
第七章多维数组
§7.5.2
数组名作为函数的参数
将数组名作为函数的实参,函数的形参为数组。
这种方法又称为“传址”方式,因为数组名代表的就
是数组在内存中的首地址,实参与形参可以“双向传
递”,调用函数时,是把实参在内存中的首地址传递
给形参,其结果相当于同一数组采用了两个不同的数
组中。
【例7-10】 阅读下面的程序,观察数组名作为实参的
作用。
/*exam7_10.c 数组名作为实参*/
#include <stdio.h>
#include <conio.h>
58/77
18:44
C
程序设计基础教程
第七章多维数组
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();
}
59/77
18:44
C
程序设计基础教程
第七章多维数组
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);
}
60/77
18:44
C
程序设计基础教程
第七章多维数组
程序运行结果:
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
61/77
18:44
发数
生组
了元
变素
化的
。值
在
调
用
前
后
C
程序设计基础教程
第七章多维数组
形参数组和实参数组共占用一段内存单元。
如图所示:
形参数组并不另外分配内存单元,只是共享实参
数组的数据。
62/77
18:44
C
程序设计基础教程
第七章多维数组
§7.6 程序范例
例7-11 线性查找,利用随机函数生成20个50以内大
小的数据,从键盘输入一个整数,用线性查找方法
在数组中查找,根据查找的结果,输出相应的信息。
注:线性查找法,把数组中的每一个元素与输入的
关键字作比较。
/*exam7_11.c 线性查找随机数*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
63/77
18:44
C
程序设计基础教程
第七章多维数组
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)
64/77
18:44
C
程序设计基础教程
第七章多维数组
{
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!!");
}
65/77
18:44
C
程序设计基础教程
第七章多维数组
程序运行结果:
Enter your number:34
Found in a[1]
Array element is:
47 34 26 2
17 38
3 47 17
8 38 46
49
37
2
5
A
12
求:(1)所有元素的和;

7
【例7-12】 有一个4×5的
矩阵如下所示:
(2)打印出所有大于
平均值的元素。
66/77
18:44
49
49
47
9
6 4
1 3
0 4
6 9
C
45
40
9  13
8 7 
10 2 

5 3 
程序设计基础教程
第七章多维数组
可以设计两个函数,一个用于计算机所有元素的和
及平均值add-ave(),另一个用于打印所有大于平均
值的元素Prt-up()。
程序如下:
/*exam7_12.c 矩阵计算*/
#include <stdio.h>
#include <conio.h>
int add_ave(int m,int n,int arr[ ]);
void Prt_up(int m,int n,float average,int arr[ ]);
67/77
18:44
C
程序设计基础教程
第七章多维数组
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();
}
68/77
18:44
C
程序设计基础教程
第七章多维数组
int add_ave(int m,int n,int arr[ ])
{
int i;
int total=0;
for (i=0;i<m*n;i++)
total=total+arr[i];
return(total);
}
69/77
18:44
C
程序设计基础教程
第七章多维数组
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;i<m;i++)
{
printf("\n");
for (j=0;j<n;j++)
if (arr[i*n+j]>average)
printf("arr[%d][%d]=%d\t",i,j,arr[i*n+j]);
}
}
70/77
18:44
C
程序设计基础教程
第七章多维数组
程序运行结果:
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]=5
add_ave 的作用是对任意大小的矩阵求出它所有元
素的和,Prt_up的作用是打印所有大于某个值的数
值元素。形参m和n是矩阵的行数和列数,形参
average代表某个值,在此代表数组元素的平均值,
形参arr[ ]为一个维数组。
71/77
18:44
C
程序设计基础教程
第七章多维数组
【例7-13】 输入一系列字符(不大于1200个),计
算并输出所输入的字符个数与行数,输入时以感叹号
“!”作为结束符。
分析:可使用一个数组string来接收所输入的字符。
Winput()——把输入的字符放到数组string中
Findline_char()——计算输入字符的行数和字符数
(以回车换行为标志)。
Output()——打印输入的行数和字符数。
程序如下:
/*exam7_13.c 字符输入计数*/
#include <stdio.h>
#include <string.h>
72/77
18:44
C
程序设计基础教程
第七章多维数组
#include <conio.h>
#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();
}
73/77
18:44
C
程序设计基础教程
第七章多维数组
void Winput()
{ c=getchar();
while(i<Max-1 && c!=End)
{ string[i]=c;
c=getchar();
i++;
}
if (string[i-1]=='\n')
string[i]='\0';
else
{ string[i]='\n';
string[i+1]='\0';
}
}
74/77
18:44
C
程序设计基础教程
第七章多维数组
void FindLine_Char() /*行计数*/
{ i=0;
Num=0;
c=string[i];
while(c!='\0')
{ if(c=='\n')
Line++;
else
Num++;
i++;
c=string[i];
}
}
75/77
18:44
C
程序设计基础教程
第七章多维数组
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
注意:输入时回车换行符没有作为字符计入字数个
数中。
76/77
18:44
C
程序设计基础教程
第七章多维数组
小结 :
本章介绍了数组的概念及使用方法,应重点掌握以下
几个方面的内容:
(1)数组元素的作用和数组名的作用。
(2)字符串的含义及处理方式。
(3)多维数组的定义及使用方法。
(4)数组元素在内存中的存放方式及占用多少内存空间。
(5)数组元素与数组名作为函数参数有什么区别。
77/77
18:44
C
程序设计基础教程