《高级语言程序设计教学课件》第6章数组.ppt
《《高级语言程序设计教学课件》第6章数组.ppt》由会员分享,可在线阅读,更多相关《《高级语言程序设计教学课件》第6章数组.ppt(96页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 1提出问题:提出问题:【例例6-16-1】从键盘输入从键盘输入1010个数,求平均值并输出所个数,求平均值并输出所有大于平均值的数。有大于平均值的数。采用以前的方法解决,采用以前的方法解决,存在以下问题存在以下问题:循环体中循环体中只用一个变量只用一个变量完成。计算出平均值后,完成。计算出平均值后,因因没有保存这没有保存这1010个数个数,无法完成比较。,无法完成比较。用十个变量用十个变量完成。完成。无法完成循环输入。另外如。另外如果数据增加到果数据增加到100100个、个、10001000个或更多时,定义如个或更多时,定义如此多的变量不现实。此多的变量不现实。第六章第六章 数组数组6.1
2、一维数组一维数组6.3二维数组及多维数组二维数组及多维数组6.5字符数组和字符串字符数组和字符串4 4基本概念基本概念n数组是一种构造数据类型n数组有序数据的集合,用数组名标识n元素是数组的基本组成成份,它们是同 一种数据类型,用数组名和下标确定aa55a44a33a22a11a005 5aa55a44a33a22a11a00n、一维数组的说明、一维数组的说明定义方式:定义方式:数据类型数据类型数据类型数据类型 数组名数组名数组名数组名 整型常量表达式整型常量表达式整型常量表达式整型常量表达式 ;合法标识符合法标识符例例int a6;数组名表示该数组所数组名表示该数组所占的内存单元的首地占的内
3、存单元的首地址,是址,是 地址常量地址常量地址常量地址常量编译时分配内存,并且是连续的编译时分配内存,并且是连续的内存字节数内存字节数=数组元素个数数组元素个数*sizeof(sizeof(元素数据类型元素数据类型)表示元素个数表示元素个数只能是常量只能是常量下标从下标从0 0开始开始6.1一维数组一维数组6 6数组定义举例数组定义举例n n例例例例 int i=15;int datai;n n例例例例 int data5;data5=10;n n例例例例#define N 15int aN;不能用变量定义数组元素个数不能用变量定义数组元素个数5 5超出了数组定义的范围,范围超出了数组定义的范
4、围,范围是是0 04 4共共5 5个整型数据个整型数据 7 7n、一维数组的引用、一维数组的引用数组必须数组必须先定义,后使用先定义,后使用只能逐个引用数组元素,不能一次引用只能逐个引用数组元素,不能一次引用整个数组整个数组数组元素表示形式:数组元素表示形式:数组名数组名数组名数组名 下标表达式下标表达式下标表达式下标表达式 其中:下标可以是其中:下标可以是整型常量或整型表达式整型常量或整型表达式整型常量或整型表达式整型常量或整型表达式8 8数组使用举例数组使用举例n n例例例例 a0=a3+a5+a2*4;n n例例例例 ai=ai-1+ai-2;n n例例例例 int a10;printf
5、(%d,a);9 9 数组元素的输入数组元素的输入 int a6;scanf(“%d%d%d%d%d%d”,&a0,&a1,&a2,&a3,&a4,&a5);int i,a6;for(i=0;i6;i+)scanf(“%d”,&ai);1010 数组元素的输出数组元素的输出 int a6;printf(“%d%d%d%d%d%d”,a0,a1,a2,a3,a4,a5);int i,a6;for(i=0;i6;i+)printf(“%5d”,ai);?只想输出只想输出a1,a5的值的值 printf(“%d,%d”,a1,a5);1111特别注意特别注意n在在C语言中语言中,程序运行时系统并不自
6、动检验程序运行时系统并不自动检验数组下标是否越界。但是我们写程序时,数组下标是否越界。但是我们写程序时,一定要保证数组下标不能越界一定要保证数组下标不能越界n例如例如int a4;a0、a1、a2、a3是合法的,但是是合法的,但是a4、a5也是可以引用的,只是它们的数也是可以引用的,只是它们的数据是多少我们不知道据是多少我们不知道1212【例例例例6-16-1】从键盘输入从键盘输入10个数,求平均值并输出所个数,求平均值并输出所有大于平均值的数有大于平均值的数#include#include main()main()int i,n=10;int i,n=10;float a10,avg=0;f
7、loat a10,avg=0;printf(“Please input 10 data:n”);printf(“Please input 10 data:n”);for(i=0;i10;i+)for(i=0;i10;i+)/*/*输入输入输入输入1010个数个数个数个数*/scanf(“%d”,&ai);scanf(“%d”,&ai);avg+=ai avg+=ai 1313 avg=avg/10avg=avg/10;printf(“printf(“平均值为:平均值为:平均值为:平均值为:%fn”,avg);%fn”,avg);for(i=1;i10;i+)for(i=1;iavg(aiavg
8、)printf(“%f ”,ai);printf(“%f ”,ai);n+;n+;if(n%5=0)if(n%5=0)/*/*每行输出每行输出每行输出每行输出5 5个数个数个数个数*/printf(“n”);printf(“n”);printf(“n);printf(“n);1414n、一维数组的初始化、一维数组的初始化初始化方式初始化方式:定义时赋初值定义时赋初值说明:说明:数组不初始化,其元素值为随机数数组不初始化,其元素值为随机数部分数组元素赋初值,没有赋初值的元素为部分数组元素赋初值,没有赋初值的元素为0当全部数组元素赋初值时,可不指定数组长度当全部数组元素赋初值时,可不指定数组长度例
9、例例例 int a5=6,2,3;a0=6;a1=2;a2=3;a3=0;a4=0;例例例例 int a=1,2,3,4,5,6;编译系统根据初值个数确定数组元素个数编译系统根据初值个数确定数组元素个数例例例例int a5=1,2,3,4,5;a0=1;a1=2;a2=3;a3=4;a4=5;15154、一维数组的应用举例、一维数组的应用举例【例例例例6-36-3】从键盘输入从键盘输入10个互不相同的整数并存放个互不相同的整数并存放在一维数组中,找出值最大的数组元素,并输出最在一维数组中,找出值最大的数组元素,并输出最大值所在的元素下标大值所在的元素下标0 1234567898-930 43
10、87 9823 79 62 28kkkkk k=0;k=0;for(i=1;i10;i+)for(i=1;i10;i+)if if(akai(akai)k=i;k=i;1616#include#include main()main()int i,k;int i,k;int a10=0;int a10=0;printf(“Please input data:n”);printf(“Please input data:n”);for(i=0;i10;i+)for(i=0;i10;i+)scanf(“%d”,&ai);scanf(“%d”,&ai);1717 k=0;k=0;for(i=1;i10;
11、i+)for(i=1;i10;i+)if if(akai(akai)k=i;k=i;printf(“max=%d,”,ak);printf(“max=%d,”,ak);printf(“k=%dn,k);printf(“k=%dn,k);1818【例例6-4】利用数组计算利用数组计算Fibonacci数列数列的前的前20个数个数f1919f55f44f33f22f111f0102 23 35 58 8这是一个古典数学问题,这是一个古典数学问题,有一对兔子,从出生后的有一对兔子,从出生后的第三个月开始,每个月都第三个月开始,每个月都生一对小兔子。小兔子长生一对小兔子。小兔子长到第三个月后每个月又生
12、到第三个月后每个月又生一对兔子。假设所有兔子一对兔子。假设所有兔子都不死,问每个月的兔子都不死,问每个月的兔子总数为多少?总数为多少?1919main()main()int i;int i;int f20=1,1;int f20=1,1;for(i=2;i20;i+)for(i=2;i20;i+)fi=fi-2+fi-1;fi=fi-2+fi-1;for(i=0;i20;i+)for(i=0;i20;i+)printf(%8d,fi);printf(%8d,fi);if(i%5=0)printf(n);if(i%5=0)printf(n);1 1 2 3 5 1 1 2 3 5 8 13 21
13、 34 55 8 13 21 34 55 89 144 233 377 610 89 144 233 377 610 987 1597 2584 4181 6765 987 1597 2584 4181 6765f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 2020【例例例例6-56-5】从键盘上输入一个数从键盘上输入一个数x,在给定的数组,在给定的数组a中查找中查找x。如果找到了,输出相应的下标,否则,。如果找到了,输出相应的下标,否则,输出输出“Not Found”。200 12345678922
14、1936 80 98 1220 55-8 165555555555555555 flag=0;flag=0;for(i=0;i10;i+)for(i=0;i10;i+)if(ai=x)if(ai=x)printf(Index is%dn,i);printf(Index is%dn,i);flag=1;flag=1;break;break;if(if(flag=0flag=0)printf(“Not Foundn”);)printf(“Not Foundn”);2121【例例例例6-56-5】从键盘上输入一个数从键盘上输入一个数x,在给定的数组,在给定的数组a中查找中查找x。如果找到了,输出相应
15、的下标,否则,。如果找到了,输出相应的下标,否则,输出输出“Not Found”。main()main()int i,flag,x;int i,flag,x;int a10=22,19,36,80,98,12,20,55,-8,16;int a10=22,19,36,80,98,12,20,55,-8,16;for(i=0;i10;i+)for(i=0;i10;i+)printf(“%d”,ai);printf(“%d”,ai);printf(Enter x:n);printf(Enter x:n);scanf(%d,&x);scanf(%d,&x);212222 flag=0;flag=0;
16、for(i=0;i10;i+)for(i=0;i10;i+)if(ai=x)if(ai=x)printf(Index is%dn,i);printf(Index is%dn,i);flag=1;flag=1;break;break;if(if(flag=0flag=0)printf(“Not Foundn”);)printf(“Not Foundn”);222323【例例】读入读入10个整数,将数组中的元素逆序个整数,将数组中的元素逆序存放存放n分析分析当程序中读入任意当程序中读入任意10个数:个数:8、-9、30、43、87、98、23、79、62、28时时0 1234567898-930
17、43 87 9823 79 62 2828286262797923239898878743433030-9-98 8 for(i=0;i5;i+)for(i=0;i5;i+)t=ai;t=ai;ai=a9-i;ai=a9-i;a9-i=t;a9-i=t;2424main()main()int i,a10,t;int i,a10,t;for(i=0;i10;i+)for(i=0;i10;i+)scanf(%d,&ai);scanf(%d,&ai);printf(origin data:);printf(origin data:);for(i=0;i10;i+)for(i=0;i10;i+)pri
18、ntf(%d,ai);printf(%d,ai);printf(n);printf(n);2525 for(i=0;i5;i+)for(i=0;i5;i+)t=ai;t=ai;ai=a9-i;ai=a9-i;a9-i=t;a9-i=t;printf(new data:);printf(new data:);for(i=0;i10;i+)for(i=0;i10;i+)printf(%d,ai);printf(%d,ai);printf(n);printf(n);2626 for(i=0,j=9;ij;i+,j-)t=ai;ai=aj;aj=t;ij2727【例例】已知十个整数升序排列,现输入整数
19、已知十个整数升序排列,现输入整数x,要求将要求将x插入到合适的位置,使得数列依然升序插入到合适的位置,使得数列依然升序n分析分析1.找到插入位置找到插入位置p(默认插最后,设(默认插最后,设x为为18)2.将插入位置将插入位置p之后的元素后移;之后的元素后移;3.将将x插入位置插入位置p0 12345678910147912151720213018p1818181818181830212018for(i=0,p=10;i10;i+)for(i=0,p=10;i10;i+)if(xai)if(x=p+1;i-)for(i=10;i=p+1;i-)ai=ai-1;ai=ai-1;ap=x;ap=x
20、;2929【例例】读读10个整数存入数组,找出其中个整数存入数组,找出其中最大值和最小值最大值和最小值n分析分析1.输入输入:用用for循环输入循环输入10个整数个整数2.处理处理:(a)先令先令 max=min=x0(b)依次用依次用xi和和max,min比较比较 若若maxxi,令令min=xi3.输出输出:max和和min3030#include#include#define SIZE 10#define SIZE 10main()main()int aSIZE,i,max,min;int aSIZE,i,max,min;printf(Enter%d integers:n,SIZE);p
21、rintf(Enter%d integers:n,SIZE);for(i=0;i for(i=0;iSIZESIZE;i+);i+)scanf(%d,&ai);scanf(%d,&ai);3131 max=min=a0;max=min=a0;for(i=1;iSIZE;i+)for(i=1;iSIZE;i+)if(maxai)max=ai;if(maxai)min=ai;if(minai)min=ai;printf(Maximum value is%dn,max);printf(Maximum value is%dn,max);printf(Minimum value is%dn,min);p
22、rintf(Minimum value is%dn,min);3232【例例例例6-66-6】输入一个正整数输入一个正整数n(1n10),再输入),再输入n个整数,用选择法将它们从小到大排序后输出个整数,用选择法将它们从小到大排序后输出n选择法排序的核心思想:选择法排序的核心思想:将将n个数据进行个数据进行n-1次循环选择次循环选择每次循环都在参与选择的数据中选择出最小的每次循环都在参与选择的数据中选择出最小的数据,并将它与本次参与选择的第一个数据进数据,并将它与本次参与选择的第一个数据进行互换行互换然后再在剩下的数据中进行下一次循环选择然后再在剩下的数据中进行下一次循环选择333349386
23、59776132730a0a1a2a3a4a5a6a7第一趟第一趟第一趟第一趟minmin13491338659776492730第二趟第二趟第二趟第二趟minmin2738 第第1趟趟:在未排序的:在未排序的n个数(个数(a0an-1)中找到最)中找到最小的元素,将它与小的元素,将它与a0交换;交换;第第2趟趟:在剩下未排序的:在剩下未排序的n-1个数(个数(a1an-1)中找到最小的元素,将它与中找到最小的元素,将它与a1交换;交换;第第n-1趟趟:在剩下未排序的:在剩下未排序的2个数(个数(an-2an-1)中找到最小的元素,将它与)中找到最小的元素,将它与an-2交换;交换;min=k
24、;min=k;/k/k为趟数为趟数为趟数为趟数-1-1 for(i=k+1;in;i+)for(i=k+1;in;i+)if(aiamin)if(aiamin)min=i;min=i;temp=amin;temp=amin;amin=ak;amin=ak;ak=temp;ak=temp;3434#include#include main()main()int i,min,k,n,temp;int i,min,k,n,temp;int a10;int a10;printf(Enter n:n);printf(Enter n:n);scanf(%d,&n);scanf(%d,&n);printf(
25、Enter%d integers:n,n);printf(Enter%d integers:n,n);for(i=0;in;i+)for(i=0;in;i+)scanf(%d,&ai);scanf(%d,&ai);3535 for(k=0;kn-1;k+)for(k=0;kn-1;k+)min=k;min=k;for(i=k+1;in;i+)for(i=k+1;in;i+)if(aiamin)if(aiamin)min=i;min=i;temp=amin;temp=amin;amin=ak;amin=ak;ak=temp;ak=temp;对数组对数组a中的中的n个元素排序(选择排序)个元素排序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级语言程序设计教学课件 高级 语言程序设计 教学 课件 数组
限制150内