C语言程序设计教程课件:数组_第1页
C语言程序设计教程课件:数组_第2页
C语言程序设计教程课件:数组_第3页
C语言程序设计教程课件:数组_第4页
C语言程序设计教程课件:数组_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数组5.1一维数组5.2二维数组5.3字符数组5.4数组与函数本章小结

5.1一维数组

【问题】从键盘任意输入N个数,给这些数排序,排序后得到的数如何存放?【分析】从键盘输入N个数并给这些数排序很简单,但是,排序后得到的数如何存放就比较麻烦。在我们学了数组之后,解决这个问题就会很容易。

5.1.1一维数组的定义

在C语言中,使用数组前必须先进行数组的定义。定义一个一维数组的一般形式为:

数据类型数组名[常量表达式];

例如:

inta[6];

定义了一个一维整型数组,数组名为a,有6个元素,这6个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]、a[5]。

【说明】

(1)数组名与变量的命名方法相同,用合法的标识符表示。

(2)方括号中的“常量表达式”又称“数组长度”,用整型常量表达式表示,可以包括常量和符号常量,但不能包括变量。

(3)数组元素的下标从0开始,最大为元素个数减1,不能越界。

(4)同一数组中所有元素的数据类型都是相同的。

5.1.2一维数组元素的引用

在定义了数组之后,就可引用其中的数组元素。其引用形式为:

数组名[下标]

下标可以为整型常量、符号常量,也可以包含变量。下标值如果为小数,C语言编译时将自动取整。

C语言中只能逐个引用数组元素,而不能一次引用整个数组。

请注意区分数组定义和数组元素的引用,两者从形式上看有些相似,但含义却完全

不同。例如:inta[5];是定义一个有5个元素的整型数组,而a[3]是对下标为3的元素的引用。数组定义是说明语句,前面有类型关键字,而元素引用出现在表达式中,前面没

有类型关键字。数组定义时,方括号中是常量表达式,而元素引用时,方括号中是一般表达式。

设计程序时,通常用循环变量控制数组元素的下标,来实现数组元素的引用。

【例5-1】将数字1~10存入一个整型数组a中并输出。

运行结果如图5-1所示。图5-1例5-1运行结果

5.1.3一维数组的基本操作

一维数组定义后,系统将按数组类型和元素个数开辟一组连续的存储单元,用于依次存放每个数组元素。数组名表示该连续存储单元的首地址。例如定义inta[10];后,系统将在内存中开辟10个连续的整型存储单元,存放10个元素,数组名a表示该连续存储单元的首地址&a[0]。

对数组元素赋值一般有两种方式:一种是在数组定义时就给数组元素赋以初值;另一种方式是用赋值语句或输入语句使数组元素取得值,这在程序运行中进行。

对一维数组元素的初始化赋值通常可以采用以下方式进行。

(1)对数组的全部元素赋初值。

例如:inta[2]={1,2};

将数组元素的初值依次放在一对花括号内,经过上述定义及初始化之后,a[0]=1,a[1]=2。

(2)对数组的部分元素赋初值。

例如:intb[4]={2,4,6};

只给前3个元素赋初值,其余1个元素的值为0。如果数组定义时没有进行初始化赋值,则所有元素的值都是随机的。

(3)对全部数组元素赋初值时,可以不指定数组的长度。

例如:inta[]={1,2,3};

(4)当数组指定的元素个数少于初值的个数时,作语法错误处理。

例如:intc[3]={1,2,3,4,5};

是不合法的,因为c数组只能有3个元素,却给了5个初始值。

5.1.4一维数组的应用

【例5-2】利用数组计算fibonacci数列的前10个数,即1,1,2,3,5,…,并按每行打印5个数的格式输出。

运行结果如图5-2所示。图5-2例5-2运行结果

【例5-3】从键盘输入10个数,求平均数并输出所有大于平均数的数。

运行结果如图5-3所示。图5-3例5-3运行结果

【例5-4】输入一个正整数n(1<n≤10),再输入n个整数,用选择法将它们从小到大排序后输出。

选择排序法的基本思路为:对于给定的一组数据,每次选择最小的数据放在数组的当前位置,直至最大的数据结束。

运行结果如图5-4所示。图5-4例5-4运行结果

【例5-5】在数组中查找一个给定的数。

输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“NotFound”。

运行结果如图5-5所示。图5-5例5-5运行结果

5.2二维数组

在实际应用中,很多问题的数据是二维或多维阵列,如矩阵、二维表格等。C语言允许使用二维或多维数组,多维数组的元素有多个下标。多维数组最具代表形式的是二维数组,它由数组名及表明行数和列数的下标构成,即数组元素有两个下标。

5.2.1二维数组的定义与初始化

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

数据类型数组名[行数][列数];

例如:

intb[1][2]; /*定义b为1行2列的整型数组*/

chara[3][4]; /*定义a为3行4列的字符型数组*/

floatd[5][6]; /*定义d为5行6列的实型数组*/

