一维数组及其应用

#一、一维数组

##1.一维数组定义形式

(1)

语法样列说明
类型标识符 数组名[整形常量表达式];int scoer[10]; //定义一个长度为十的数组①数组名的命名规则和简单变量名相同,遵循标识符的命名规则。②数组名后的整形常量表达式是用方括号括起来的,不是圆括号。如 int a[10] 是错误的。该常量表达式表示元素的个数。③常量表达式的值是整形的,用于表示数组的长度,可以是常量或者符号常量,不能是变量。

与其他变量一样,数组也需要先声明,后使用。指明数组元素的类型和数量。

  • c语言不允许对数组的大小做动态定义,如下语句是错误的:
int len;
scanf ("%d", &len);
int a[len];			//用变量作为数组的长度,为错误的应用。

(2)"下标法”引用数组元素
数组的第一个元素用a[0]表示,第二个元素用a[1]表示…,第n个元素用a[n-1]表示。

数组下标:数组名后的方括号内的数值或表达式, 用于区分数组中的不同元素。
长度为n的数组其各个元素的下标应该是0n-1,而不是1n。
For exanple:

int scoer[10];    
	scoer[0] = 80;    //给下标为0的元素赋整数值,
	scoer[1] = scoer [0];    //将scoer[0]元素的值赋给scoer[1]	
	

##2.一维数组初始化
用例子来说明,求几个数的均值。
88,91,80,79,
求以上四个数的均值。

###初始化方式 1

#inciude <stdio.h>
	int main()
	{
	float a[4] = {88, 91, 80, 79};    //给所有元素赋初始值
	float sum = 0, ave = 0;
	sum = a[0] + a[1] + a[2] + a[3];
	ave = sum / 4;
	printf("average = %.1f\n", ave);
	return 0;

本例采用“给所有元素赋初始值”的形式初始化数组。语句:

float a[4] = {88, 91, 80, 79};

将数组元素的值按顺序放在一对花括号内。

只能给数组元素逐个赋值,而不能给数组整体赋值。for example :
对长度为4的数组中所有元素赋值3,应写为:int a[4] = {3, 3, 3, 3, };
而不能贪图方便写成:int a[4] = {3};
这样只能给a[0]元素赋值3,而其他三个元素赋值0。
也不能写成:
int a[4] = 3; //错误的数组初始化形式
###初始化方式 2
给部分数组元素赋初值。求四个数的均值,并将均值放于数组的最后一个元素中。

#include <stdio.h>
	int main ()
	{
		float a[5] = {88, 91, 80, 79};      //给部分元素赋初值,最后一个元素预留给平均成绩,暂不初始化。
		float sum = 0;
		sum = a[0] + a[1] + a[2] + a[3];
		a[4] = sum / 4;
		printf("average = %.1f\n", a[4]);
		return 0;
	}

本例数组定义及初始化如下:
float a[5] = {88, 91, 80, 79};
四个数和均值都要放在同一个数组,因此数组长度为五。其中四个数已知,均值暂时未知。因此数组中四个元素的初值是可以确定的,而最后一个元素的初值不确定,因此只能对数组中的“部分元素赋初值”。
未初始化的元素a[4]的值默认为0,程序后面部分的语句计算出平均值,并将平均值赋给a[4]元素,则a[4]元素才能获得更新后的值。

若在定义时对元素进行初始化,则各数值是按照花括号内的先后顺序依次赋给数组中的各元素。未赋初值的默认值为0。
可以用以下方式对所有元素赋初值0:
int a[10] = 0;

##3. 使用循环结构存取数组
用例子来说明问题,更加直观,所以还是来一段代码。
这次我们来算5个数的均值。

#include <stdio.h>
	int main()
	{
		int a[5], i, sum;   //数组a长度为5,可以存放5个数字
		sum = 0;
		for(i = 0; i < 5; i++)    //控制数组元素的下标从0~4进行变化
		{
			scanf("%d", &a[i]);    //输入一个数字,存放到下标为i数组元素中
			sum + = a[i];
		}
		printf("The Average = %.1f\n", sum / 5.0);
		return 0;
	}
  • c语言不要求检查下标的范围。当下标超出范围时,编译器不会给出错误信息,程序也能正常运行,但会读取一些非法的内存空间,从而得到错误的结果。
  • 下标超出范围主要是因为忽略了长度为n的数组,其元素的下标是从0(n-1),而不是1n。
    常见错误如下:
//输入10个整数,保存到数组中,并逆序显示这10个数字。
#include <stdio.h>
	int main ()
	{
		int a[10], i ;
		for(i = 0 ; i < 10 ; i++)  //输入10个元素,下标从0~9
		{
			scanf("%d", &a[i]);
		}
			printf("Reveres Order :\n");
		for(i = 10; i >= 0; i--)     //下标出错,误用了a[10]元素
  		{
			printf("%d\n", a[i]);    //导致输出结果出错
		}
		return 0;
	}

错误原因已在注释中说明。正确做法是:

for (i = 9 ; i >= 0 ; i--)
{
	printf("%d\n", a[i]);
}

接下在了解一下如何用数组处理Fibonacci问题,输出数列的前20项。

#include <stdio.h>
#define N 20       //用符号常量表示数组长度
	int main ()
	{
		int i;
		int f[N] = {1, 1};
		for(i= 2; i < N ;i++)
		{
			f[i] = f[i-1] + f[i - 2];
		}
		for(i = 0; i < N; i++)
		{
			if(i % 5 == 0)    //控制每行输出5个
			{
				printf("\n");
			}
			printf("%8d", f[i]);
		}
		printf("\n");
		return 0;
	}	

对数值型数组的输入输出只针对单个元素操作,不能整体的输入或输出一个数组,假如有定义“int a[10];”则不能用“scanf("%d", a);”,也不能用"printf("%d", a);", 试图对整个数组进行输入或输出,而应该结合循环结构对元素逐个进行处理。如上例。

#二、一维数组的应用

   1.[排序](http://c.biancheng.net/cpp/html/54.html)
   2.[统计](http://blog.csdn.net/zhaoyaqian552/article/details/46882435)

送福利了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值