Menu Close

C语言 – 数组及其应用

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引(下标)访问。

所有的数组都是由连续的内存位置组成。最低的地址对应第一个数组元素,最高的地址对应最后一个数组元素。

C语言数组

数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。

声明数组

在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:

type arrayName [ arraySize ];

这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。

例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:

double balance[10];

现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

例如:
a[5];
a[i+j];
a[i++];
都是合法的数组元素。

初始化数组

在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。

如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。

因此,如果:

double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。

下面是一个为数组中某个元素赋值的实例:

balance[4] = 50.0;

上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。

以下是上面所讨论的数组的的图形表示:

C语言对数组的初始化赋值还有以下几点规定:

  • 1) 可以只给部分元素赋初值
    当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。
    例如:
    int a[10]={0,1,2,3,4};

    表示只给 a[0]~a[4]5 个元素赋值,而后 5 个元素自动赋 0 值。

  • 2) 只能给元素逐个赋值,不能给数组整体赋值
    例如给十个元素全部赋 1 值,只能写为:
    int a[10]={1,1,1,1,1,1,1,1,1,1};

    而不能写为:

    int a[10]=1;
  • 3) 如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数
    例如:
    int a[5]={1,2,3,4,5};

    可写为:

    int a[]={1,2,3,4,5};

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:

double salary = balance[9];

上面的语句将把数组中第 10 个元素的值赋给 salary 变量。

例1.数组的赋值和数组元素的访问

#include <stdio.h>
  
int main () {
 
   int n[ 10 ]; /* n is an array of 10 integers */
   int i,j;
  
   /* initialize elements of array n to 0 */         
   for ( i = 0; i < 10; i++ ) {
      n[ i ] = i + 100; /* set element at location i to i + 100 */
   }
    
   /* output each array elements value */
   for (j = 0; j < 10; j++ ) {
      printf("Element[%d] = %d\n", j, n[j] );
   }
  
   return 0;
}

数组类型说明应注意以下几点

1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

2) 数组名的书写规则应符合标识符的书写规定

3) 数组名不能与其它变量名相同
例如:

main()
{
  int a;
  float a[10];
  ……
}

是错误的。

4) 方括号中常量表达式表示数组元素的个数,如 a[5]表示数组 a 有 5 个元素。

但是其下标从 0 开始计算。因此 5 个元素分别为 a[0],a[1],a[2],a[3],a[4]。

5) 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。
例如:

#define FD 5
main()
{
  int a[3+2],b[7+FD];
  ……
}

是合法的。

但是下述说明方式是错误的。

main()
{
int n=5;
int a[n];
……
}

6) 允许在同一个类型说明中,说明多个数组和多个变量。
例如:

int a,b,c,d,k1[10],k2[20];

可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合 scanf 函数逐个对数组元素赋值。

如下例所示

例2.利用scanf函数对数组进行赋值并求出最大值

main()
{
  int i,max,a[10];
  printf("input 10 numbers:\n");
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  max=a[0];
  for(i=1;i<10;i++)
  if(a[i]>max) max=a[i];
  printf("maxmum=%d\n",max);
}

 

  • 本例程序中第一个 for 语句逐个输入 10 个数到数组 a 中。 然后把 a[0]送入 max 中;
  • 在第二个 for 语句中,从 a[1]到 a[9]逐个与 max 中的内容比较,若比 max 的值大,则把该下标变量送入 max 中,因此 max 总是在已比较过的下标变量中为最大者;
  • 比较结束,输出max 的值。
READ  C语言结构体数组的定义和操作

例3.输入十个整数,按从大到小顺序排列

[content_control]

 main()
{
    int i,j,p,q,s,a[10];
    printf("\n input 10 numbers:\n");
    for(i=0;i<10;i++)
       scanf("%d",&a[i]);
    for(i=0;i<10;i++)
   {
       p=i;q=a[i];
    for(j=i+1;j<10;j++)
      if(q<a[j]) { p=j;q=a[j]; }
    if(i!=p)
    {
     s=a[i];
     a[i]=a[p];
     a[p]=s;
    }
    printf("%d\t",a[i]);
   }
} 

 

本例程序中用了两个并列的 for 循环语句,在第二个 for 语句中又嵌套了一个循环语句。第一个 for 语句用于输入 10 个元素的初值。

第二个 for 语句用于排序。本程序的排序采用逐个比较的方法进行。在 i 次循环时,把第一个元素的下标 i 赋于 p,而把该下标变量值 a[i]赋于 q。然后进入小循环,从 a[i+1]起到最后一个元素止逐个与 a[i]作比较,有比a[i]大者则将其下标送 p,元素值送 q。

一次循环结束后,p 即为最大元素的下标,q 则为该元素值。若此时 i≠p,说明 p,q 值均已不是进入小循环之前所赋之值,则交换 a[i]和 a[p]之值。

此时 a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对 i+1 以后各个元素排序。

[/content_control]

 

例4.计算用户输入数据的平均值

// Program to find the average of n numbers using arrays

#include <stdio.h>
int main() {

  int marks[10], i, n, sum = 0, average;

  printf("Enter number of elements: ");
  scanf("%d", &n);

  for(i=0; i < n; ++i) {
    printf("Enter number%d: ",i+1);
    scanf("%d", &marks[i]);
          
    // adding integers entered by the user to the sum variable
    sum += marks[i];
  }

  average = sum / n;
  printf("Average = %d", average);

  return 0;
}

结果

Enter n: 5
Enter number1: 45
Enter number2: 35
Enter number3: 38
Enter number4: 31
Enter number5: 49
Average = 39
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in C语言教程

Related Posts