收藏 分享(赏)

C语言教案ch7数组.ppt

上传人:dreamzhangning 文档编号:3313668 上传时间:2018-10-12 格式:PPT 页数:46 大小:1.75MB
下载 相关 举报
C语言教案ch7数组.ppt_第1页
第1页 / 共46页
C语言教案ch7数组.ppt_第2页
第2页 / 共46页
C语言教案ch7数组.ppt_第3页
第3页 / 共46页
C语言教案ch7数组.ppt_第4页
第4页 / 共46页
C语言教案ch7数组.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

1、C程序设计(第二版) -教学课件,制作人: 黄 荧 制作人单位:河师大数学与信息科学学院,第七章 数组,数组的学习,标志着你的编程水平是“小学“还是“中学“.前者的你只能指挥一个兵(“单个数据“), 后者的你可以指挥全军万马(“大批数据“).,第七章 数组,本章内容: 1 数组的概念 2 一维数组的定义和引用(重点!) 2 二维数组的定义和引用 3 字符数组的定义和引用 4 与数组相关的常用算法 (重点!),7.1 一维数组,一 一维数组的定义与使用:,一般形式: 数组名常量表达式,如,int a10; a是整型数组,数组a包含10个元素,分别用a0、a1、a9表示 重要特点:1)数组的每一个

2、元素都是一个简单变量2)数组的元素是连续存放的!,数组类型,数组长度,C中的一维数组相当于数学中的向量,有一个下标:a=(a0,a1,a2,an),例7.1将0-9放入数组,再按9-0输出数组 #include void main ( ) int i, a10;for(i=0;i=0;i-) printf(“%d “,ai);printf(“n“); ,简单类型的变量只能存储一个单个的数据。 如:整型,实型,实符型等等。 结构类型的变量则能存储一组数据。 如:数组等等。, 给数组的全部元素赋初值: 如 int a10=0,1,2,3,4,5,6,7,8,9;,int a =0,1,2,3,4,

3、5,6,7,8,9;,变量初始化:是指在定义变量的同时给它赋值., 给数组的部分元素赋初值:(其余元素自动赋为0),如:int a10=0,1,2,3,4;,int a10=0,1,2,3,4,0,0,0,0,0;,思考:这里的10省略了结果怎样?,二 一维数组的两种初始化形式,三 一维数组程序举例:,例7.2用数组求Fibonacci数列前20项。 f1=1,f2=1,fn=fn-1+fn-2 (n3),用简单变量实现: #include void main() long f1,f2; int i;f1=1; f2=1; for(i=1;i=10;i+)printf(“%12ld %12ld

4、“,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2; f2=f2+f1; ,用数组实现: (i=2-19)fi=fi-1+fi-2,#include void main() long f20=1,1;int i;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%4=0) printf(“n“);printf(“%12ld“,fi);printf(“n“); ,例 7.3 用起泡法对10个整数排序(由小到大)P134,算法分析:a0 a1 a2 a3 a4 a5,a0 a1 a2 a3 a4,a0 a1 a2 a3,a

5、0 a1 a2,a0 a1,注意,这种方法总是相邻两个元素比较!“小的上冒,大的下沉“,#include void main() int t,j,i, a10=2,4,6,8,4,7,-4,13,6,9; printf(“排序前:n“); for(i=0;iai+1 ) t=ai;ai=ai+1; ai+1=t; printf(“排序后:n“); for(i=0;i10;i+)printf(“%4d “,ai); printf(“n“); ,例 求一维数组中数据的最大值及位置。,a0 a1 a2 an-1,max=a0 p=0,#include void main() int i,max,p,

6、a10=2,4,6,18,4,67,-14,13,6,9;printf(“数组a:n“); for(i=0;imax) max=ai;p=i;printf(“max=a%d=%dn“,p,max); ,例 在一维数组中查询数据x。,#include void main() int i,x,a10=2,5,7,1,7,4,3,8,9,7;printf(“数组a:n“);for(i=0;i10;i+)printf(“%5d“,ai);printf(“n“);printf(“请输入查询的数据 x:“);scanf(“%d“, ,算法分析:a0 a1 a2 an-1 x,例 在一维数组中删除数据x。,

