计算机程序设计A.ppt

上传人:夺命阿水 文档编号:262757 上传时间:2023-04-03 格式:PPT 页数:50 大小:779KB
返回 下载 相关 举报
计算机程序设计A.ppt_第1页
第1页 / 共50页
计算机程序设计A.ppt_第2页
第2页 / 共50页
计算机程序设计A.ppt_第3页
第3页 / 共50页
计算机程序设计A.ppt_第4页
第4页 / 共50页
计算机程序设计A.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《计算机程序设计A.ppt》由会员分享,可在线阅读,更多相关《计算机程序设计A.ppt(50页珍藏版)》请在课桌文档上搜索。

1、第五章 数组,本章目的,熟练掌握一维数组的定义和引用;掌握二维数组的定义和引用;利用数组编写程序(求最大最小值,平均值,选择排序,冒泡排序,字符串的处理,矩阵运算),为什么要使用数组,只用前面所讲的基本数据类型(int,long,float,double,char),解决复杂的问题有困难.例:排序问题,两个数排序?,if(a b)t=a;a=b;b=t;,三个数排序?,if(a b)t=a;a=b;b=t;if(a c)t=a;a=c;c=t;if(b c)t=b;b=c;c=t;,四个数排序?,if(a b)t=a;a=b;b=t;if(a c)t=a;a=c;c=t;if(a d)t=a;

2、a=d;d=t;if(b c)t=b;b=c;c=t;if(b d)t=b;b=d;d=t;if(c d)t=c;c=d;d=t;,100个数排序?,!?,数组概念,有序数据的表示测量球的直径:需要多次测量,求平均值按学号排列的成绩表都是由具有相同类型的若干个分量按一定顺序排列组成的,数组概念,按序排列的相同类型的数据的集合称为数组这些数据叫数组的元素用数组名和下标来唯一地确定数组中的元素数组的特征:数组名、数组元素的类型和个数(数组长度),5-1 一维数组,一维数组的定义:数组类型名 数组名1exp1,数组名2exp,;其中:exp、exp1为常量表达式,正整数;如:int a10含义:定义

3、了一个一维数组a,共有10个元素,它们都是整型数据变量.数组元素在内存中从下标为0的元素开始连续存放。,已定义 char c120;请问,此语句的含义?,int n=10,bn;float x7.5;含义?,5-1 一维数组,一维数组的初始化在定义数组时对数组元素赋初值,否则是不确定值 int a5=1,2,3,4,5;可以只给部分元素赋初值,其余初值为0 int b5=1,2,3;对全部数组元素赋初值时,可省略数组长度 int c=1,2,3,4,5;初值的个数不能多于数组长度,5-1 一维数组,一维数组元素的引用数组必须先定义,后引用只能引用数组元素,不能一次引用整个数组引用数组元素的形式

4、:数组名下标表达式下标表达式可以是常量、变量、表达式。下标表达式的取值范围是:0 数组长度-1 且为正整数。,int a10,j=5;a0=5;aa0=9;aj+3=8;,a3.5=9;a10=4;,5-1 一维数组,应用举例例 1:用数组来处理 求 Fibonacci 数列问题:Fibonacci 数列:F1=1F2=1Fn=Fn-1+Fn-2n 3解:用数组f40来存放Fibonacci数列前40项.f0=1,f1=1,fn=fn-1+fn-2(n1),#include void main()int i;long f 40=1,1;for(i=2;i 40;i+)f i=f i-2+f i

5、-1;for(i=0;i 40;i+)if(i%4=0)printf(n);printf(%16ld,f i);,5-1 一维数组,应用举例例 2:输入一个班级学生的一门课成绩(人数=50),计算平均成绩,并统计高于平均成绩的学生人数.解:必须用数组完成。算法框图:,5-1 一维数组,对n 个数排序问题(以从小到大排序为例)(1)选择法排序:找出最小的放在最前面。,5-1 一维数组,对n 个数排序问题(以从小到大排序为例)(1)选择法排序:找出最小的放在最前面。每一轮找出一个最小的,共n1轮。,#include void main()float a 100,t;int i,j,k,n;scan

