大学计算机程序设计基础(C语言)-第8章 数组_第1页
大学计算机程序设计基础(C语言)-第8章 数组_第2页
大学计算机程序设计基础(C语言)-第8章 数组_第3页
大学计算机程序设计基础(C语言)-第8章 数组_第4页
大学计算机程序设计基础(C语言)-第8章 数组_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第8章数组本章要点

一维数组

二维数组字符数组数组元素作函数实参

数组是同类型数据的集合,集合中的每个数据称为数组元素或下标变量,数组元素的类型相同、个数确定。下标变量中如果只用一个下标,则称为一维数组,用两个下标则称之为二维数组,用三个下标称之为三维数组,依此类推。基本概念8.1一维数组8.1.1一维数组的定义定义形式为:

[存储类别]类型标识符数组名[常量表达式],…;例如:inta[6]; floatx[100],y[100];说明:类型标识符”表明了数组元素的数据类型常量表达式是由常量、符号常量和运算符组成的表达式,它的值规定了数组中数组元素的个数(数组的长度)常量表达式中不能含有变量。intn;scanf("%d",&n);inta[n];数组在内存中占据一片连续的存储单元,数组中的每个数组元素在这片连续的存储单元中按序存储。C语言规定数组名表示该连续存储单元的首地址(首字节编号)。a

a[0]a[1]a[2]a[3]a[4] a[5]

图8.1数组的存储结构

数组的定义语句给每个数组元素分配了一定的存储单元,和简单变量一样它们的值是不确定的、是随机的,只有通过赋值或赋初值才能得到确定的值。同类型的数组的定义和普通变量的定义可以出现在同一个定义语句中。如: inta[6],b[20],i,j;数组初始化的一般形式为:

[存储类别]类型标识符数组名[常量表达式]={初值表};在编译过程中完成的,不占程序运行时间。数组初始化常见的几种形式:对所有数组元素赋初值,此时数组定义中表示数组长度的常量表达式可以省略。

inta[6]={0,1,2,3,4,5};可以只给一部分数组元素赋初值,此时数组长度一般不省略。后面3个元素由C编译系统自动赋值为0。

inta[6]={0,1,2};

8.1.2一维数组的初始化引用形式为:

数组名[下标表达式]

例如:

a[0]=123;

scanf(“%d”,&a[3]);

printf(“%d”,a[5]);

a[i++]=2*a[i+j];8.1.3一维数组元素的引用【例8.1】输入100个整型数据,然后分别按顺序和逆序的方式输出。main(){inti,a[100];

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

scanf("%d",&a[i]);/*顺序输入*/

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

printf("%d",a[i]);/*顺序输出*/for(i=99;i>=0;i--)

printf("%d",a[i]);/*逆序输出*/}在引用数组元素时应注意: ①引用数组元素时,下标表达式的值是确定的。 ②数组元素本身可以看作是一个普通变量,代表内存中的一个存储单元。因此数组元素可以在任何相同类型简单变量允许使用的位置引用。 ③数组引用时,下标值应该在已定义的数组大小范围内。常出现的错误是:

inta[100];

a[100]=4;8.1.4一维数组应用【例8.2】从键盘输入10个整数存放在数组中,输出其中最大的一个数和它在数组中的位序。main(){inta[10],i,max,id;printf("Enterdata:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);max=a[0];id=0;for(i=1;i<10;i++)if(a[i]>max) {max=a[i];id=i;}printf(“最大数是%d,位序为:%d\n",max,id);}【例8.4】已知一个一维数组中的各个元素值均不相同,编写程序查找数组中是否有值为x的数组元素。如果有,输出相应的下标;如果没有,输出“该值在数组中不存在”字样信息。main(){intnum[10]={1,32,14,56,74,3,56,6,9,12},x,i,j;printf(“inputx:”);scanf("%d",&x);for(i=0;i<10;i++)if(num[i]==x)break;if(i==10)printf(“该数在数组中不存在");elseprintf(“该数在数组中的下标是%d”,i);}【例8.5】编写程序,利用选择法对10个整数进行递增排序,并输出排序后的结果。选择法排序的思路是:先从全体待排序的n个数据中找出最大的数,把它放到数组的第0个位置上,完成第1趟选择排序;接着再在剩余的n-1个数据中找出最大的数放到数组的第1个位置上,完成第2趟选择排序,……,如此反复,经过n-1趟选择排序后,原始数组已经有序。main(){inti,j,k,temp,a[10];for(i=0;i<10;i++)scanf(“%d”,&a[i]);for(i=0;i<9;i++){k=i;

for(j=k+1;j<10;j++)if(a[k]<a[j])k=j;

temp=a[i];a[i]=a[k];

a[k]=temp;}for(i=0;i<10;i++)printf(“%4d”,a[i]);}交换:199763第4趟查找:19976

3交换:1997

63第3趟查找:199673交换:199673第2趟查找:193679交换:19

3679第1趟查找:736199排序前:736199【例8.6】编写程序,利用冒泡法对10个整数进行递增排序。……第一趟

124156

341215634

121563412

615341263

15第二趟

463

12第三趟

43