7、#include void main() int i,k,x,a10=2,5,7,1,7,4,3,8,9,7;printf(“删除前的数组a:n“);for(i=0;i10;i+)printf(“%5d“,ai);printf(“n请输入要删除的数据 x:“);scanf(“%d“,算法分析:1 定位:x的位置.2 删除:从数组中“删除“xa0 a1 ai an-1|x,思考:保序插入的算法.,7.2 二维数组,1 二维数组的定义数组名常量表达式1常量表达式2,第一维长度:行数,第二维长度:列数,如:float a34; 表示:二维实型数组a有 3排 4列 个实型元素如下:a00 a01 a0

8、2 a03 a10 a11 a12 a13 a20 a21 a22 a23,C中的二维数组相当与数学中的矩阵,有两个下标:,注意事项:, C语言规定:二维数组 - 特殊的一维数组。“行向量“ - 特殊的“元素“。, 二维数组的存储方式:,二维数组是“按排存储“的。, 给部分元素赋初值:,2二维数组的初始化 (有两类4种形式), 给全部元素赋初值,a)分行赋初值: 如:int a3 4=1,2,3,4,5,6,7,8,9,10,11,12;,b) 不分行 如: int a3 4=1,2,3,4,5,6,7,8,9,10,11,12;,第二维长度 是绝对不能省略的!,a)分行赋初值: 如:int

9、a34=1,3,5;,又如:int a34=1,0,5;,b) 不分行赋初值,如:int a34=1,3,5 ;,当外循环变量控制的是行下标, 则是按行输入数据的!,一般格式: for(表达式1;表达式2;表达式3)语句,3 二维数组程序举例,例 二维数组的输入与输出。,#include void main()int i,j,a33;/= 输入矩阵: printf(“请输入9个数据:n“);for(i=0;i3;i+)for(j=0;j3;j+)scanf(“%d“,1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9,思考:分析,修改其中的输入方式后的内存存放过程和输出结果

10、。 1 for(i=0;i3;i+)for(j=0;j3;j+)scanf(“%d“,例7.4 P138 数组的转置。,即,行变列,列变行:aijbji (0i2 0j3),例7.4 矩阵的转置。,#include void main() int i,j,a23=1,2,3,4,5,6,b32;printf(“转置前:n“); for(i=0;i2;i+)for(j=0;j3;j+)printf(“%4d“,aij); printf(“n“); for(i=0;i2;i+)for(j=0;j3;j+)bji=aij; printf(“转置后:n“); for(i=0;i3;i+) for(j=

11、0;j2;j+)printf(“%4d“,bij); printf(“n“); ,例 方阵的转置(在本数组中)。,#include void main() int i,j,t,a33=1,2,3,4,5,6,7,8,9;printf(“n 转置前:n“); for(i=0;i3;i+)for(j=0;j3;j+)printf(“%4d“,aij); printf(“n“); for(i=0;i3;i+)for(j=0;ji;j+) t=aij;aij=aji;aji=t; printf(“n 转置后:n“); for(i=0;i3;i+) for(j=0;j3;j+)printf(“%4d“,

12、aij); printf(“n“); ,算法思想:交换上下三角阵的对应元素,如图。,例7.5 求二维矩阵(3*4)的最大值,及其所在行号及列号。,分析: 二维数组与一维数组完全类似:,#include void main() int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,row,colum,max;max=a00; row=0;colum=0;for(i=0;imax)max=aij;row=i;colum=j; printf(“max=a%d%d=%dn“,row,colum,max); ,例 矩阵的乘积。,A=(aij)2*3 B=(bij)3*4

