- 论坛徽章:
- 0
|
我们以前学过char,int,float,double以及int和double的变体。这些数组有一个限制:在一个特定的时间内这些数据类型的变量只能保存一个数值,因此它们只能用于数量有限的数据,而在实际应用中,我们要读取和显示大量的数据。就需在一些功能强大数据类型。C语言支持一各派生数据类型,称为数组。
数组:含有相同数据类型的元素的系列集合。
以下的示例用到了数组的概念:
1 一天,一个月或一年中每个小时所记录的湿度列表。
2 某公司的职工名单列表。
3 某班学生考试成绩。
4 客户及其电话号码列表。
一维数组:
一维数组的定义方程为 type varible-name [size];
type指定了包含元素的类型,如int ,float或char等。而size则表明了数组所存储元素的最大数目。
例如:如果要用number表示5个数字的集合(3,5,69,78,125),可以这样声明变量number:
int number[5];
计算机将如下为变量保留5个存储空间的位置:
3(number0)
5(number1)
69(number2)
78(number3)
125(number4)
数组的元素可以像C语言的其它变量一样使用:
a=number[0]+10;number[4]=number[10]+number[2];number[2]=x[5]+y[10];a[0]=a[5]+a[7]-a[2*3];
数组的下标可以是整数常量,整数变量,或者是生成整数的表达式。
数组的大小必须是一个数字常量或符号常量,有的同学可能会对这样的一个程序产生疑问
#include
void main()
{
int i,a[10];
for(i=0;i
a=i;
for(i=9;i>=0;a++)
printf("%d",a);
printf("\n");
}
疑问a=i; ??? 这里的i不是一个变量吗?
大家注意,在声明里是int i,a[10].计算机开辟了10个空间给a[10],i只不过是一个代表符,在将i赋给a时,i代表一个确定的值如0,1,2...而不是变量。而下面的例子则是不行的:
int n;
scanf("%d",&n);
int a[n];
C语言只是把字符串当作字符的数组,字符串的大小表示字符的最大数目。例:
char name[10];
将name声明为字符数组(即字符串)变量,最多可以保存10个字符。如我们将“well done”这个字符串读入到字符串变量name中。字符串的每个字符都看作数组name的一个元素,在内存中按如下形式保存:
'w'
'e'
'l'
'l'
' '
'd'
'o'
'n'
'e'
'\0'
当编译器遇到一个字符串时,将把它添加空字符以作为结尾。
写程序:输入十个数,求它们的平方和。
#include
main()
{
int i;
float x[10],value,total;
/*......reading values into array......*/
printf("enter 10 real numbers\n");
for(i=0;i
{
scanf("%f",&value);
x=value;
}
/*......computation of total......*/
total=0.0;
for(i=0;i
total=total+x*x;
/*......printing of x value and total......*/
printf("%\n");
for(i=0;i
printf("x[%2d]=%5.2f\n",i+1,x);
printf("\n total=%.2f\n",total);
}
一维数组的初始化
1 编译时初始化: 和普通变量一样,在声明数组时初始化数组的元素。一般形式:type array-name[size]={list of value};
列表中的数值用逗号隔开,例
int number[3]={0,0,0};
将变量number声明为大小为3的数组,并把零赋给每个元素。如果列表中的数组少于元素的个数,只有部分元素初始化,剩余的元素自动设置为0。
数组的大小可以省略,这样编译器为所有已初始化的元素分配足够的空间。例
int number[]={32,65,87};
将number声明为大小为3的数组。
字符串数组也可以用同样的方法初始化char name[]={'j','o','h','n','\o'};
将name声明为有5个字符的数组,并用字符串'john'进行初始化,末位为空字符。我们也可以这样直接将字符串赋给数组:char name[]="john";
如果用于初始化的数值多于所声明的数组大小,编译器将产生一个错误。如int number[2]={10,554,74};不能运行,它在C语言中不合法。
2 运行时初始化: 可以在运行时显式的初始化数组。这种方法通常大于数组的初始化。例:
for(i=0;i
{
if (i
sum=0;
else
sum=1;
}
数组sum前5个元素在运行时初始化为0,而后5个元素初始化为1。
也可以用scanf之类的函数来初始化数组。
int x[3];
scanf("%d%d%d",&x[0],&x[1],&x[2]);
二维数组:
我们以前学过的数组变量只能存储数列;有时我们需要存数值表。
声明 type array-name[row-size][column-size];
列0 列1 列2
| | |
[0][0] [0][1] [0][2]
21
56
47
行0-----
[1][0] [1][1] [1][2]
58
57
96
行1-----
[2][0] [2][1] [2][2]
84
66
36
行2-----
二维数组在内存中的存储情况
数组元素可以出现在表达式中,也可以被赋值。b[1][2]=a[2][3]/2
同一维数组,二维数组也可以在使用前初始化。(1)最常用的赋值方法int a[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
(2)可以把所有的数据写在一个括号里,按数组排列的顺序对各元素赋初值。int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};结果与第一种相同,但赞成用第一种,一行对一行,不容易混淆,也容易简查。这样写的话也可以把[3]省去,但第二维的长度不能省。
(3)可以对部分赋值int a[3][4]={{1},{3},{2}};它的作用是只对各行第一列赋值,其它的自动赋值为0。
程序举例:请用二维数组编写一个程序,计算并显示上面介绍的数据表的以下信息,
(a)每个销售人员的销售总值;
(b)每种物品的销售总值;
(c)所有销售人员销售的全部物品的总值。
#define maxgirls 4
#define maxtiems 3
main()
{
int value[maxgirls][maxitems];
int girl_total[maxgirls],item_total[maxitems];
int i,j,grand_total;
/*...reading of value and computing girl_total...*/
printf("Input data\n Enter values,one at a time,row-wise\n\n");
for(i=0;i
{
girl_total=0;
for(j=0,j
{
scanf("%d",&value[j]);
girl_total=girl_total+value[j];
}
}
/*...computing item_total...*/
for(j=0;j
{
item_total[j]=0;
for(i=0;i
item_total[j]=item_total[j]+value[j];
}
/*...computing grand_total...*/
grand_total=0;
for(i=0;i
grand_total=grand_total+girl_total;
/*...printing of results...*/
printf("\n girls totals\n\n");
for(i=0;i
printf("Salesgirl[%d]=%d\n",i+1,girl_total);
printf("\n item totals\n\n");
for(j=0;j
printf("item[%d]=%d\n",j+1,item_total[j]);
printf("\n grand total=%d\n",grand_total);
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/48859/showart_431843.html |
|