C语言程序设计 c语言6_第1页
C语言程序设计 c语言6_第2页
C语言程序设计 c语言6_第3页
C语言程序设计 c语言6_第4页
C语言程序设计 c语言6_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第六章

组基本问题1.为什么要使用数组例如:要输入一个100个学生的成绩。方法1:用简单变量方法输入学生成绩int

m1,m2,m3,

……m100;scanf("%d",&m1);scanf("%d",&m2);……scanf("%d",&m100);要用100句输入语句方法2:使用简单变量和循环结构相结合int

mark,i;for

(i=1;i<=100;i++)scanf("%d",&mark);方法3:使用数组和循环结构相结合int

mark[100],i;for

(i=1;i<=100;i++)scanf("%d",&mark[i]);4.数组的类型一维数组:数组中的变量具有先后顺序的逻辑结构,则称其为一维数组。二维数组:数组中的变量具有行列顺序的逻辑结构,则称其为二维数组。6.1

一维数组一、一维数组的定义定义格式:数据类型符

数组名[常量表达式];功能:定义指定“数据类型”的一维数组。说明:数据类型符用于说明数组中存放的数据的数据类型。它可以是任何基本类型,如int、float等。也可以是以后要介绍的指针类型或结构类型等。数组名必须是按照“标识符”的命名规则命名,不能与程序中的其他变量名同名。(3)常量表达式的值为数组的长度,表示数组中的元素个数,必须是整数,可以是整型常量或符合常量,但不能是变量。例如:①int

a[10];②#define

N

10float

b[N];③int

i=10;int

c[i];以上①②是正确的,③是错误的。(4)当定义了某一个一维数组,则要给其所有的元素分配内存单元。单元数目=数组长度×每个元素占用的字节数据例如:①int

a[10];定义一个a数组,10个元素,每个元素占2个字节,整个数组占20个字节的内存单元。②float

b[10];定义一个b数组,10个元素,每个元素占4个字节,整个数组占40个字节的内存单元。二、一维数组元素的引用C语言规定不能整体使用数组,只能使用数组元素,数组元素在数组中的位置称为下标。引用格式:数组名[下标]说明:(1)数组名表示数组元素从属的数组,该数组是事先已定义过的数组。(2)下标确定数组元素在数组中的位置,下标可以是整型常量、整型变量和整型表达式。其有效取值范围是:0≤下标<数组的长度如果下标的值超出范围,称为数组越界,将导致错误的运行结果。例1:一维数组元素引用举例。设有数组定义语句:int

a[4];数组a有四个元素,分别是a[0],a[1],a[2],a[3下列方式引用数组a的元素均为正确的:a[0]=10;scanf("%d,%d",&a[1],&a[3]);a[2]=2*a[0]+a[1]-a[3];例2:一维数组元素下标越界举例。设有数组定义语句:int

y[2];数组y有两个元素,分别是y[0],y[1]下列方式引用数组y的元素语法上均为正确的,但程序可能会出错。y[2]=10;scanf("%d",&y[3]);y[1]=y[4];(3)定义数组时方括号的数字与数组元素中的数字意义完全不同,前者的数字说明数组的长度,后者的数字说明该数组元素在数组中的位置。(4)数组名不是变量是常量,而数组元素是变量如设有数组定义语句:int

x[3];x[2]=10;x=6;/*正确*//*非法操作*/三、一维数组的初始化定义数组时赋予初值,称为初始化。格式:数据类型符

数组名[长度]={初值表}方法一:对所有元素赋初值如:int

a[5]={1,2,3,4,5};结果:a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5方法二:对部分元素赋初值如:int

a[5]={1,2,3};结果:a[0]=1,a[1]=2,a[2]=3,a[3]=0,a[4]=0方法三:对所有元素赋初值,可省略数组长度如:int

a[

]={1,2,3,4,5};等价于:

int

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

a[

];是错误的。四、一维数组的应用在一维数组的应用中,需注意以下几点:一般具有先后顺序的一组数据用一维数组存放。数组元素的下标控制用循环实现。数组元素的下标从0开始,最后一个元素的下标等于数组长度的大小减1。例1:编写程序,完成:(1)从键盘上任意输入10个整数;

(2)按反序输出10个整数;(3)按反序存放10个整数。例2:编写一程序,功能是任意输入10个整数,把这10个数据由小到大排序。算法分析:排序的方法很多,如选择法、冒泡法希尔法、插入法等。1.选择法排序选择法排序的基本思想是首先将n个数中最小的数找出来,同第一个数对调,然后再将n-1个数中最小的数找出来同第二个数对调……依次类推。对n个数作n-1轮比较,每轮都找出一个未经排序的数中最小的数。选择法排序示意图2.冒泡法排序冒泡法排序的基本思想是将第一个数与第二个数作比较,小数调到前面,大数调到后面;再将第二个数与第三个数作同样的比较与交换……依次类推,当完成第一遍的两两比较后,最大的数已跑到了数列的最后。然后再对第一个数至倒数第二个数执行两两比较和相应的交换操作……依次类推,直至数列的第一、第二个数比较结束。冒泡法排序示意图6.2

二维数组一、二维数组的定义定义格式:数据类型符

数组名[常量表达式1]

[常量表达式2];功能:定义指定“数据类型”的二维数组。说明:数据类型符用于说明数组中存放的数据的数据类型。它可以是任何基本类型,如int、float等。也可以是以后要介绍的指针类型或结构类型等。数组名必须是按照“标识符”的命名规则命名,不能与程序中的其他变量名同名。(3)常量表达式1说明二维数组行数的大小(即第一维的长度),常量表达式2说明二维数组列数的大小(即第二维的长度)。二维数组包含的数组元素个数=常量表达式1×常量表达式2。例如:int

a[4][5];(定义一个二维数组a,其元素为20个)(4)当定义了某一个二维数组,则要给其所有的元素分配内存单元。单元数目=数组长度×每个元素占用的字节数据例如:①int

a[4][5];定义一个a数组,20个元素,每个元素占2个字节,整个数组占40个字节的内存单元。②float

b[3][4];定义一个b数组,12个元素,每个元素占4个字节,整个数组占48个字节的内存单元。(5)C的编译系统对二维数组的存储单元的分配原则是:按行顺序存放,即上一行的末元素之后是下一行的首元素。二、二维数组元素的引用引用格式:数组名[下标1][下标2]说明:下标1确定数组元素所在的行,下标2确定数组元素所在的列。下标1为任一整型表达式,满足:0≤下标1<行数

(3)下标2为任一整型表达式,满足:0≤下标2<列数和一维数组一样,C对二维数组的下标也不作越界检查。三、二维数组的初始化方法一:按行给所有元素赋初值如:int

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

{6,7,8,9,10},{11,12,13,14,15}};结果:01122

