收藏 分享(赏)

C语言--数组.ppt

上传人:j35w19 文档编号:8114962 上传时间:2019-06-09 格式:PPT 页数:66 大小:686KB
下载 相关 举报
C语言--数组.ppt_第1页
第1页 / 共66页
C语言--数组.ppt_第2页
第2页 / 共66页
C语言--数组.ppt_第3页
第3页 / 共66页
C语言--数组.ppt_第4页
第4页 / 共66页
C语言--数组.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、第5课 数组,主要内容 一维数组 二维数组 字符数组 数组作为函数参数,为什么需要数组,输入10个成绩(int型),求总成绩、平均成绩、最好成绩、最差成绩。,for (n=1; nmax) max=cj;else if (cjmin) min=cj; ,10个成绩并未保存起来,cj中只存放了最后一个输入的成绩。,10个成绩分别放在a、b、c、?,如果这样,如何利用循环进行批量处理? sum=sum+cj; 循环不变式,当需要多个类型相同的变量时使用数组,概述,数组是一个由若干个同类型数据组成的有序集合。这个有序集合中的每一个数据称为数组的元素,数组元素用共同的名字(数组名)和下标唯一标识,下标

2、用方括号括起来。如:a5、a8、 每一个数组元素均可以作为一个独立变量使用。因此,引用这些数组元素时可用“同一名字,不同下标”来实现。如:sum+=cjn;数组是由内存中连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素。数组可以是一维的,也可以是多维的。,一维数组(变量)的说明,数组说明: 类型说明符 数组名长度 例:int a10; / 定义数组时,长度只能是常量表达式char ch20;,注意:C语言中的下标是从0开始的,而不是从1开始的!,下图说明了数组a在内存中的存储情况,假设起始地址为1000.,说明:数组所占字节大小可由下式计算:总字节数= sizeo

3、f(类型) * 数组长度,一维数组的引用,引用形式: 数组名下标注:下标的取值范围:0 数组长度-1,【例】将数字0到9装入一个整型数组。 void main( ) int x10; /* 定义包含1 0个整型数的数组 * /int n;for (n=0; n10; n+) xn=n; ,注意:数组下标是否超出范围由程序设计者负责!越界使用可能会导致严重后果!,数组的输入输出(有数组必有循环)for(i=0;i10;i+) scanf(“%d”, ,i=0;y=18; do u=y/2; ai=y%2; i+; y=u; while(y=1); for(j=i-1;j=0;j-) printf

4、(“%d”,aj); ,i=0 y=18 u=9 a0=0 i=1 y=9 u=4 a1=1 i=2 y=4 u=2 a2=0 i=3 y=2 u=1 a3=0 i=4 y=1 u=9 a4=1 i=5,for(i=0;i10;i+) if(i%2=0) s2+=ai; if(ai%2=0) s1+=ai; ,什么时候用数组(当有大量相同类型数据时) 例题: 让用户输入10个数,求和,求最大最小值 #include main() int a10,sum=0,count=0; for(i=0;iai) min=ai; ,用户输入一个要查找的数,找到输出位置。#includemain()int a

5、10=1,3,5,6,7,8,4,3,2,10,i,index=-1,find; printf(“请输入要查找的数字:“); scanf(“%d“, ,倒置数组,#include main() int i,j,t; for(i=0,j=n-1;ij;i+,j-) t=ai; ai=aj; aj=t; ,删除元素,#include main() int a10=1,2,3,4,5,6,7,8,9,10,i,find; scanf(“%d“, ,在有序数组中插入元素,#include main()int a10=1,2,4,5,6,7,8,9,10,j,i,insert;scanf(“%d“, ,

6、排序,#include main()int a10=11,2,4,5,6,7,8,9,10,t,j,i,insert;for(i=0;iaj)t=ai;ai=aj;aj=t; for(i=0;i10;i+) printf(“%d“,ai); ,(05年三级上机题) 找出数组a中小于平均值的数放在数组b中,#include main()int a10=11,2,4,5,6,7,8,9,10,b10,sum=0;int j=0,i;double ave;for(i=0;i10;i+) sum+=ai; ave=sum/10.0;for(i=0;i10;i+)if(aiave)bj=ai;j+; f

7、or(i=0;ij;i+) printf(“%d“,bi); ,for(i=0;i长度-1;i+) for(j=i+1;j长度;j+) if(aiaj). ,选择法排序,选择法排序(升序)的基本思想是:,第i次排序:从ai,ai+1, , aN中选择一个最小的元素,并将它与ai对调。,对于N个元素构成的数据列表:a1, a2, , aN,第一遍扫视数据列表,从整个数据列表中选出第一个最小元素,并放到数据列表的第一个位置;,第二遍扫视剩余的数据列表,从剩余的数据列表中选出第二个最小元素,并放到数据列表的第二个位置;,第N-1遍扫视剩余的数据列表,从剩余的数据列表中选出第N-1个最小的元素,并放到

8、数表的第N-1个位置。,至此,数据列表中的最大元素已放在第N个位置,排序完成。,算法选择排序,共有 N-1 趟排序! 即 i 的取值分别为:1、2、N-1,第i次排序:从ai,ai+1, , aN中选择一个最小的元素,并将它与ai对调。,【例】在电视歌手大奖赛时,有10个评委评分。从键盘输入10个评委给某歌手的评分,要求找出10个评委中哪一个给了最低分、哪一个给了最高分。去掉一个最低分并去掉一个最高分后剩下的八个评分的平均值为该歌手的最后得分,求该歌手的最后得分。,一维数组的初始化,一般方法: 1、赋值语句或输入函数 2、在数组说明语句中赋值,区别:静态初始化是在程序的编译阶段完成,而一般初始

9、化是在程序的运行过程中完成的!,【例】int a10=0,1,2,3,4,5,6,7,8,9; /* 全部初始化 */int a10=0,1,2,3; /* 部分赋值 */int a10=0; /* 部分赋值 */int a =1,2,3,4,5; /* 可省略数组长度 */static int a5=1,2,3,4,5; /* 静态初始化 */,实例2: 对于一个自然数,如果该数的所有因子之和等于该数,则该数称为完数。找出1000以内的所有完数,并输出它的所有因子。(如:6=1+2+3,6为完数!),找出 n 的所有因子,并计算因子之和sum;,if (sum=n) 输出 n 的所有因子;,

