2019第5章数组ppt课件.ppt

上传人:scccc 文档编号:13677221 上传时间:2022-01-21 格式:PPT 页数:75 大小:2.21MB
返回 下载 相关 举报
2019第5章数组ppt课件.ppt_第1页
第1页 / 共75页
2019第5章数组ppt课件.ppt_第2页
第2页 / 共75页
2019第5章数组ppt课件.ppt_第3页
第3页 / 共75页
2019第5章数组ppt课件.ppt_第4页
第4页 / 共75页
2019第5章数组ppt课件.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《2019第5章数组ppt课件.ppt》由会员分享,可在线阅读,更多相关《2019第5章数组ppt课件.ppt(75页珍藏版)》请在三一文库上搜索。

1、第5章 数组,引例:输入30个学生的成绩,求高于平均成绩人数。,开场,定义变量sum, x, i,sum=0, i=1;,判别:i=30 ?,输入数据=x,sum=sum+x,i+,判别:i=30 ?,输入数据=x,sum=sum+x,i+,判别:i=30 ?,输出ave,假,ave=sum/30,终了,56,x,67,引例:输入30个学生的成绩,求高于平均成绩的人数。,main() int i,x; float sum=0,ave; for(i=1;i=30;i+) scanf(%d,将30个人的成绩逐一与ave比较,大于ave计数。(循环处理)如何保存30个成绩?,开场,定义变量sum,

2、i, 数组a30,sum=0, i=0;,sum=sum+ai,i+,判别:i=29 ?,输入数据 = a数组;,sum=sum+ai,i+,判别:i=29 ?,输出高于ave人数,假,ave=sum/30,终了,判别:i=29 ?,a,a0,a29,a1,a2,a28,引例:输入30个学生的成绩,求高于平均成绩人数。,第5章 数组,5.1 一维数组5.2 二维数组5.3 字符型数据5.4 算法举例,定义:批量数据的集合特点:所有数据类型相同要素:数组名、下标,5.1 一维数组,一、一维数组的定义和引用定义:类型说明符 数组名数组长度 如: int a10,x5*3;,a,a0 a2 a4 a

3、6 a8 a1 a3 a5 a7 a9,int n; scanf(“%d”, ,引用方式:数组名下标,留意:命名规则、数组长度、下标 、空间分配,整数或整型常量表达式,5.1 一维数组,二、一维数组元素的赋值,1. 初始化:定义同时赋值;2. 数组元素的输入:scanf函数输入;3. 数组元素的赋值:使用赋值运算;4. 产生随机数:使用随机函数random。,5.1 一维数组,1、初始化在定义数组时,对全部数组元素赋初值。 int a5=6, 2, 7, -3, 5;只给一部分元素赋值。 int a5=6, 2; int a5=6, 2, 0, 0, 0;定义数组时使数组a中全部元素自动赋以0

4、值。 static int a5; int a5=0;对全部数组元素赋初值时,可以不指定数组长度。 int a3=1, 2, 3; int a =1, 2, 3;,随机函数random的用法: 格式: random(x) 阐明: (1) x为整型 (2) 头文件stdlib.h (3) 产生0, x) 区间上的整数。留意: 若需每次运行时产生不同的随机整数,用randomize()函数,所在头文件:time.h,产生a,b区间上任意整数的方法: random(b-a+1)+a,2、 随机函数random和rand,rand函数的用法:格式: rand ( )阐明: (1) 头文件stdlib.

5、h。 (2) 该函数产生0到整型最大值之间的一个随机整数。,产生a,b区间上任意整数的方法: rand( )%(b-a+1)+a,srand函数 (头文件time.h) srand(time(0) 用当前时间作为随机数的初始种子,main( ) int i, a5=1,2,3,4,5; for (i=0; i5; i+) printf(%5d, ai ); printf(n); ,例5-1 数组元素的引用。,int i, a5;,for (i=0; i5; i+) scanf(%d, ,ai=i+1;,ai=random(20);,#include,例: 用数组求Fibonacci数列前40项

6、.,main( ) int i; long f40=1,1; for(i=2;i40;i+) fi=fi-2+fi-1; for(i=0;i40;i+) if(i%5=0) printf(n); printf(%12ld,fi); ,例5-2 求10个学生成绩的最高分、最低分和平均分。,#include stdio.hmain( ) int i, a10, min, max; float av, s; for(i=0;imax) max=ai; s+=ai; av=s/10; printf(“max=%d,min=%d,av=%.2f, max,min,av); ,运行输入:63 88 89

7、90 66 73 61 92 72 78运行结果:max=92,min=61,av=77.20,例5-3:求10个数的最小值及其位置,并与第1个数对调。(最小值唯一),分析: 用数组a存放10个数据,int a10; 用k记录最小值的位置。 交换a0与ak的值。,k=6,k=1,k=1,k=1,k=1,k=6,k=6,k=6,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,例5-3:求10个数的最小值及其位置,并与第1个数对调。(最小值唯一),main( ) int i, k, a10, t; for(i=0;i10;i+) scanf(%d, ,4 6 8 9 0 12 3 45

8、 1 5min :0weizhi:4,例5-4:产生10个40,100内的随机数,并用选择排序法按由小到大的顺序排序后输出。,k=0,k=2,5,3,k=3,k=1,k=2,5,9,k=2,k=3,k=4,9,6,7,思绪: 在ai和a9中找出最小的数,记录最小数所在的下标位置k,然后将最小数与ai交换。,第 i 轮:k=i; for (j=i+1;jaj) k=j; if (k!=i) t=ai;ai=ak;ak=t; ,第0轮,第1轮,第2轮,第3轮,#include stdlib.hmain() int i, j, k, t, a10; for(i=0;iaj) k=j; if (k!=

9、i) t=ai; ai=ak; ak=t; for(i=0;i10;i+) printf(%5d,ai);,例5-4:产生10个40,100内的随机数,并用选择排序法按由小到大的顺序排序后输出。,例5-5:用顺序排序法对10个数按升序排序。,第0轮,5,3,3,2,5,7,3,5,6,7,5,6,6,7,第1轮,第2轮,第3轮,思绪: 假设ai最小,发现其后面的数比ai小,就将这两个数交换。,第 i 轮:for (j=i+1; jn; j+) if (ajai) t=ai; ai=aj; aj=t; ,例5-5:用顺序排序法对10个数按升序排序。,#include stdlib.hmain(

10、) int i, j, k, a10; for(i=0;i10;i+) ai=random(61)+40; printf(%5d,ai); printf(n); for(i=0;i9;i+) for(j=i+1;j10;j+) if(ajai) k=ai; ai=aj; aj=k; for(i=0;i10;i+) printf(%5d,ai);,main( ) int a =1,3,5,6,8,9,10,15, k, i, left, right, m, n=8; scanf(%d, ,例5-6: 用二分查找法判断一个数是否在一个有序数组中。,例: 用random函数产生n个10,50之间的随

11、机整数,并按逆序重放在数组中。(n50),#include “time.h” #include stdlib.h main( ) int a50, t, n, i; scanf(%d, , 逆序存放a数组元素,a数组处理过程:,a0a1a2a3a4a5a6a7a8a9,a0a1a2a3a4a5a6a7a8a9,算法: for(i=0;in/2;i+) t=ai; ai=an-1-i; an-1-i=t; ,例: 用random函数产生n个10,50之间的随机整数,并按逆序重放在数组中。(n50),#include “time.h” #include stdlib.h main( ) int a

12、50, t, n, i; scanf(%d, ,main( ) int i, j, t, a8=1,2,3,4,5,6,7,8; for(i=0;i=7;i+) printf(%3d,ai); printf(n); for(i=1;i=3;i+) t=a0; for( j=1;j=7;j+) aj-1=aj; a7=t; for( i=0;i=7;i+) printf(%3d,ai);,数据前移,例: 一个数组有8个元素:1 2 3 4 5 6 7 8不增加数组,通过移动元素将数组变化为4 5 6 7 8 1 2 3,例: 用随机函数产生20个10,90之间的整数,找出其中素数,并按由小到大顺

13、序排列。,#include “stdlib.h”main( ) int a20, b20, i, j, k=0, t; for(i=0;i20;i+) ai=random(81)+10; for(i=0;i20;i+) for( j=2;j=ai-1;j+) if(ai%j=0) break; if(j=ai) bk=ai; k+; ,将数组 a 中的素数找出放到数组b中,例: 用随机函数产生20个10,90之间的整数,找出其中素数,并按由小到大顺序排列。,for(i=0;ik-1;i+) for(j=i+1;jk;j+) if(bjbi) t=bi; bi=bj; bj=t; for(i=0

14、;ik;i+) printf(%5d,bi);,用顺序排序法使 b 数组升序,例: 输入n个数到数组中n最多为100),选出所有大于n个数的平均值的那些数。,1. int a100;2. 输入n个数据并求这n个数据的累加和。3. 求n个数据的平均值。4. 选出所有大于平均值的那些数。,main( ) int a100, s=0, av, i, n; scanf(%d, ,例: 输入n个数到数组中n最多为100),选出所有大于n个数的平均值的那些数。,定义类型说明符 数组名 常量表达式 常量表达式 例:int a23阐明二维数组看作是特殊的一维数组。 a0 a00 a01 a02 a1 a10

15、a11 a12 二维数组在内存中按行存放。,5.2 二维数组,a00 a02 a11 a01 a10 a12,5.2 二维数组,引用形式 数组名下标下标举例: 若有说明: int a34 则对a数组元素非法引用的是 A. a03*1 B. a23 C. a1+10 D. a04,D,5.2 二维数组,初始化对全部元素赋初值 int a33=1,2,3,4,5,6,7,8,9; int a33=1,2,3,4,5,6,7,8,9; int a 3=1,2,3,4,5,6,7,8,9;对部分元素赋初值 int a33=1,2,5,6;,例: 打印如下方阵,1 0 0 0 0 0 1 3 1 0 0

16、 0 1 4 3 3 1 0 1 4 4 3 3 3 1 4 4 4 3 3 1 2 1 4 4 3 1 2 2 2 1 4 1 2 2 2 2 2 1,主对角线: i=j,副对角线:i+j=6,ij & i+j6,ij & i+j6,ij & i+j6,i6,main( ) int a77, i, j; for(i=0;i6) aij=4; if (ij ,例: 打印如下方阵,3,3,1111111,4 6 4 10 10 5 15 20 15 6,例5-8: 打印杨辉三角形,输出形式如下所示。,算法分析: 定义a77 ai0=1; aii=1; aij=ai-1j-1+ai-1j,2,11

17、 11 2 11 3 3 11 4 6 4 1 5 10 10 5 11 6 15 20 15 6 1,1,例5-8: 打印杨辉三角形。,main ( ) int a77, i, j, k; for (i=0;i7;i+) ai0=1; aii=1; for (i=2;i7;i+) for (j=1;ji;j+) aij=ai-1j+ai-1j-1; for (i=0;i7;i+) for (j=0;j=i;j+) printf(%6d,aij); printf(n); ,填充杨辉三角形中的 1 数字,填充除1以外的其它数字,例: 打印杨辉三角形。,1 1 1 1 2 1 1 3 3 1 1

18、4 6 4 11 5 10 10 5 1,for (i=0;i6;i+) for (j=1;j6-i;j+) printf( ); for (j=0;j=i;j+) printf(%6d,aij); printf(n); ,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1,for (i=0;i6;i+) for (j=1;j6-i;j+) printf( ); for (j=0;j=i;j+) printf(%6d,aij); printf(n); ,6个空格,3个空格,main( ) int a33, i, j, t, k=1; for(i=0;i3;i

19、+) for(j=0;j3;j+) aij=k+; for(i=0;i3;i+) for(j=0;ji;j+) t=aij;aij=aji;aji=t; for(i=0;i3;i+) for (j=0;j3;j+) printf(%4d,aij); printf(n); ,例5-7: 矩阵转置。,2 3 5 67 8 9,4 7 5 83 6 9,例:在一个34矩阵中,求最大值及其位置.,#include main( ) int a34, i, j, max , r, c; for(i=0;imax) max=aij; r=i; c=j; printf(max=a%d%d=%dn,r,c,ma

20、x); ,47 71 43 71 77 98 96 36 89 27 65 99max=a23=99,例:以下程序的功能是求一个二维数组中每行的最大值和每行的和。#include stdlib.h“#define N 4main( )int aNN, bN, cN, i, j, k, s=0; for(i=0;iN;i+) for(j=0;jN;j+) aij=random(40)+20; for(i=0;iN;i+) k=ai0; 【?】 ; for(j=0;jN;j+) if(kaij) 【?】 ; s=s+aij; bi=k; 【?】 ; ,for(i=0;iN;i+) for(j=0;

21、jN;j+) printf(%4d, 【?】 ); printf(%4d%4d,bi,ci); printf(n); ,s=0;,k=aij;,ci=s;,aij,符号常量,符号常量,用一个标识符表示一个常量,命名规则: 1、字母、数字、下划线组成 不能以数字开头; 2、一般不超过8个字符。 3、见名知意。 4、区分大小写。,#define PI 3.14main( ) float c,s,r; r=5; c=2 * 3.14 * r; s=3.14 * r * r; printf(%f,%f ,c,s);,#define 符号常量名 常量 #define PI 3.14,PI,PI,练习:f

22、un函数的功能是:求一个3行4列矩阵的外框的元素值之和,留意,矩阵四个角上的元素不能重复加。#define m 3#define n 4main( ) int amn=1,2,3,4,5,6,7,8,9,10,11,12; int i,j,s,s1=s2=s3=s4=0; for(j=0;jn;j+) s1=s1+a0j; s2=s2+amj; for(i=0;im;i+) s3=s3+ai0; s4=s4+ain-1; s=s1-s2-s3-s4; printf(total=%dn,s);,int i, j, s, s1=0,s2=0,s3=0,s4=0;,s2=s2+am-1j;,for(

23、i=1;im-1;i+),s=s1+s2+s3+s4;,5.3 字符型数据,(1) 普通字符: 用一对单撇号括起来的一个字符。(2) 转义字符: n 123 xAF。,5.3.1 字符常量,5.3.2 字符串常量,用一对双撇号括起来的字符序列。如: CHINA、a、how are you. 、 。字符串常量在内存中的存放: 每一个字符均以其ASCII码存放,且在字符串的最后自动添加一个0作为字符串结束标志。,请区别: a 和 a,5.3.3 字符型变量,只能放一个字符,占一个字节,存放该字符的ASCII码值。定义 char c1,c2;赋值 c1= a; c2= b;,c=a;c=97;二者等

