1、数组数 组【引例:任意读入3个整数,然后逆序输出。】main()int x,y; scanf(“%d%d”,&x,&y); printf(“%d,%dn”, y,x);【数据量增大时,数据之间的关系若组织不当,即使算法再简单,程序都难以编写。因此引入新的数据结构(即数据间的组织)数组。】数组的特点“有限、有序、同类”。【用数组改写上例】#define N 3main()int aN,k; for(k=0;k=0;k-) printf(“%dn”, ak);一、一维数组1定义 类型名 数组名整型常量;2说明(1)数组名即与变量命名规则一样。(2)定义时的内只能是正整型常量。表示数组所含成员(元素
2、)的个数。(3)数组各元素被分配在连续空间中,低字节中存放数组的第一个元素,下标为0。int a5;则数组a含有5个元素:a0、a1、a2、a3、a4。(4)TC系统对数组下标越界不报错。注意:下标必须在0个数-1之间!int n=5;int an; /*n是变量*/(5)数组名就是数组的首地址,即第一个元素的地址。数组名是一个常量。int a5;则 a等价于&a0【结论:数组的每一个元素相当于同类型的一个普通变量。】二、数组元素的输入输出1、数组元素初始化(1)所有元素在定义时获得值int a3=1,3,5;或int a =1,3,5;以上两种形式完全等价,即给所有元素初始化时,可以将内的常
3、量省略。*所给值的个数不能多于数组元素个数。(2)部分元素在定义时获得值int a5=2,4;则a0获值2,a1获值4,而其余元素全都获值0。【本学期的定义格式情况下,数组定义时若没有被初始化,则所有元素都没有值(或有不确定值);而一旦前面若干元素在定义时获得值,则其后所有元素都有默认值0。】2、数组元素在定义之后获得值(1)获得有规律的值一般情况,各元素值与其下标有函数关系。例如:让数组元素获得从2开始的连续偶数。int a10, k;for(k=0;k=9;k+) ak=2*(k+1);通常使用循环语句,循环体为赋值语句。(2)获得无规律的值通常使用循环语句,循环体为scanf函数语句。f
4、or(k=0;k10;k+) scanf(“%d”, &ak);3、数组元素的输出(1)所有元素都被输出,用循环for(k=0;k10;k+) printf(“%5d”, ak);(2)输出部分元素三、一维数组的常用算法1、求最大值、最小值算法例1.任意读入10个整数,输出其中的最大数。#define N 10main()int aN, k, max; for(k=0;kN;k+)scanf(“%d”,&ak);max=a0;/*总是将第一个或最后一个元素认为就是最大的*/for(k=1;kmax) max=ak;printf(“MAX=%dn”,max);2、递推(猴子吃桃)【输出时,以前只
5、能从第9天输出到第1天;如今可以随意任意一天的桃子数。】main()int a11,k; /*想让a1存放第一天的桃子数,a10 存放第10天的桃子数。a0浪费了*/a10=1;for(k=9;k=1;k-) ak=2*(ak+1+1);for(k=1;k=10;k+) printf(“%d:%dn”,k,ak);3、查找(1)顺序查找(线性查找)例1. 任意读入10个整数,看看其中是否有数值99,若有,输出是第一个读入的;否则,输出“wu”。【算法要领:拿关键值与每一个元素进行比较,一旦找到即跳出循环】本题忽略了有相同值的情况,即找到第一个相等值就终止。main()int a10,k for
6、(k=0;k10;k+) scanf(“%d”,&ak); /*以下用循环查找*/ for(k=0;k10;k+) if(ak=99) break; if(ak=99) /* k10或 k!=10*/ printf(“%dn”, k+1); else printf(“wun”);/*用while改写*/main()int a10,k for(k=0;k10;k+) scanf(“%d”,&ak); k=0;/*查找应该在指定范围内!*/ while(k10&ak!=99) k+; /*范围控制在前*/ if(ak=99) /* khigh时,表示找不到。】例如:已有10个按升序排列的数据,任意
7、读入一个数,看10个有序数中有无与之相等的数。main()int a10=-90,-79,-68,-57,-44,-32,-29,-10,-9,-5; int k,low=0,high=9,mid; int x; scanf(%d,&x); mid=(low+high)/2; while(amid!=x&lowamid) low=mid+1; if(xamid) high=mid-1; mid=(low+high)/2; if(amid=x) /*low=high*/ printf(Foundn); else printf(Not foundn);4、排序(1)冒泡排序(起泡)【算法要领:n个
8、数最多处理n-1趟,每一趟比前一趟少比较一次。每趟中从头到尾(或从尾到头)两两相邻的元素进行比较,升序时,前者大后者小则交换】例如:任意读入10个整数,升序排列后输出。#define N 10main()int aN,k,t,n; for(k=0;kN;k+) scanf(“%d”,&ak); /*外循环控制趟数*/ for(n=1; n=N-1;n+) /*内循环控制每趟的比较次数*/ for(k=0;kak+1)/*注意不让ak+1越界*/ t=ak;ak=ak+1;ak+1=t; for(k=0;kN;k+) printf(“%6d”, ak);(2)选择法排序【算法要领:n个数最多处理n-1趟,第一趟,找出最小数(升序排列)与第一个元素交换值;第二趟,找出除第一个元素以外的最小数(升序排列)与第二个元素交换值;】
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1