13、 乘积矩阵: C=(cij)2*4(其中i=0,1,j= 0,3),#include void main() int i,j,k,c24,a23=1,2,3,2,4,6,b34=1,3,5,2,0,1,0,1,1,0,1,3;/= 求矩阵的乘积:求乘积矩阵的每个元素for(i=0;i2;i+)for(j=0;j4;j+)cij=0;for(k=0;k3;k+)cij+= aik*bkj; /=输出结果:乘积矩阵printf(“乘积矩阵c:n“);for(i=0;i2;i+)for(j=0;j4;j+)printf(“%4d“, cij); printf(“n“); ,7.3 字符数组 P140

14、,1 字符数组的定义: char c10; c0=I; c1= ; c2=a; c3=m; c4= ; c5=h; c6=a; c7=p; c8=p; c9=y; 在内存中:,2 字符数组的初始化:1)用字符常量(全部): char c10 =I, ,a,m, ,h,a,p,p,y;2)用字符常量(部分): char c10 =h,a,p,p,y;在内存中:,整型数组的元素是整型变量.(如,int a10;有a0a9,10个元素.) 实型数组的元素是实型变量.(如,float f100;有f0f99,100个元素.) 字符型数组的元素是,字符型变量.(类似地,char c80;有c0c79,8

15、0个元素.),3 字符数组的引用,#include void main() char c10 =I, ,a,m, ,a, ,b,o,y;int i;for(i=0;i10;i+)printf(“%c“, ci); printf(“n“); ,例7.6 输出一个字符串. 注意: 通常用一维字符数组放一个字符串!(用一个字符变量只能放一个字符.),运行结果: I am a boy,例7.7 输出一个菱形图.,#include void main() char diamond5 = , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,* ;int i,j;for(i=0;i5;i+

16、) for(j=0;j5;j+)printf(“%c“, diamondij); printf(“n“); ,* * * * * *,注意: 通常用二维字符数组放多个字符串!,4 字符串与字符串的结束标志,1)字符串的结束标志: 0 2)用字符串给字符数组赋初值!char c =“I am happy“; char c =“I am happy“; char c =I, ,a,m, ,h,a,p,p,y,0;/ char c =I, ,a,m, ,h,a,p,p,y; 3) 部分赋初值: char c10 =“happy“;在内存中,5 字符数组的输入输出:即:字符串的输出和输出。,1) 输出

17、:char c20=“happy!“;printf(“%sn“,c)字符数组名!注意: 遇到第一个串结束符就结束! 2) 输入: char s120,s220,s320;scanf(“%s%s%s“,s1,s2,s3);没有地址符! 输入形式:how are you? 此时:“how“s1, “are“s2, “you?“s3,注意:scanf()是把空格作为分隔符的.这说明用scanf()不能接收带空格的串!,#include void main() char s180,s280,s380;scanf(“%s%s%s“,s1,s2,s3); printf(“%sn%sn%sn“,s1,s2,

18、s3); ,6 字符串处理函数(8个), 串输入: gets(s)如:gets(s);(s: 数组名,即数组的首地址。)输入:how are you? 则系统将12个字符及串结束符放在数组s中。注意:函数gets()是可以接收带空格的字符串的。,#include void main() char s80;gets(s); puts(s); ,int a10;, 串输出: puts(s) 这里 s: 数组名,即数组的首地址。或串常量 如:puts(“chinan Xin Xiangn“);执行结果:chinaxinxiang, 串连接:,函数使用格式:strcat(数组名,串2)功能:将串2接到

19、串1后,放在指定的数组中。注意:“串2“可以是一个串常量,也可以是数组名.如: char a10=“b“;strcat(a,“111“); 注意到数组应足够大。puts(a);输出为:b111,串拷贝:,函数使用格式:strcpy(数组名,串) 功能: 将串复制到指定的数组中。如:strcpy(s,“happy“); puts(s);输出结果: happy串拷贝的另一用法: 如:strcpy(s, “happy“,3);其作用:将串的前3个字符放入s中,并加上串结束符。, 串比较函数。,strcmp(串1,串2)功能:比较两个字符串的“大小“,其函数值为整数。当串1=串2,函数值为0;当串1串

