目录
一.数组概念的引用
1.特点: 具有相同的数据类型
使用过程中需要保留原始数据
2.数组的定义:所谓数组就是一组具有相同数据类型的数据的有序集合
数组是一组有序数据的集合 :数组中各数据的排列是有一定规律的,下标【1】代表数据在数组中的序号
数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据放在同一个数组中
用一个数组名和下标来唯一确定数组中的元素例如,a[8]代表下标为8元素的值
二.一维数组
1.定义格式:
类型说明符 数组名[常量表达式];
2.说明: 类型说明符:数组的类型
数组名规则和变量名相同,遵循标识符命名规则
常量表达式可以包括常量和符号常量,但不能包含变量
C中不允许对数组变量大小定义
数组说明(定义[]里的数字)语句必须在可执行语句之前
常量表达式指明数组中元素的个数,必须大于0
必须用方括号!
Float score[30];
Char str[50];
Float a[3][4];
Score str a是数组名
30 50 3 4是数组长度
下标个数为数组维数
数组成员称为数组元素
数组初始化:在数组定义时为数组元素赋初值成为数组初始化
1.在定义数组时对数组元素赋以初值
方法:将数组元素的初值一次放在一对花括弧内
例如: int a[10]={2,3,5,6,7,18,20,45,43,90};
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};
- 一维数组赋初值的个数不能超过数组总元素的个数
C语言规定,只能引用单个数组元素,不能一次引用整个数组
数组元素的引用形式:数组名[下标]
说明:
下标是指在数组中第几个元素
例如:a[3]就是数组中序号为3的元素,它和简单变量地位 和作用相似
下标可以是整型常量,整型变量和整形表达式
例如:a[4]=a[0]+a[i+1];
下标的值是数组元素序号,从0开始,到0-1结束
例如:int a[10];说明数组a有十个元素a[0]到a[9]
区分数组定义和数组元素引用
数组定义时有类型说明符
一维数组的输入:
#include<stdio.h>
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf ("%d",&a[i]);
return 0;
}
一维数组的输出:
#include<stdio.h>
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
printf("%8d",a[i]);
return 0;
}
如何对数组进行引用
可以对数组中任意一个元素进行单独的输入输出,每个元素等同于一个普通常量。
数组的引用离不开循环。将数组的下标作为循环变量,通过循环,就可以对数组的所有元素逐个进行处理
三.一维数组程序举例
例子1同数组来处理求fibonacci数列问题(1,1,2,3,5,8,13)
F[0]=1(n=0)
F[1]=1(n=1)
F[n]=F[n-1]+F[n-2] (n>=2)
#include<stdio.h>
int main()
{
int i;
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1]; //用于推出数列后边的值
for(i=0;i<20;i++)
{
if(i%5==0)printf("\n"); //i%5==0 每五个就换个行
printf("%12d",f[i]); //用来输出数列的值,12d 每个数站12个
}
printf("\n");
}
例子2 已知一组数,要求对他们按由小到大的顺序排列
冒泡法基本思想:每次将相邻两个比较,将小的调到前面
如果有n个数,要进行n-1次比较
第j趟比较要进行n-j次比较
#include<stdio.h>
#define N 10
int main()
{
int a[N],i,j,t;
printf("input %D numbers:\n",N);
for (i=0;i<N;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<N-1;j++) //进行N-1次循环,实现N-1趟比较
for(i=0;i<N-1-j;i++) //在每一趟中进行N-1-j次比较
if (a[i]>a[i+1]) //对相邻两个数比较
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");
}
四.认识二维数组
一般形式 类型说明符 数组名[常量表达式1] [常量表达式2];
二维数组有两个下标
常量表达式1为行数;常量表达式为2为列数
例如 float a[3][4],b[5][10]。
注意:
一对方括号内不能写两个下标。
例如:float a[3,4] 是错的
数组元素个数必须是常量表达式,不能使用变量。
用于定义数组长度的常量表达式必须为大于零的正整数。
理解:
二维数组可以被看做一种特殊的一维数组:他的元素又是一个一维数组。
float a[3][4]:可以把a看做一个一维数组,他有三个元素:a[0]a[1]a[2]
而这三个元素又是一个包含四个元素的一维数组
存储:
C语言中,二维数组中元素在内存中排列阿顺序是按行存放的
注意:用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列关系。
而在内存中,各元素是连续存放的,不是二维的,是线性的。
初始化:
- 分行给二维数组赋初值。(最清楚直观)
Int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
- 可以将所有数据卸载一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
- 可以对部分元素赋初值
Int a[3][4]={{1},{5},{9}};
也就是对每行第一个元素赋值,然后其它的是0
也可以对每行的某个元素赋初值
Int a[3][4]={{1},{0,6},{0,0,0,11}};
也可以只对某几行元素赋初值
Int a[3][4]={{1},{5,6}};
(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}; 是等价的
在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值
引用:
二维数组元素医用与一维数组元素引用一样,也要采用下标法。
引用形式: 数组名[下标1][下标2]
说明:
下标1和下标2 可以是整型常量,整型变量和整型表达式。其编号从0开始
注意:下表不要越界
数组名a代表的是数组a在内存中的首地址,
可以用数组名a来代表数组元素a[0][0]的地址
数组名是常量,不可对他赋值
输入输出:
采用双重循环方式进行。
#include <stdio.h>
int main()
{
int a[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
return 0;
}#include <stdio.h>
int main()
{
int a[2][3],i,j;
for (i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%5d",a[i][j]);
return 0;
}
五.二维数组程序举例
将数组a,的行和列互换得到数组b
b[j][i]=a[i][j];
#include<stdio.h>
int main()
{
int a[2][3]={{1,2,3},{4,5,6}},b[3][2],i,j;
printf("array a:\n");
for (i=0;i<2;i++) //处理a数组中的一行各元素
{ for(j=0;j<3;j++) //处理a数组中某一列中各元素
{printf("%5d",a[i][j]); //输出a数组中i行i列元素
b[j][i]=a[i][j]; //将a数组元素的值赋给b数组相应元素
}
printf("\n");
}
printf("array b:\n"); //输出b数组各元素
for(i=0;i<3;i++) //输出b数组中一行中各元素
{
for(j=0;j<2;j++) //处理b数组中一列中各元素
printf("%5d",b[i][j]); //输出b数组元素
printf("\n");
}
}
六.字符数组
定义:
用来存放字符数据的数组是字符数组
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的个字符
格式:char 数组名[常量表达式]
Char c[6]
c数组具有6个元素,可以存放长度小于或等于5的字符串。
字符串的个数<=数组的元素个数
强调:字符串实际占有单元的数量等于字符串长度+1
m定义时注意考虑元素总个数应比实际长度多1
初始化:
- 用单个字符对字符数组初始化
说明:1 如果在定义字符数组时不尽兴舒适化,则数组中各元素的值是不可预料的
2.如果花括号中提供的初值个数(即字符个数)大于数组航渡,则出现语法错误;
3 .如果提供的处置个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
4.如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即’\0’)。
2. 用字符串常量对字符数组初始化
例如 char str[6]={“CHINA”}; {}可以省略,6也可以省略
说明 :
将字符串存储到字符数组中,字符串和第一个‘\0’构成有效字符串。对字符串的操作,就是对字符数组的操作。
普通数组的元素是确定的,一般用下标控制循环;而字符串使用结束符‘\0’来控制循环。
输入输出:
- 单个字符输入输出(用格式符%c或字符输入函数)
- 字符串整体或部分输入输出(用格式符%s)
Char str[6];
Scanf(“%s”,str);
输入输出必须是以字符串的地址形式出现;
也可以是字符串常量:printf(“%s\n”,”book”);
只能输入不包括空格、\t和\n的字符串;
若要输入空格,用gets函数;
数组名前不加&符号
例如char str[10];
Printf(“%s\n”,str);
不能用scanf输入带有空格的字符串
用%s输出字符串时,从输出项提供的地址开始输出,直到遇到字符串结束串‘\0’为止