目录
(一)顺序查找:在一批数据中查找某数基本思想:从前向后依次与所查数比较,看是否为所找之数。
一、数组的作用
1.数组的作用
数组的作用从键盘输入一百个学生的成绩,求总成绩。
当时由此引入了循环结构,用一个变量保存成绩,循环输入,求累加。
for(i=0;i<100;i++);
scanf(“%f",&a);
s=s+a;
如果这个程序不是要求和,而是要把这一百个学生的成绩按从高到低的顺序排列,则必须要把这一百个学生的成绩都同时记录下来,也就是说,必须要设定一百个变量。
在C语言中,提供了一种方便的同时设定多个变量的数据类型,这就是数组。前提是,这多个变量必须具有相同的数据类型,比如同为int、long、float、char等等。
数组有一维数组、二维数组和多维数组
2.数组的概念
数组:具有相同类型的数据组成的序列,是有序集合,
数组中的每一个数据称:(数组元素、数组分量、下标变量)
数组元素由其所在的位置序号(称数组元素的下标)来区分。一个数组元素就是一个相对独立的变量。
注意:数组的有序性,是指数组元素存储的有序性,而不是指数组元素值有序
二、怎样定义和引用一维数组
一维数组:只有一个下标的数组。
1. 一维数组的定义
定义格式:
类型标识符 数组名标识符[常量表达式];
说明:
(1)类型标识符:数组元素的数据类型。int、long、char、float、 double等。
(2)数组名标识符:与变量的命名规则相同。
(3)常量表达式:即数组长度(数组包含元素的个数),只能是一个整型常量表达式,可以是符号常量。
2. 一维数组元素的引用
数组元素的描述:由数组名加方括号中的下标组成
即:数组名[下标]
下标:数组元素在数组中的顺序号,可以是整型常量、整型变量下或整型表达式。
取值范围:从0到(元素个数-1)*C语言不对下标越界作语法检查。
注意:
只能引用数组元素而不能一次整体调用整个数组全部元素的值。
数组元素与一个简单变量的地位和作用相似。
“下标"可以是整型常量或整型表达式。
定义数组时用到的“数组名「常量表达式1和引用数组元素时用的“数组名[下标]”形式相同,但含义不同。
int a[10];
//前面有int,这是定义数组,指定数组包含10个元素
t=a[6];
//这里的a[6]表示引用a数组中序号为6的元素
3.一维数组的初始化
含义:在定义数组的同时,对数组所有元素指定初值。初始化是编译阶段完成,不占用运行时间。
注意:用赋值语句或输入语句只能给单个数组元素指定初值,是在运行时完成,占用运行时间。
初始化数组格式:
类型标识符数组名[元素个数]={<初值列表>}
说明:①<初值列表>是用逗号分隔的数组元素的初始值(常量)②)<初值列表>中数值的类型必须与<类型标识符>一致。
Eg:对数组初始化的几种情形:
①在定义数组时,对所有数组元素赋初值。例:int a[5]={8,8,2,4,123};
②在定义数组时,对部分数组元素赋初值。例:int a[5]={7,6};等价a[0]=7,a[1]=6;其它赋0;
③若要使一个数组所有元素为零,可以写成例:int a[5]={0};括号不能省略,此格式仅限于全零数组如有:int al5]={1};只有第一个元素为1,其他全是零
④对全部数组元素赋初值时,可省数组长度,系统自动确定
4.利用数组进行数据查找
(一)顺序查找:在一批数据中查找某数基本思想:从前向后依次与所查数比较,看是否为所找之数。
#define M 10
int main()
{int a[M]={-12,0,6,16,23,56,80,100,110,115},i,n;
printf("Input a number to be searched:");
scanf"%d",&n);
for(i=0;i<M;i++)
if(a[i]==n)break;
if(i<M)printf("%d",i);
else print("数据不存在”);
}
(二)折半查找:在一批有序数据中查找某数(课后作业5.9)基本思想:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,从而较快地找到目的数。
例6.7假设在数组a中的数据是按由小到大顺序排列的:
-12 0 6 16 23 56 80 100 110 115
从键盘上输入一个数,判定该数是否在数组中,若在输出所在序号;若不在输出相应信息。
查找过程如下:
第一步:设low、mid和high三个变量,分别指示数列中的起始元素中间元素与最后一个元素位置,其初始值为low=0,high=9,mid=4,判断mid指示的数是否为所求,mid指示的数是23,不是要找的80,须继续进行查找。
第二步:确定新的查找区间。因为80大于23,所以查找范围可以缩小为23后面的数,新的查找区间为[5680100110 1151,low,mid,high分别指向新区间的开始、中间与最后一个数。实际上high不变,将low(mid=(low+high)/2)指向100,还不是要找的(low=mid+1)指向56,(mid=(low+high)/2)指向100,还不是要找的80,仍须继续查找。
第三步:上一步中,所找数80比mid指示的100小,可知新的查找区间为[5680],low不变,,mid与high的值作相应修改。mid指示的数为56,还要继续查找。
第四步:根据上一步的结果,80大于mid指示的数56,可确定新的查找区间为[801,此时,low与high都指向80,mid亦指向80,即找到了80,到此为止,查找过程完成。
若在查找过程中,出现low>high的情况,则说明,序列中没有该数亦结束查找过程。
#define M 10
输入:80 输出:The index of 80 is 6
#include<stdio.h>
#define M 10
int main()
{int a[M]={-12,0,6,16,23,56,80,100,110,115};
int n,low,mid,high,found;
low=0;high=M-1; found=0;
printf("Input a number to be searched:");
scanf("%d",&n);
while(low<=high)
{mid=(low+high)/2;
if(n==a[mid]){found=1;break;)
else if(n>a [mid]) low=mid+1;
else high=mid-1;
}
if (found==1) printf("The index of %d is %d",n,mid);
else printf("There is not %d",n);
}
三、怎样定义和引用二维数组
1.二维数组的定义
若一个一维数组,它的每一个元素亦是类型相同的一维数组时,便构成二维数组。
数组的类型相同:是指数组大小、元素类型相同。
数组的维数体现为数组元素的下标个数,一维数组元素只有一个下标,二维数组元素有两个下标。
定义形式:
类型标识符 数组名[常量表达式1][常量表达式2];
例:
float b[4][3];
定义了一个4x3的数组b,即数组为4行3列,可存放12个实型数据。
2 二维数组元素的引用
二维数组元素的引用形式:
数组名[下标1][下标2]
下标1称第一维下标(或称行号),下标2称第二维下标(或称列号)。下标从0开始变化,其值分别小于数组定义中的常量表达式1与常量表达式2。
二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。例如,float a[3][4];可以把a看作一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组:
a[0]- a[0][0] a[0][1] a[0][2]a[0][3]
a[1]-a[11[0] a[1][1] a[11[2] a[1][3]
a[2]-- a[2][0] a[2][1] a[2][2] a[2][3]
3. 二维数组的初始化
(1)分行给二维数组赋初值。((最清楚直观)
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以对部分元素赋初值
int a[3][4]={{1},{5},{9}};
int a[3][4]={{1},{0,6},{0,0,11}};
4 二维数组的初始化
(1).分行给二维数组赋初值,每个花括号内的数据对应一行元素例:int a[3][2]={{0,1},{2,3},{4,5}};
(2).将所有初值写在一个花括号内,顺序给各元素赋值。例:int a[3][2]={0,1,2,3,4,5};
(3).只对部分元素赋值,没有初值对应的元素赋0值或空字符(字符数组)
例:int a[3][2]={{1,2},{4},{5,3}};例:int a[3][2]={1,2,4,5,3};
(4).给全部元素赋初值或分行初始化时,可不指定第一维大小,其大小系统可根据初值数目与列数(第二维)自动确定;但必须指定第二维的大小。
例:int a[][2]={0,1,2,3,4,5};
int a[][2]={{1,2},{},{0,5}};
四、字符数组和字符串
1.字符数组的定义
字符数组:其元素类型为字符类型的数组,其定义与前面介绍的数组定义相同。
例如:
char s[80];定义一个有80个元素的字符数组,每个元素相当于一个字符变量:
2.字符数组的初始化
方法:将字符常量以逗号分隔写在花括号中
①在定义字符数组时进行初始化char s[7]-{'p','r' ,'o','g','r','a','m'};
②在初始化时,可以指定一部分元素,其他元素补零char s[7]= {'p','r','o','g’};
③在对全部元素指定初值时,可省写数组长度char s[ ]= {'p','r','o','g''r','a','m'};
3.字符串的概念
字符串:若干有效字符的序列;可包含转义字符、ASCII码表中的字符:形式为:用双引号括起来的字符序列;
例:"Iam a student." "Hello"
字符串的结束标志:’\0'
注:C语言无字符串类型,字符串是存放在字符数组中的。
几点说明:
(1)字符串结束标志"0'仅用于判断字符串是否结束,输出字符串时不会输出。
(2)在对有确定大小的字符数组用字符串初始化时,数组长度应大于字符串长度。
如: char s[7]={“program”};是错误的.(3)在初始化一个一维字符数组时,可以省略花括号。如:
char s8="program
(4)不能直接将字符串赋值给字符数组。下面的操作是错误的。
s="program";