20、2,函数值0;当串1串2,函数值0.,如:1) strcmp(“abcd“,“abd“)=c-d=99-100=-1 串 “abcd“是小于串“abd“的.2) strcmp(“abcd“,“abc“)= d -0 =100- 0=100 串 “abcd“是大于串“abc“的.3) strcmp(“abc“,“abc“)=0-0=0-0=0 串 “abc“是等于串“abc“的.,字符串的比较方法:两个字符串的比较是对应字符比较: 从两个字符串的第一对相应字符比起,依次比较两个字符串中的每一对相应字符,直到出现对应字符不同或出现字符串结束符为止,其函数值为最后一次比较中相应字符的ASCII码之差

21、。),求串长:strlen(串),应注意的是:求出的是串的实际长度, 不包含串结束符。 如:l=strlen(“happy“);printf(“%dn“,l);输出:5 大写转换小写:strlwr(s) (返回串首址) 小写转换大写:strupr(s)(返回串首址) 注意:以上所有关于字符串的函数都在头文件string.h中!,回顾,8个常用字符串函数: puts(s) gets(s) strcat(数组名,串2) strcpy(数组名,串) strcmp(串1,串2) strlen(串) strlwr(s) strupr(s),例 7.9 有10个字符串,求其最大者。,a0 a1 a2 an

22、-1,max=a0,例 7.9 程序:,#include #include void main() char max20,str1020; int i;for(i=0;i0)strcpy(max,stri);printf(“n 最大串是:%sn“,max); ,ex 7.13 实现字符串的连接(不用strcat() ) 读程序,算法分析: 1)定位:i=0,1,2,一直找到串a的尾部,即:ai等于 0 时停止 . 2)拷贝:向串a的尾部依次拷入串b中每个字符,j=0,1,2,一直到bj是串结束符 0 停止。 即ai+j=bj,#include void main() char a80,b20;

23、 int i,j;printf(“请输入两个串:n“);gets(a);gets(b);for(i=0;ai!=0;i+); /定位for(j=0;(ai+j=bj)!=0;j+); /复制puts(a);,ai!=0,(ai+j=bj)!=0,ai,ai+j=bj,ai!=0 ai!=0,注意:, ai,(ai+j=bj)!=0 (ai+j=bj)!=0 ai+j=bj,ex 7.14 实现字符串的比较,编程序.,#include void main() char a80,b80; int i,d;printf(“请输入两个串:n“);gets(a);gets(b);for(i=0;ai=b

24、i ,例7.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开。,分析:如:aa bbc dd ee 出现单词: 空格之后出现了一个非空格字符 注意问题: 1 用多长的数组放一行字符? 2 用什么函数接收一行可能带空格的字符? 3 word=0表示当前字符是空格,它是为检验下一个字符是否为单词的开始做准备。,例7.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开。,#include void main()char string80;int i,num=0,word=0;puts(“请输入一个串:“);gets(string); for(i=0; stringi;i+)if(s

25、tringi= )word=0;else if(word=0)num+;word=1;printf(“此行中有%d个单词.n“,num);,例7.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开。,方法2: (同学想出的算法) #include void main()char s80;int i,num=0;puts(“请输入一个串:“);gets(s); for(i=1; si!=0;i+)if(si!= ,分析:如:aa bbc dd ee 出现单词: 空格之后出现了一个非空格字符,作业: P152,Ex 7.2 7.4 7.5 (一维数组)7.3 7.6 (二维数组)7.13

