C语言程序设计 第七章 数组2.ppt_第1页
C语言程序设计 第七章 数组2.ppt_第2页
C语言程序设计 第七章 数组2.ppt_第3页
C语言程序设计 第七章 数组2.ppt_第4页
C语言程序设计 第七章 数组2.ppt_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/8/3,1,第七章 数组,对3个整数从小到大排序 对100个整数从小到大排序 计算机处理数据时,经常出现数是某种有序的形式进行组织的情况。 共同特征: 是由若干个同一类型的分量组成; 分量按一定顺序排列,有一定对应关系。,2020/8/3,2,数组:按序排列的具有相同类型的变量的集合。 1.用数组名来表示这一数组。 2.用数组名后跟下标来唯一的确定数组中的某一元素。,2020/8/3,3,7.1 一维数组的定义和引用 一、定义数组 类型说明符 数组名常量表达式 int a5; (定义了一个有5个整型分量的数组) 作用:分配内存,2020/8/3,4,说明: 1. 数组命名规则按照标识

2、符规则。 2. 数组名后只能是 括起来的常量表达式、常量或符号常量。 a10 a(10) an a4*M+1 3.常量表达式的值确定数组元素的个数。 4. 一维数组用连续的内存单元存放各个元素。 例:int a5;,2020/8/3,5,二、一维数组的引用 C语言规定:数组必须先定义后引用,并只能逐个引用数组元素,而不能一次引用整个数组。 引用格式:数组名下标(第几个元素) a2=10; (数组中元素的下标从0开始, a0 a1 a4,不会有a5。最大下标值为数组元素个数减1),2020/8/3,6,例:将数组元素逆序输出 main( ) int i,a10; for(i=0;i=0;i-)

3、printf(“%d”,ai); pritnf(“n”); ,9 8 7 6 5 4 3 2 1 0,注意:数组元素的下标常用循环变量来控制,结果:,2020/8/3,7,三、初始化 1. 在定义数组时对数组元素赋以初值 int a4=8,5,13,56 2. 部分赋初值 int a4=8,5 3. 不指定数组长度(数组元素全部赋初值) int a =8,5,13,56 注意:若不是数组元素全部赋初值,则数组长度不能忽略,2020/8/3,8,用数组来处理Fib数列的前20项。,main() int i; int f20 = 1,1; for(i=2; i20; i+) fi = fi-1 +

4、 fi-2; for(i=0; i20; i+) if (i%5 = 0) printf(n); printf(%12d,fi); ,main() long int f1=1,f2 =1; int i; printf (%12ld %12ld , f1,f2); for (i=1; i=20; i+) printf (%12ld %12ld , f1,f2); if (i%2 = 0) printf(n); f1 = f2 + f1; f2 = f1 + f2; ,2020/8/3,9,例:输入10个数,用“起泡法”对10个数排序(由小到大)。 “起泡法”算法:以六个数9、8、5、4、2、0为

5、例。 第1趟比较 第2趟比较,2020/8/3,10,第1趟比较后,剩5个数未排好序;两两比较5次 第2趟比较后,剩4个数未排好序;两两比较4次 第3趟比较后,剩3个数未排好序;两两比较3次 第4趟比较后,剩2个数未排好序;两两比较2次 第5趟比较后,全部排好序;两两比较1次,2020/8/3,11,算法结论: 1. 对于n个数的排序,需进行n-1趟比较,第j趟比较需进行n-j次两两比较。 2. 用两层嵌套循环控制排序过程 外循环j控制比较趟数(n-1趟) 内循环i控制一趟比较的次数(n-j趟) 程序:设需排序的数有10个,定义数组a11 使用a1a10存放10个数,a0不用。,2020/8/

6、3,12,main( ) int a11; /* 用a1a10, a0不用 */ int i,j,t; /* i,j作循环变量,t作两两比较的临时变量 */ for(i=1;i ai+1) t = ai; ai = ai+1; ai+1 = t; /* 交换大小 */ for(i=1;i11;i+) printf(%d,ai); ,2020/8/3,13,7.2 二维数组的定义和引用 一、定义 类型说明符 数组名常量表达式常量表达式 float a34; a为34(3行4列)的数组 float b510; b为510(5行10列)的数组,2020/8/3,14,二维数组的理解: 二维数组a34

7、理解为: 有三个元素a0、a1、a2,每一个元素是一个包含4个元素的数组。,2020/8/3,15,二维数组的元素在内存中的存放循序: 按行存放,即:先顺序存放第一行的元素,再存放第二行的元素。(最右边的第二维下标变化最快,第一维的下标变化最慢)。,2020/8/3,16,二、二维数组中元素的引用 格式:数组名下标下标 例:float a23; 有6个元素,按如下方式引用各元素: a00、a01、a02、a10、a11、a12,注意:数组float a23中无元素a23。 (下标从0始),2020/8/3,17,三、二维数组的初始化 1、分行赋值,如: int a34 =1,2,3,4,5,6