24、价,整型与字符型变量可以通用,通用范围:0 127,5.3.4 getchar和putchar函数,1.getchar函数,2.putchar函数,从终端输入一个字符。,方式:c=getchar( );c为字符型或整型变量。,向终端输出一个字符。,方式:putchar(c);,a A,例5-11 从键盘上输入一个字符,然后输出到终端显示器上。,#include stdio.hmain( ) char c; c=getchar(); putchar(c);,5.3.5 字符数组,定义 char 字符数组名整型常量表达式 例:char s110, s223;初始化将字符数组中的各元素逐个赋予字符

25、例:char str3=t, a, e;用字符串常量来对字符数组初始化 例:char str =“hello; char str 6=“hello; 注: 对静态字符数组未被赋值的元素系统自动将其赋值为空(0)。字符数组元素的引用: 同简单变量,下面几种定义形式是等价的:,char name5= good;char name = good;char name5= good;char name = good;char name5= g, o, o, d;char name = g, o, o, d, 0;,例: 输出一个字符数组中的字符,main( ) char c10=I, ,a,m, ,a,

26、 ,b,o,y; int i; for (i=0;i10;i+) printf(%c,ci); ,5.3.5 字符数组,字符数组的输入输出 %c 逐个字符输入/输出 %s 一次输入/输出整个字符串,5.3.5 字符数组,输入时应注意 “%s格式输入,后面跟数组名,且不带“&”符号。 “%s格式输入无法输入空格。,例:char c10; scanf(%s, c); I am happy, “%c格式输入字符时,不需要分隔符,连续输入之后回车。,输出应注意的问题 用“%s格式输出,遇0时结束,printf函数中的输出项是字符数组名,而不是数组元素。 例: static char c11=china

