《语言数组学习.pptx》由会员分享,可在线阅读,更多相关《语言数组学习.pptx(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、内容提要数组定义和基本操作;常用算法:求最大最小值、排序、查找等;用字符数组存取字符串;使用字符串处理函数处理字符串第1页/共70页一维数组(Array)的定义类型 数组名长度;长度为常量表达式,不可以是变量(但C99提供了动态数组)例:int a10;定义一个有10个元素的数组,每个元素的类型均为int系统会在内存分配连续的10个int空间给此数组a 是数组名,同时也代表着此数组的首地址/长度长度长度长度n n不可以是变量不可以是变量不可以是变量不可以是变量第4页/共70页一维数组的初始化int a5=12,34,56,78,9;int a5=12;int a =12,34,56,78,9;
2、12123434565678789 9a0a0a1a1a2a2a3a3a4a412120 00 00 00 0a0a0a1a1a2a2a3a3a4a412123434565678789 9a0a0a1a1a2a2a3a3a4a4第5页/共70页一维数组的赋值数组赋值和普通变量赋值一样只能逐个对数组元素进行操作!不能整体赋值!切忌下标越界!int a4;for(i=0;i4;i+)ai=2*i+1;int a4,b4;a=b;int a4;a0=1;a1=3;a2=5;a3=7;/a和和b是数组首地址是数组首地址,是地址常量是地址常量/地址常量地址常量a不可以被赋值不可以被赋值第6页/共70页如
3、何使两个一维数组的值相等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:输入输入第第i个数组元素个数组元素for(i=0;i10;i+)scanf(%d,&ai);/方法方法2:循环输入:循环输入数组元素数组元素int a10,i=0;printf(“%d”,ai);/方法方法1:输出输出第第i个数组元素个数组元素fo
4、r(i=0;i10;i+)printf(%d,ai);/方法方法2:循环输出循环输出数组元素数组元素第8页/共70页耳听为虚,眼见为实一维数组在内存中是连续存放的一维数组名就是此数组首元素的地址数组下标越界的严重性第9页/共70页证明:数组在内存中是连续分布的;数组名就是数组的首地址int i;int a6=1,3,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页/
5、共70页后果很严重!下标越界 int i,a6;for(i=1;i=6;i+)ai=0;printf(a%d的值是%dn,i,ai);LL 总是出现莫名其妙的错误总是出现莫名其妙的错误,且不容易被发现且不容易被发现!LL 越界下标将访问数组以外的空间,可能带来严重后果越界下标将访问数组以外的空间,可能带来严重后果!LL C C语言不提供下标越界检查,所以一定要注意!语言不提供下标越界检查,所以一定要注意!第11页/共70页数组的使用数组的下标都是从0开始对数组每个元素的使用与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;iSIZE;i+)ai=2*i;下标越界是大忌
6、!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果sizeof可以用来获得数组大小第12页/共70页 FibonacciFibonacci数列数列数列数列 1 1,1 1,2 2,3 3,5 5,8 8,1313,2121,3434,5555 兔子繁殖问题(数组版)第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-
7、2;for(month=1;month=YEAR_MONTH;month+)printf(%dt,fmonth);retuun 0;第14页/共70页反转并打印数组#includeinclude#definedefine N 10 N 10intint main()main()intint i,temp,aN;i,temp,aN;srandsrand(time(NULL);(time(NULL);forfor(i=0;i N;+i)(i=0;i N;+i)ai=ai=rand rand()%100;()%100;printfprintf(“%3d,ai);(“%3d,ai);for for(i
8、=0;i N/2;+i)(i=0;i N/2;+i)temp=ai;temp=ai;ai=aN-1-i;ai=aN-1-i;aN-1-i=temp;aN-1-i=temp;forfor(i=0;i N;+i)(i=0;i N;+i)printfprintf(“%3d,ai);(“%3d,ai);return 0;return 0;第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页求数组最小元素及
9、其所在下标#include#define N 10int main()int i,imin,aN;srand(time(NULL);for(i=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页a0a09 9a1a13 3a2a25 5a3a34 4a4a42 2a5a50 03 39 95 54 42 20 03 35 5
10、9 94 42 20 03 35 54 49 92 20 03 35 54 42 29 90 03 35 54 42 20 09 9a0a03 3a1a15 5a2a24 4a3a32 2a4a40 0a5a59 93 35 54 42 20 09 93 34 45 52 20 09 93 34 42 25 50 09 93 34 42 20 05 59 9第第第第0 0轮轮轮轮第第第第1 1轮轮轮轮第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;j9;j
11、+)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页 选择排序a0a0a1a1a2a2a3a3a4a4a5a5a6a6a7a7a8a8a9a95 53 32 26 68 87 74 40 09 91 10 03 32 26 68 87 74 45 56 61 10 01 12 26 68 87 74 45 56 63 3第第0 0轮轮第第1 1轮轮第第2 2轮轮iminiminiminiminiminiminiminiminiminiminiminiminiminim
12、iniminimin第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;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(
13、%3d,ai);第23页/共70页顺序查找哈,找到了!a0a0a1a1a2a2a3a3a4a4a5a5a6a6a7a7a8a8a9a91 13 35 57 79 92 24 46 68 81010第24页/共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
14、);elseprintf(未找到);return 0;第26页/共70页 折半查找(有序数组)a0a0a1a1a2a2a3a3a4a4a5a5a6a6a7a7a8a8a9a91 13 35 57 79 912121414161618182020第第1 1次次第第2 2次次第第3 3次次lowlowhighhighmidmid1 13 35 57 79 912121414161618182020lowlowhighhighmidmid1 13 35 57 79 912121414161618182020lowlowhighhighmidmid第29页/共70页 折半查找(有序数组)a0a0a1a
15、1a2a2a3a3a4a4a5a5a6a6a7a7a8a8a9a91 13 35 57 79 912121414161618182020第第1 1次次第第2 2次次第第3 3次次lowlowhighhighmidmid1 13 35 57 79 912121414161618182020lowlowhighhighmidmid1 13 35 57 79 912121414161618182020lowlowhighhighmidmid第第4 4次次1 13 35 57 79 912121414161618182020lowlowhighhigh第30页/共70页折半查找int a10=1,3,
16、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 amid)high=mid-1;elsefind=1;pos=mid;break;if(find)printf(找到了!位置是%d,pos);elseprintf(未找到);第31页/共70页二维数组的定义二维数组的定义数据类型数据类型数据类型数据类型 数组名数组名数组名数组名 常量表达式常量表达式常量表达式常量表达式 常
17、量表达式常量表达式常量表达式常量表达式;int a23;a0a1a-a00 a01 a02-a10 a11 a12在在c语言中,二维数组是数组的数组!语言中,二维数组是数组的数组!第32页/共70页二维数组的初始化int b23=1,2,3,4,5,6;按行赋值int b23=1,2,3,4,5,6;按存放顺序赋值int b 3=1,2,3,4,5,6;行长度可省,列长度不能省 int b23=1,2,3,4;部分元素赋初值int b23=1,2,3,4,5,6;第33页/共70页二维数组的存储结构short int a23;a0a1a10 a11 a12a00 a01 a02存放顺序:存放顺
18、序:按行按行存放存放先存放第先存放第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=0;i3;i+)printf(a%d的值是:%p size是:%dn,i,ai,sizeof(ai);pr
19、intf(a的值是:%pn,a);printf(a的size是:%dn,sizeof(a);第36页/共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;只能逐个对数组元素进行操作(字符数组例外)只能逐个对数组元素进行操作(字符数组例外)第38页/共70页二维数组的最大值#include int main()int i,j,row=0,col=0;int a34=1,2,3,4,9,8,7,6,
20、-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(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
21、 3 11 4 6 4 1 杨辉三角形杨辉三角形杨辉三角形杨辉三角形第40页/共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=China;char str6=China;char str =China;“China”是字符串常量,系统自动添加0字符C Ch hi in na a00st
22、r0str0str1str1str2str2str3str3str4str4str5str5C Ch hi in na a00str0str0str1str1str2str2str3str3str4str4str5str5第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页scanfscanf(%s,str);(%s,str);printfprintf(%s
23、,str);(%s,str);charchar str10;str10;字符串的输入输出字符串的输入输出字符串的输入输出字符串的输入输出 getsgets(str);(str);putsputs(str);(str);gets可以输入带空格的字符串scanf(“%s”,str)将遇到空格或回车键停止读入字符串注意字符长度越界,引起缓冲区溢出第46页/共70页#include int main()char str150,str250;printf(调用gets()函数输入字符串:n);gets(str1);printf(输入的字符串是:n);puts(str1);printf(n调用scanf(
24、)函数输入字符串: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 stringIm
25、 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页字符串处理函数在中定义了若干专门的字符串处理函数strcpy:string copystrcpy(目的字符串,源字符串);strlen:string lengthstrlen(字符串);返回字符串的实际长度,不包括0strcat:string c
26、ombinationstrcat(目的字符串,源字符串);strcmp:string comparisonstrcmp(字符串1,字符串2);当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小返回其ASCII码比较的结果值 第52页/共70页字符串处理函数字符串不能直接整体复制!str1=str2;/*错误*/strcpy(str1,str2);/*正确*/字符串不能用关系运算符比较大小!字符串不能用关系运算符比较大小!if(str1 str2)/*if(str1 str2)/*错误错误错误错误*/if(strcmp(str1,str2)0)/*if(strcmp(str1,str
27、2)0)/*正确正确正确正确*/第53页/共70页字符串函数 strcmp()strcmp(str1,str2)abcde0str1abcde0str2abc00 abcd de0a abcd0 A Abcde0str1str2str1str2strcmp(str1,str2)=0strcmp(str1,str2)=0strcmp(str1,str2)0strcmp(str1,str2)0strcmp(str1,str2)0strcmp(str1,str2)0第54页/共70页字符串例题 从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名 等价于求最小字符串 第55页/共70页#include#include#define ARRA_SIZE 80main()int n;char strARRA_SIZE,minARRA_SIZE;printf(Please 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页感谢您的观看!第70页/共70页
限制150内