3

43

4

56789101112131415012方法二:按行对部分元素赋初值如:float

b[3][4]={{1.0},{3.2,4.5}};结果:01.010.020.030.03.24.50.00.00.00.00.00.0012方法三:给所有元素赋初值,可省略第一维长度如:int

a[

][3]={1,2,5,8,3,7};等价于:

int

a[2][3]={1,2,5,8,3,7};结果是:125837省略的第一维长度由数据总个数除于第二维的长度确定(6/3=2)。因为二维数组在内存中是按行存放的,所以必须知道每行的元素个数,才能由数据总数确定数组的行数。四、二维数组的应用在二维数组的应用中,需要注意以下几点:(1)一般具有行、列的表格数据用二维数组存放。

(2)定义存放数据的二维数组行与列的大小只能是整型常量或符号常量。(3)行下标与列下标均成0开始,它们的值惟一确定二维数组元素在数组中的位置。(4)二维数组元素的下标控制,一般用两重循环实现例3:编写程序,对一个4行4列的二维数组,完成以下操作:(1)求对角线上的元素之和与积;

(2)求所有靠边的元素之和与积;

(3)求所有不靠边的元素之和与积。算法分析:对于一个行列相同的二维数组,它有两条对角线一条称为主对角线,另一条称为副对角线。主对角线上的元素下标特点是行、列下标的值相等,副对角线上的元素下标特点是行、列下标之和等于(行数-1)。所有靠边元素的下标特点是行下标等于0或者等于(行数-1),列下标等于0或者等于(列数-1)。所有不靠边元素的下标特点是行下标不等于0也不等于(行数-1),列下标不等于0也不等于(列数-1)

。程序清单:例4:编写程序,输出杨辉三角形的前10行11112113311464115101051………………算法分析:算法分析:杨辉三角形数据的特点是对角线和第1列上的值为1,其余从第3行起每行第2个数开始的各个数等于上一行同一列上的数与其左侧的数之和。即满足

a[i][j]=a[i-1][j]+a[i-1][j-1]。程序清单6.3

字符串与字符数组一、字符串与字符数组所谓字符串,就是用双引号括起来的字符序列。为了便于识别一个字符串的结尾,C语言约定,字符串的未尾以转义字符“\0”作为结束标志。在C语言中,字符串用字符数组来存放和处理。字符数组用于存放字符型数据,每个数组元素存放一个字符,存放的是字符的ASCII代码。不管字符数组中存放的是字符串,还是若干个字符,每个字符数组的元素都可以作为一个字符型变量来使用。二、字符数组定义一维字符数组定义格式:char

数组名[常量表达式];二维字符数组定义格式:char

数组名[常量表达式1][常量表达式2];3.说明:一维字符数组用于存放一个字符串,二维字符数组用于存放多个字符串。在定义字符数组和存储字符串时应估计要存放的字符串的最大可能长度,使得字符数组的长度始终大于字符串的实际长度,保证有效字符之后是字符串的结束标志“\0”。例如:要存放字符串“I

am

a student.”,则定义的一维字符数组长度至少为16(有效字符15个、字符串结束标志1个),即char

str[16];。如要同时存放3个字符串“I