10、sum=0; for (i=1; in; i+)if (n%i=0) sum+=i;,for (i=1; in; i+)if (n%i=0) printf(“%d, ”, i); printf(“n”);,二维数组,1、二维数组的说明 2、二维数组的引用 3、二维数组的初始化,二维数组说明,数组说明:类型说明符 数组名长度1长度2 占用字节数:行数列数类型字节数总字节数 例:float a34;,例 将整数到1 2装入一个3*4的二维数组。 void main ( ) int i, j, num34;for (i=0; i3; +i)for (j=0; j4; +j)numij=(i*4)+j

11、+1; ,每个构造元素ai是一个包含4个元素 的一维数组,二维数组a是由3个构造元素组成,二维数组的理解,这对于理解指针是非常重要的!,二维数组的引用,形式: 数组名下标1下标2 【例】 void main() int sum, i, j, a45;for (i=0; i3; i+) for (j=0; j4; j+) scanf(“%d“, ,for (j=0; j4; j+) / 控制列sum=0;for (i=0; i3; i+) / 控制行sum=sum+aij;a3j=sum;,0 1 2 3 40 1 2 3 ,二维数组的初始化,按元素排列顺序初始化,分行初始化,#include

12、void main() int a23=1, 2, 3, 4, 5, 6;int b32, i, j;printf(“array a:n“);for (i=0; i2; i+) for (j=0; j3; j+) printf(“%5d“, aij);bji=aij;printf(“n“); ,程序举例,例:将二维数组行列元素互换,存到另一个数组中.,例: 求二维数组aMN中最大元素值及其行、列号。,#include void main() int a34=1, 2, 3, 4,9, 8, 7, 6,-10, 10, -5, 2;int i, j, row=0, column=0, max;m

13、ax=a00;for (i=0; imax) max=aij;row=i;column=j;printf(“max=%dn“, max);printf(“row=%d, colum=%dn“, row, column); ,字符数组,1、说明、引用、初始化 2、用字符数组处理字符串 3、字符数组的输入输出 4、字符串处理函数,字符数组、引用、初始化,字符数组 定义,字符数组的初始化 逐个字符赋值,例 char c10, ch34;,字符数组的引用,用字符串常量,字符数组也可以通过ai来引用它的它 i 个元素(字符)。 一般情况下,是将整个字符数组作为一个字符串来使用。 字符串的操作是通过一些系

14、统函数来实现的,主要包括:char str60=“Jiangxi”, str180=“It is ”, str220=“a dog.”puts(str), gets(str), strlen(str), strcat(str1, str2), strcpy(str1, str2), strcmp(str1, str2),二维字符数组初始化,用字符数组处理字符串,字符串及其结束标志 无字符串变量,用字符数组处理字符串 字符串结束标志:0,用字符数组处理字符串,char ch10=“JXUFE”; char ch10=“JXUFE”;注:char ch =“JXUFE”;char ch =J, X

15、, U, F, E; / 不形成字符串char ch =J, X, U, F, E, 0;,字符数组的输入输出,1、逐个字符输入输出:%c 2、将整个字符串一次输入输出:%s,例: 字符数组的输出.,#include void main() char c10=I, , a, m, , a, , b, o, y;char str=“I am a boy”;int i;for (i=0; i10; i+)printf(“%c“, ci);printf(“n“);printf(“%sn”, str); ,用字符数组名, 遇0结束,字符数组的输入输出,例:字符数组的输入。,例 用%c void mai

16、n() char str5;int i; for (i=0; i5; i+)scanf(“%c”, ,例 用%s void main() char str5;scanf(“%s”, str);printf(“%sn”, str); ,1、用字符数组名, 不要加& 2、输入串长度数组维数 3、遇空格或回车结束 4、自动加0,void main() char a=h, e, l, 0, l, o, 0;printf(“%s“, a); ,输出:hel,数组中有多个0时, 遇第一个结束,字符数组的输出,void main() int i;char a5;scanf(“%s“, a);printf(“

17、%sn”, a); ,运行情况: (1)若输入 hel , 正常 (2)若输入 hell , 正常 (3)若输入 hello , 超出了数组长度,会出现问题,字符串输入举例,输入字符串长度数组维数,#include void main() char a15, b5, c5;scanf(“%s%s%s“, a, b, c);printf(“a=%snb=%snc=%sn“, a, b, c);scanf(“%s“,a);printf(“a=%sn“,a); ,运行情况: 输入:How are you? 输出:a=Howb=arec=you? 输入:How are you? 输出:a=How,sc

18、anf中%s输入时,遇空格或回车结束,运行情况: 输入:How are you?,字符串输入举例,例 若准备将字符串“This is a string.”输入, 考虑如下输入语句: (A)scanf(“%20s”, s); (B)for (k=0; k17; k+) sk=getchar(); (C)while (c=getchar()!=n)sk+=c;,举例,不构成字符串,不构成字符串,字符串输出函数puts 格式:puts(字符数组) 功能:向显示器输出字符串(输出完,自动换行) 说明:字符数组必须以0结束,字符串输入函数gets 格式:gets(字符数组) 功能:从键盘输入一以回车结束

19、的字符串放入字符数组中,并自动加0 说明:输入串长度应小于字符数组维数,例 #include void main( ) char string80;printf(“Input a string:”);gets(string);puts(string); 输入: How are you? 输出: How are you ?,字符串处理函数,字符串的输入输出函数:,字符串连接函数strcat 格式:strcat(字符数组1,字符数组2) 功能:把字符数组2连到字符数组1后面 返值:返回字符数组1的首地址 说明:字符数组1必须足够大连接前,两串均以0结束;连接后,新串最后加0,字符串拷贝函数strc

20、py 格式:strcpy(字符数组1,字符串2) 功能:将字符串2拷贝到字符数组1中去 返值:返回字符数组1的首地址 说明:字符数组1必须足够大拷贝时0一同拷贝不能使用赋值语句为一个字符数组赋值,例 char str120, str220;str1=“Hello!”; ()str2=str1; (),字符串处理函数,头文件: string.h,例 strcpy与strcat举例,#include #include void main() char destination25;char blank=“ “, c=“C+“,turbo=“Turbo“;strcpy(destination, tur

21、bo);strcat(destination, blank);strcat(destination, c);puts(destination); ,Turbo C+,字符串比较函数strcmp 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止 返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数c. 若字符串1 = 字符串2, 返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen 格式:strlen(字符数组) 功能:计算字符串长度 返值:返回字符串实际长度

22、,不包括0在内,例 对于以下字符串,strlen(s)的值为: (1)char s10=A, 0, B, C, 0, D; (2)char s =“tv0willn”; (3)char s =“x69082n”;,答案:1 3 1,How are you? Hello! Len1=6, Len2=12, Len3=18,例1:输入一行字符,统计其中有多少个单词。,#include void main() char string81;int i, word=0, flag=0;char c;gets(string);for (i=0; (c=stringi)!=0; i+)if(c= ) fla

23、g=0;else if(flag=0) flag=1; word+; printf(“There are %d wordsin the linen“, word); ,数组应用举例,I am a student,例 输入:Iamaboy.,当前字符,是否空格,flag原值,新单词开始否,flag新值,word值,I,a,m,a,b,o,y,.,例2:有三个字符串,找出其中最大者。,#include #include void main() char string20, str320;int i;for (i=0; i0)strcpy(string, str0);elsestrcpy(strin

24、g, str1);if (strcmp(str2, string)0)strcpy(string, str2);printf(“nThe largest string is: %s n“, string); ,例3:编写一个函数,实现将任意的十进制整数转换成R进制数(R在2-16之间)。,void TransDec(int num, int r) int imr60, i, j;char base=“0123456789ABCDEF“;char result60;for (i=0; num!=0; i+) / ?imri=num%r;num=num/r;for (i-, j=0; i=0; i

25、-, j+)resultj=base imri ;resultj=0;puts(result); ,例 比较 int a23=5, 6, 7, 8;与 int a23=5, 6, 7, 8;,例 int a 10;float f2=1.2, 2.2;,例 int a5;a=2, 4, 6, 8, 10;,例 int a10;float i=3;ai=10;,例 char name0;float weight10.3;int array-100;,例 char str=“Hello”;char str=H,e,l,l,o;,几种值得注意的使用情况:,数组作为函数参数,1、数组元素作为函数的参数,