8、,7,8,9,10,11,12; 2、按存放顺序赋值,全部数据写在一个大括号内,如: int a34 = 1,2,3,4,5,6,7,8,9,10,11,12; 3、部分元素赋值,如: int a34 = 1,5,9;,2020/8/3,18,4、如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度。例: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 与下面定义等价: int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,2020/8/3,19,四、二维数组的输入输出 二维数组的输入输出用嵌套循环来实现 行:外循环 列:内循环,20

9、20/8/3,20,例: main() int a33,i,j; for(i=0;i=2;i+) for(j=0;j=2;j+) scanf(“%d”, ,输入:1 2 3 4 5 6 7 8 9,结果:1 2 3 4 5 6 7 8 9,2020/8/3,21,例:将一个二维数组行和列交换,存到另一个二维数组中。例如:,2020/8/3,22,算法: 1. 定义变量i,j,a23,b32; 2.确定循环语句(for),输入数组(二重) 输出a数组; 3. 循环体 bji = aij; 4. 输出(二重循环)。,2020/8/3,23,main( ) int a23 = 1,2,3,4,5,6

10、; int b32, i,j; for(i=0;i=1;i+) /* 01行 */ for(j=0;j=2;j+) /* 02列 */ printf(%5d,aij); bji = aij; /* 行、列交换 */ printf(n ); /*输出一行后换行 */ for(i=0;i=2;i+) for(j=0;j=1;j+) printf(%5d,bij); printf(n); /*输出一行后换行 */,2020/8/3,24,例:有一4*4矩阵,求主对角线元素的和与次对角线元素的积,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a30 a

11、31 a32 a33,主,次,主:i,j 相等;次:i+j=3,2020/8/3,25,main() int i,j,s=0,t=1,a44; for(i=0;i4;i+) for(j=0;j4;j+) scanf(“%d”, ,for(i=0;i4;i+) s=s+aii; t=t*ai3-i; ,2020/8/3,26,7.3 字符数组 字符数组:存放字符数据的数组,每一个元素存放一个字符。 一、定义: char 数组名 常量表达式 char a3; box a0=b; a1=o; a2=x,int a3;,2020/8/3,27,二、字符数组的初始化 1. 逐个元素初始化 char c1

12、1 = I, ,a,m, ,a, ,b,o,y; 注:0表示空字符null(ASCII为0),2020/8/3,28,2. 使用字符常数给字符数组赋初值 char c6=“china”; char c6=“china”; char c =“china”; 注:以字符串方式赋值时,必须保证数组元素个数字符数+1,2020/8/3,29,例:字符数组赋初值 main() char a7=a,p,p,l,e; char b7=“apple”; char c7; int i; for(i=0;i=6;i+) printf(“%6d%6d%6dn”, ai,bi,ci); ,结果: 97 97 -23

13、112 112 75 112 112 -62 108 108 80 101 101 -2 0 0 51 0 0 4,printf(“%6c%6c%6cn”, ai,bi,ci);,a a 任意字符 p p p p l l e e,2020/8/3,30,例:用一字符串给字符数组赋初值,打印出各元素的ASCII编码值。 main() char str =“This is”; int i=0; while(stri!=0) printf(“%c=%dn”,stri,stri); i +; ,T=84 h=104 i=105 s=115 =32 i=105 s=115,注:1. 用字符串给字符数组赋

14、初值,系统自动加上空字符0 2. 空格符ASCII为32,“0”ASCII为0,两者均无法打印,2020/8/3,31,三、字符数组的引用与输入、输出 1. 逐个字符数组元素输入输出(%c) for(i=0;i=3;i+); scanf(“%c”,2020/8/3,32,说明: 字符数组中的数组名代表该数组的起始地址(首地址),所以,不用 gets(str);,2020/8/3,34,2.字符数组输出函数 格式:puts(字符数组名/字符串 ) 作用:将数组中的字符串(以0结束的字符序列)输出,输完自动换行 例:char c6=China; puts(c); printf(%sn,c);,结果

15、: China China,2020/8/3,35,例:#include”string.h” main() char s100; gets(s); puts(s); 输入:How are you? 输出:How are you?,puts(gets(s);,scanf(“%s”,s); printf(“%s”,s);,How,gets(s); printf(“%s”,s);,2020/8/3,36,3、字符串拷贝函数:strcpy() 格式:strcpy(字符数组1,字符串/字符数组2); 作用:把字符串或字符数组2中的字符串拷贝到“字符数组1”中。 注意:在C语言中,不允许把字符串或字符数组

16、直接赋给一个字符数组。 char str6; str=“china”,char str6=“china”;,或 char str6; str0=“c”; str1=“h”; str2=“i”; str3=“n”; str4=“a”;,strcpy(str,”china”);,2020/8/3,37,说明: 1. 字符数组1无初值,为空; 2. 字符数组1的长度字符数组2 3. 拷贝时连同0一起拷贝,2020/8/3,38,例: #include”string.h” main() char s140,s240; scanf(“%s”,s1); strcpy(s2,s1); printf(“%sn

17、”,s2);,输入:How are you 输出:How,gets(s1);,How are you,2020/8/3,39,4. 字符串连接函数:strcat() 格式:strcat(字符数组1,字符串/字符数组2); 作用:把字符串或字符数组2连接到“字符数组1”中。,2020/8/3,40,例:输入任意三个字符串并将其连接成一个字符串后输出 #include“string.h” main() char a140,a210,a310; gets(a1); gets(a2); gets(a3); strcat(a1,a2); strcat(a1,a3); puts(a1); ,输入:this

18、 is a string OK end 输出:this is astringOK end,2020/8/3,41,说明: 两个字符串连接,串1中的“0“取消,只在新串最后保留一个“0“。 字符数组1的长度要足够大,以容纳连接后的字符串。 C语言规定两个字符串不能相加,只能用strcat连接。 char c; c=a+b;,char c10; c=“a”+”b”;,strcat(c,”a”+”b”); strcat(c,”a”);,2020/8/3,42,5、字符串比较函数: strcmp() 格式: strcmp(字符串1/字符数组1,字符串2/字符数组2 ); 作用:比较两个字符串(逐个字符

19、比较ASCII码,直到遇到不同字符或0,比较结果是该函数的返回值。) 结果:字符串1 字符串2 正数 字符串1 = 字符串2 0 字符串1 字符串2 负数 例:x=strcmp(“abd, “abc); x=1 x=strcmp(“AX”, “AX); x=0 x=strcmp(“1000”,”2”); x=-3,2020/8/3,43,例:两个字符数组比较大小 #include”string.h” main() char a20,b20; gets(a);gets(b); if(strcmp(a,b)0) printf(“abn”); else if(strcmp(a,b)=0) print

20、f(“a=bn”); else printf(“abn”);,2020/8/3,44,6.测量字符串长度函数:strlen() 格式:strlen(字符数组名/字符串) 作用:测试字符串长度(不包含“0”)返回一个数值。 例:strlen(“china”) 值为5,2020/8/3,45,7. 大-小写转换函数:strlwr() 格式:strlwr() 作用:将字符串中的大写字母转换为小写字母 8. 小-大写转换函数:strupr() 格式:strupr() 作用:将字符串中的小写字母转换为大写字母,2020/8/3,46,例:将字符串逆序输出 #include”stdio.h” #inclu

21、de”string.h” main() char s40;int i; gets(s); i=strlen(s); printf(“%dn”,i); for(;i=0;i-) putchar(si); puts(“ “); ,输入:abcde 123 输出:9 321 edcba,2020/8/3,47,例:将两个字符串相连接,不用strcat() 算法: 1. 输入str1和str2 2. 找到str1的结束标志0 3. 将str2的字符逐个放入str1当前位置开始的地方,#include main() char s180,s240; int i=0,j=0; gets(s1); gets(

22、s2); while(s1i!=0) i+; while(s2j!=0) s1i=s2j) i+;j+ s1i=0; printf(“%sn”,s1);,2020/8/3,48,例:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。,未出现新单词,使word=0,num不累加 当前字符=空格? 前一字符为空格(word=0),新单词出现 num加1,word=1. 前一字符为非空格(word=1),未出现新 单词,num不加1。,Y,N,Num用来统计单词个数,word作为判别是否是单词 的标志,若word=0表示未出现单词,如出现就置成1。,2020/8/3,49,#include

23、main() char string81; int i,num=0,word=0; char c; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1;num+; printf(“%dn”,num); ,2020/8/3,50,7.4 数组作为函数的参数 一、数组元素做函数实参 与变量做实参一样,数组元素做实参也是“值传递”。,2020/8/3,51,例:求10个任意整数中的最大数 int max(int x,int y) return(xy?x:y); main() int a10,i,m; for(i=0;i10;i+) scanf(“%d”, ,2020/8/3,52,二、数组名做函数参数 若函数的形参是数组,对应的实参必须是数组名。 此时实参传递给形参的值是数组的首地址。,int max(int x ,int n),n,a,10);,2020/8/3,53,说明:P136 实参数组与形参数组的类型必须一致。 用数组名做参数时,传递的是数组的首地址。 形参数组可以不指定大小,但需另设一个参数,传递数组元素的个数。 数组名做函数参数时,形参数组和实参数组共享同一内存单元。 *如果形参数组的元素的值被修改,实参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论