说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

数值数组-C语言教程

HTML文档下载 WORD文档下载 PDF文档下载
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

 

在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本章介绍数值数组。

7.1 一维数组的定义和引用

7.1.1 一维数组的定义方式

在C语言中使用数组必须先进行定义。

一维数组的定义方式为:

    类型说明符 数组名 [常量表达式];

其中:

类型说明符是任一种基本数据类型或构造数据类型。

数组名是用户定义的数组标识符。

方括号中的常量表达式表示数据元素的个数,也称为数组的长度。

例如:

    int a[10];           说明整型数组a,有10个元素。

    float b[10],c[20];   说明实型数组b,有10个元素,实型数组c,有20个元素。

    char ch[20];         说明字符数组ch,有20个元素。

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

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];

7.1.2 一维数组元素的引用

数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。

数组元素的一般形式为:

    数组名[下标]

其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。

例如:

a[5]

a[i+j]

a[i++]

都是合法的数组元素。

数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。

例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量:

    for(i=0; i<10; i++)

           printf("%d",a[i]);

而不能用一个语句输出整个数组。

下面的写法是错误的:

printf("%d",a); 

【例7.1】

 

main(){  int i,a[10];  for(i=0;i<=9;i++)      a[i]=i;  for(i=9;i>=0;i--)      printf("%d ",a[i]);}

【例7.2】

 

main(){  int i,a[10];  for(i=0;i<10;)      a[i++]=i;  for(i=9;i>=0;i--)      printf("%d",a[i]);}

【例7.3】

 

main(){  int i,a[10];  for(i=0;i<10;)      a[i++]=2*i+1;  for(i=0;i<=9;i++)printf("%d ",a[i]);  printf("\n%d %d\n",a[5.2],a[5.8]);}

   本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作,C语言允许用表达式表示下标。 程序中最后一个printf语句输出了两次a[5]的值,可以看出当下标不为整数时将自动取整。

7.1.3 一维数组的初始化

给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。

数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。

初始化赋值的一般形式为:

    类型说明符 数组名[常量表达式]={值,值……值};

其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。

例如:

    int a[10]={ 0,1,2,3,4,5,6,7,8,9 };

相当于a[0]=0;a[1]=1...a[9]=9;

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};

7.1.4 一维数组程序举例

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

【例7.4】

 

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的值。

【例7.5】

 

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",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以后各个元素排序。

 

7.2 二维数组的定义和引用

 

7.2.1 二维数组的定义

 

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。

二维数组定义的一般形式是:

    类型说明符 数组名[常量表达式1][常量表达式2]

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。

例如:

    int a[3][4];

说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

a[0][0],a[0][1],a[0][2],a[0][3]

    a[1][0],a[1][1],a[1][2],a[1][3]

    a[2][0],a[2][1],a[2][2],a[2][3]

二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。 如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。

即:

先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。

 

7.2.2 二维数组元素的引用

 

二维数组的元素也称为双下标变量,其表示的形式为:

    数组名[下标][下标]

其中下标应为整型常量或整型表达式。

例如:

    a[3][4]

表示a数组三行四列的元素。

下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

【例7.6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

 

Math

80

61

59

85

76

C

75

65

63

87

77

Foxpro

92

71

70

90

85

可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:

 

main(){  int i,j,s=0,average,v[3],a[5][3];  printf("input score\n");  for(i=0;i<3;i++){      for(j=0;j<5;j++)	  { scanf("%d",&a[j][i]);	    s=s+a[j][i];}      v[i]=s/5;      s=0;   }  average =(v[0]+v[1]+v[2])/3;  printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]);  printf("total:%d\n", average );}

程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。

7.2.3 二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。

例如对数组a[5][3]:

1) 按行分段赋值可写为:

        int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };

2) 按行连续赋值可写为:

        int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

    这两种赋初值的结果是完全相同的。

【例7.7】

 