6main(){inta[10],i,j,temp;

printf("Input10numbers\n");

for(i=0;i<10;i++)scanf("%d",&a[i]);

printf("\n");

for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}printf("thesortednumbers:\n");for(i=0;i<10;i++)printf("%d",a[i]);}8.2二维数组例:求一个矩阵的转置矩阵356768292456245668293567定义二维数组的一般形式为:[存储类别]类型标识符数组名[常量表达式1][常量表达式2],…;例如:inta[2][3];说明:①二维数组定义中的第1个下标表示该数组具有的行数,第2个下标表示该数组具有的列数,两个下标之积是组成该数组的元素的个数,即二维数组的长度。②二维数组在内存中占据一片连续的存储单元。aa[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]8.2.1二维数组的定义③在C语言中,一个二维数组可以看作是一个特殊的一维数组,其中一维数组中的每个元素又是一个一维数组,即二维数组是由元素类型为数组类型的一维数组构成的一维数组。因此C系统就把a[0]、a[1]看作是一维数组的数组名。a[0]a[1]aa[0][0]a[0][2]a[0][1]a[1][1]a[1][2]a[1][0]inta[2][3];二维数组初始化的几种常见形式:

(1)按行给二维数组元素赋初值。如:

inta[2][3]={{1,2,3},{6,7,8}};

(2)将所有数据写在一个花括弧内,按数组在内存中的排列顺序对各数组元素赋初值。如:

inta[2][3]={1,2,3,6,7,8};

(3)给二维数组所有元素赋初值,二维数组第一维的长度可以省略。如:inta[2][3]={1,2,3,6,7,8};等价于:

inta[][3]={1,2,3,6,7,8};

(4)在定义时也可以只对部分元素赋初值而省略第一维的长度,但应按行赋初值。如:

inta[][3]={{0,2},{6}};8.2.2二维数组的初始化二维数组元素的引用形式为:

数组名[下标表达式1][下标表达式2]数组元素的行列下标都从0开始。可以对二维数组元素进行与普通变量相同的操作,因为它们的本质就是一个普通变量,如运算、赋值等。如:a[0][0]=a[0][2]/3-30;

printf(“%d”,a[1][1]);区分在定义数组时使用的维数和各维大小与引用数组元素时下标值的不同。如:

inta[3][5];

a[3][5]=6;8.2.3二维数组元素的引用【例8.8】输入12个整型数据形成一个具有3行4列的二维数组,然后按数组的逻辑排列形式输出。main(){inti,j,a[3][4];

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

for(j=0;j<4;j++)scanf("%d",&a[i][j]);/*按行顺序输入*/for(i=0;i<2;i++)

{for(j=0;j<3;j++) printf("%2d",a[i][j]);/*按行顺序输出*/printf(“\n”);/*一行输出完后,要换行*/}}#defineM2#defineN3main(){inta[M][N]={{1,2,3},{4,5,6}},b[N][M],i,j;for(i=0;i<M;i++){for(j=0;j<N;j++){b[j][i]=a[i][j];}

}for(i=0;i<N;i++){for(j=0;j<M;j++)printf(“%5d”,b[i][j]);}}8.2.4二维数组应用举例【例8.10】将一个二维数组的行和列元素互换,存到另一个二维数组中。a=b=【例8.11】已知一个小组5个学生的4门课成绩,要求分别求每门课的平均成绩和每个学生的平均成绩。

cour1cour2cour3cour4stud187699862stud259926877stud378884560stud489629794stud572997564main(){inti,j;

floatscore[6][5]={{87,69,98,62},{59,92,68,77},

{78,88,45,60},{89,62,97,94},{72,99,75,64}}for(i=0;i<5;i++)/*统计每个学生的平均成绩*/{for(j=0;j<4;j++)

score[i][4]+=score[i][j];

score[i][4]=score[i][4]/4;

}}for(j=0;j<4;j++)/*统计每门课程的平均成绩*/{for(i=0;i<5;i++)score[5][j]+=score[i][j];

score[5][j]=score[5][j]/5;}求一个矩阵所有靠外侧的元素的和#defineM3#defineN4main(){inta[3][4]={{3,5,6,7},{6,8,2,9},{2,4,5,6}};intk,j,sum=0;

for(j=0;j<N;j++)sum+=a[0][j]+a[M-1][j]

for(i=1;i<M-1;i++)sum+=a[i][0]+a[i][N-1];printf(“%d”,sum);} 3567682924568.3字符数组字符数组是存放字符型数据的数组。其中每个数组元素的值都是字符型数据(单个字符或转义字符)。常用的字符数组为一维字符数组和二维字符数组。8.3.1字符数组的定义charstr1[5];charstr2[3][10];用赋值语句可以对字符数组元素逐个赋初值。例如:

str1[0]='C';str1[1]='h';str1[2]='i';

str1[3]='n';str1[4]='a';China字符数组的存储状态

字符串常量在内存中占用一串连续的空间,相当于字符数组,可以按照字符数组的方式访问字符串。对字符串的处理常常采用一维字符数组实现。不能通过赋值语句把字符串常量或其它字符数组中的字符串直接赋给字符数组8.3.2字符串与字符数组hello\0逐个字符对字符数组初始化(不会自动在最后一个字符后加’\0’)

