学生的学籍号、棒球选手背后的号码,还有飞机的作为号码……在生活中我们经常会遇到相同类型的事务聚在一起的情况,与其逐一叫出它们的名字,还不如统一使用号码更加简单明了。
本篇博客将会为大家介绍为了提高处理效率而把具有相同类型的数据有序地组织起来的一种形式——数组。
相同类型的变量的集合,放在一起处理比较方便。这种情况下可以使用数组。
一次输入5名学生的分数,显示出他们的总分和平分,代码如下:
#include
int main()
{
int stu1 = 0;
int stu2 = 0;
int stu3 = 0;
int stu4 = 0;
int stu5 = 0;
int sum = 0;
printf("请输入5名学生的分数:");
printf("1号:");
scanf("%d", &stu1);
sum += stu1;
printf("2号:");
scanf("%d", &stu2);
sum += stu2;
printf("3号:");
scanf("%d", &stu3);
sum += stu3;
printf("4号:");
scanf("%d", &stu4);
sum += stu4;
printf("5号:");
scanf("%d", &stu5);
sum += stu5;
printf("总分:%d", sum);
printf("平均分:%.1lf", (double)sum / 5);
return 0;
}
如果学生更加的多呢,比如300人,那是不是需要创建300个变量,这样的话不仅会使写程序的效率降低,还会出现变量名的错误。
综上所说我们可以使用数组来解决,因为是同一类型的变量。
数组的声明通过指定元素类型、变量名、元素个数来进行。另外,【】中的元素个数必须是常量。
数组a的各个元素,都是int类型的对象。不允许一些元素是int类型,一些元素是bouble类型。
对于数组而言各个元素的访问都是自由的,访问元素是根据下标来的,下标表示该元素的首元素之后的第几个元素,而不是数组中的第几个元素。
下标运算符;
a[b] 从数组a的首元素算起,访问b个元素后的元素。
第一个元素的下标为0,因此将从第一个元素开始依次访问a[0]、a[1]、a[2]、a[3]、a[4]。
元素个数为n的数组的各个元素是a[0]、a[1]、……a[n-],不存在a[n]。
创建一个元素类型为int,包含5个元素的数组,依次把1、2、3、4、5赋给它们并显示,代码如下:
#include
int main()
{
int v[5];
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
v[4] = 5;
printf("v[0]=%d\n", v[0]);
printf("v[1]=%d\n", v[1]);
printf("v[2]=%d\n", v[2]);
printf("v[3]=%d\n", v[3]);
printf("v[4]=%d\n", v[4]);
return 0;
}
这样还看不出数组的优势,下面是通过for循环简化的代码:
#include
int main()
{
int i = 0;
int v[5];
for ( i = 0; i < 5; i++)
{
v[i] = i + 1;
}
for ( i = 0; i < 5; i++)
{
printf("%d ", v[i]);
}
return 0;
}
通过for循环的处理,使的程序更加的简单了。
下面我们来看看double类型的数组赋值,代码如下:
#include
int main()
{
int i = 0;
double x[7];
for ( i = 0; i < 7; i++)
{
x[i] = 0.0;
}
for ( i = 0; i < 7; i++)
{
printf("%lf ", x[i]);
}
return 0;
}
在声明变量的时候,除了的确没有必要的情况下,都要对变量进行初始化。
输出的初始化:
int a[3]={1,2,3}
数组的初始值就是那些在大括号中的、用逗号分开并逐一赋值给各个元素的值。
来看下下面的代码:
#include
int main()
{
int i = 0;
int v[5] = { 1,2,3,4,5 };
for ( i = 0; i < 5; i++)
{
printf("%d ", v[i]);
}
return 0;
}
还可以像下面这样在声明数组的时候不指定元素个数,数组会根据初始值的个数自动进行设定。
int v[]={1,2,3}
另外还有一个规则,就是用0对{}内没有赋初始值的元素进行初始化。
int v[5]={0};
当初始值的元素个数超过数组的元素个数的时候,程序就会发生错误。
int v[3]={1,2,3,4}
把数组中的元素复制到另一个数组,代码如下:
#include
int main()
{
int i = 0;
int a[5] = { 17,23,36 };
int b[5];
for ( i = 0; i < 5; i++)
{
b[i] = a[i];
}
puts("a b");
puts("-----------");
for ( i = 0; i < 5; i++)
{
printf("%d %d", a[i],b[i]);
}
}
运行结果:
程序中的第一个for语句,其作用是把a中全部元素的值依次赋给b中的元素。
C语言不支持使用基本赋值运算符=为数组赋值,就是说下面的语句是错误的:
b=a;
从键盘输入数组的值,输入int[5]数组的各元素的值并显示的程序如下代码:
#include
int main()
{
int i = 0;
int x[5];
for ( i = 0; i < 5; i++)
{
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
for ( i = 0; i < 5; i++)
{
printf("x[%d]=%d\n", i, x[i]);
}
return 0;
}
如果仅仅是输入并显示元素的值,那并没有意思。下面我们对数组进行倒序排序,代码如下:
#include
int main()
{
int i = 0;
int x[7];
for ( i = 0; i < 7; i++)
{
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
for ( i = 0; i < 3; i++)
{
int temp = x[i];
x[i] = x[6 - i];
x[6 - i] = temp;
}
puts("倒序排序了。");
for ( i = 0; i < 7; i++)
{
printf("x[%d]=%d\n", i, x[i]);
}
return 0;
}
输入5名学生的分数并显示出他们的总分和平均分,代码如下:
#include
int main()
{
int i = 0;
int tensu[5];
int sum = 0;
printf("请输入5名学生的分数。\n");
for ( i = 0; i < 5; i++)
{
printf("%d号:", i + 1);
scanf("%d", &tensu[i]);
sum += tensu[i];
}
printf("总分:%d\n", sum);
printf("平均分:%.2lf\n",(double)sum / 5);
return 0;
}
数组tensu用来保存学生的分数。同时由于下标是从0到4,因此在提示输入学生分数的时候,要使用下标值加1(即“1号:”“2号:”等)来显示。
如果学生人数由5人增加到8人时,我们需要改的地方也有点多呢,有没有更好的办法呢。肯定是有的呢我们可以使用对象式宏。
语法形式:
#define a b
该指令之后的a替换为b.
它的原理和文字处理或者编译器的替换处理是一样的,在将该指令之后的a替换为b的基础上,在进行编译与执行处理。
代码如下:
#include
#define NU 5
int main()
{
int i = 0;
int tensu[NU];
int sum = 0;
printf("请输入%d名学生的分数。\n",NU);
for (i = 0; i < NU; i++)
{
printf("%d号:", i + 1);
scanf("%d", &tensu[i]);
sum += tensu[i];
}
printf("总分:%d\n", sum);
printf("平均分:%.2lf\n", (double)sum / NU);
return 0;
}
宏名一般用大写字母来表示,本程序中的,宏名为NU,在程序中的NU被替换为5。
我刚刚提到的如果改变学生的人数怎么处理,其实很容易的呢,就是只需要将宏定义改为下面的这样即可了呢:
#define NU 8
在程序中使用使用宏,不仅能够在一个地方统一管理,而且通常为常量定义名称,还可以是程序阅读起来更加容易。
下面的代码是求最高分和最低分,即数组元素的最大值和最小值,代码如下:
#include
#define NU 5
int main()
{
int i = 0;
int tensu[NU];
int max = 0;
int min = 0;
printf("请输入%d名学生的分数\n", NU);
for ( i = 0; i < NU; i++)
{
printf("%d号:", i + 1);
scanf("%d", &tensu[i]);
}
min = max = tensu[0];
for ( i = 1; i < NU; i++)
{
if (tensu[i] > max)
{
max = tensu[i];
}
if (tensu[i]<min)
{
min = tensu[i];
}
}
printf("最高分:%d\n", max);
printf("最低分:%d\n", min);
return 0;
}
在求最大值和最小值的代码中,使用赋值运算符=。首先我们对int 类型变量n进行如下的赋值操作。
n=2.55;
因为整数n不能存放小数点之后的数字,所以其值为2。赋值表达式的判定结果,和赋值后左操作数的类型相同。
上面的程序中的学生人数都是5,虽然通过定义宏来变更学生的人数非常的简单,但是每次都需要对程序进行修改后编译。综上所说我们可以定义一个较大的数组,然后从头开始仅使用其中需要的部分。
编写一个程序输入学生的分数并显示分布情况,代码如下:
#include
#define NU 80
int main()
{
int i = 0;
int j = 0;
int num = 0;
int tensu[NU];
int bunpu[11] = {0};
printf("请输入学生人数:");
do
{
scanf("%d", &num);
if (num<1||num>NU)
{
printf("\a请输入1~%d的数:", NU);
}
} while (num<1||num>NU);
printf("请输入%d人的分数。\n", num);
for ( i = 0; i < num; i++)
{
printf("%d号:", i + 1);
do
{
scanf("%d", &tensu[i]);
if (0 > tensu[i] || 100 < tensu[i])
{
printf("\a请输入1—100的数:");
}
} while (0>tensu[i]||100<tensu[i]);
bunpu[tensu[i] / 10]++;
}
puts("\n-------分布图---------");
printf(" 100:");
for ( j = 0; j < bunpu[10]; j++)
{
putchar('*');
}
putchar('\n');
for ( i = 9; i >= 0; i--)
{
printf("%d-%d:", i * 10, i * 10 + 9);
for ( j = 0; j < bunpu[i]; j++)
{
putchar('*');
}
putchar('\n');
}
return 0;
}
所谓的多维数组,就是多个数组集合在一起形成的数据,及元素本身就是数组的数组。
前面说到的数组,其元素类型都是int 型或double型等单一类型。实际上,数组的元素也可以是数组本身。
以该数组作为元素的数组是二维数组,以二维数组为元素的数组是三维数组,也可以是更高维数组。
二维数组的生成过程,如下
下面是4行3列的数组分布图;
和一维数组一样,多维数组的所有元素/所有构成元素在内存上是排列成一条直线的。
多维数组的构成元素排列时,首先从末尾的下标开始递增。