06-数组 -c语言初学系列

引子

请输入30个同学C语言的成绩,求平均分

main()
{ float stud_1,stud_2,stud_3,
           stud_4…..stud_30,aver;
  scanf(“%f”,&stud_1);
  scanf(“%f”,&stud_2);
  ………..
  scanf(“%f”,&stud_30)
  aver=(stud_1+stud_2+stud_3….
               +stud_30)/30;
}
main()
{float stud[30],aver=0;
  for (i=0;i<30;i++) 
      scanf(“%f”,&stud[i]);
  for (i=0;i<30;i++)
      aver=aver+stud[i];
  aver=aver/30;
}

要定义30个变量,很麻烦,如果学生数量有1000个呢?

数 组

6.1 一维数组的定义和引用

6.2 一维数组的初始化

6.3 多维数组的定义和使用

6.4 数组作为函数参数

§6.1 一维数组的定义和引用

一维数组的定义

定义:

类型标识符 数组名[元素个数];

如: int a[5];

它表示数组a可以存放5个整型数据

数组的定义要注意以下几个问题:

数组名的命名规则同变量名的命名,要符合C语言标识符的命名规则。

数组名后面的“[ ]”是数组的标志,不能用圆括号或其它符号代替。

数组元素的个数必须是一个固定的值,可以是整型常量、符号常量(第九讲中介绍)或者整型常量表达式。例如:int b[3*4];

一维数组的定义

数组的定义要注意以下几个问题:

定义数组时,系统将按照数组类型和个数分配一段连续的存储空间存储数组元素。例如,上述定义的a、b的存储空间为20和48个字节。

在定义数组要特别注意:绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要省略元素个数(形参和数组初始化时除外)。例如错误的写法:int n=3 , c[n] , d[ ];

数组元素的个数表示数组最多可以存放的数据。在定义int a[5]时,数组a最多可以存放5个整型数据,分别放入a[0]、a[1]、a[2]、a[3]、a[4]中,其中0~4称作数组的下标。数组的下标从0开始,小于元素个数,所以当定义数组a含有5个元素时,使用数组元素a[5]是错误的。

引用:

数组必须先定义后使用。

在数组的使用时要注意:C语言规定只能逐个引用数组元素,而不能一次引用整个数组。

数组元素引用的一般形式是:

数组名[下标]

下标可以用整型常量、整型变量或者整型表达式,其范围从0开始,小于等于“元素个数-1”。

当定义 int n=1,a[5]; 以下用法是正确的

a[0]=0; a[n]=n; a[n+1]=n+1; a[2*2]=8;

由此可见,数组名后中括号内的内容在不同场合的含义是不同的:在定义时它代表数组元素的个数,其它情况则是下标(与数组名联合起来表示某一个特定的数组元素)。

数组元素存放是按照下标的顺序按次序存放的

例6.1 将数字0~4放入一个整型数组,并逆序输出数组

 #include <stdio.h>
 void main()    
 { int i,a[5];
   /*给数组中元素赋值*/
   for (i=0;i<5;i++)
         a[i]=i;
   /*逆序输出数组中元素值*/
   for (i=4;i>=0;i--)
         printf (“%3d”,a[i]);
   printf(“\n”);
  }
 运行结果 :4  3  2  1  0

一维数组的存储示意图

static char a[2]={‘A’,’B’};
static int b[2]={67,68};
static long c[2]={18,112};

数组元素的使用方法与同类型的变量的使用方法相同。数组常用循环语句来处理

例6.2 输入10个整数,输出最大数。

#include <stdio.h>
void main()    
{ int i,array[10],big;
  /*给数组中所有元素赋值  */
  for(i=0;i<10;i++) 
        scanf(“%d”,&array[i]);
 /*找出数组中最大的元素 */
  big=array[0];
  for(i=1;i<10;i++) 
        if(array[i]>big) big=array[i];
  printf (“The biggest is %3d\n”,big);
  }

举一反三 :

从键盘输入三个数放入一维数组a[3]中,然后按从小到大的顺序排序并输出。

§6.2 一维数组的初始化

一维数组的初始化:

数组的初始化的一般形式如下:

类型标识符 数组名[元素个数]={元素值表列};

例如:float x[3]={1.5,3.2,9};
等价于:  float x[3];
                  x[0]=1.5 ; x[1]=3.2 ; x[2]=9;

说明:

元素值表列,可以是数组所有元素的初值,也可以是前面部分元素的初值。例如: int a[5]={1,2,3};

当数组为整型时,初始化未确定初值的元素,其值为0

当对全部数组元素赋初值时,元素个数可以省略。但 “[ ]”不能省。例如:char c[ ]={‘a’,’b’,’c’};

程序L6_3.C功能:一维数组初始化的几种形式。

