语言数组PPT课件_第1页
语言数组PPT课件_第2页
语言数组PPT课件_第3页
语言数组PPT课件_第4页
语言数组PPT课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、内容提要数组定义和基本操作;常用算法:求最大最小值、排序、查找等;用字符数组存取字符串;使用字符串处理函数处理字符串第1页/共70页为什么引入数组 保存大量同类型的相关数据 如矩阵运算,表格数据等 第2页/共70页一维数组(Array)的定义 类型 数组名长度; 长度为常量表达式,不可以是变量(但C99提供了动态数组) 例:int a10; 定义一个有10个元素的数组,每个元素的类型均为int 使用a0、a1、a2、a9这样的形式访问每个元素。 系统会在内存分配连续的10个int空间给此数组 a就是此数组的首地址 第3页/共70页一维数组(Array)的定义 类型 数组名长度; 长度为常量表达

2、式,不可以是变量(但C99提供了动态数组) 例:int a10; 定义一个有10个元素的数组,每个元素的类型均为int 系统会在内存分配连续的10个int空间给此数组 a 是数组名,同时也代表着此数组的首地址第4页/共70页一维数组的初始化 int a5 = 12, 34, 56, 78, 9; int a5 = 12 ; int a = 12, 34, 56, 78, 9;第5页/共70页一维数组的赋值 数组赋值和普通变量赋值一样 只能逐个对数组元素进行操作! 不能整体赋值! 切忌下标越界!int a4;for (i=0; i4; i+) ai = 2*i+1 ;int a4, b4; ;

3、a = b; int a4;a0=1; a1=3; a2=5; a3=7; / a和和b是数组首地址是数组首地址,是地址常量是地址常量/ 地址常量地址常量a不可以被赋值不可以被赋值第6页/共70页如何使两个一维数组的值相等7int a4=1,2,3,4, b4;方法方法1: 1: 逐个元素赋值逐个元素赋值 b0=a0; b1=a1; b2=a2; b3=a3;方法方法2: 2: 通过循环赋值通过循环赋值 int i; for (i=0; i4; i+) bi=ai;第7页/共70页一维数组的输入和输出int a10, i=0;scanf(“%d”,&ai); /方法方法1:输入输入第第

4、i个数组元素个数组元素for (i=0; i10; i+) scanf(%d, &ai); /方法方法2:循环输入:循环输入数组元素数组元素int a10, i=0;printf(“%d”, ai); /方法方法1:输出输出第第i个数组元素个数组元素for (i=0; i10; i+) printf(%d, ai); /方法方法2:循环输出循环输出数组元素数组元素第8页/共70页耳听为虚,眼见为实 一维数组在内存中是连续存放的 一维数组名就是此数组首元素的地址 数组下标越界的严重性第9页/共70页证明:数组在内存中是连续分布的; 数组名就是数组的首地址int i;int a6=1,3,

5、5,7,9,11;for (i=0; i=5; i+) printf(a%d的值是%2d,地址是%pn, i, ai, &ai);printf(“a的size是%dn”, sizeof(a); printf(“a的值是%pn”, a ); /a是数组名,也是首元素的地址 /a的值和&a0的值相等第10页/共70页后果很严重!下标越界 int i, a6; for (i=1; i=6; i+)ai=0; printf(a%d的值是%dn,i, ai);第11页/共70页数组的使用 数组的下标都是从0开始 对数组每个元素的使用与普通变量无异 可以用任意表达式作为下标,动态决定访问哪

6、个元素for (i=0; iSIZE; i+) ai = 2 * i; 下标越界是大忌! 使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果 sizeof可以用来获得数组大小第12页/共70页兔子繁殖问题(数组版)第13页/共70页兔子问题(数组版)#include #define YEAR_MONTH 12int main()int fYEAR_MONTH+1 = 0,1,1;int month;for (month=3; month=YEAR_MONTH; month+)fmonth = fmonth-1 + fmonth-2; for (month=1;

7、month=YEAR_MONTH; month+)printf(%dt, fmonth); retuun 0;第14页/共70页反转并打印数组第15页/共70页求数组最小元素及其所在下标#define N 10 int i,aN; imin = 0; for (i = 1; i N; +i) if (ai aimin) imin = i; printf(最小值是a%d:%3dn,imin, aimin);第16页/共70页求数组最小元素及其所在下标#include #define N 10int main() int i, imin, aN; srand(time(NULL); for (i

8、= 0; i N; +i) ai = rand ( ) % 100 ; printf(“a%d是: %3d n , i, ai ) ; imin = 0; for (i = 1; i N; +i) if (ai aimin) imin = i; printf(最小值是a%d:%3dn,imin, aimin); return 0;第17页/共70页常用排序算法 冒泡排序 选择排序第18页/共70页第19页/共70页Bubble sort#include int main() int a10=93,84,52,46,25,0,66,18,39,70, i, j, temp; for ( j=0;