26、7.14 7.15 (字符数组),a0 a1 a2 a3 a4 a5,例 7.3 用起泡法对10个整数排序(由小到大)P134,算法分析:,注意,这种方法总是相邻两个元素比较!“小的上冒,大的下沉“,#include void main() int t,j,i,a10=2,4,6,8,4,7,-4,13,6,9;printf(“排序前:n“); for(i=0;iai+1 ) t=ai;ai=ai+1; ai+1=t;printf(“排序后:n“); for(i=0;i10;i+)printf(“%4d “,ai);printf(“n“); ,a0 a1 a2 a3 a4,a0 a1 a2 a

27、3,a0 a1 a2,a0 a1,a5 -最大,a4 次大,a3 第三大,a2 第四大,a1 第五大,例 用第五章所讲的排序方法给10个数排序(由小到大),分析: a0 a1 a2 a3 a4 a5,a1 a2 a3 a4 a5,a2 a3 a4 a5,a3 a4 a5,a4 a5,冒泡法排序: for(j=0;jai+1) t=ai;ai=ai+1;ai+1=t;,第五章的排序方法: for(j=0;jai) t=ai;ai=aj;aj=t;,例 用第五章所讲的排序方法给10个数排序(由小到大),#include void main() int t,i,j, a10=2,4,6,8,4,7,

28、-4,13,6,9; printf(“排序前:n“); for(i=0;iai) t=ai;ai=aj;aj=t; printf(“排序后:n“); for(i=0;i10;i+)printf(“%4d “,ai); printf(“n“); ,Ex7.4 向已排好序的数组,插入一个数。,算法分析:1 定位:x的位置.2 插入:向数组中“插入“xa0 a1 ai a9|x,#include void main() int a11=1,2,3,5,8,12,27,29,30,96;int i,j,x;printf(“插入前:n“);for(i=0;i=x)break; for(j=9;j=i;j

29、-) /后移a9 aiaj+1=aj; ai=x; /插入x到ai printf(“插入后:n“); for(i=0;i11;i+)printf(“%5d“,ai); printf(“n“); ,ex7.5 逆序存放。,分析: a0 a1 a8 a9 i=0 j=9,先让i,j分别“指向“a0和a9 ,当ij,则交换ai,aj;然后i,j同步内移:i+,j- ,再交换ai,aj ,直至ij不成立为止。,#include void main() int a10 =1,2,3,4,5,6,7,8,9,10,i,j,t;printf(“逆序前:n“);for(i=0;i10;i+)printf(“%

30、4d“,ai); printf(“n“);for(i=0,j=9;ij;i+,j-) t=ai;ai=aj;aj=t;printf(“逆序后:n“);for(i=0;i10;i+)printf(“%4d“,ai); printf(“n“); ,/不用系统函数如何将将整型转换成字符串呢? #include /函数功能:转化整数为字符串 /入口参数:整数 num /出口参数:字符串的首地址 /返回值:字符串的首地址 char* myItos( int num,char *str) char *s0=str,*i,t;for(;num;num/=10)*str+=(num%10)+0;*str=0;

31、str-;for(i=s0;istr;i+,str-) t=*i;*i=*str;*str=t; return s0; void main() int m=12345; char s80;printf(“n=%d s=“%s“ n“,m,myItos(m,s);,/* 筛法求素数 筛法,是求不超过自然数N(N1)的所有质数的一种方法。 据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274194年)发明的,又称埃拉托斯特尼筛子。 具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。 第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。 2后面第一个没

32、划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。 3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。 这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。 因为希腊人是把数写在涂蜡的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后, 这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。 (另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。) */ #include #include #define MAX 501 int main(void) int i,j,k,aMAX=0,0,1,count;for(i=3;iMAX;i+=2) ai=1; /此处已经筛去偶数了,一下可以只考虑奇数。k=(int)sqrt(MAX)+1;for(i=3;ik;) /依次筛去能被3-(int)sqrt(MAX)整除的数 for(j=i+2;jMAX;j+=2)if(aj) if(j%i=0)aj=0; /筛去能被i整除的数while(a+i=0 ,假设数组A中已经存放20个整数,编写程序,将其中所有偶数存放在数组B中,将所有的奇数存放在数组C中,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报