《《高级语言程序设计教学课件》第6章数组课件.ppt》由会员分享,可在线阅读,更多相关《《高级语言程序设计教学课件》第6章数组课件.ppt(65页珍藏版)》请在三一办公上搜索。
1、第六章 数组,6.1一维数组6.3二维数组及多维数组6.5字符数组和字符串,2,一维数组元素的输入,int i,a6;for(i=0;i6;i+)scanf(“%d”,for(i=0;i6;i+)printf(“%5d”,ai);,一维数组元素的输出,3,【例6-3】从键盘输入10个互不相同的整数并存放在一维数组中,找出值最大的数组元素,并输出最大值所在的元素下标,k=0;for(i=1;i10;i+)if(akai)k=i;,找最大值,这两个程序的区别?,max=0;for(i=1;i10;i+)if(amaxai)max=i;printf(“max=a%d=%dn,max,amax);,m
2、ax=a0;for(i=1;i10;i+)if(max ai)max=ai;printf(“max=%dn,max);,5,【例6-5】从键盘上输入一个数x,在给定的数组a中查找x。如果找到了,输出相应的下标,否则,输出“Not Found”。,5,flag=0;for(i=0;i10;i+)if(ai=x)printf(Index is%dn,i);flag=1;break;if(flag=0)printf(“Not Foundn”);,二分查找(折半查找,对有序表的查找),1、思想:表头为left,表尾为right,k为要查找的关键字计算中间数据的序号mid=(left+right)/2;
3、若 k=amid,成功;否则:若 kamid,则 left=mid+1;重复1 当 leftright时,不成功。,折半查找过程,X=20,rightleft,查找失败,X=7,9,【例】读入10个整数,将数组中的元素逆序存放,分析当程序中读入任意10个数:8、-9、30、43、87、98、23、79、62、28时,28,62,79,23,98,87,43,30,-9,8,for(i=0;i5;i+)t=ai;ai=a9-i;a9-i=t;,10,for(i=0,j=9;ij;i+,j-)t=ai;ai=aj;aj=t;,11,【例】已知十个整数升序排列,现输入整数x,要求将x插入到合适的位置
4、,使得数列依然升序,分析1.找到插入位置p(默认插最后,设x为18)2.将插入位置p之后的元素后移;3.将x插入位置p,for(i=0,p=10;i10;i+)if(xai)p=i;break;,/*后移*/for(i=10;i=p+1;i-)ai=ai-1;,ap=x;,查找并删除,ai=ai+1,/*找到后前移,且数组元素个数减少*/if(flag)for(i=p;in-1;i+)ai=ai+1;n=n-1;,13,【例6-6】输入一个正整数n(1n10),再输入n个整数,用选择法将它们从小到大排序后输出,for(k=0;kn-1;k+)min=k;for(i=k+1;in;i+)if(a
5、iamin)min=i;temp=amin;amin=ak;ak=temp;,14,排序问题(冒泡排序法及改进),for(i=0;iaj+1)temp=aj;aj=aj+1;aj+1=temp;,for(i=0;iaj+1)temp=aj;aj=aj+1;aj+1=temp;flag=1;if(!flag)break;/无交换,排序完成,15,思考问题:,在数学中我们常常会用到矩阵,它的结构如下:怎样用一种数据结构来表示矩阵呢?,16,6.3二维数组及多维数组,1、二维数组的定义2、二维数组理解3、二维数组元素的引用4、二维数组元素的初始化5、二维数组的应用,17,1、二维数组的定义定义方式:
6、数据类型数组名常量表达式1常量表达式2;数组元素的存放顺序原因:内存是一维的二维数组:按行序优先,例 int a34;float b25;int a3,4;,行数下标从0开始,列数下标从0开始,元素个数=行数*列数,a21,a20,a11,a10,a01,a00,18,例 int a34;,每个元素ai是由包含4个元素的一维数组组成,2、二维数组的理解,把二维数组a理解成由3个元素组成的一维数组,a2,a1,a0,19,3、二维数组元素的引用数组名下标1下标24、二维数组元素的初始化分行初始化按元素排列顺序初始化,20,int a34;for(i=0;i3;i+)for(j=0;j4;j+)s
7、canf(%d,二维数组元素的输入输出,for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,aij);printf(n);,2 3 4 6 7 89 10 11 12,21,5、二维数组应用举例,22,【例6-10】在一个二维数组中,找出最大的元素值以及最大元素的行下标和列下标,并输出该数组,分析:1.输入:循环输入一个二维数组 a(维数固定)2.处理:遍历数组找出最大值 arowcol(a)先令 row=col=0;(b)依次用aij和arowcol比较 若aij arowcol,令row=i;col=j 3.输出:row、col和arowcol,23,【例6-10
8、】在一个二维数组中,找出最大的元素值以及最大元素的行下标和列下标,并输出该数组,#inlcude main()int row,col,i,j;int a32;/*输入3 x 2的数组*/for(i=0;i3;i+)for(j=0;j2;j+)scanf(“%d”,24,row=0;col=0;for(i=0;i3;i+)for(j=0;j2;j+)if(arowcolaij)row=i;col=j;,25,printf(“max a%d%d=%dn”,row,col,arowcol);,26,【例6-11】输入一个正整数n(1n6),根据下式生成1个nn的方阵,转置(行列互换)后输出,分析:1
9、.输入:方阵的行数 n2.处理:(a)循环计算出nn方阵每个元素的值;(b)将nn方阵转置;3.输出:循环输出转置前和转置后的方阵。,27,例如:n=3 转置前 转置后,for(i=0;in;i+)for(j=0;ji;j+)temp=aij;aij=aji;aji=temp;,28,1、先输入n的值,#include main()int i,j,k,n,temp;int a66=0;printf(Enter N:);scanf(%d,29,2、计算并打印出原始矩阵,for(i=0;in;i+)for(j=0;jn;j+)aij=i*n+j+1;printf(%4d,aij);printf(“
10、n”);,30,3、将矩阵转置,for(i=0;in;i+)for(j=0;ji;j+)temp=aij;aij=aji;aji=temp;,31,4、打印出转置后的矩阵,printf(“转置矩阵:n);for(i=0;in;i+)for(j=0;jn;j+)printf(%4d,aij);printf(n);,32,【例6-12】求NN阶二维数组的主对角线元素之和,sum=0;for(i=0;in;i+)sum=sum+aii;,33,【例】求NN阶二维数组每一行元素之和,数组 a,数组 b,34,【例】求NN阶二维数组每一行元素之和,int b3=0;for(i=0;i3;i+)for(j
11、=0;j4;j+)bi+=aij;for(i=0;i3;i+)printf(%5d,bi);,35,main()int a66=0,i,j;for(i=0;i6;i+)/主对角线和第0列赋1 ai0=1;aii=1;for(i=2;i6;i+)/其他元素 ai,j=ai-1,j-1+ai-1,j for(j=1;ji;j+)aij=ai-1j-1+ai-1j;for(i=0;i6;i+)for(j=0;j=i;j+)printf(%4d,aij);printf(n);,【例】杨辉三角形,36,在程序中使数组元素获得值的方法,说明数组的同时进行初始化缺点:数据相对固定用scanf语句由用户输入缺
12、点:当数组规模较大时,需要读入的数据会很多利用循环变量为数组赋值,int a23;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,&aij);,k=1;for(i=0;i4;i+)for(j=0;j4;j+)aij=k+;,37,37,矩阵的术语与二维数组下标的对应关系,38,例 在程序中使数组元素获得值的方法,初始化,缺点是数据相对固定利用scanf当数组元素有规律时,利用循环变量为数组赋值,k=1;for(i=0;i4;i+)for(j=0;j4;j+)aij=k+;,for(i=0;i2;i+)for(j=0;j3;j+)scanf(%d,39,多 维 数
13、组,int c100100100int b234,40,6.5字符数组和字符串,1、使用字符数组存储字符序列定义定义格式与一维数组相同字符数组的引用逐个字符引用,与一维数组相同,41,逐个数组元素输入输出char c15;for(i=0;i 15;i+)scanf(“%c”,*/,字符数组的输入输出,42,main()char c10=I,a,m,a,b,o,y;int i;for(i=0;i10;i+)printf(%c,ci);printf(n);,例 逐个输出字符序列,43,注意上述字符数组c中存放的不是字符串说明处理连续多个字符时要知道它的长度连续读入和输出字符时要一个一个字符进行,4
14、4,2、C语言的字符串特点C语言没有字符串变量,用字符数组代替。所有的字符串均以串尾标志0结束该字符也可以使用NULL表示,ASCII码值为0要存储一个长度为n的字符串,需要n+1个字符空间使用字符数组来处理字符串时,数组元素的个数也需要多1个例如:char str8=program;,45,【例6-14】输入一个以回车结束的字符串(至少10个字符),它由数字字符组成,将该字符串转换成整数后输出,#include void main(void)int i,n;char s10;printf(Enter a string:);i=0;while(si=getchar()!=n)i+;si=0;,
15、46,n=0;for(i=0;si!=0;i+)if(si=0,将字符串转换为整数,47,3、字符串存储的初始化逐个字符赋初值注意如果在中的初始字符长度大于数组定义长度,语法出错如果在中的初始字符长度小于数组定义长度,缺省的数据自动置NULL字符0,48,char str8=“China”;,字符串方式初始化,char str6=“China”;char str6=“China”;,char str=“China”;,若字符串长度字符数组长度,其余元素自动赋0,49,4、多个字符串的存储要存储1个字符串,需要一个一维字符数组,那么,如果有多个字符串,怎样存储呢?char911=Load,Pic
16、k,New,Save,Write to,Directory,Change dir,OS shell,Quit;,使用二维字符数组,50,5、常用的字符串处理函数字符串的输入输出使用格式输入/输出函数%s,例 用%s main()char str6;scanf(%s,str);printf(%s,str);,使用字符数组名时,遇0输出字符数组结束,难点:用字符数组名,而不是元素输入串长度数组元素个数遇空格、Tab键或回车结束自动加0,51,main()char a=h,e,l,l,0,o,!,0;printf(%s,a);,问题:下面的程序输出的结果是多少?,输出:hell,数组中有多个0时,遇
17、第一个结束,52,main()int i;char a=h,e,l,l,0,o,!,0;for(i=0;i 8;i+)printf(“%c”,ai);,问题:下面的程序输出的结果是多少?,输出:hell o!,53,main()char a15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);,运行情况:输入:How are you?输出:a=How b=are c=you?,例 逐个输入字符串,scanf中%s格式符,遇空格、Tab或回车结束,54,格式:puts(字符数组)功能:向显示器输出字符串(并且输出后换行)说明:字符数
18、组必须以0结束,专门的字符串输入输出函数字符串输出字符串函数,main()char str1=China;char str2=Bei jing;puts(str1);puts(str2);,55,格式:gets(字符数组)功能:从键盘输入一个以回车结束的字符串放入字符 数组中,并自动加0说明:输入串长度应小于字符数组维数,字符串输入函数gets,56,#include main()char string80;printf(Input a string:);gets(string);puts(string);,Input a string:How are you?,How are you?,57
19、,【例6-16】编写程序,从键盘上输入一个字符串,统计字母、数字和其它字符的个数,#include void main()char str80;int i,m=0,n=0,k=0;gets(str);for(i=0;stri!=0;i+)if(stri=a,58,【例6-17】已知两个字符串,要求将第二个字符串连接到第一个字符串后面。,#include stdio.hmain()char s180,s280;int i=0,j=0;gets(s1);gets(s2);while(s1i!=0)/*定位结束标志*/i+;while(s2j!=0)/*将s2接到s1后*/s1i=s2j;i+;j+
20、;s1i=0;puts(s1);,59,字符串连接函数strcat(String Catenate),格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消,新串最后加0,60,main()char str110=How;char str25=are;strcat(str1,str2);puts(str1);puts(str2);,61,格 式:strcpy(字符数组1,字符串2)功 能:将字符串2,拷贝到字符数组1中去返回值:返回字符数组1的首地址说 明:字符数组1必
21、须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值,例 char str120,str220;str1=Hello!;str2=str1;,字符串拷贝函数strcpy(String Copy),62,格 式:strcmp(字符串1,字符串2)功 能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止返 回 值:返回int型整数 若字符串1 字符串2,返回正整数 若字符串1=字符串2,返回零说 明:字符串比较不能用=,必须用strcmp,字符串比较函数strcmp(String Compare),63,比较字符串的大小:strcmp(A,B)
22、strcmp(a,A)strcmp(ABC,AB)strcmp(computer,compare)strcmp(36,3654),值=A-B 0值=C-0 0值=u-a 0值=0-5 0,64,字符串长度函数strlen(String Length),格 式:strlen(字符数组)功 能:计算字符串长度返回值:返回字符串实际长度,不包括0在内,例 对于以下字符串,strlen(s)的值为:(1)char s10=A,0,B,C,0,D;(2)char s=tb0willn;(3)char s=x69082n;,答案:1 3 1,65,字符串输入输出函数:包含文件是 stdio.h 字符串处理函数:包含文件是 string.h,