6、f(“%d”,5-1 一维数组,对n 个数排序问题(以从小到大排序为例)(2)冒泡法排序:将相邻两个数比较,将小的调到前头,大的调到后面。,985420,985420,89,59,49,29,09,9,9,854209,58,48,28,08,8,8,420589,5,5,204589,4,4,024589,2,2,结果,开始,024589,共循环多少次?每次循环进行了多少次比较?什么时候结束?如果序列为5、8、9、4、2、0,先排在最后的还是 9 吗?如果要求先将最小的数排在最前面,该如何操作?,5-1 一维数组,对n 个数排序问题(以从小到大排序为例)(2)冒泡法排序数据结构:变量n:这一

7、组数的个数,从键盘输入.一维数组a:存放这n 个数(a0,an-1)循环变量i表示轮次,初值=0 循环变量j表示每轮中,比较时元素的下标值。j每轮都从0开始,以aj 和 aj+1 比较 每轮比较次数不断减1。,5-1 一维数组,对n 个数排序问题(以从小到大排序为例)(2)冒泡法排序,#include void main()int a 100,n,i,j,t;scanf(“%d”,5-1 一维数组,对n 个数排序问题(以从小到大排序为例)(2)冒泡法排序:改进的冒泡排序:如果在某轮外循环中,一次交换也没有发生,则说明已排好序,外循环可以不再进行.可以用一个标记变量来表示是否交换过。,5-1 一

8、维数组,在n个数中查找某一个数。顺序查找法:n个数一个个与被查找数比较。折半查找法:不要求,略!,#include void main()int a100,i,n,x;scanf(“%d”,for(i=0;in;i+)if(ai=x)printf(“find:%d it is a%dn”,x,i);exit(0);printf(“%d not been foundn”,x);,练习,读程序写结果,#include void main()int p7=11,13,14,15,16,17,18,i=0,k=0;while(i7,5-2 二维数组,C语言中,数组元素又可以是一个数组,这样就构成了多维

9、数组。二维数组是“数组的数组”,数据有行列之分,用两个下标标识一个数组元素,适合处理矩阵。,5-2 二维数组,二维数组的定义数组类型名 数组名行常量表达式列常量表达式;,int a23;/*定义一个2行3列的整型数组a,共有6个元素,分别为a00,a01,a02,a10,a11,a12,这些元素均为简单的整型变量。*/char c310;float b22;,可把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组例如,可把 a34 看作是一个一维数组,有3个元素:a0、a1、a2,每个元素又是一个包含 4 个元素的一维数组。见下图:,二、二维数组的存储,二维数组中元素排列的顺序是按行存

10、放,a0a1a2,a00 a01 a02 a03,a,a10 a11 a12 a13,a20 a21 a22 a23,三、二维数组的初始化,1、按行,2、按存放顺序,例:int b23=1,2,3,4,5,6;,3、只给部分元素赋初值,例:int c23=1,2,4;int d23=0,0,9,0,6;,按行存放,例:int a23=1,2,3,4,5,6;,4、省略第一维长度;,例:int e3=1,2,3,4,5,6,7;,注意:不能省略第二维的长度。为什么?,四、二维数组的引用,二维数组元素的表示:数组名行下标列下标,如:a23a2-12*2-1b12=a23/2,注意数组定义和数组元素

11、引用的区别例如int a34;第一个元素是a00,最后一个元素是a23,下标可以是整型表达式,5-2 二维数组,二维数组的使用举例矩阵转置:将一个矩阵的行、列互换,#include void main()int a23=1,2,3,4,5,6;int b32,i,j;printf(array a:n);for(i=0;i 2;i+for(j=0;j 3;j+)printf(%3d,aij);bji=aij;printf(n);,printf(array b:n);for(i=0;i 3;i+)for(j=0;j 2;j+)printf(%3d,bij);printf(n);,5-2 二维数组,

12、二维数组的使用举例找出二维数组(M行N列)的最大值与最后一个元素交换后以行列对齐方式输出.(p115,例5.13),5-3 字符数组,为什么要把字符数组单独作为一个内容讲解?是因为字符数组跟数值数组有不同之处。1.字符数组和数值数组的相同之处(1)定义格式相同 char c10;char d320;,5-3 字符数组,1.字符数组和数值数组的相同之处(2)引用数组元素的形式相同 数组名下标 或 数组名下标1下标2 其中:下标可以是 常量,变量,表达式,c0=a;int i=5;ci=g;scanf(“%c”,5-3 字符数组,1.字符数组和数值数组的相同之处(3)数值数组初始化的格式同样适用字

13、符数组这种初始化的方式是单字符方式,char c10;char c10=a,b,c,d,e,f,g,h,i;char c=a,b,c,d,e,f,g,h,i;char c10=a,b;/*没有初始化的元素为0*/,5-3 字符数组,1.字符数组和数值数组的相同之处(4)数组在内存的存贮格式相同一维数组以数组名为首地址,从下标为0的元素开始连续存贮,每个元素分配一个字节。二维数组以行序存贮.,5-3 字符数组,字符数组和数值型数组的不同之处首先了解一下:字符串和字符串结束标记的概念C语言中只有字符串常量,没有字符串变量.C语言将字符串作为字符数组来处理。即用一个一维的字符数组存贮一个字符串.,例

14、:char c100;/*数组c占用100个字节空间*/当用c数组存贮字符串“abcdefghij”,该字符串的长度为10,浪费大量空间.,5-3 字符数组,字符串结束标记为了方便测定字符串的长度,C语言规定了一个ASCII码值为0(记作0)的字符作为字符串结束标记.定义了:char c100;当用c数组存贮字符串“abcdefghij”,内存结构为:,53 字符数组,字符数组和数值型数组的不同之处(1)初始化的不同 C语言允许初始化时直接用字符串常量。char c100=”abcdefghij”;或 char c100=”abcdefghij”;,C数组的长度:100 字符串实际:10字符串

15、实际占用的字节数:11,53 字符数组,处理字符串时,主要关心什么时候遇到0,一般不关心字符数组长度。,我们经常这样使用:char c=”abcdefghij”;C数组长度:11 字符串实际占用的字节数:11字符串长度:10,但不能:char c10=”abcdefghij”;C数组长度:10 字符串实际占用的字节数:10字符串长度:10没有空间来存放0,注意:字符串的有效字符长度也是到第一个0结束。例:char c=”abc0 xyz”;则数组c的长度为8,而字符串长度为3。,53 字符数组,字符数组和数值型数组的不同之处(2)字符数组的输入和输出(利用%s格式)在前面已说明:数组被定义后,

16、只能引用数组元素,不能引用数组名。但对字符数组,在输入和输出及字符串处理函数的调用中可以引用数组名。,53 字符数组,字符数组和数值型数组的不同之处利用%s格式的输入char c100;scanf(“%s”,c);功能:接收从键盘输入的以空格或回车结束的一串字符存入以c为首地址的连续空间中,并自动加0结尾.注意:不用“&”取地址了,53 字符数组,字符数组和数值型数组的不同之处利用%s格式的输出printf(“%s”,c);功能:把以c为首地址的连续空间中的一串字符串输出,直到遇第一个0停止,不输出0.,例:下面程序的结果#include void main()char c81;int i;s

17、canf(“%s”,c);for(i=0;ci!=0;i+)if(ci=a 运行时输入为:HangZhou China,输出结果:HANGZHOU,53 字符数组,字符串处理函数对字符串的处理要调用字符串处理函数实现。对应的头文件为:string.h1)输出字符串函数 调用格式:puts(数组名)/*puts(地址)*/功能:把以给定的数组名为首地址的连续空间中的一串字符串输出,遇到第一个0停止。输出后换行.,53 字符数组,字符串处理函数B)字符串输入函数 调用格式:gets(数组名)功能:接收从键盘输入的以回车结束的一串字符存入以给定地址为首地址的连续空间中,并自动加0结尾.输入的串中可含

18、空格.,53 字符数组,字符串处理函数C)二个字符串连接函数调用格式:strcat(字符数组1名,字符串数据2)功能:将字符串数据2(含0)连接到字符数组1的末尾0位置开始的区域.函数返回字符数组1的首地址.注意:定义时,字符数组1要足够大。,例:有如下程序段 char c18=”HangZhou”;char a=”China”;strcat(c,a);puts(c);运行结果:HangZhou China,53 字符数组,字符串处理函数D)字符串的复制函数调用格式:strcpy(字符数组1名,字符串数据2)功能:将字符串数据2(含0)复制到字符数组1的首地址开始的区域.函数返回字符数组1的首

