第五章数组ppt课件.ppt

上传人:本田雅阁 文档编号:3118687 上传时间:2019-07-12 格式:PPT 页数:83 大小:1.42MB
返回 下载 相关 举报
第五章数组ppt课件.ppt_第1页
第1页 / 共83页
第五章数组ppt课件.ppt_第2页
第2页 / 共83页
第五章数组ppt课件.ppt_第3页
第3页 / 共83页
第五章数组ppt课件.ppt_第4页
第4页 / 共83页
第五章数组ppt课件.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

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

1、第五章数组,5.1 数组的定义和使用 5.2 数组初始化 5.3 数组使用举例 5.4 字符串 5.5 数组与指针,5.1 数组的定义和使用,x1 x2 x3 x4 x5 x6 x7 x8,x1 x2 x3 x4 x5 x6 x7 x8,x1 x2 x3 x4 x5 x6 x7 x8,x0 x1 x2 x3 x4 x5 x6 x7,int x8;,for (i=0; i8; i+) printf(“%d“,xi);,数组:一组相同类型的变量 元素个数确定 这些数按一定次序存放 用一个统一的名字表示这组数 用不同的下标来区分它们 在内存用连续的存储单元存放数组元素,数组是相同类型数据的有序集合,

2、一、数组的定义 1定义格式: 类型 数组名常量表达式1常量表达式2. 用一个标识符作数组名 每个元素的类型都相同(基类型) 常量表达式的个数为数组的维数 每一维的下标从0开始,到常量表达式-1为止 静态数组(程序编译时就知道数组元素个数),int s10;,int a10; int c34; char b456;,c,c对应的下标,数组在内存使用连续的存储空间, 按行存放,2.数组的存储组织,int a6=0,11,22,33,44,55;,0,11,22,33,44,55,100,104,108,112,116,120,值,地址,a,数组名代表 数组的首地址,int b34=1,2,3,4,