main(){  int i,j,s=0, average,v[3];  int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};  for(i=0;i<3;i++)      { for(j=0;j<5;j++)	    s=s+a[j][i];	    v[i]=s/5;	    s=0;      }average=(v[0]+v[1]+v[2])/3;  printf("math:%d\nc languag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]);  printf("total:%d\n", average); }

对于二维数组初始化赋值还有以下说明:

1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。

        例如:

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

    是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:

        1 0 0

2 0 0

3 0 0 

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

赋值后的元素值为:

    0 1 0

0 0 2 

3 0 0 

2) 如对全部元素赋初值,则第一维的长度可以不给出。

        例如:

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

可以写为:

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

3) 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。

如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:

a[0]

a[1]

a[2]

对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。

必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

 

苹果再发力:推Apple Pay,或将引发新一轮支付变革 CausalImpact,谷歌开源的R时域因果关系分析工具 腾讯云总裁陈磊:互联网和传统企业互联网化是主线 不得不看,苹果Pay技术大起底! 详解Apple Pay:一大波iOS原生应用正在逼近! 高性能微信公众平台开发 【先锋】事务、高性能,王涛谈打造超越MongoDB的NoSQL 浅谈互联网数据中心海量运营之道 一篇文章读懂开源web引擎Crosswalk Facebook创建新开源组织TODO,Google、Twitter等继续捧场 微软明日将启动第二轮裁员 涉及所有的事业部 IBM推出Watson Analytics 将人机对话带进企业决策 参与2014中国移动开发者大调查 MDCC门票等你拿 手游开发经验谈:付费体系决定游戏收成好与坏? 惠普推出全新ProLiant Gen9服务器 腾讯安全出杀手锏 搭建全国最大Wi-Fi开放平台帮助网友免费蹭网 云与数据安全实践尽在ISC 2014(免费门票) 开源的对决,MapR将Apache Drill引入企业应用 令程序员费解的10个语言特性 走进雅虎北京全球研发中心:五年光阴缔造雅虎全球创新引擎 超强集成游戏编辑器!开源跨平台引擎Wave 求别再侵犯儿童隐私!FTC狠罚Yelp和TinyCo 华为应用市场助力开发者 软硬结合造就强大生态系统 【CTO俱乐部看板研修班北京站现场速递】看板方法:渐进变革的过程 《近匠》不背单词,用“沉浸”征服英语学习 ETpl——强复用、灵活、高性能的JavaScript模板引擎 MDCC 2014大会日程概览发布 最新嘉宾议题揭秘 终于来了,微信企业号正式开启公测! 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究 谷歌Kubernetes专访:未来BigTable开发只是课后习题 首届“最具价值CTO”评选来啦!我们在找你! 有谁知道《斯托克代尔悖论》的内容? 使用VB6.0编程设置IIS5.0服务器 谁有InstallShield,包括汉化界面,中文语言包和注册码,200分回报 freedorm格式数据窗口打印问题,字太长如何自动换行, 一个头痛问题。 做过政府审计软件的请帮帮忙,怎么从十来套不同表结构的数据库导数据到一个固定表结构的数据库呢? 如何让菜单可用或不可用?急啊~~ Lotus中的js问题 哪有Oracle中文最新版下载呀, 请问各地delphi认证培训的费用是多少? re:下雨了 怎么样加提示框 借一个问题!XP里面网卡怎么工作不正常 请问有什么办法破VBA的密码 CEdit 背景色的问题 100 分 请问vb中浏览器控件是在哪个文件中,另外我想在vb程序中加入介绍性网页,应该怎么办! 了解jpeg的请进 高分急求数据库解决方案! 请问vb中浏览器控件是在哪个文件中,另外我想在vb程序中加入介绍性网页,应该怎么办! 存储类 在MainFrame里怎么得到一个指向MyDoc类的指针? 上海的弟兄前来领分!!!! 能ping通代理服务器,但不能上网(ftp等都不能用)。有那些原因! 谁有api做的串口通讯例子 很简单的Temporary used 问题,就是搞不清,请哪位详细点拨一下,铭谢 DataGrid中使用HyerLinkColumn,请怎样动态传递多个参数或改变DataNavigateUrlFormatString的值(在线等待答复) 在winsock1.1下怎样监听网络事件。(请给个API 的 sample ) 高分急求数据库解决方案! 高分求助软件稳定性问题! 高分请教exej4的问题!~ 我的代码可以被编译吗? 十万火急(在线等)关于发邮件问题!多谢了(最后50分了) 感谢各位的鼎力支持!!! 急:如何让sqlload使用命令行方式,把数据库中的指定几个表导出?(在线) 单元全局变量与工程全局变量有什么区别 问一个关于JSP和XML结合的问题. 请问怎样用ASP连接Mysql数据库,急! 有没有j2ee的qq群??? win2k里的smtp服务器,怎么是需要身份验证的? 怎样让智能ABC记住输入的词组呢? 你在delphi中,用到了多少面向对象的知识? Dragover事件什么情况下触发 北京还是深圳 如何实现两个类互相访问--急! <Code Complete>怎么翻译好呢? 急!!!!!在dcom中向数据源添加数据报错,为什么? 有哪些方法可以在ASP.NET设计文件.aspx(html格式WEB)与脚本文件.aspx.cs(.aspx.vb)中传递数,或者说传递变量的值!!! 我用CDONTS.NewMail发邮件,怎么判断邮件发送成功或者是不成功呢? asp.net的客户端键盘的事件处理的有关问题? 请问怎么在程序里随机产生CLSID代码?$$$$$$$$$$$$$$$$ 急! 如何定义一个全局的类的实例,请高手指招? 头脑风暴真的可以解决所有问题?如题 地球生存的多少年谢谢了,大神帮忙啊 发表权的名词解释 下面几个头脑风暴问题,1现在有什么功能手机是没有的但是人们又需要?2不给你钱你怎么过一天?3你穿越到了古代,地点是监狱,该监狱的犯人一刻钟以后要斩头,你会怎么办? 我们生活在地球的表面还是里面? 抵消权的名词解释是什么? 这两个微分方程的特解都一样吗?说明下理由 olt 的发光功率我这测得OLT光功率最高才3点多个DB,距离+5还有点差距,请问怎么提高,是更换光模块么?我最近看了点资料 说是PON模块分型号的 有10KM的 发光功率在2-3DB,20KM的 发光功率在5-7DB,我想 地球生存了多少年?000 地球以前的美 揶揄的汉语拼音是什么啊 COMME des garcons中文怎么发音? 地球的美在何处? 中兴 OLT c300 发光功率? 举例英,法,美三国资产阶级革命的领导人及革命中颁布的重要文件 已知一次函数y=x+m与反比例函数y=m+1/x(m≠-1)的图象在第一象限内的交点为P(Xo,3)(1)求p点的作标 谁了解comme des garcons 这个牌子?如题~请达人介绍下此品牌,去香港买是否便宜? 反渗透直饮水机是什么样子的机子啊? 地球的美与破坏 comme des garcons 这个牌子怎么读?好像是法文,还有marc jacbos这个品牌~ 奇函数y=f(x)的图像在x=0处有定义,则f(0)=0 地球美不美 哪种天气细菌不容易繁殖 处于分裂状态的细胞染色体有哪些变化? 永恒是什么意思?时间就定格在这一秒、“假如时间是永恒的,那么这一秒是最终的结束”“可是,下一秒呢?”打了双引号的一句话是全连起来的、是什么意思?求解 净水机处理过的污水能够饮用吗?有些好奇 分裂期时细胞内的染色体如何改变具体到染色质如何形成染色体 永恒的意义其实是一个宗教问题,我只是在网上粗略看了一些宗教的介绍,基本都有一个核心内容,就是 信者得救 ,好像都提倡信者死后可永恒,但不信者,有得下地狱,有的要轮回之类,可是在另外 地球为什麽是圆的 细胞分裂时,染色体的变化最明显,染色体先()再分裂 永远和永恒的意思是一样的么? 为什麽地球是圆的? 《山居夏日》高骈(唐) 头脑风暴,少年智力开发报里的一道题有AB两辆汽车同时从甲乙两站相对而行,两车第一次在距离甲站40千米处相遇,相遇后两车保持原速继续行进,各自到达乙甲两站后沿着原路返回,第二次在距 为什麽地球是个圆的 高骈号什么 来几个头脑风暴的问题 月亮是地球的什麽? 改错:1、We have a little time.We are late for school.2、how are your borther?3Are you good to kids 两情相悦才是长久时是什么意思?感情是可以培养的? 第一财经的头脑风暴,为什么换主持人了?袁岳不是北京人么? 若f(x)是奇函数,f(x)在x=0处有定义,则f(0)=? comme des fuckdown 简述什么是头脑风暴,头脑风暴如何训练?我从《教育心里学》这本书中看到的,但他没有对这一词做任何解释,请您帮助我好吗? 怎样写山水田园诗?是怎样写,不是写出来 于某留做万年镜,为官当学万青山是什么意思 有所为,有人说该词语除了正确的意思之外还有一种容易让人误解的意思,在下不知道是什么. 典型山水田园诗有哪些 头脑风暴数学题在400米的跑道上举行400米跑比赛,跑道每道宽1.25米,相邻的两圈外一圈起跑线要比内一圈起跑线前移多少米? We are_____international school for children of 5-12.(a) 高骈是什么朝代的诗人?骈怎么念? 食盐的酸碱度? ‘有所为,有所不为. 保留意见审计报告. Homme Comme des Dansens*是什么牌子? 地球还要生存多久?拜托各位大神 急求报告名词解释 结合具体问题说明头脑风暴 在资源被过度消耗的情况下,地球上的城市生存的方向有哪些? 年度审计报告 清华大学附属中学在浙大招老师 录用者桐庐干部乔迁摆宴 专家:人情往来易生永康首座500千伏输变电所明年开建宁波出台国内首个网购争议处理办法(组杭州萧山错案四名当事人已提国家赔偿申浙江温岭村民收获“巨无霸”番薯 重达韩亚空难最后一名留医伤者出院 共留医民调称8成俄人认为俄腐败程度高 地方默克尔电话疑遭美安全机构窃听 致电奥俄总理:乘直升机上班因交通拥堵韩亚空难最后一名留医伤者出院 共留医俄罗斯总理访问安徽 拿相机拍照恐怖嫌犯\"白寡妇\"家庭照被曝光 日本上传网络短片宣示钓鱼岛“主权”抗议“歧视性”抓黑工 伦敦中国城短暂韩国国防部突搜网络司令部广东龙川镇纪委书记撞死人叫侄子顶包 黄坤明任中央宣传部副部长(图|简历)中国高考英语改革引发存废之争王岐山:不让有问题者心存侥幸 不允许19岁女孩把自己包装成富家女 梦想嫁我国古代“窗”字多省城45个警营今日上午开放欧曼GTL登陆“雪龙号”“认识火灾,学会逃生”农民宅基地或可入市流转济莱城际快客运行两周人气火爆黄莱画展周末举行甜蜜从早晨开始全会后政治局常委密集发声痔疮不手术贴贴就祛除一块热表牵出一团乱账各部门要为推进改革“做答案”上哪儿找天生的一对呐?如何化解网络时代家教危机?冬天已到警惕前列腺疾病危害老人健康李钲皓:经常上网浏览热点话题西部两强演火爆冲突 伊巴欲卡拳击恶汉北约出版新季度赛博安全状态观察报告皮肤白斑,一抹就好!本月社保费申报缴费期顺延美专家:美军普天间机场若无法搬迁将固
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