19、地址.,#include#include void main()char s150=”abcdef”;char s220=”xyzuvw”;strcpy(s1+2,strcat(s2+3,”qw”);printf(“%sn”,s1);输出结果是:abuvwqw,s1+2:,s2+3:,53 字符数组,字符串处理函数E)字符串比较函数调用格式:strcmp(字符串数据1,字符串数据2)功能:将字符数组1和字符数组2比较.函数返回值是:若字符数组1字符数组2 返回一个正整数 若字符数组1字符数组2 返回一个负整数 若字符数组1=字符数组2 返回0,例:有下面程序段 char s140,s240;g

20、ets(s1);gets(s2);if(s1=s2)if(strcmp(s1,s2)=0).,错误!,正确!,53 字符数组,字符串处理函数求字符串的长度函数调用格式:strlen(字符串数据)功能:求字符串的长度(遇到第一个0结束,不含0).,例:char a15=”ab110cdne”;则:strlen(a)的值是10,例:char a15=”ab1100cdne”;则:strlen(a)的值是3,应用举例1)回文字符串的判断回文字符串是指:正读和反读相同的字符串。“abcdcba”回文字符串“xyzzy”不是回文字符串,53 字符数组,如何来判断一个字符串是否是回文字符串?相等?若不相等

21、,则不是回文字符串。若相等,则继续类推比较。,一个字符串的末尾字符位置(下标值)如何确定?方法1:j=strlen(s)-1;方法2:j=0;while(sj)j+;/*while(sj!=0)j+;*/j-;,#include#include void main()char s100;int i,j;gets(s);i=0;j=strlen(s)-1;for(;ij)printf(“%s是一个回文串”,s);else printf(“%s不是一个回文串”,s);,53 字符数组,例2:从输入的字符串中删除一指定字符算法:例如在串“abcdefgde”中删字符dabcefgde abcefge

22、,#include#include void main()char s81,ch;int i,j;gets(s);ch=getchar();for(i=0,j=0;si!=0;i+)if(si!=ch)sj=si;j+;sj=0;puts(s);,53 字符数组,读程序写结果#include#include void main()char s81,t;int i,j;gets(s);for(j=0;sj!=0;j+);for(i=0,j-;ij;i+,j-)t=si;si=sj;sj=t;puts(s);运行时输入为:abcdefg,下面程序的功能?#include main()char s1

23、100,s210=”abcd”;int i=0;while(s2i!=0)s1i=s2i;i+;s1i=0;puts(s1);,54二维字符数组,例:在三个字符串中找出最大者.#include#include void main()char string20,str320;int i;for(i=0;i0)strcpy(string,str0);else strcpy(string,str1);if(strcmp(str2,string)0)strcpy(string,str2);printf(“nThe largest string is:n%sn”,string);,作业,P130页一三1、3、4四2、3五1、4,答疑,周一下午1:304:15赛博南楼 306,

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

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号