数组b有1*2=2个元素,数组a有3*4=12个元素,数组d有5*6=30个元素。与一维数组定义中元素个数必须为常量表达式相同,二维数组定义中的行数和列数也必须为常量表达式,不能包含变量。

像一维数组元素一样,二维数组元素的行下标和列下标均从0开始。例如,上面定义的数组a有3行4列,其元素有:

实质上,二维数组可以看做由一维数组嵌套而成,即当一维数组的每个元素又是一个类型相同的一维数组时,就组成了二维数组。例如,inta[3][4]可以看成:一维数组inta[3]的三个元素a[0]、a[1]、a[2]又都是有四个元素的一维数组(行数组),a[0]、a[1]、a[2]分别是它们的数组名。数组a[0]的元素有a[0][0]、a[0][1]、a[0][2]和a[0][3];数组a[1]的元素有a[1][0]、a[1][1]、a[1][2]和a[1][3];数组a[2]的元素有a[2][0]、a[2][1]、a[2][2]和a[2][3]。

同样,三维数组可以看成是一维数组的各元素由二维数组构成。

5.2.2二维数组元素的引用

二维数组元素的引用形式如下:

数组名[行下标][列下标]

下标用来标识数组元素在数组中的位置。下标可以是整型常数、有值变量或表达式,如:s[2][n+3],a[i][j]等,但不能写成s[2,1+3],a[i,j]的形式。与一维数组相似,二维数组也只能逐个访问数组元素,而不能访问整体数组、整行或整列。程序设计时通常用两重循环的循环变量分别控制数组元素的行下标和列下标,实现对二维数组元素的引用。

【例5-6】定义1个3*2的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a:

运行结果如图5-6所示。图5-6例5-6运行结果

5.2.3二维数组的基本操作

1.二维数组的存储

二维数组定义后,系统也将为二维数组按其类型和元素个数开辟连续的存储单元。由于二维数组有行列结构,而内存单元是顺序(线性)排列的,因此必须按一定的规律存放二维数组的元素。C语言规定:二维数组元素按行存储,即一行接一行存储。例如,整型数组a[3][2]共有6个整型存储单元。

2.二维数组的初始化

二维数组可以在数组定义时,给数组元素赋以初值。操作方法如下:

(1)分行给二维数组赋初值。

(2)按存储顺序连续赋初值。

(3)分行对部分元素赋初值,未赋初值的元素自动取0值(对实数是0.0,对字符型是'\0')。

(4)按存储顺序对全部或部分元素赋初值,省略行数,系统将自动计算行数。

5.2.4二维数组的应用

【例5-7】将矩阵a转置后存入矩阵b。

矩阵转置是行列互换,其关键语句为b[i][j]=a[j][i];。

运行结果如图5-7所示。图5-7例5-7运行结果

【例5-8】不借助另外的矩阵,将矩阵a转置。

【分析】不借助另外的矩阵,将一个矩阵转置,要求是一个方阵,即将i行j列的元素与j行i列的元素互换。但应注意,下标i、j不能完全遍历,否则矩阵将转置两次等于还原。

运行结果如图5-8所示。图5-8例5-8运行结果

【例5-9】自定义一个函数day_of_year(year,month,day),计算并返回year(年)、month(月)和day(日)对应的是该年的第几天。

【分析】先判断是否为闰年,然后再计算具体天数。

运行结果如图5-9所示。图5-9例5-9运行结果

5.3字符数组

5.3.1字符数组与字符串字符数组即用来存放字符或字符串的数组。

1.字符数组的定义一维字符数组的定义、引用、初始化与其他类型的一维数组一样。如:charstr[80];定义一个含有80个字符型元素的数组str。

2.字符数组的初始化

(1)字符数组初始化的基本方法:逐个给字符数组中的各元素赋值,这与数值数组的初始化方法相同。

例如:chart[5]={'H','a','p','p','y'};

staticchars[6]={'H','a','p','p','y',0};

0代表字符'\0',也就是ASCII码为0的字符

staticchars[6]={'H','a','p','p','y','\0'};

(2)如果对全体元素赋初值,则可以省略长度说明。

如:charch[]={'h','e','l','l','o'};

这时数组ch的长度自动定为5。

字符数组初始化的基本方法一般都没有存储 '\0' 字符,这样的字符数组不能作为字符串处理。要想使得初始化以后的字符数组可以作为字符串处理,要么指出并增加字符数组的长度,以便在数组尾部自动存储 '\0' 作为字符串结束标志(在'\0'较多的情况下,以第一个'\0'作为字符串结束标志);要么在初值之后加上 '\0' 字符。

如:charch[]={'h','e','l','l','o','\0'};

3.字符串的初始化存储

字符串的初始化存储是指用字符串直接给字符数组赋初值。

(1)一维字符数组的字符串的初始化存储。

如:charch[]={"happy"};

也可以省去花括号,直接写成:

charch[]="happy";

这种方式比逐个字符赋初值书写起来方便得多。此时,数组ch实际有6个而不是5个元素,因为编译程序在处理字符串时,自动在字符串的末尾加上'\0',以表示字符串的结束,'\0'会占用一个字节的空间。我们在程序中可以依靠检测'\0'来判定字符串是否结束。