9、 j9; j+)for (i=0; iai+1) temp=ai; ai=ai+1; ai+1=temp; for (i=0;i10;i+) printf(%3d,ai);return 0;第20页/共70页 选择排序第21页/共70页选择排序 for (i=0; in-1; i+) imin = i; for (j=i+1; jn; j+) if (aj aimin) 记录此轮参加比较的最小元素的下标 imin = j; 若imin不等于i,则 交换aimin和ai, 第22页/共70页选择排序int a10=1,3,5,7,9,10,8,6,4,2;int i, j, imin, temp

10、;for (i=0; i9; i+) imin = i;for (j=i+1; j10; j+) if (aj aimin) imin = j; if (imin != i)temp = ai;ai = aimin;aimin = temp; for (i=0; i10; i+) printf(%3d,ai);第23页/共70页顺序查找哈,找到了!第24页/共70页顺序查找 int aN=(1,3,5,7,9,2,4,6,8,10), x int i, find = 0, pos =-1 ; for (i=0; i10; i+) if (ai = number) pos = i; find =

11、 1; if (find)printf(“找到了,位置是%d“,pos); elseprintf(”未找到”); 哈,找到了!第25页/共70页顺序查找#include #define N 10int main() int aN=1,3,5,7,9,2,4,6,8,10, number ; int i, find = 0, pos =-1; printf(请输入要查找数据:); scanf(%d, &number); for (i=0; iN; i+) if (ai = number) pos = i; find = 1; if (find)printf(找到了,位置是%d,pos);

12、 elseprintf(未找到); return 0;第26页/共70页 折半查找(有序数组)查找12成功!第27页/共70页 折半查找(有序数组)第28页/共70页 折半查找(有序数组)第29页/共70页 折半查找(有序数组)第30页/共70页折半查找int a10=1,3,5,7,9,12,14,16,18,20, number;int low = 0, high= 9 ,mid,pos = -1, find = 0printf(请输入要查找的数:); scanf(%d,&number);while (low amid)low = mid +1;else if (number am

13、id)high = mid -1;elsefind = 1;pos = mid;break;if (find)printf(找到了! 位置是%d, pos);elseprintf(未找到);第31页/共70页- - 第32页/共70页二维数组的初始化nint b23=1,2,3, 4,5,6;按行赋值nint b23=1,2,3,4,5,6;按存放顺序赋值nint b 3=1,2,3,4,5,6;行长度可省,列长度不能省 nint b23=1,2,3,4;部分元素赋初值nint b23=1,2,3,4,5,6;第33页/共70页二维数组的存储结构short int a23;a0a1a10 a1