am

a student.”、“You

are

a

worker.”、“He

is

a

teacher.”,则定义的二维字符数组第二维的长度至少为18(3个字符串中,第二个字符串最长,有效字符17个、字符串结束标记1个),即char

str[3][18];。三、字符数组的初始化字符数组的初始化既可以用字符常量也可以用字符串常量来实现。例如:char

str[]={"I","","a","m","","a","","b等价于:char

str[]={"I

am

a

boy"};或者:char

str[]="I

am

a

boy“说明:(1)不管用那一种方法,str数组都是有11个数组元素组成。str

0

1

2

3

4

5

6

7

8

9

10I

a

m

a

b

o

y

\0在用字符常量初始化字符数组时,特别要注意:如存放的是字符串,最后一般要放上字符串结束标志‘\0’,否则,C不将其视为字符串。用字符串常量初始化字符数组时,系统自动在字符串的末尾加上字符串结束标志‘\0’。显然,用字符串常量初始化字符数组比用字符常量要方便,直观得多。四、字符数组的输入与输出(一)字符数组输入的3种方法1.单个字符逐个输入在scanf函数中,用格式字符“%c”,表示从键盘上输入单个字符。如:char

c[11];int

i;for

(i=0;i<10;i++)scanf("%c",&c[i]);c[10]="\0";运行时输入:I

am

a

boy结果数组c存放的是:I

am

a

boy\0,可以作为数组使用。2.整个字符串一次输入在scanf函数中,用格式字符“%s”,表示从键盘上

一次输入一串字符,输入项直接写数组名。不过要注意:用“%s”输入字符串时,只能输入不含有空格符的字符串。因为用“%s”输入字符串时,不接受空格符(即遇到空格符结束),并自动补上字符串结束标志‘\0’。如:char

c[14];

scanf("%s",c);运行时若输入:You

are

a

boy结果数组c存放的是:You\0。3.用gets函数一次输入整个字符串格式:gets(字符数组名);功能:从键盘上输入一串字符,存放在指定的字符数组中。说明:gets函数既可输入包含空格的字符串,又可输入不包含空格的字符串。在输入字符串时,遇到回车符结束,并将回车符转换成字符串结束标志’\0’。如:char

c[14];

gets(c);运行时若输入:You

are

a

boy结果数组c存放的是:You

are

a

boy\0。(二)字符数组输出的3种方法1.单个字符逐个输出在printf函数中,用格式字符“%c”,输出一个数组元素(即一个字符)。如:char

c[11]="I

am

a

boy";int

i;for

(i=0;i<11;i++)printf("%c",c[i]);printf("\n");运行结果为:I

am

a

boy2.一次输出整个字符串在printf函数中,用格式字符“%s”,输出项直接写数组名,一次输出整个数组。如:char

c[11]="I

am

a

boy";printf("%s",c);printf("\n");运行结果为:I

am

a

boy说明:格式字符“%s”在输出字符串时,原样输出,遇到字符串结束标记"\0"不换行。3.用puts函数一次输出整个字符串格式:puts(字符数组名);功能:在显示器上输出存放在指定字符数组中的整个字符串。如:char

c[11]="I

am

a

boy";puts(c);运行结果为:I

am

a

boy说明:puts函数输出字符串时,遇到字符串结束标记"\0"换行。五、字符串处理函数1.字符串复制函数strcpy格式:strcpy(字符型参数1,字符型参数2)功能:把参数2指定的字符串复制到参数1指定的字符数组中。说明:参数1用于存放复制的字符串,所以它必须是字符数组,而且其长度不能小于所复制字符串的长度。参数2可以是字符数组,也可以是字符串常量。复制时连同字符串结束标记"\0"一起复制。例如:char

str[20];strcpy(str,

"I

am

a

boy");puts(str);运行结果为:I

am

a

boy例如:char

name[7]

="王大明";

/*正确*/name="王大明";/*非法操作*/strcpy(name,

"王大明");

/*正确*/2.字符串连接函数strcat格式:strcat(字符型参数1,字符型参数2)功能:把参数2指定的字符串连接到参数1指定的字符数组中字符串的后面。说明:(1)参数1用于存放连接后的字符串,所以它必须是字符数组,而且其长度要足够容纳两个字符串

(2)参数2可以是字符数组,也可以是字符串常量(3)连接时参数1指定的字符数组中原有的字符串结束标记"\0"被参数2指定的字符串的第一个字符取代,而参数2指定的字符串的字符串结束标记"\0"作为新字符串的结束标记。例如:char

str1[80]="I

am

a

boy.";char

str2[]="You

are

a

girl.";printf("%s\n",strcat(str1,str2));运行结果为:I

am

a

boy.You

are

a

girl.str2数组中仍为:"You

are

a

girl."str1数组中为:"I

am

a

boy.

You

are

a

girl."3.字符串比较函数strcmp格式:strcmp(字符型参数1,字符型参数2)功能:比较参数1和参数2

温馨提示

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

评论

0/150

提交评论