26、2、一维数组名作为函数的参数,3、二维数组名作为函数的参数,1、数组元素作为函数参数,例1:输入10个整数,判断它们是否为素数。 要求:编写一个函数int prime(int m)来判断形参m是否为素数。,#include #include void main() int a10, n, result, prime(int);for (n=0; n10; n+) / 输入10个整数scanf(“%d”, ,int prime(int m) return (result); ,数组的-基本操作,1、数组元素求和,2、求数组元素的最大值和最小值,3、数组排序(选择法、冒泡法、插入法),4、数组元素

27、查找(顺序查找法、二分查找法),排序与查找,一、排序 1、选择法排序; 2、冒泡法排序; 3、插入法排序。二、查找 1、顺序查找法; 2、二分查找法(折半查找法)。,冒泡排序法,第一遍冒泡排序:对数组中的n个元素,自左至右将相邻两个数进行比较(需要比较n-1次),把小的调到前头(小的往上冒,故称为“冒泡法”)。,第二遍冒泡排序:对数组中前n-1个元素,自左至右将相邻两个数进行比较(需要比较n-2次) ,把小的调到前头。,第n-1遍冒泡排序:对数组中的前2个元素,对它们进行比较,把小的调到前头。,最后,第一个元素中就是n个数中最小的,排序完成。,结果:最大的数沉到第n个元素中。,结果:次大的数沉