通常,字符数为n的字符串需占用n+1个字符空间。与上例等价的形式为:

charch[6]={"happy"};

(2)二维字符数组的字符串的初始化存储。

例如:chars[3][6]={"happy","hello","hi"};

结果是每行存储一个字符串。

5.3.2字符串的输入输出

1.逐个输入、输出字符串中的字符

字符串的输入、输出一般有两种方法:一种方法是使用scanf和printf函数的格式符"%c";另一种方法是使用getchar和putchar函数逐个输入和输出字符数组中字符。它们的不同点在于:使用scanf和printf函数可以一次输入和输出多个字符,而使用getchar和putchar函数一次只能输入和输出一个字符。

【例5-10】使用scanf和printf函数输入、输出字符数组中的字符。

运行结果如图5-10所示。图5-10例5-10运行结果

2.字符串函数

C语言提供了除已介绍的用于输入、输出的scanf、printf、gets和puts函数外,还提供了字符串拷贝、连接、比较等字符串处理函数。应当指出的是,使用这些函数前应在程序中包含头文件“string.h”。

1)字符串拷贝函数strcpy

函数strcpy的调用格式为:

strcpy(字符数组名,字符串)

【功能】将一个字符串复制到一个字符数组中,字符串结束标志'\0'也一同拷贝,字符串将覆盖字符数组的相应部分。本函数的返回值为字符数组的首地址。

【说明】

(1)字符数组必须定义得足够大,以便能存入指定的字符串。字符数组名若换成字符数组元素地址,将从该元素处开始复制。

(2)字符串可以是字符串常量、字符数组名、字符数组元素地址等,代表源字符串。

(3)  strcpy(字符数组名,字符串,整数)形式只将字符串前整数个字符和 '\0' 复制到字符数组。

【例5-11】将一个字符串复制到另外一个字符串中。

运行结果如图5-11所示。图5-11例5-11运行结果

2)字符串连接函数strcat

函数strcat的调用格式为:

strcat(字符数组名,字符串)

【功能】把字符串连同'\0' 连接到字符数组的后面,字符数组的'\0' 取消,结果存放在字符数组中。本函数的返回值为字符数组的首地址。

【说明】

(1)字符数组必须定义得足够大,以便能存入指定的字符串。字符数组名若换成字符数组元素地址,将从该元素处开始复制。

(2)字符串可以是字符串常量、字符数组名、字符数组元素地址等,代表字符串。

【例5-12】连接两个字符串。

运行结果如图5-12所示。图5-12例5-12运行结果

3)字符串比较函数strcmp

函数strcmp的调用格式为:

strcmp(字符串x,字符串y)

【功能】比较两个字符串,返回值为比较结果:

当字符串x= 字符串y时,函数返回值为0;

当字符串x > 字符串y时,函数返回值为一正数;

当字符串x < 字符串y时,函数返回值为一负数。

4)测字符串的长度函数strlen

函数strlen的调用格式为:

strlen(字符串)

【功能】测字符串中字符的实际个数(不含'\0'标志),返回值为整数。

例5-13】测字符串的长度。

运行结果如图5-13所示。图5-13例5-13运行结果

5.3.3二维字符数组的应用

前面已经介绍,二维数组的每一行都是一个一维数组,第i行一维数组的数组名就是a[i],也就是第i行首地址,用它就可以访问第i行字符串。因此,用二维字符数组可以处理多个字符串问题,访问这些字符串就变成了访问一维数组。

【例5-14】输入一个字符串,分别统计其中的大写字母、小写字母、数字字符和其他字符的个数。

运行结果如图5-14所示。图5-14例5-14运行结果

5.4数 组 与 函 数

1.数组元素作为函数参数数组元素即下标变量,它的使用与普通变量并无区别。数组元素只能用作函数实参,其用法与普通变量完全相同:在发生函数调用时,把数组元素的值传送给形参,实现单向值传送。

【例5-15】写一函数,统计字符串中字母的个数。

运行结果如图5-15所示。图5-15例5-15运行结果

说明:

(1)用数组元素作实参时,只要数组元素类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。

(2)使用普通变量或下标变量作函数参数时,编译系统为形参变量和实参变量分配两个独立的内存单元。在函数调用时发生的值传送,是把实参变量的值赋予形参变量单元。

2.数组名作为函数的参数

数组名作函数参数时,既可以作形参,也可以作实参。

数组名作函数参数时,要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。这种方式是把实参数组的起始地址传给形参数组,形参数组的改变也是对实参数组的改变,称这种参数传递方式为“地址传递”。

【例5-16】已知某个学生5门课程的成绩,求出平均成绩。

运行结果如图5-16所示。图5-16例5-16运行结果

说明:

(1)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数组类型必须一致,否则结果将出错。例如,在本例中,形参数组为a[],实参数组为sco[],它们的类型相同。

(2)用数组名作函数实参时,并不是把数组元素的值传递给形参,而是把实参数组的首地址传给形参数组,这样形参数组与实参数组共用同一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论