数组.docx

上传人:b****2 文档编号:2145006 上传时间:2022-10-27 格式:DOCX 页数:6 大小:16.85KB
下载 相关 举报
数组.docx_第1页
第1页 / 共6页
数组.docx_第2页
第2页 / 共6页
数组.docx_第3页
第3页 / 共6页
数组.docx_第4页
第4页 / 共6页
数组.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

数组.docx

《数组.docx》由会员分享,可在线阅读,更多相关《数组.docx(6页珍藏版)》请在冰豆网上搜索。

数组.docx

数组

数组

【引例:

任意读入3个整数,然后逆序输出。

main()

{intx,y;

scanf(“%d%d”,&x,&y);

printf(“%d,%d\n”,y,x);

}

【数据量增大时,数据之间的关系若组织不当,即使算法再简单,程序都难以编写。

因此引入新的数据结构(即数据间的组织)数组。

数组的特点“有限、有序、同类”。

【用数组改写上例】

#defineN3

main()

{inta[N],k;

for(k=0;k<=N-1;k++)

scanf(“%d”,&a[k]);

for(k=N-1;k>=0;k--)

printf(“%d\n”,a[k]);

}

一、一维数组

1.定义

类型名数组名[整型常量];

2.说明

(1)数组名即与变量命名规则一样。

(2)定义时的[]内只能是正整型常量。

表示数组所含成员(元素)的个数。

(3)数组各元素被分配在连续空间中,低字节中存放数组的第一个元素,下标为0。

inta[5];

则数组a含有5个元素:

a[0]、a[1]、a[2]、a[3]、a[4]。

(4)TC系统对数组下标越界不报错。

注意:

下标必须在0~个数-1之间!

intn=5;

inta[n];/*n是变量*/

×

(5)数组名就是数组的首地址,即第一个元素的地址。

数组名是一个常量。

inta[5];

则a等价于&a[0]

【结论:

数组的每一个元素相当于同类型的一个普通变量。

二、数组元素的输入输出

1、数组元素初始化

(1)所有元素在定义时获得值

inta[3]={1,3,5};

或inta[]={1,3,5};

以上两种形式完全等价,即给所有元素初始化时,可以将[]内的常量省略。

*所给值的个数不能多于数组元素个数。

(2)部分元素在定义时获得值

inta[5]={2,4};

则a[0]获值2,a[1]获值4,而其余元素全都获值0。

【本学期的定义格式情况下,数组定义时若没有被初始化,则所有元素都没有值(或有不确定值);而一旦前面若干元素在定义时获得值,则其后所有元素都有默认值0。

2、数组元素在定义之后获得值

(1)获得有规律的值

一般情况,各元素值与其下标有函数关系。

例如:

让数组元素获得从2开始的连续偶数。

inta[10],k;

for(k=0;k<=9;k++)

a[k]=2*(k+1);

通常使用循环语句,循环体为赋值语句。

(2)获得无规律的值

通常使用循环语句,循环体为scanf函数语句。

for(k=0;k<10;k++)

scanf(“%d”,&a[k]);

3、数组元素的输出

(1)所有元素都被输出,用循环

for(k=0;k<10;k++)

printf(“%5d”,a[k]);

(2)输出部分元素

三、一维数组的常用算法

1、求最大值、最小值算法

例1.任意读入10个整数,输出其中的最大数。

#defineN10

main()

{inta[N],k,max;

for(k=0;k

max=a[0];

/*总是将第一个或最后一个元素认为就是最大的*/

for(k=1;k

if(a[k]>max)max=a[k];

printf(“MAX=%d\n”,max);

}

2、递推(猴子吃桃)

【输出时,以前只能从第9天……输出到第1天;如今可以随意任意一天的桃子数。

main()

{inta[11],k;/*想让a[1]存放第一天的桃子数,……a[10]存放第10天的桃子数。

a[0]浪费了*/

a[10]=1;

for(k=9;k>=1;k--)

a[k]=2*(a[k+1]+1);

for(k=1;k<=10;k++)

printf(“%d:

%d\n”,k,a[k]);

}

3、查找

(1)顺序查找(线性查找)

例1.任意读入10个整数,看看其中是否有数值99,若有,输出是第一个读入的;否则,输出“wu”。

【算法要领:

拿关键值与每一个元素进行比较,一旦找到即跳出循环……】

本题忽略了有相同值的情况,即找到第一个相等值就终止。

main()

{inta[10],k

for(k=0;k<10;k++)

scanf(“%d”,&a[k]);

/*以下用循环查找*/

for(k=0;k<10;k++)

if(a[k]==99)break;

if(a[k]==99)/*k<10或k!

=10*/

printf(“%d\n”,k+1);

else

printf(“wu\n”);

}

/*用while改写*/

main()

{inta[10],k

for(k=0;k<10;k++)

scanf(“%d”,&a[k]);

k=0;/*查找应该在指定范围内!

*/

while(k<10&&a[k]!

=99)k++;

/*范围控制在前*/

if(a[k]==99)/*k<10或k!

=10*/

printf(“%d\n”,k+1);

else

printf(“wu\n”);

}

(2)折半查找(二分法)

【算法要领:

待查找范围内的数据事先必须有序,计算出整个查找区间的中点,将对应的数组元素与关键值比对,一旦相等,则找到,出循环;否则,数据若升序排列,关键值大于对应中间元素,修改low值;关键值小于对应中间元素,修改high值。

当low>high时,表示找不到。

例如:

已有10个按升序排列的数据,任意读入一个数,看10个有序数中有无与之相等的数。

main()

{inta[10]={-90,-79,-68,-57,-44,-32,-29,-10,-9,-5};

intk,low=0,high=9,mid;

intx;

scanf("%d",&x);

mid=(low+high)/2;

while(a[mid]!

=x&&low<=high)

{if(x>a[mid])low=mid+1;

if(x

mid=(low+high)/2;

}

if(a[mid]==x)/*low<=high*/

printf("Found\n");

else

printf("Notfound\n");

}

4、排序

(1)冒泡排序(起泡)

【算法要领:

n个数最多处理n-1趟,每一趟比前一趟少比较一次。

每趟中从头到尾(或从尾到头)两两相邻的元素进行比较,升序时,前者大后者小则交换……】

例如:

任意读入10个整数,升序排列后输出。

#defineN10

main()

{inta[N],k,t,n;

for(k=0;k

scanf(“%d”,&a[k]);

/* 外循环控制趟数*/

for(n=1;n<=N-1;n++)

/*内循环控制每趟的比较次数*/

for(k=0;k<=N-1-n;k++)/*比前少1*/

if(a[k]>a[k+1])/*注意不让a[k+1]越界*/

{t=a[k];a[k]=a[k+1];a[k+1]=t;}

for(k=0;k

printf(“%6d”,a[k]);

}

(2)选择法排序

【算法要领:

n个数最多处理n-1趟,第一趟,找出最小数(升序排列)与第一个元素交换值;第二趟,找出除第一个元素以外的最小数(升序排列)与第二个元素交换值;……】

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1