27、; printf(%s, c);,china,可使用gets和puts整体输入/输出字符串。,#include main( ) char a20; int i; for(i=0;i6;i+) ai=getchar(); for(i=0;i6;i+) putchar(ai);,scanf(%c,printf(%c,ai);,#include main( ) char a20; scanf(%s,a); printf(%sn,a); ,例:输入/输出字符串,gets(a); puts(a);,5.3.5 字符数组,字符串处理函数 stdio.hgets(字符数组名):输入字符串puts(字符数组名

28、或字符串常量):输出字符串,例#include main( ) char a6; gets(a); puts(a);,5.3.5 字符数组,string.h字符串有效长度函数 strlen(字符数组名或字符串常量) char a10=abcde; printf(%dn,strlen(a);,5,举例下面程序段的输出结果是 char c =“tv0willn”; printf(“%d”,strlen(c); A. 14 B. 3 C. 输出不确定 D. 9,B,例:不使用strlen函数求字符串有效长度,#include “ stdio.h”main() char s80; int i=0; g

29、ets(s); while(si!=0) i+; printf(“ %d”,i);,s,good4,5.3 字符数组,字符串连接函数 strcat(字符数组名,字符数组名或字符串常量) char a10=abcde,b10=xy; strcat(a,b); puts(a); puts(b);,abcdexyxy,例5-20:不使用strcat函数,将两个字符串连接起来。,b,o,y,0,数组s1,数组s2,#include main( ) char s80,t80; int i, j; gets(s); gets(t); for(i=0;si!=0;i+) ; for(j=0;tj!=0;j+

