if(a[i]>a[j])
{tem=a[i];
a[i]=a[j];
a[j]=tem;}}
例题4:
查找问题.(折半查找法)
例题5141-7.4
例题6:
围绕着山顶有10个洞,一只兔子和一只狐狸各住一个洞,狐狸总想吃掉兔子。
一天兔子对狐狸说,你想吃我有一个条件,你先把洞编号1到10。
你从第10号洞出发,先到第1号洞找我,第二次隔一个洞找我,第三次隔两个洞找我,以后依次类推,次数不限。
若能找到我,你就可以饱餐一顿,在没找到我之前不能停止。
狐狸一想只有10个洞,寻找的次数又不限,哪有找不到的道理,就答应了条件。
结果就是没找着。
假定狐狸找了1000次.
0
1
2
3
4
5
6
7
8
9
1
1
1
1
1
1
1
1
1
1
7.2二维数组的定义和引用
1.二维数组的定义
形式如下:
类型说明符 数组名[常量表达式1][常量表达式2]
Inta[3][4];
数组a中共有12个数组元素.
a|a00,a01,a02,a03|
|a10,a11,a12,a13|
|a20,a21,a22,a23|类似于线性代数中的矩阵.
说明:
1、其中常量表达式1是第一维下标的长度(行数),常量表达式2是第二维下标的长度(列数)。
2、数组元素在内存中是“按行存放”的,即先顺序存放第一行的元素,再存放第二行,以此类推,存放在内存中的一个连续的空间内。
a00a01a02a03a10…a23
3、可以把2维数组看作是一种特殊的1维数组:
它的元素又是一个1维数组。
如:
数组a可以看作3个一维数组
a[0]a00,a01,a02,a03
a[1]a10,a11,a12,a13
a[2]a20,a21,a22,a23
多维数组:
a[2][3][4]相当于在三维直角坐标系中的一组数.
2.二维数组元素的引用
一般形式:
数组名[行下标][列下标]
说明:
1、在引用数组元素时,它的行、列下标可以是常量,变量或表达式,其值只能是0~元素个数-1之间的整型值。
(同1维数组:
注意不要越界)
2、对基本数据类型的变量所做的操作,也都适用于同类型的二维数组元素。
3.二维数组元素的初始化
1、按行分段赋值
类型说明符数组名[常量表达式1][常量表达式2]={{第一行初值表},{第二行初值表},……}
inta[2][3]={{1,2,3},{4,5,6}};
即把每个初值表中的数据按顺序赋给各行的各个元素。
2、按行连续赋值
类型说明符数组名[…][…]={初值表}
即按各个元素在内存中的先后顺序赋值。
Inta[2][3]={1,2,3,4,5,6};
说明:
1、可以只对部分元素初始化,未赋值的元素值为0。
如:
inta[2][3]={1,2,3};
2、如果对全部元素初始化,则可省略行数,但不能省略列数。
Inta[][3]={1,2,3,4,5,6};
Intb[][3]={1,2,3,4};则系统自动补足相应的0.例子b0.c
程序举例:
1.在二维数组a中选出各行最大的元素组成一个一维数组b。
a=31687654321110810251237b=(8710837)
h1.c
2.题目:
求一个3*3矩阵对角线元素之和
3.求2维数组中第2大的数组元素.
4.P153—7.7
7.3字符数组
1.字符数组的定义
一般形式为:
char数组名[常量表达式1][常量表达式2]……
一维字符数组---用来存放和处理一个字符串
二维字符数组---用来存放和处理多个字符串
2.字符数组的初始化
1、为每个元素指定初值,放入初值表中
chara[5]={‘h’,’e’,’l’,’l’,’o’};
说明:
√如果给全部元素赋初值,可以省略元素个数。
Chara[]={‘m’,‘o’,‘r’,‘n’,‘i’,‘n’,‘g’}
√如果给部分元素赋初值,则元素个数不能省略,未赋值的元素值为‘\0’。
2、使用字符串常量为字符数组初始化
charb[]={”hello”};(在内存中占6字节)
√{}可以省略。
√元素个数可以省略。
√用字符串方式赋值比用字符逐个赋值要多占一个字节,系统自动在字符串末尾加一个’\0’.
chara[]={‘h’,’e’,’l’,’l’,’o’};(在内存中占5字节)
★如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串。
3.字符数组的引用:
字符型1维数组可以整体引用,单独引用.
charc[]={“”};
printf(“%s”,c);
字符型2维数组可以看作由字符串组成的一维数组并引用.
chara[2][20]={“hello”,“china”};
Printf(“%s”,a[0]);ar.c
4.字符数组的输入输出
除了使用初始化给字符数组赋值外,还可以通过一些函数给它们赋值,也可以使用函数输出数组元素。
字符数组的输出:
printf()函数
1、用格式符号“%c”对数组中元素进行逐个输出。
2、用格式符号“%s”对数组(字符串)进行整体输出。
说明:
√输出的时候不输出’\0’。
√用“%s”格式符输出字符串时,printf函数输出项是字符一维数组名或者在2维数组虚拟的某个一维数组元素.
√输出时遇到第一个’\0’就结束。
Chara[]={‘a’,’\0’,’b’};
Printf(“%s”,a);
输出结果为a
Chara[]={‘a’,’b’,’c’};
Printf(“%s”,a);
输出结果不可以预料
字符数组的输入:
1、用格式符号“%c”输入一个字符。
Scac.c不可以用回车或者空格来分格字符.
2、用格式符号“%s”输入整个字符串。
说明:
√用scanf输入时,系统会自动加上’\0’,要注意数组的长度。
(数组名本身代表地址,所以不需要&).
√用一个scanf函数输入多个字符串时,每个字符串之间以空格分隔。
Sca.c
5.字符串处理函数
(1)字符串输出函数---puts
√格式:
puts(字符数组)
其中字符数组可以直接用字符串常量代替。
√功能:
把字符数组中所存放的字符串,输出到标准输出设备中去,输出时候用‘\n’取代字符串的结束标志‘\0’,即输出完换行.
√使用说明:
*字符串中允许包含转义字符。
*该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。
(2)字符串输入函数──gets()
√格式:
gets(字符数组)
√功能:
从键盘上读取1个字符串将其存储到字符数组中。
函数的返回值为该数组的首地址。
√使用说明:
*该函数不能输入转义字符,但允许输入空格,而scanf()函数都不允许。
(3)字符串连接函数---strcat
√格式:
strcat(字符数组1,字符数组2)
其中字符数组2也可以直接用字符串常量代替。
√功能:
把“字符数组2”连接到“字符数组1”后面,结果存放到“字符数组1”中。
√使用说明:
*“字符数组1”要足够大,以便容纳连接后的目标字符串。
*连接后“字符数组1”中的字符串的结束标志'\0'被“字符数组2”的第一个字符覆盖,只在新串的最后保留一个'\0'。
Chara[20]=”hello”,b[]=”China”;
Strcat(a,b);
a“helloChina”cat.c
(4)字符串拷贝函数---strcpy
√格式:
strcpy(字符数组,字符串)
其中“字符串”可以用字符数组代替。
√功能:
将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。
√使用说明:
*字符数组必须定义得足够大,以便容纳复制过来的字符串。
复制时,连同结束标志'\0'一起复制。
*除初始化时候之外不能用赋值运算符“=”将一个字符串或一个字符数组直接赋值给一个字符数组,只能用strcpy()函数来处理。
注意:
可以将字符串中前若干个字符复制到字符数组中,格式为strncpy(字符数组,字符串,n).strcpy.c
(5)字符串比较函数──strcmp()
√格式:
strcmp(字符数组1,字符数组2)
√功能:
比较两个字符串的大小。
字符串1=字符串2,函数值为0。
字符串1<字符串2,函数值为负整数。
字符串1>字符串2,函数值为正整数。
√使用说明:
*如果一个字符串是另一个字符串从头开始的子串,则母串为大。
computercompute>0
AfricaAsia<0
00707<0
0070070
*不能使用关系运算符“==”来比较两个字符串,只能用strcmp()函数来处理。
(6)求字符串长度──strlen
√格式:
strlen(字符数组)
√功能:
求字符串的实际长度,返回值就是字符串的长度(从开头到结束标志,但不包含结束标志)。
Charc[]=”hello”;
实际长度为6,strlen返回值为5
charc[]={‘a’,’\0’,’b’}
strlen==1;
strlen.c
(7)大写字母转换成小写字母──strlwr
√格式:
strlwr(字符串)
√功能:
将字符串中的大写字母转换成小写,其它字符不转变。
(8)小写字母转换成大写字母──strupr
√格式:
strupr(字符串)
√功能:
将字符串中小写字母转换成大写,其它字符不转变。
upr.c
程序举例:
1输入五个国家的名称按字母顺序排列输出。
2.p153-7.12
3.判断一个字符串是否是另外一个的子串zic.c
4.p130—14lx.c
5.编写一个程序:
将s所指的字符串中的ASCII值为偶数的字符删除,串中剩余的字符形成一个新串放在t所指的数组中。
如:
s中的内容是“ABCDEFG12345”,则删除后的结果是“ACEG135”