c语言六 数组
数组
当我们需要遇到类似:统计某公司100个员工的平均工资时,如果用变量来存储这些数据(int a,
b,c,d......),虽然这非常麻烦,且易错。这时用数组x[0],x[1],x[2],x[3]......就简单多了。
在程序设计中,使用x[0]、x[1]、x[2]……x[n]表示的一组具有相同数据类型的变量集合称为数组x,数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,该下标是从0开始的(这是超级重点)。
数组可分为一维数组,二维数组,三维数组,四维数组。(二维及以上称为多维数组)
定义方式
(引用/对数组中的元素开辟了一块内存空间)
int array[5];
//类型说明符 数组名 [常量表达式];
//类型说明符表示数组中所有元素的类型,常量表达式指的是数组的长度,也就是数组中存放元素的个数。
//记住,数组用的是整数
数组初始化
(赋值)
//1直接对数组中的所有元素赋值
int array_1[5]={1,2,3,4,5};
/*
定义了5个元素,分别为且值为:array_1[0]=1; array_1[1]=2; array_1[2]=3;
array_1[3]=4; array_1[4]=5;
没有array_1[5],原因是起点是0,而且如果有那不像是变量吗?还像数组吗?
*/
//2只对数组中一部分的元素进行赋值
int array_2[5]={1,2,3};
/*
在上述代码中,定义了一个int类型的数组,但在初始化时,只对数组中的
前三个元素进行了赋值,其它元素的 值会被默认设置为0。
*/
//3对数组全部元素赋值,但不指定长度
int array_3[]={1,2,3,4,5};
/*
在上述代码中,数组i中的元素有4个,系统会根据给定初始化元素
的个数定义数组的长度,因此,数组i的长度为4。
*/
注意:
1、数组的下标是用方括号括起来的,而不是圆括号。
2、数组名的命名同变量名的命名规则相同。
3、数组定义中,常量表达式的值可以是符号常量,例如下面的定义是合法的。
int a[N]; //假设预编译命令#define N 4, 下标是符号常量
统计公司5名成员的总工资和平均工资,
#include <stdio.h>
#include <stdlib.h>
int main()
{
int people[5]={1,2,3,4,5};
int i,sum=0; //这个for循环配合sum+=是个小精髓来着
for(i=0;i<5;i++) //要记!!!!
{
sum+=people[i];
}
printf("总工资: %d\n平均工资: %d\n",sum,sum/5);
system("pause");
}
输出公司5名员工的工资情况
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int people[5]={2,3,4,5,6};
int i;
for(i=0;i<5;i++)
{
printf("people[%d]的工资为: %d\n",i+1,people[i]);
}
system("pause");
}
公司工资最高是多少?
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int people[5]={3,4,5,6,7};
int i,max=0;
for(i=0;i<5;i++)
{
if(people[i]>max)
{
max=people[i];
}
}
printf("%d\n",max);
system("pause");
}
排列公司员工工资,由小到大
原理:冒泡排序
在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似,接下来,分步骤讲解冒泡排序的整个过程,具体如下:
第一步,从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,则交换它们的位置。整个过程完成后,数组中最后一个元素自然就是最大值,这样也就完成了第一轮的比较。
第二步,除了最后一个元素,将剩余的元素继续进行两两比较,过程与第一步相似,这样就可以将数组中第二大的数放在倒数第二个位置。
第三步,依次类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int x[5]={5,78,13,54,56};
int i,j,a=0,b;
printf("排序前: ");
for(b=0;b<5;b++)
{
printf("%d\t",x[b]);
}
printf("\n");
for(i=0;i<5-1;i++) //5个元素,冒泡排序每轮一次比较得一个"最大数"
{ //剩下最后一个没法比较,也不需要比较
for(j=0;j<5-1-i;j++) //所以第一个for循环表示轮数
{ //而里面的for循环表示没一轮进行比较的次数
if(x[j]>x[j+1])
{ //第1轮 对应4次比较
a=x[j]; //第2轮 对应3次比较
x[j]=x[j+1]; //第3轮 对应2次比较
x[j+1]=a; //第4轮 对应1次比较
} //看到细节没有恰好相反,好好记吧,年轻人
}
}
printf("排序后: ");
for(b=0;b<5;b++)
{
printf("%d\t",x[b]);
}
printf("\n");
system("pause");
}
二维数组
二维数组的引用/定义方式
//类型说明符 数组名 [常量表达式1][常量表达式2];
int a[3][4]; //3行4列 共12个元素
二维数组的初始化/赋值方式
int a[2][3]={{1,2,3},{4,5,6}};
/*
1、按行给二维数组赋初值。在上述代码中,等号后面有一对大括号,大括号中
的第一对括号代表的是第一行的数组元素,第二对括号代表的是第二行的数组元素。
*/
int a[2][3] = {1,2,3,4,5,6};
/*
2、将所有的数组元素按行顺序写在一个大括号内。在上述代码中,二维数组a
共有两行,每行有三个元素,其中,第一行的元素依次为1、2、3,第二行元素依次为4、5、6。
*/
int b[3][4] = {{1},{4,3},{2,1,2}};
/*
3、对部分数组元素赋初值。在上述代码中,只为数组b中的部分元素进行了赋
值,对于没有赋值的元素,系统会自动赋值为0
b[3][4]={{1,0,0,0},
{4,3,0,0},
{2,1,2,0}}
*/
int a[][3] = {1,2,3,4,5,6};
/*
系统会根据固定的列数,将后边的数值进行划分,自动将行数定位2。
如果对全部数组元素置初值,则二维数组的第一个下标可省略,但第二个下标不能省略。
*/
二维数组的应用
#include <stdio.h>
#include <stdlib.h>
int main()
{ // 语 数 英
int people[5][3]={{78,46,84},//李
{98,46,78},//张
{84,51,74},//陈
{12,96,45},//刘
{78,95,99}};//林
printf("个人总成绩:\n");
int i,j,nSore;
for(i=0;i<5;i++)
{
nSore=0;
for(j=0;j<3;j++)
{
nSore+=people[i][j];
}
switch(i)
{
case 0:
{
printf("李同学的总成绩为: %d\n",nSore);
break;
}
case 1:
{
printf("张同学的总成绩为: %d\n",nSore);
break;
}
case 2:
{
printf("陈同学的总成绩为: %d\n",nSore);
break;
}
case 3:
{
printf("刘同学的总成绩为: %d\n",nSore);
break;
}
case 4:
{
printf("林同学的总成绩为: %d\n",nSore);
break;
}
}
}
for(i=0;i<3;i++)
{
nSore=0;
for(j=0;j<5;j++)
{
nSore+=people[j][i];
}
switch(i)
{
case 0:
{
printf("小组语文总分为: %d\t小组语文平均分为: %d\n",nSore,nSore/3);
break;
}
case 1:
{
printf("小组数学总分为: %d\t小组数学平均分为: %d\n",nSore,nSore/3);
break;
}
case 2:
{
printf("小组英语总分为: %d\t小组英语平均分为: %d\n",nSore,nSore/3);
break;
}
}
}
system("pause");
return 0;
}
多维数组
多维数组的定义与二维数组类似,其语法格式具体如下:
数组类型修饰符 数组名 [n1][n2][n3];
定义一个三维数组的示例代码如下:
int x[6][7][8];
上面的这个例子,定义了一个三维数组,数组的名字是x,数组的长度为3,每个数组的元素又是一个二维数组,这个二维数组的长度是4,并且这个二维数组中的每个元素又是一个一维数组,这个一维数组的长度是5,元素类型是int。
多维数组在实际的工作中使用不多,并且使用方法与二维数组相似,这里不再做详细地讲解,有兴趣的读者可以自己学习。