#include <stdio.h>
void main()    
{ int n;
  int a[5]={0,1,2,3,4};
  int b[5]={1,2};
  float c[ ]={1,2,3,4,5};
  for (n=0;n<5;n++)    printf(“%5d”,a[n]);
  printf(“\n”);
  for (n=0;n<5;n++)    printf(“%5d”,b[n]);
  printf(“\n”);
  for (n=0;n<5;n++)    printf(“%5.1f”,c[n]);
  printf(“\n”);}
 运行结果 :0      1      2      3      4
                      1      2      0      0      0
                   1.0   2.0   3.0   4.0   5.0

注意:数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个元素一个元素地赋值。

例如下列赋值方式是错误的:

       main()
       { int a[5];
         a[5]={1,2,3,4,5};
         ………..
        }

正确:

main()
{ int a[5]={1,2,3,4,5};
 ……….
}

用数组来处理Fibonacci数列问题

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%6 ==0) printf(“\n”);
         printf(“%8d”,f[i]);
       }
}

例题

输入A,B,C,D,E五个班学生的C语言成绩,求平均分(设每班30人)

main()
{ float stud_a[30],stud_b[30],stud_c[30],
           stud_d[30],stud_e[30],aver;
int i;
for (i=0;i<30;i++)
scanf(“%f”,&stud_a[i])
for (i=0;i<30;i++)
scanf(“%f”,&stud_b[i])
…………..}
main()
{ float stud[5][30];
int i,j;
for (i=0;i<5;i++)
  for (j=0;j<30;j++)
    scanf(“%f”,&stud[i][j]);
………….
}

§6.3 多维数组的定义和使用

二维数组的定义形式为

类型标识符 数组名[元素个数1][元素个数2];

例如:

        int a[2][3],b[30][5];

数组a为2行3列6个元素,数组b为30行5列150个元素

C语言把二维数组看作是一维数组的集合,即二维数组是这样一个特殊的一维数组:它的元素是一个一维数组。例如二维数组a[2][3],可以看作由2个一维数组a[0]、a[1]组成,这两个数组元素是包含3个整型数组元素。如图所示。

二维数组的定义

由于a[0]、a[1]相当于一个一维数组名,按照一维数组的引用方式,a[0][0]、a[1][0]则分别是一维数组a[0]和a[1]的第1个元素。

二维数组中元素的存放顺序是按行存放的,即先按顺序存放第一行的数组元素,再放第二行的数组元素。例如上例数组a的存放顺序为:

二维数组的定义

假设数组a的首地址是1000,数组a的起始地址存放a[0],所以a、a[0]都等于二维数组的首地址,即一维数组a[0]的第一个元素为a[0][0]的地址,a=a[0]=&a[0][0]。

二维数组的定义

多维数组的定义方式可以按照二维数组的定义:

类型标识符 n维数组名[元素个数1][元素个数2]…[元素个数n];

n维数组就有n个“[元素个数]”。例如,定义一个三维数组 float x[2][3][4];

多维数组的存储顺序为:最左边的下标变化最慢,越往右变化越快,最右边的下标变化最快。

二维数组的引用

二维数组中元素的表示形式为

数组名[下标1][下标2]

同一维数组一样,二维数组的下标可以是整型常量、整型变量或者整型表达式。为了便于理解二维数组下标的含义,我们可以将二维数组看作一个行列式或矩阵,则下标1用来确定元素的行号(从0开始,小于等于“元素个数1”减1),下标2用来确定元素的列号(从0开始,小于等于“元素个数2”减1)。下面我们举例说明:

程序L6_4.C功能:二维数组的下标意义。

#include <stdio.h>
void main()    
  { int i,j,a[2][3],b[2][3];
  for (i=0;i<2;i++) 
      for (j=0;j<3;j++)    
            a[i][j]=i;   
for (i=0;i<2;i++)        
     for (j=0;j<3;j++)    
       b[i][j]=j;      
  printf(“array a:\n”);
  for (i=0;i<2;i++)         
{ for (j=0;j<3;j++)      
       printf(“%3d”,a[i][j]); 
    printf(“\n”);          
   }
  printf(“array b:\n”);
  for (i=0;i<2;i++)         
{ for (j=0;j<3;j++)      
        printf(“%3d”,b[i][j]); 
     printf(“\n”);         
  }
}

二维数组的初始化

按行对二维数组初始化。例如

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

按照数组的存储顺序赋初值。例如

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

只对部分元素赋值。例如

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

如果对数组元素全部赋初值,定义数组时元素个数1(最左边的元素个数)可以省略,元素个数2不能省略。例如

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

§6.4 数组作为函数参数

一维数组元素作为函数参数

一维数组中元素作为函数的实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响实参。