28、到第n-1个元素中。,结果:第n-1个大的数沉到第2个元素中。,第 i 次排序(i=1, 2, , n-1):对a0、a1、an-i进行处理(共n-i+1个元素)。,for (j=0; jaj+1) t=aj; aj=aj+1; aj+1=t;,共需要进行n-1遍排序。,插入排序法,思路:先输入一个数放在数组的第一个元素,它是有序的;从第二个输入的数开始,对每个输入的数寻找在数组中的插入位置,将插入位置之后的所有元素向后移动,并在插入位置上插入该数;直到10个数输入完毕。,#define N 10 void main() int aN, i, j, temp;scanf(“%d”, / 插入

29、,问题:输入10个数,按插入排序法将它们按升序排列。,顺序查找法,问题:编写一个函数,在指定的数组a 中查找一个指定的数key,若找到则返回在数组中位于第几个,否则返回0。,程序: int search(int a , int n, int key) int i=0, r=0;for (i=0; in; i+)if (key=ai) r=i+1;break;return r; ,二分查找法(折半查找法),算法: 1、将数组按升序排列(或假设数组已经有序)。 2、top, bott, mid top=0; bott=n-1; mid=(top+bott)/2; 3、当topamid,则:top=

30、mid+1;若keybott时,表示查找目标不存在.,问题:编写一个函数,在数组a 中查找一个指定的元素key。,实例,问题:编写一个函数,检查给定表达式字符串中的圆括号是否配对出现。,int match(char exp ) int p=0, i;for (i=0; expi; i+)if (expi=() p+;else if (expi=) p-;if (p=0)return 1; / Matching elsereturn 0; / No matching ,实例,问题:编写一个函数,求字符串中字符s的个数。,int snum(char str ) int n=0, i=0;while

31、 (stri!=0) if (stri=s) n+;i+;return (n); ,实例,问题:找出二维整数数组中的鞍点。二维数组中鞍点位置的判断条件:其值在其行上为最大,而在其列上为最小。 注意:矩阵中可能没有鞍点。,实例,问题:读入字符行,统计其中英文字母出现的次数。,实例,编程产生杨辉三角形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1,杨辉三角形性质: (1)第1行(i=1)只有一个元素 (2)第i行有i个元素 (3)第i(i1)行的最左、最右元素为1 (4)第i行的中间元素是它上一行(i-1)对应位置元素与对应位置前一个元素之和。,【算法】,生成第1行; 输出第1行; for (i=2; i=N; i+) 由第i-1行生成第i行;输出第i行; ,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1,本章结束!,请同学们对本章内容进行复习、总结!,输入一行字符,统计其中有多少个单词 编写一个函数,实现将任意的十进制整数转换成R进制,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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