例如:

charstr1[5]={‘C’,‘h’,‘i’,‘n’,‘a’};

charstr2[2][3]={‘W’,‘i’,‘n’,‘d’,‘o’,‘w’};如果初值个数小于数组长度,C编译系统将其余的元素自动定为空字符(即‘\0’)用字符串常量对字符数组初始化(系统会自动在最后一个字符后加’\0’)例如:

charc1[13]={"Goodmorning"};

charc2[2][10]={"Hello","World"};8.3.3字符数组的初始化不可以用赋值语句给字符数组整体赋一串字符如:charc1[13];c1=“Goodmorning”;逐个字符输入输出scanf()和printf()函数中用格式符“%c”,循环8.3.4字符数组的输入输出charstr[5];for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=4;i>=0;i--)printf(“%c”,str[i]);

必须在接受到“回车”时,scanf()才开始读取数据。如果按“回车”时,输入的字符少于scanf()循环读取的字符,scanf()继续等待用户将剩下字符输入;否则,scanf()循环只将前面的字符读入。逐个读入字符结束后,不会自动在末尾加’\0’。字符串整体输入输出scanf()函数中用格式符“%s”整体输入例如:从键盘上读入5个字符并输出:charstr[6];scanf("%s",str);printf("%s",str);①用“%s”输入输出字符串,以上函数的第二个参数都要求是字符数组的首地址,如字符数组名。②按照“%s”格式输入字符串时,输入的字符串中不能有空格(由空格键或Tab键产生,空格或是输入数据的结束标志),否则空格后面的字符不能读入,这时scanf()函数认为输入的是两个字符串。

如输入:Iamhappy

则输出:Iprintf()函数中用格式符“%s”整体输出printf("%s",str);

输出项是一个地址值。可以是字符数组名、字符指针或字符数组元素的地址。函数从这一地址开始依次输出,直至遇到第一个’\0’。

‘\0’是结束标志,不在输出字符之列,输出结束后不自动换行。1.字符串输入和输出函数 (1)字符串输出函数puts()函数的调用形式为:

puts(str);功能:从str指定的地址开始,一次将存储单元中的各个字符输出到显示器,直到遇到'\0'。例如下列程序段:

charstr[]=“China”;puts(str);注意:在输出时将字符串结束标志转换成'\n',即输出完字符串后换行。8.3.5字符串(字符数组)处理函数(2)字符串输入函数gets()函数的调用形式:

gets(str);功能:从键盘输入一个字符串(可包含空格),直到遇到回车符,并将字符串存放到由str指定的字符数组(或内存区域)中。换行符读入后,不作为字符串的内容,系统自动用’\0’代替。函数调用完成后,输入的字符串存放在str开始的内存空间中。2.字符串连接函数strcat()函数调用形式为:

strcat(str1,str2)功能:将以str2为首地址的字符串连接到str1字符串的后面。从str1原来的字符串结束标志’\0’处开始连接。例如:

charstrl[13]={“Ilove”};

charstr2[]={“China”};

printf("%s",strcat(str1,str2)); 输出结果为:

IloveChinastr1必须足够大格式:strcpy(字符数组1,字符数组2);功能:将字符数组2拷贝到字符数组1中;

例如:charstr1[10],str2[]={“Computer”}; strcpy(str1,str2);

执行后str1中的内容为:Computer;注意:字符数组1的长度应大到足够容纳字符串2.

字符数组2的形式可以是字符数组名也可以是字符串常量. 如:strcpy(str1,“Computer”);3.字符串拷贝函数strcpy()

格式:strcmp(字符串1,字符串2);功能:对两个字符串从左到右逐个字符进行比较,直到相应位置上的字符不一样或遇到‘\0’,比较结果由函数返回

(1)如果字符串1=字符串2,函数返回值为0(2)如果字符串1>字符串2,函数返回值为正整数

(3)如果字符串1<字符串2,函数返回值为负整数4、字符串比较函数strcmp()格式:strlen(字符串);功能:测试字符串的实际长度(不包括‘\0’)

如:charstr[15]={“Ilovechina”}; printf(“%d”,strlen(str));

结果:125、测字符串长度函数strlen()8.3.6字符数组应用【例8.13】编写程序求一个字符串的逆串。如:字符串”abcdefg”的逆串为:”gfedcba”。main(){charstr[50];intc,i,j,n;

printf("Pleaseinputthestring:\n");

scanf("%s",str);

for(n=0;str[n]!=‘\0’;n++);

for(i=0,j=n-1;i<j;i++,j--){c=str[i];str[i]=str[j];str[j]=c;}printf("Reversedstring:\n%s",str);}gets(str);n=strlen(str);【例8.14】编写程序将输入的两个字符串连接起来,以实现strcat()函数的功能。#include"string.h"main(){charstr1[50],str2[20];

inti,j=0;

printf("PleaseinputthestringNo.1:\n");

gets(str1);

printf("Pleaseinpu

温馨提示

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

评论

0/150

提交评论