3、5,6,7,8,9,10,11,12;,1,2,3,1,4,5,6,7,8,9,1,10,11,12,200,204,208,212,216,220,224,228,232,236,240,244,b,数组名代表 数组的首地址,数组元素的格式: 数组名下标1下标2. 下标应是整型表达式,二、数组的使用,只能对数组元素逐个使用 不能整体引用 数组名代表数组的首地址 程序中需要确保下标不越界,int a10,b10; a=b;,输入数组各元素的值,for (i=0; i10; i+) scanf(“%d“,int a10; scanf(“%d“, ,for (j=0; j4; j+) scanf(

4、“%d“,int b34; scanf(“%d“, ,for(i=0; i3; i+) for (j=0; j4;j+) scanf(“%d“,for(i=0; i10; i+) printf(“%3d“,ai);,数组各元素值的输出,for(i=0; i3; i+) for(j=0; j4; j+) printf(“%3d“,bij); printf(“n“); ,1 2 3 4 5 6 7 8 3 5 2 9,1 2 3 4 5 6 7 8 3 5 2 9,s=0; for (i=0; i10; i+) s+= ai;,注意: 下标溢出 未初始化的非static数组元素无初值,max=a0

5、; for (i=1; i10; i+) if(maxai) max=ai;,int a10; (1)计算10个整数的和 (2)找10个数的最大值,输入N个成绩,找出最高分并计算平均分,#define N 8 int main( ) int aN,i, max; float average; ,for(i=0; iN; i+) scanf(“%d“,average=max=a0; for(i=1; imax) max=ai; average+=ai; average/=N;,printf(“max=%d, average=%fn“,max,average);,常见错误,int n=15; in

6、t datan;,只能定义静态数组,int data5; data5=10;,/定义与引用时“5“表示不同含义,int a10,i; for(i=1; i=10; i+) scanf(“%d“,int a10; float i; ai=10;,5.2 数组的初始化,int a10=0,1,2,3,4,5,6,7,8,9;,int d5=0,1,2,3,4;,int b34=1,2,3,4,5,6,7,8,9,10,11,12;,int p34=1,2,3,4,5,6,7,8,9,10,11,12;,char c5=h, a, p, p, y;,没有初始化,值天知道!,static数组若未赋初值

7、,每个分量均为0 static char ch8;,static int h10;,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7,int c =1,2,3,4,5; int f 4=2,3,4,5,6,5;,5,3,在数组元素全部列出的情况下,第一维可以不指定长度,char w =I, , w, i, l, l;,6,只给一部分分量赋初值 int a10=0,1,2,3,4; int b10=0; int t34=1,5,9; int h34= ,0,6,0,0,11;,char c510=I, t, , i, s;,5.3 数组使用举例,按相反的顺序存储数组元素,0

8、 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,9=10 -0 -1,8=10 -1 -1,7=10 -2 -1,6=10 -3 -1,5=10 -4 -1,int main( ) int i , t , a10; for(i=0; i10; i+) scanf(“%d“, ,交换排序,一组数,每次用第一个数依次与后面的数比较,如果第一个数大则交换。一趟排序完成后第一个数最小。数的个数依次减少,共进行n-1趟排序。,i=0; for(j=1; jaj) temp=ai; ai=aj; aj=temp; ,i=0; for(j=i+1; jaj) temp=ai;

9、ai=aj; aj=temp; ,for (i=0; iaj) temp=ai; ai=aj; aj=temp; ,选择排序,选择排序的思想:每次从剩下的数中选择最小的数(记住它的下标)与这组数中第一个数交换,数的个数依次减少。一趟排序完成后最前面的数最小。共进行n-1趟排序。,i=0; k=0;/假设从a0an-1的数中a0最小 for(j=i+1; jn; j+) if(ajak) k=j; temp=a0; a0=ak; ak=temp;,i=1; k=1;/假设从a1an-1的数中a1最小 for(j=i+1; jn; j+) if(ajak) k=j; temp=a1; a1=ak;

10、 ak=temp;,i=1; k=1;/假设从a1an-1的数中a1最小 for(j=i+1; jn; j+) if(ajak) k=j; temp=a1; a1=ak; ak=temp;,for(i=0; in-1; i+) k=i;/假设从aian-1的数中ai最小 for(j=i+1; jn; j+) if(ajak) k=j; temp=ai; ai=ak; ak=temp; ,冒泡排序,冒泡排序的思想是: 依次比较相邻的两个数,如果前面的数大就相互交换,这样小的数就会向气泡一样往前冒。一趟排序完成后最后一个数最大。共进行n-1趟排序。,一趟排序结果,for(j=0; jaj+1) t

11、emp=aj; aj=aj+1; aj+1=temp; ,从a0到an-1,依次比较相邻的两个数aj和aj+1 (j取0到n-2),如果前一个数大则交换.,使an-1的值最大,for(j=0; jaj+1) temp=aj; aj=aj+1; aj+1=temp; ,for(j=0; jaj+1) temp=aj; aj=aj+1; aj+1=temp; ,for(j=0; jaj+1) temp=aj; aj=aj+1; aj+1=temp; ,for(i=1; iaj+1) temp=aj; aj=aj+1; aj+1=temp; ,交换排序 for (i=0; iaj) temp=ai;

12、 ai=aj; aj=temp; ,#define n 10 int an;,选择排序 for(i=0; in-1; i+) k=i;/假设从aian-1的数中ai最小 for(j=i+1; jn; j+) if(ajak) k=j; temp=ai; ai=ak; ak=temp; ,97 5 7 4 0 8 66 23 55 9,#define n 10 int main( ) int i,j,k; int t,an; for(i=0; in; i+) scanf(“%d“, ,if(k!=i) ,冒泡排序 #define n 10 int main( ) int i,j; int tem

13、p,an; for(i=0; iaj+1) temp=aj; aj=aj+1;aj+1=temp; for(i=0; in; i+) printf(“%d “,ai); ,97 5 7 4 0 8 66 23 55 9,顺序查找和折半查找,a0=3, a1=8, a2=9, a3=11, a4=18, a5=22, a6=35, a7=51, a8=76,查找x=9,查找x=6,#define n 10 int main( ) int an; int i,left,right, mid; int x; for(i=0; in; i+) scanf(“%d“, ,left = ; right=

14、; while ( ) mid = (left + right) / 2; if (x amid) left = mid + 1; else if (x amid) right = mid - 1; else break; ,if( ) printf(“not found!“); else printf(“%d is %d“, ,x);,#define n 10 int main( ) int an; int i,left,right, mid; int x; for(i=0; in; i+) scanf(“%d“, ,left = 0 ; right= n-1 ; while ( left

15、amid) left = mid + 1; else if (x amid) right = mid - 1; else break; ,if( leftright ) printf(“not found!“); else printf(“%d is %d“,mid ,x);,有一个3*4的矩阵,求值最大的元素及其所在的行号、列号,#define M 3 #define N 4 int main( ) int max, i , j , row,col; int aMN; for(i=0; imax) max=aij; row=i; col=j; printf(“max=%d,row=%d,co

16、l=%dn“,max,row,col); ,输入40个学生的学号和成绩,输出最高分学生的信息,#define ARR_SIZE 40 int main() float scoreARR_SIZE, maxScore; int numARR_SIZE,maxNum; int n, i; printf(“Please enter total number:“); scanf(“%d“, ,5.4 字符串,char c110; static char c210;,char c310=I,a,m,h,a,p,p,y;,复习:字符数组的定义与初始化,#define N 10 int main( ) in

17、t i, j, k; char aN,t; printf(“input 10 characters:“); for(i=0; iN; i+) scanf(“%c“, ,一、字符串 C语言中没有专门的字符串类型, 而是用字符数组来表示 但字符数组的长度与字符串的长度不同 字符数组的长度在定义该数组时就指定了 而字符串的长度是可以变化的 以0表示字符串的结束(空字符) 一个字符串应存放在比它的长度多1的字符数组中,C中为何需要空字符?,可以这样初始化存放字符串的字符数组: char ch =“Iamhappy“; char ch = “Iamhappy“;,char st10=I, t, , i,

18、 s, 0;,表示字符串“It is“,ch的长度为11 字符串的长度为10,表示一个字符串“Beijing“,可以定义: char onecity10;/数组长度至少为8,应该定义: char city610;,表示多个字符串:“Beijing“、“Shanghai“、“Nanjing“、“Dalian“、“Shenzhen“ 、“Guangzhou“,注意: 并没有规定字符数组 必须以0结束!,(表示字符串 “Iam“),字符数组,字符串,二、字符串的输入与输出,1输入和输出方式 字符数组的输入输出 for(i=0; iN; i+) scanf(“%c“, ,0不能以%c的格式输入,2输入

19、/出字符串时注意: 输入/出字符不包括0 按实际长度输入/出字符串 按%s格式输入时, 以或CR作为字符串的结束符 数组名表示数组的首地址,char str110= “Book“; char str210= “Try it!“; printf(“%s“,str1); printf(“%s“,str2);,char str110,str210,str310; scanf(“%s%s%s“,str1,str2,str3); 输入:Howareyou?,scanf(“%s“,str1); 输入:Howareyou?,三、字符串处理函数 必须使用#include 1puts(字符串) 作用:将一个字符

20、串输出到屏幕 char str = “This is a book!“; puts(str); puts(“Press a key!“);,?与printf的区别: 只能用作字符串的输出,无格式控制符 一次只能输出一个字符串 puts(“Hi!“,name); error! 输出字符串后自动输出回车换行 puts(“One“); puts(“Two“);,2gets(字符数组) 作用:从键盘输入一个字符串到字符数组 char str20; gets(str);,?与scanf的区别 以回车作为字符串的结束符 gets(str); 输入: Howareyou?,3.strcat(字符数组1,字符

21、数组2) 作用:将两个字符串合并成一个字符串, 放在字符数组1中 char str125= “Youare“; char str210= “astudent“; puts(strcat(str1,str2);,str1:,str2:,str1:,注意:字符数组1要足够大,4.strcpy(字符数组1,字符串2) 作用:将字符串2中的全部字符(含0)复制到字符数组1 char str110, str2 = “China“; strcpy(str1,str2); 复制后,str1为:,注意:这是给字符数组一次性赋值的唯一方法 字符数组1要足够大 不能使用以下赋值运算: str1= “China“;

22、 只能用: str10= C; str11= h; ,5.strcmp(字符串1,字符串2) 作用:比较两个字符串.比较的方法为: 从左到右依次比较两个下标相同的字符, 直到:(1)全部相同或 (2)出现不同为止 返回0(相同) 或对应字符的ASCII码值之差 strcmp(str1, “China“) 0 strcmp(str1, “Cgina“) 1 strcmp(str1, “Ciina“); -1,注意:不能这样比较: if(str1=str2) ,6.strlen(字符串) 作用:计算字符串的长度 strlen(“abc“) 值为3 7.strlwr(字符串) 作用:将字符串中大写字

23、母转换成小写字母 8.strupr(字符串) 作用:将字符串中小写字母转换成大写字母,对一个字符串进行操作 char one80; gets(one); for(i=0; onei!=0; i+) 或:while(getchar()!=n) ,对多个字符串进行操作 char many1080; for(i=0; i10; i+) gets(manyi);,for(i=0; i80; i+) scanf(“%c“,用于串输入是错的,有10个字符串,找出其中的最大者,#define N 10 #include int main( ) char string30, strN30; int i; fo

24、r(i=0; i0) strcpy(string,stri); printf(“The largest string is:“); puts(string); return 0; ,#define N 10 int main( ) int i, j, k; char aN80,t80; printf(“input 10 characters:“); for(i=0; iN; i+) gets(ai); for(i=0; iN-1; i+) k= i; /假设从aiaN-1的字符中ai最小 for(j=i+1; jN; j+) if(strcmp(aj,ak)0) k = j; if(k!=i)

25、 strcpy(t,ak); strcpy(ak,ai); strcpy(ai, t); printf(“the sorted strings:n“); for(i=0 iN; i+) puts(ai); printf(“n“); return 0; ,N个字符串排序,输入一行字符,统计其中有多少个单词. 单词之间用空格隔开,#include int main( ) int i, num=0, word=0; char string81; gets(string); for(i=0; stringi!=0; i+) if (stringi= ) word=0; else word=1; ,if

26、(word=0) word=1; num+; printf(“There are %d word in the linen”,num); return 0;,char password10; j=0; while(passwordj=getch()!=r) putch(*);j+; /输入口令 passwordj=0; if(!strcmp(password,“12345“) /验证口令 printf(“口令正确“);,239房间,轻松小屋,住的人值 可以发生变化,房间地址指针,房间名变量名 编程时定义 编译时指定地址,5.5 数组与指针,一、什么是指针? 地址称为指针,int sum; su

27、m=7; 变量名为sum, sum有确定的地址&sum, sum值为7 通过sum和&sum都可以访问到7 直接访问、间接访问 地址空间的大小(有哪些房间号)和变量的具体地址分别由硬件系统和编译系统决定,二、指针变量 专门用于存放地址的变量称为指针变量,int i; i=10; 假设,int i; i=10; 假设,用*i_point表示i_point所指向的存储单元的值 即i的值,4个字节,可以放int、 float类型数据,8个字节, 放double类型数据,1个字节, 放char类型数据,首地址只有一个,存储空间大小和存储方式?,定义指针变量也需要指出指向数据的类型,指针变量定义: 类型

28、 *标识符,指针变量的定义与初始化,例: int i,j; float x; int *pointer_i, *pointer_j; float *pf; 在程序中可以赋值: pointer_i=,初始化: int a,*p=,指针变量定义: 类型 *标识符,指针变量的使用 int main( ) int a,b; int *point_1,*point_2; a=100; b=10; point_1= ,比较: p1=,int a,b; int *p1,*p2; a=100; b=10; p1=,比较: a=5; *p1=5; p1=5;,int main() int *p1,*p2,*p,

29、a,b; scanf(“%d,%d“, ,阅读程序,3,5,数组的首地址-数组的指针 数组元素的地址-数组元素的指针,三、数组与指针,int a10; int *p,*s,i; p= &a0与a等价,p,s,int b34=1,2,3,4,5,6,7,8,9,10,11,12; int a6=0,11,22,33,44,55;,0,11,22,33,44,55,100,104,108,112,116,120,值,地址,a,1,2,3,1,4,5,6,7,8,9,1,10,11,12,200,204,208,212,216,220,224,228,232,236,240,244,b,数组的内存组

30、织,若p=&a0或p=a p指向数组a的第零个元素a0 C语言规定: p+i表示数组第i个元素ai的地址,值相当于 a+i*sizeof(a0) 因此: 指针p+i、a+i均指向ai *(a+i) 、*(p+i) 就是ai,引用数组元素的方法 (1)下标法 ai (2)指针法:pi、*(a+i)、*(p+i) 注意:pi与ai的区别,int a10,i,s=0; for (i=0; i10; i+) scanf(“%d“,int a10,i,s=0; int *p; for (p=a; pa+10; p+) scanf(“%d“,p); for (p=a,i=0; i10; i+) s+=*(

31、p+i); for (p=a; pa+10; p+) printf(“%4d“,*p);,int a10、p=a不能少,下标法,指针法,b,3,5,9,7,8,10,7,2,1,4,3,6,int b34;,bij是第?个元素,i*4+j,int a34,s=0; for (i=0; i3; i+) for(j=0; j4; j+) scanf(“%d“,int a34,s=0; int *p; p= ,下标法,指针法,int main() int b34,c43; int i,j; int *p,*s; p= ,int main() int b34,c43; int i,j; int *p,

32、*s; p=b0;s=c0; / ,char s20=“abcdefgh”; char *p; p=s; gets(p); puts(p); printf(“%sn”,p);,char a20,b20; char *p1,*p2; p1=a; p2=b; for(; *p1!=0; p1+,p2+) *p2=*p1; *p2= 0;,四、动态数组,程序执行过程中内存申请、释放函数 #include 1void *malloc(unsigned size); char *malloc(unsigned size); 分配size字节的连续存储空间 返回该区域的首地址或0 2void free(void *ptr) 释放ptr所指向的内存区域,int n,i,sum=0; int *p; scanf(“%d“,一维动态数组,int n,m,i,sum=0; int *p; scanf(“%d %d“,二维动态数组,

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

当前位置:首页 > 其他


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