《计算机软件基础自考3课件》由会员分享,可在线阅读,更多相关《计算机软件基础自考3课件(45页珍藏版)》请在金锄头文库上搜索。
1、计算机计算机 软件基础软件基础第一篇第一篇C语言程序设计基础语言程序设计基础第三章数组第三章数组第三章数组第三章数组第三章数组第三章数组第三章数组第三章数组数组是在一个变量名之下存放的多个数据的存储区的说明,数组是在一个变量名之下存放的多个数据的存储区的说明,是具有相同类型的数的集合按照一定的顺序组成的数据。是具有相同类型的数的集合按照一定的顺序组成的数据。数列和矩阵是用来描述一批数据之间的关系的。如:数列和矩阵是用来描述一批数据之间的关系的。如:表示表示x数列时通常写成:数列时通常写成:x1,x2,x3,xn表示一个表示一个23矩阵矩阵y可以写成:可以写成:y11 y12 y13y21 y2
2、2 y23分析数列和矩阵不难发现它们有三个特点:分析数列和矩阵不难发现它们有三个特点:有一批数据;有一批数据;这些数据之间有一定的内在联系;这些数据之间有一定的内在联系;这些数据的类型相同。这些数据的类型相同。一、一维数组一、一维数组1. 1.定义定义定定义定定义形式形式当构成数当构成数组的各个元素的下的各个元素的下标只有只有1 1个个时,称,称为一一维数数组。类型型说明符明符 数数组名名 常量表常量表达式达式;例如:例如:int nun5;int nun5;一、一、一维数组一维数组一维数组一维数组一维数组的说明一维数组的说明一维数组的说明一维数组的说明 :(1)常量表达式中仅包含常量或符号常
3、量,不得包含)常量表达式中仅包含常量或符号常量,不得包含变量变量如:如:int x , a X ; 是是错误错误的。的。 #define N 5 int a N ; 是是正确正确的。的。 int a 2+3*2 ;是是正确正确的。的。(2)一维数组在内存中是按下标从)一维数组在内存中是按下标从0开始依次存放各开始依次存放各个元素个元素。一、一维数组一、一维数组2. 2.一维数组的初始化一维数组的初始化方法方法示例示例(1 1)在定)在定义数数组的同的同时,对数数组进行初始化。行初始化。int a 5 = 1,2,3,4,5 ;int a 5 = 1,2,3,4,5 ;(2 2)若)若对所有元素
4、所有元素赋初初值,则数数组长度可省略。度可省略。int a = = 1,2,3,4,5 ;int a = = 1,2,3,4,5 ;(3 3)如果只)如果只对数数组的前若干个元的前若干个元素素赋初初值,那么未,那么未赋初初值的元素其的元素其初初值为0 0。int a 5 = = 1,2,3 ;int a 5 = = 1,2,3 ;(4 4)要想)要想让一个数一个数组中全部元素中全部元素为0 0,可以写成:,可以写成:int a 3 = 0,0,0 ;int a 3 = 0,0,0 ;或或int int a 3 = 0 ;a 3 = 0 ;一、一、一维数组一维数组一维数组一维数组3. 3.一维数
5、组元素的引用:一维数组元素的引用:一维数组元素的引用:一维数组元素的引用:(1)引用原则:先定义,后引用;逐个引用,不能)引用原则:先定义,后引用;逐个引用,不能一次引用整个数组。一次引用整个数组。(2)引用形式:)引用形式: 数组名数组名 下标下标 例如:例如:a 2 ,a 1+2 ,a i+ ,a i+j ;都是合法都是合法的数组元素引用。的数组元素引用。注意注意注意注意:数组元素一经引用就和变量一样使用。数组元素一经引用就和变量一样使用。一、一、一维数组一维数组一维数组一维数组3. 3.一维数组元素的引用(续):一维数组元素的引用(续):一维数组元素的引用(续):一维数组元素的引用(续)
6、:(3)数组元素的输入:可以用赋值的方法,也可以)数组元素的输入:可以用赋值的方法,也可以用输入函数。用输入函数。例如:例如: for ( i=0 ;i4 ;i+) scanf (%d ,& num i ) ;键入键入3 5 1 2(回车)(回车)一、一、一维数组一维数组一维数组一维数组3. 3.一维数组元素的引用(续):一维数组元素的引用(续):一维数组元素的引用(续):一维数组元素的引用(续):(4)数组元素的输出:用输出函数输出数组元素值。)数组元素的输出:用输出函数输出数组元素值。例如:例如: for ( i=0 ; i4 ;i+) printf (“ % 3d “ , num i )
7、 ;运行结果为:运行结果为:3 5 1 2注意注意注意注意:数组元素在引用时其下标不要超界。:数组元素在引用时其下标不要超界。一、一、一维数组一维数组一维数组一维数组 例例3-1求一维数组元素最大值及所在位置。求一维数组元素最大值及所在位置。 #define N 5 main() int aN,i,max,maxi; for(i=0;iN;i+) scanf(%d,&ai); /*输入输入a数组的数组的N个元素值个元素值*/ max=a0;maxi=0; /*最大值及位置序号置初态最大值及位置序号置初态*/ for(i=1;imax) /*求最大数求最大数max及位置及位置maxi*/ max
8、=ai;maxi=i; printf(max=a%d=%dn,maxi,max); 一、一、一维数组一维数组一维数组一维数组例例3-2求一个整数各位数字之和。求一个整数各位数字之和。 main()long x; int a10,k,i=0,s=0; /*i中统计整数的位数中统计整数的位数,S中放各位数字之和中放各位数字之和*/ scanf(%Ld,&x); /*输入长整型数输入长整型数*/ while(x!=0) ai=x%10; /*分离出最右边数字分离出最右边数字,放入放入a数组数组*/ x=x/10; /*去掉右边数字后余下的数去掉右边数字后余下的数*/ i+; /*i为数组元素的下标为
9、数组元素的下标*/ for(k=0;ki;k+) /*这个整数共有这个整数共有i位位,下面求数组各元素之和下面求数组各元素之和*/ s=s+ak; printf(sum=%dn,s);一、一、一维数组一维数组一维数组一维数组 方法二:可以不用数组方法二:可以不用数组,在分离各位数字的过程中边分在分离各位数字的过程中边分离边累加。主要语句如下:离边累加。主要语句如下:void main()int s=0;long x;scanf(%Ld,&x);while(x!=0) s=s+x%10; x=x/10; printf(sum=%dn,s); 一、一、一维数组一维数组一维数组一维数组例例3-3输出
10、输出Fibonacci数列的前数列的前l0个数个数,要求每行输出要求每行输出5个。个。 分析:设有一整型数组分析:设有一整型数组a10,其中:其中:a0=0,a1=1;其余各数的其余各数的关系为关系为 ai=ai-2+ai-1;(2i10) main() int a10=0,1,i; /*给定前两个元素值为给定前两个元素值为0和和1*/ for(i=2;i10;i+) ai=ai-2+ai-1; /*形成数组形成数组a2 a9的值的值*/ for(i=0;i10;i+) if(i%5=0)printf(n); /*若每行够若每行够5个数个数,则换行则换行*/ printf(%5d,ai); /
11、*输出各数输出各数*/ 一、一、一维数组一维数组一维数组一维数组例例例例3-4 3-4 编写程序把一维数组逆序排列。编写程序把一维数组逆序排列。编写程序把一维数组逆序排列。编写程序把一维数组逆序排列。 main ( ) int a7=5,9,6,4,2,3,8,i,j,m; i=0;j=6; /*两个变量记录当前交换元素的位置两个变量记录当前交换元素的位置*/ while(ij) m=ai;ai=aj;aj=m; /*a i和和aj交换交换*/ i+,j-; /*两指针前进两指针前进*/ for(i=0;i7;i+) printf(%6d,ai); printf(n);一、一、一维数组一维数组
12、一维数组一维数组程序二:程序二:7个数交换个数交换3次次(72=3)main()int a7,i,m; for(i=0;i7;i+) scanf(%d,&ai); /*输入七个数输入七个数*/ for(i=0;i3;i+) /*七个数交换七个数交换3次次*/ m=ai;ai=a7-i-1; a7-i-1=m; /*ai和和a7-i-1交换交换*/ for(i=0;i=0;k-) printf(%ld,ak); /*逆序输出数组逆序输出数组a值值,即二进制数即二进制数*/ printf(=)n);二、二维数组二、二维数组1. 1.定义定义定定义定定义形式形式当构成数当构成数组的各个元素的下的各个
13、元素的下标有有2 2个个时,称,称为二二维数数组。类型型说明符明符 数数组名名 常量表达常量表达式式1 1 常量表达式常量表达式2;2;例如:例如:int nun34;int nun34;元素个数元素个数= =行数行数列数列数二、二维数组二、二维数组2. 2.初始化初始化分行赋值分行赋值方法方法示例示例分分行行赋值全部元素初全部元素初始化始化int a 3 2 = 1,2,3,4,5,6;int a 3 2 = 1,2,3,4,5,6;部分元素初部分元素初始化始化int a 3 2 = 1,2,3;int a 3 2 = 1,2,3;第一第一维长度度省略初始化省略初始化int a 2 = 1,
14、2,3,4,5,6;int a 2 = 1,2,3,4,5,6;注意:第二注意:第二维长度不能省略!度不能省略!二、二维数组二、二维数组2. 2.初始化初始化按行连续赋值按行连续赋值方法方法示例示例按按行行连续赋值全部元素初全部元素初始化始化int a 3 2 = 1,2,3,4,5,6 ;int a 3 2 = 1,2,3,4,5,6 ;部分元素初部分元素初始化始化int a 3 2 = 1,2,3,4 ;int a 3 2 = 1,2,3,4 ;第一第一维长度度省略初始化省略初始化int a 2 = 1,2,3,4,5,6 ;int a 2 = 1,2,3,4,5,6 ;注意:第二注意:第
15、二维长度不能省略!度不能省略!二、二维数组二、二维数组3. 3.二维数组元素的引用二维数组元素的引用引用形式引用形式示例示例数数组名名 行下行下标 列下列下标 a 3 4 ; a 3 4 ;注意:引用二维数组元素时,其下标不能超界!注意:引用二维数组元素时,其下标不能超界!注意:引用二维数组元素时,其下标不能超界!注意:引用二维数组元素时,其下标不能超界!二、二维数组二、二维数组4. 4.二维数组输入输出二维数组输入输出用用两重循环两重循环实现实现void main( )void main( )int a33,i,j;int a33,i,j;for ( i=0;i3;i+)for ( i=0;
16、i3;i+) for (j=0;j3;j+) for (j=0;j3;j+) scanf ( %d ,&aij); scanf ( %d ,&aij); for (i=0;i3;i+) for (i=0;i3;i+) for (j=0;j3;j+) for (j=0;j3;j+) printf (%5d,aij); printf (%5d,aij); printf (n); printf (n); 二、二维数组二、二维数组例例3-6阅读并分析下列程序。阅读并分析下列程序。程序一:程序一:程序一:程序一:main()main()int a12,b34,i,j,k=0;int a12,b34,i,
17、j,k=0; for(i=0;i3;i+) /* for(i=0;i3;i+) /*自动形成二维数组自动形成二维数组自动形成二维数组自动形成二维数组b*/b*/ for(j=0;j4;j+) for(j=0;j4;j+) bij=i*4+j+1; bij=i*4+j+1; for(i=0;i3;i+) /* for(i=0;i3;i+) /*输出二维数组输出二维数组输出二维数组输出二维数组b b的元素值的元素值的元素值的元素值* */ / for(j=0;j4;j+) for(j=0;j4;j+) printf(%4d,bij); printf(%4d,bij); printf(n); pri
18、ntf(n); 二、二维数组二、二维数组例例3-6阅读并分析下列程序。阅读并分析下列程序。/*/*将二维数组中的将二维数组中的将二维数组中的将二维数组中的b b元素值元素值元素值元素值, ,逐行存逐行存逐行存逐行存入入入入一维数组一维数组一维数组一维数组a a中中中中* */ /for(i=0;i3;i+)for(i=0;i3;i+) for(j=0;j4;j+) for(j=0;j4;j+) ak=bij; ak=bij; k+; k+; for(i=0;i12;i+) /* for(i=0;i12;i+) /*输出一维数组输出一维数组输出一维数组输出一维数组a a的各元素值的各元素值的各元
19、素值的各元素值* */ / printf(%4d,ai); printf(%4d,ai); 二、二维数组二、二维数组例例3-7编写矩阵转置的程序编写矩阵转置的程序设有矩阵设有矩阵设有矩阵设有矩阵a a为为为为2323阶阵,则阶阵,则阶阵,则阶阵,则a a的转置阵的转置阵的转置阵的转置阵b b为为为为3232阶阵。阶阵。阶阵。阶阵。二、二维数组二、二维数组void main()void main() int a23=4,5,6,7,8,9,b32,i,j;int a23=4,5,6,7,8,9,b32,i,j;printf(array a:n);printf(array a:n);for(i=0
20、;i2;i+)for(i=0;i2;i+) for(j=0;j3;j+)for(j=0;j3;j+) printf(%4d,aij);printf(%4d,aij); bji=aij; bji=aij; printf(n); printf(n); printf(array b:n);printf(array b:n);for(i=0;i3;i+)for(i=0;i3;i+) for(j=0;j2;j+)for(j=0;j2;j+)printf(%4d,bij); printf(%4d,bij); printf(n);printf(n); 二、二维数组二、二维数组例例3-8输出杨辉三角形。输出杨
21、辉三角形。11112113311464115101051二、二维数组二、二维数组例例3-8输出杨辉三角形。输出杨辉三角形。 int a77,i,j; for(i=1;i=6;i+) ai1=aii=1; for(i=3;i=6;i+) for(j=2;j=i-1;j+) aij=ai-1j-1+ai-1j; for(i=1;i=6;i+) for(j=1;j=i;j+) printf(%5d,aij); printf(n); 二、二维数组二、二维数组例例3-9编写求二维数组编写求二维数组a中元素最大值及所在行、列位中元素最大值及所在行、列位置的程序。置的程序。 #define M 2 #def
22、ine N 3main( ) int aMN,i,j,max,maxi,maxj; for(i=0;iM;i+) /*输入数组元素值输入数组元素值*/ for(j=0;jN;j+) scanf(%d,&aij); max=a00;maxi=maxj=0; for(i=0;iM;i+) /*每个元素和当前最大值比较每个元素和当前最大值比较*/ for(j=0;jmax) max=aij;maxi=i;maxj=j; printf(max=a%d%d=%dn,maxi,maxj,max); 三、字符数组和字符串三、字符数组和字符串1. 1.字符数组字符数组定定义形式形式 示例示例char char
23、 数数组名名 常量表达式常量表达式 ; ; char ch 10 ;(2(2)字符数组初始化字符数组初始化方法方法 示例示例定定义数数组的同的同时,给元素逐个元素逐个赋值。char ch4=h,p,p,y可省略数可省略数组长度。度。char ch =h,p,p,y(1 1)字符数组字符数组用来存放字符数据的数组。用来存放字符数据的数组。三、字符数组和字符串三、字符数组和字符串2.2.2.2.字符串字符串注意:注意:注意:注意: C中没有存放字符串的变量,它是用字符数组中没有存放字符串的变量,它是用字符数组 处理字符串的;处理字符串的; 字符串结束的标记:字符串结束的标记:0。(1 1)字符串常
24、量:用双撇号括起来的字符序列。字符串常量:用双撇号括起来的字符序列。如:如:”123+123”,”a”等等三、字符数组和字符串三、字符数组和字符串(2 2)字符串和字符数组在使用上的区别字符串和字符数组在使用上的区别字符数组字符数组字符串字符串赋初值时,字符个数赋初值时,字符个数=字符数组长度字符数组长度如:如:char b4=H,P,P,Y;赋初值时,字符个数赋初值时,字符个数字符数组长度字符数组长度,遇遇到空格或回车结束时,自动加到空格或回车结束时,自动加 0 。1)for(i=0;i4;i+) scanf(“%c”,&bi);2)for(i=0;i4;i+) bi)=getchar();
25、1) scanf(“%s”,b);2) gets(b);1)for(i=0;i4;i+) printf(“%c”,bi);2)for(i=0;i4;i+) putchar(bi);1) printf(“%s”,b);2) puts(b);三、字符数组和字符串三、字符数组和字符串(3 3)常见字符串函数常见字符串函数1)1) 字符串输入函数字符串输入函数格式:格式:gets (字符数组名字符数组名);功能:从键盘输入一个功能:从键盘输入一个字符串字符串到到字符数组字符数组如:如:char str 5; gets ( str ); 输入:输入:abc(回车),将字符串(回车),将字符串abc存入字
26、符数组存入字符数组str中,中,str中共有中共有4个字符(含系统自动加入的个字符(含系统自动加入的0字符)字符) 三、字符数组和字符串三、字符数组和字符串(3 3)常见字符串函数常见字符串函数2)2) 字符串输出函数字符串输出函数格式:格式:puts (字符数组名字符数组名);功能:将一个功能:将一个字符串字符串输出到输出到终端。终端。如:如:char str =“china”; puts ( str ); 输出:输出:china 三、字符数组和字符串三、字符数组和字符串3)3) 求字符串长度函数求字符串长度函数格式:格式:strlen (字符数组名字符数组名);功能:将字符数组所表示的字符
27、串的的长度,并作为功能:将字符数组所表示的字符串的的长度,并作为该函数的返回值返回。该函数的返回值返回。如:如:#include main( ) char str 10 =“china”; printf ( “%d”,strlen(str); 输出结果:输出结果:5三、字符数组和字符串三、字符数组和字符串例例310#include /*程序中用到了字符串处理函数程序中用到了字符串处理函数*/main()char s15=Turbo c; printf(%dn,strlen(s); /*输出输出s串的长度串的长度*/三、字符数组和字符串三、字符数组和字符串4)4) 字符串连接函数字符串连接函数格
28、式:格式:strcat (字符数组字符数组1,字符数组字符数组2);功能:将字符数组功能:将字符数组2接到字符数组接到字符数组1的后边,并删去的后边,并删去字符串字符串1的结束标记的结束标记0。如:如: char str1 20=BJ ; char str2 =SH; printf ( %s,strcat(str1,str2);输出:输出:BJ SH三、字符数组和字符串三、字符数组和字符串例例3-11编写十进制数转换成十六进制数的程序编写十进制数转换成十六进制数的程序 main( )int x,y,m,i=0; /*i为十六进制数的位数计数器为十六进制数的位数计数器*/ char a16; s
29、canf(%d,&x); y=x; /*把十进制数把十进制数x保存到保存到y中中,便于输出原始值便于输出原始值i*/ while(y!=0) m=y%16; if(m=0;m-)printf(%c,am); /*输出十六进制各位输出十六进制各位*/printf(十六十六)n); 三、字符数组和字符串三、字符数组和字符串例例3-12把十六进制数变成十进制数。把十六进制数变成十进制数。main()char a16; int x=0,i=0; scanf(%s,a); /*把十六进制这一串数输入到字符数组中把十六进制这一串数输入到字符数组中*/ while(ai!=0) if(ai=0&ai= 0&
30、 ch=9) si=ch; i+; si=0; puts(s); 三、字符数组和字符串三、字符数组和字符串例例例例3-15 3-15 编写将串编写将串编写将串编写将串2 2连在串连在串连在串连在串1 1后面的程序后面的程序后面的程序后面的程序#include stdio.hvoid main()char s180,s240,i,j; gets(s1);scanf(%s,s2); i=0; while (s1i!=0)i+; j=0; while (s2j!=0) s1i=s2j; i+;j+; s1i=0; puts(s1) ; 三、字符数组和字符串三、字符数组和字符串例例例例3-15 3-1
31、5 编写将串编写将串编写将串编写将串2 2连在串连在串连在串连在串1 1后面的程序后面的程序后面的程序后面的程序#include stdio.h#include stdio.hmain()char s180,s240;scanf(%s,s1); gets(s2);Strcat(s1,s2);puts(s1) ; 历年真题演练历年真题演练1.(20 09.4,单选)下列语句正确的是(),单选)下列语句正确的是()A. char s 5; s=abc ; B. char s 5 =abcxyz;C. char s =12345; D. char s 5 =1,2,3,4,5,0 ;2.(20 10
32、.4,单选)给数组赋初值错误的语句是(),单选)给数组赋初值错误的语句是()A. int dd = 0 ; B. int bb 5 = 1 , 3 , 5 ;C.C. int cc 3 = 5 , 4 , 3, 2 ;D.D. int aa = 1 , 2 , 3 , 4 , 5 ;历年真题演练历年真题演练3.(2009.4,填空),填空) 已知已知int a 3 = 2,4,6,8,10; ,数组元素,数组元素a 1 1 的值是(的值是( )。)。 4.(2009.4,程序分析)下列程序的功能是用选择法对,程序分析)下列程序的功能是用选择法对10个整数按由大到小排序。填空完成程序。个整数按由
33、大到小排序。填空完成程序。 main()main() int i,j,m,t; int i,j,m,t;int a 10 = 5,7,4,2,3,6,1,0,9,8;int a 10 = 5,7,4,2,3,6,1,0,9,8;for ( j=0;j=9; j+)for ( j=0;j=9; j+) m = ; m = ;i =j+1;i =j+1;while (i 10 )while (i 10 ) if ( a m a i ) m=i; if ( a m a i ) m=i; ; ; if ( m!=j)if ( m!=j) t= a j; t= a j;a j =a m;a j =a m;a m=t;a m=t; for ( i=0; i10; i+) printf ( %2d, a i);for ( i=0; i10; i+) printf ( %2d, a i);printf (n);printf (n);