14、1 a12a00 a01 a02存放顺序:存放顺序:按行按行存放存放先存放第先存放第0行的元素行的元素,再存放第再存放第1行的元素行的元素a00a01a02a10a11a12第34页/共70页二维数组是先行后列存放int i,j;short int a34; /注意:a是short整型for (i=0; i3; i+)for (j=0; j4; j+)aij = 4 * i + j;printf(a%d%d的值是: %2d “, ”地址是: %pn, i, j, aij, &aij );第35页/共70页二维数组是数组的数组int i, j;short int a34; for (i=

15、0; i3; i+)printf(a%d的值是: %p size是: %dn, i, ai, sizeof(ai); printf(a的值是: %pn, a ); printf(a的size是: %dn, sizeof(a); 第36页/共70页二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)(字符数组例外)输入第输入第i行第行第j列元素:列元素:scanf(“%d”,&aij);输入整个数组元素:输入整个数组元素:for (i=0;i2;i+) for(j=0;j3;j+) scanf(“%d”,&aij

16、);输出第输出第i行第行第j列列元素:元素:printf(“%d”,aij);输出整个数组元素:输出整个数组元素:for (i=0;i2;i+) for(j=0;j3;j+) printf(“%d”,aij);第37页/共70页二维数组的输入和输出for (i=0; i2; i+)for (j=0; j3; j+) scanf(“%d”, &aij); /输入输入 for (i=0; i2; i+)for (j=0; j3; j+) printf(“%d”, aij); /输出输出int a23, i, j;只能逐个对数组元素进行操作(字符数组例外)只能逐个对数组元素进行操作(字符数组

17、例外)第38页/共70页二维数组的最大值#include int main() int i, j, row = 0,col = 0; int a34 = 1,2,3,4,9,8,7,6,-10,10,-5,2; row = 0 ; col = 0; for (i=0 ; i=2 ;i+) for (j=0; jarowcol)row = i;col = j; printf(最大值为:%d, arowcol); return 0;第39页/共70页#include int main() int a1010; int i,j,k; for(i=0;i10;i+) ai0=1; aii=1; for

18、(i=2;i10;i+) for(j=1;ji;j+) aij= ai-1j+ ai-1j-1; for(i=0;i10;i+) for(j=0;j=i;j+) printf(%6d, aij); printf(n); return 0;11 11 2 11 3 3 11 4 6 4 1 第40页/共70页例例 : 输出10行扬辉三角形。int main() int a1010; int i,j; for(i=0;i10;i+) ai0=1; aii=1; for(i=0;i10;i+) for(j=1;ji;j+) /* 0,1两行不用计算,j循环不执行 */ aij= ai-1j+ ai-

19、1j-1; /*上一行的同列元素与前一列元素之和*/ for(j=0;j=i;j+) printf(%5d, aij); printf(n); 11 11 2 11 3 3 11 4 6 4 1 第41页/共70页字符数组与字符串(String) 字符数组 数组每个元素都是字符类型 char string5=h,e,l,l,o; 字符串 以0结尾的字符数组(在c语言中) char string6=h,e,l,l,o,0; C语言使用字符数组实现字符串第42页/共70页字符串的初始化 用字符初始化 char str6 = C,h,i,n,a,0; 用字符串常量初始化 char str6 = Ch

20、ina; char str6 = China; char str = China; “China”是字符串常量,系统自动添加0字符第43页/共70页字符数组的赋值 只能逐个对字符数组元素进行操作! 切忌下标越界!char a4;for (i=0; i4; i+) ai = a+ i ;char a4, b4; char a4;a0=a; a1=b; a = b; / a是数组首地址,是地址常量,不能赋值是数组首地址,是地址常量,不能赋值第44页/共70页字符数组的赋值字符数组的赋值 字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机 对输入字

21、符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin);第45页/共70页 gets可以输入带空格的字符串 scanf(“%s”,str)将遇到空格或回车键停止读入字符串 注意字符长度越界,引起缓冲区溢出第46页/共70页for(i=0; i10; i+) stri=getchar(); putchar(stri);第47页/共70页#include int main()char str150,str250;printf(调用gets()函数输入字符串:n);gets(str1); printf(输入的字符串是:n);puts(str1); printf(n调

22、用scanf()函数输入字符串:n);scanf(%s,str2); /str2之前没有&,为什么?printf(输入的字符串是:n);printf(%sn, str2);return 0;第48页/共70页What does it print?int main(void) char str = Im a full string; puts( str); str7 = o; str8 = o; puts(str); str10 = 0; puts( str); str10 = s; puts( str); return 0;Im a full stringIm a fool strin

23、gIm a foolIm a foolsstring 0 1 2 3 4 5 6 7 8 9 第49页/共70页scanf() char str10;scanf(%s, str); 这里没有& 不能读入带空格的字符串,gets()可以 这两种用法都不安全。当用户的输入多于10个(含10个),str数组将越界 scanf被公认为最易遭到黑客攻击的函数之一第50页/共70页gets() 字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机 对输入字符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin);第5

24、1页/共70页字符串处理函数 在中定义了若干专门的字符串处理函数 strcpy: string copy strcpy(目的字符串,源字符串); strlen: string length strlen(字符串); 返回字符串的实际长度,不包括0 strcat: string combination strcat(目的字符串,源字符串); strcmp: string comparison strcmp(字符串1,字符串2); 当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小 返回其ASCII码比较的结果值 第52页/共70页字符串处理函数 字符串不能直接整体复制! str1 =

25、 str2; /*错误*/ strcpy(str1,str2); /*正确*/第53页/共70页字符串函数 strcmp( )strcmp(str1,str2)abcde0str1abcde0str2abcabce0bcd0bcde0str1str2str1str2第54页/共70页字符串例题 从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名 等价于求最小字符串 第55页/共70页#include #include #define ARRA_SIZE 80main()int n;char strARRA_SIZE, minARRA_SIZE;printf(Please

26、 enter five names:n);gets(str); strcpy(min, str); for (n=1; n5; n+)gets(str); if (strcmp(str, min) 0) strcpy(min, str); printf(The min is:);puts(min); 第56页/共70页第57页/共70页第58页/共70页第59页/共70页第60页/共70页字符串(String)与字符数组 字符串 一串以0结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加0终结符 C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理 字符数组 每个元素都是字符类型的数组 char string80;第61页/共70页字符数组的初始化 用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; 用字符串常量直接对数组初始化 char str6 = China; char str6 = China;第62页/共70页逐个输入输出for (i=0; si!=0; i+) putchar(si);putchar(n);第63页/共70页scanf() char str10;scanf(%s, str); 不能读入带空格的字符串,gets()可以 这两种用法都不安全。当用户的输

温馨提示

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

评论

0/150

提交评论