30、) si+j=tj; si+j=0; puts(s);,goodboygoodboy,例5-20:不使用strcat函数,将两个字符串连接起来。,5.3 字符数组,字符串复制函数 strcpy(字符数组名,字符数组名或字符串常量) char a10=abcde,b10=xy; strcpy(a,b); puts(a); puts(b);,xyxy,例5-19:不使用strcpy函数完成字符串复制,#include “stdio.h”main() char s80,t80; int i; gets(s); for(i=0; si!=0; i+) ti=si; ti=0; puts(t);,输入:

31、china输出:china,5.3 字符数组,字符串比较函数 strcmp(字符数组名或字符串1,字符数组名或字符串2),函数值=,the thatthe thesePLANE boat,如:,例: 编写程序,比较两个字符串的大小。不用strcmp函数实现其功能。,比较规则:逐个字符进行比较,直到有两个字符不等或有一个字符串结束为止。,#include main( ) char s80,t80; int i; gets(s); gets(t); for(i=0;si=ti,thethat4,#include main( )char s80, t80; int i, k; gets(s); ge

32、ts(t); for(i=0; si!=0; i+) if(si!=ti) break; k=si-ti; if(k0) printf(stn); else if(k0) printf(stn); else printf(s=tn); ,例: 编写程序,比较两个字符串的大小。不用strcmp函数实现其功能。,i=0; while(si=ti,i=0; while(si!=0,例: 在一个字符串中删除一个指定的字符。,解题方法:在原串中,将不等于待删字符的元素放到原有数组中。,#include stdio.hmain( ) char s80, c; int i, k=0; gets(s); c=

33、getchar( ); for(i=0;si!=0;i+) if(si!=c) sk=si; k+; sk=0; puts(s); ,例5-22 在给定的字符串中删除所有的数字字符。,#include stdio.hmain( ) char s80; int i, k=0; gets(s); for(i=0;si!=0;i+) if(si9|si0)sk=si; k+; sk=0; puts(s);,7bc8bc9bcbcbcbc,例: 有三个字符串(长度不超过20),要求找出其中最大者。,str0,str1,str2,string,大,大,例: 有三个字符串(长度不超过20),要求找出其中最

34、大者。,#include string.h“#include main( ) char str20, s320; int i; for(i=0;i0) strcpy(str,s0); else strcpy(str,s1); if (strcmp(s2,str)0) strcpy(str,s2);printf(nthe largest string is:n%sn,str); ,CHINAHOLLANDAMERICAthe largest string is:HOLLAND,例5-21: 将5个姓名按由小到大排序。,#include stdio.h #include string.h main

35、( )char a520, b20; int i, j; for (i=0;i0) strcpy(b,ai); strcpy(ai,aj); strcpy(aj,b); for (i=0;i5;i+) puts(ai); ,例5-23 判断一个字符串是否是另外一个字符串的子串,如果是 输出其第一次出现的位置,如果不是输出相应的信息。,#include stdio.h#include string.hmain() int i,j,k,flag=0; char a80,b10; gets(a); gets(b); for(i=0;ai!=0;i+) for(j=i,k=0;bk!=0;k+,j+)

36、 if(bk!=aj) break; if(bk=0) printf(yes %dn,i); flag=1;break; if(flag=0) printf(non);,I love C programminggramyes 12fjksdfajkasfdabcno,例: 输入一行字符,统计其中有多少个单词,单词之间用空格分隔。,设char s= I am a boy.n初值为0, w初值为0,0,0,1,I,1,1,2,0,3,a,1,2,4,m,5,0,6,a,1,3,7,0,8,b,1,4,9,o,10,y,11,.,循环条件为si!=0,#include stdio.hmain( )

37、char s81; int i, n=0, w=0; gets(s); for (i=0; si!=0; i+) if (si= = ) w=0; else if (w= =0) w=1; n+; printf(There are %d words n,n);,例: 输入一行字符,统计其中有多少个单词,单词之间用空格分隔。,#include stdio.hmain( ) char s80, t; int n=0, m, d, i; scanf (%d, ,例: 将一个十进制正整数转换为十六进制数。,main( ) int a6=2,4,5,8,9, i, j, k; scanf (%d, ,例: 有n个数已按由小到大的顺序排好,要求输入一个数,把它插入到原有序列中,而且插入之后仍然保持有序。,寻找插入位置,把插入位置空出来,for(i=4; i=0; i-) if(kai) ai+1=ai; else ai+1=k; break;if(ka0) a0=k;,

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1