温习:三种循环结构
while(条件表达式) 循环体
do
{
循环体
}while(条件表达式);
for(表达式1;表达式2;表达式3) 表达式1
{ while(表达式2)
循环体 {
} == 循环体
表达式3
}
第七章 数组
【一维数组的定义与引用】
之前讲到的数据基本上都是属于基本类型(整型、字符型、实型)的数据,C语言还提供了构造类型的数据,他们有数组类型、结构体类型和共用体类型。构造类型数据是由基本类型数据按照一定规则组成的,因此他们又被称为“导出类型”。
本章只介绍数组。数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。我们会用到数组的下表符号[]。
定义数组的方法:int a[100]; --→这一语句表示开了一个大小为100个int的数组a
例:结合之前学过的for循环,输入a[0]到a[10],让后倒着输出。
解:首先因为0到10一共有11个数,所以至少开11个数的数组
int a[11];
然后以for循环的形式依次输入a[0],a[1],...,a[10]
for(i=0;i<11;i++)
scanf("%d" , &a[i]);
倒着输出 == 从a[10]一直到a[0]输出,也是用for循环
for(i=10;i>=0;i--)
prnitf("%d\n" , a[i]);
上面分别就是一维数组定义与引用的方法了~~
【一维数组的初始化】
对数组元素的初始化可以用以下方法实现。
(1)在定义数组时对数组元素赋初值。例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
(2)可以只给一部分元素赋值。例如:
int a[10]={0,1,2,3,4}; --没有赋初值的元素全为0
(3)在对全部元素赋初值时,由于数据的个数已经确定,因此可以不指定数据长度。例如:
int a[5]={1,2,3,4,5};
可以写成
int a[]={1,2,3,4,5};
第二种写法中,花括号中有5个数,系统就会据此自动定义a数组的长度为5。
例题:输入n个数,给他们从小到大排序,然后输出。
【二维数组的定义和引用】
二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式];
二维数组在内存空间中其实是连续的,但是在抽象的空间中应该是这样的(以a[3][4]为例):
----------------------------------------
| a[0][0] a[0][1] a[0][2] a[0][3] |
| a[1][0] a[1][1] a[1][2] a[1][3] |
| a[2][0] a[2][1] a[2][2] a[2][3] |
----------------------------------------
对应的为3行4列~
例如:
float a[3][4],b[5][10];
二维数组的引用:
二维数组元素的表示形式为
数组名[下标][下标]
数组元素可以出现在表达式中,也可以被赋值,例如:
b[1][2] = a[2][3]/2;
--二维数组里面的每一个元素就相当于一个变量
【二维数组的初始化】
可以用下面的方法对二维数组初始化。
(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};
这种方法效果与第(1)种方法相同(因为在内存空间中二维数组也还是连续的)。但是以第一种方法为好,一行对一行,界限清楚。用第二种方法如果数据多,写成一大片,容易遗漏,也不易检查。
(3)可以对部分元素赋初值。例如:
int a[3][4] = {{1},{5},{9}};
1 0 0 0
5 0 0 0
9 0 0 0
int a[3][4] = {{1},{0,6},{0,0,11}};
1 0 0 0
0 6 0 0
0 0 11 0
(4)如果对全部元素都赋初值(及提供全部初始数据),则定义数组时对第一位的长度可以不指定,但第二维的长度不能省略。例如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
与下面的定义等价:
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
系统会根据数据总个数和第二维的长度算出第一维的长度。数组一共有12个元素,每行4列,显然可以确定行数为3。
在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例如:
int a[][4]={{0,0,3},{},{1,10}};
这样的写法,能通知编译系统;数组共有三行。数组个元素为
0 0 3 0
0 0 0 0
0 10 0 0
二维数组程序举例:
(1)page.139 例7.5
(2)小明爬山问题(扩展)
3
4 2
5 6 9
1 4 7 3
8 5 6 1 2
9 3 4 5 6 7
5 8 9 3 2 1 7
2 4 5 6 7 3 2 1
8 7 6 3 5 9 7 5 3
1 4 6 3 2 7 6 8 9 4
小明爬山摘果子,每次只能从下面一层做到上面一层他的左上侧或者右上侧的,他每到一个点就能得到他所在那个点的果子的重量,问:按上述规则从第十层走到第一层,小明最多能够采到的果实的重量是多少?
f(i,j) = max{f(i+1,j),f(i+1,j+1)}
【字符数组】
字符数组的定义方法与前面介绍的类似。例如:
char c[10];
c[0]='I';c[1]=' ';c[2]='a';c[3]='m';c[4]=' ';
c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';
【字符数组的初始化】
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
也可以是没有"10":
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};
因为编译系统自动会识别。
也可以定义和初始化一个二维数组,例如:
char diamond[5][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{'*',' ','*'},{' ',' ','*'}};
字符串的初始化还可以这么写
char c[10]={"I am happy"};
字符形式的输出一个字符串练习:page.141 例7.6 ,例7.7
字符串的结束标志'\0'
【字符数组的输入输出】
字符数组的输入输出可以有两种方法。
(1)逐个字符输入输出。用格式符"%c"输入或输出一个字符,如例7.6
(2)将整个字符一次输入或输出。用"%s"格式符,意思是对字符串(string)的输入输出。例如:
char c[]={"China"};
printf("%s" , c);
在内存中数组c的状态如下:
--------------------------------------
| C | h | i | n | a | \0 |
--------------------------------------
字符串的输入:
char c[100];
scanf("%s" , s); --为什么字符串不仅能够一次性的输入输出,而且输入还没有"&"呢?
→地址概念+字符串这么输出有意义~
【字符串处理函数】
puts(字符数组)
gets(字符数组)
strcat(字符数组1,字符数组2)
strcpy(字符数组1,字符串2)
strncpy(字符数组1,字符串2,n)
strcmp(字符串1,字符串2)
strlen(字符串)
strlwr(字符串)
strupr(字符串)
例题:page.151 例7.9
课后练习:7.3,7.5