程序L6_5.C :输入两个数,输出其中最大数

#include <stdio.h>        
 float max(float x, float y)   
 {float z;                 
  if (x>y) z=x;            
  else z=y;               
  return z;   }
 void main( )                    
 {float a[2],c;                   
   scanf("%f,%f",&a[0],&a[1]);        
  c=max(a[0],a[1]);                      
  printf("%f,%f,the max is %f\n",a[0],a[1],c); }

修改程序例6_2.C,用数组元素替换实参x、y,验证数组元素作函数参数同样符合形参改变不影响实参。

数组名作为函数参数

数组名作为函数参数,此时形参和实参都是数组名(或者是表示地址的指针变量,见第十讲),传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一空间的同一个数组。这样形参数组修改时,实参数组也同时被修改了。

 #include <stdio.h>
void change(int x[2])
{ int t;
printf (“x[0]=%d,x[1]=%d\n”,x[0],x[1]);
t=x[0];  x[0]=x[1];  x[1]=t;
printf (“x[0]=%d,x[1]=%d\n”,x[0],x[1]);}
void main()    
{ int a[2]={3,4};
   printf (“a[0]=%d,a[1]=%d\n”,a[0],a[1]);
   change(a);
   printf (“a[0]=%d,a[1]=%d\n”,a[0],a[1]);}

数组名作为函数参数

数组名作函数参数时要注意:形参中的数组要定义,并且要求与实参数组类型一致,但是形参数组的大小(即元素个数)可以小于等于实参数组的元素个数,甚至形参数组的元素个数可以省略,而由一个专门的参数传递元素个数。例如

L6_7.C:已知一个一维数组,求其中前n个数的和。n由键盘输入

#include <stdio.h>
int sum(int array[ ],int n)
{ int i,s=0;
   for (i=0;i<n;i++)          
        s+=array[i];
   return s;}
 void main()      
{ int num  a[10]={1,2,3,4,5,6,7,8,9,10};
   scanf (“%d”,&num);
   printf("%d\n",sum(a,num)); }
/*----------------------------------------------
  程序L6_10.C功能:用选择法对10个整数排序。
  --------------------------------------*/
 #include <stdio.h>
 void sort(int array[ ],int n)
 {
  int i,j,k,t;
  for (i=0;i<n-1;i++)  
            /*进行n-1轮选择最小数的操作*/
    { k=i; /*k用来存放第i轮最小数的下标*/
      for (j=i+1;j<n;j++)
          if (array[j]<array[k]) k=j;
      t=array[k];array[k]=array[i];array[i]=t; 
        /*最小数a[k]与a[i]互换*/
     }
  }
 void main()      
 {
  int a[10],i;
  for (i=0;i<10;i++)
    scanf ("%d",&a[i]);
  sort(a,10);
  for (i=0;i<10;i++)
    printf("%4d",a[i]);
  printf("\n");
 }

练习:求一个3×3矩阵对角线元素之和

练习:打印出以下的杨辉三角形

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

课后练习

1.已知一个数组a[5]={1,2,3,4,5}、b[5]={11,4,2,7,9}

数组c[5]等于数组a、b对应元素之和。输出数组

c中个元素的值。

2. 写一个函数void change(int array[],int n),可以

将数组array中的n个元素逆序存放。即array[0]

与a[n-1]互换,array[1]与array[n-2]互换……。

3. 求两个矩阵的乘积c。已知矩阵a、b的值:

  • 4.应用数组实现输入年year、月month、日date,计算该日期是这年的第几天。方法:定义二维数组days_of_month[2][12],令该数组第一行由非闰年的12个月的天数组成,第二行由闰年12个月的天数组成,则根据年判断:闰年时i为1、非闰年时i为0,累计days_of_month[i][0]到days_of_month[i][month-1]的天数,再加上date,得到总天数。

5. 根据例6.10的算法,修改例6.8,要求按照平均成绩从高到低的顺序输出学号和平均分。提示:对平均分aver排序,当aver元素互换时,学号num元素对应互换。

6. 如果选择1,调用例6.9的输入函数input();选择2,调用void search(long num[],float aver[],int n),该函数可以根据输入的学号输出该学生的各课成绩和平均分;选择3,调用例6.9的输出函数output();选择0,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。

该程序只有当输入选择为“0”时结束,否则返回主菜单

ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。

06-数组-自己使用的C语言教程PPT-适合老师备课或者自学.pptx-C文档类资源-CSDN下载


 

 全部课程的PPT已经整理好了,需要的童鞋可以点击下载
总-自己使用的C语言教程PPT-适合老师备课或者自学-15篇PPT合集.zip-C文档类资源-CSDN下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锁住子锁不住

老少爷们向前冲!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值