C数组及其应用_第1页
C数组及其应用_第2页
C数组及其应用_第3页
C数组及其应用_第4页
C数组及其应用_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

1、C数组及其应用 数组的概念数组的应用数组的定义授课内容字符串常见错误例:某班有50名学生,求该班成绩的平均分 #include void main( ) int j , sum , s ; float ave ; sum=0; for ( j=1; js; sum=sum+s; ave=sum/50.0; cout “ave=ave;假设现在不仅要求平均分,还要求高于平均分的人数,那就不能只使用一个变量s了,而需要50个变量,但这样一来输入、输出、计算都会变得繁琐. 在这种情况下,我们可以使用数组类型,说明一个含有50个元素的数组,每个数组元素存放一个成绩,成绩的输入、输出、计算都可通过循环来

2、实现引入#include void main( ) int i , overn=0 , mark50 ; float ave=0; for ( i=0; imark i; ave=ave+marki; ave=ave/50; for(i=0;i=ave) overn+; cout “平均分:ave“ 高于平均分的人数有:n;int an;. 常量表达式中不能有变量 常量表达式的值不能是实数 下标从0开场, a0 , a1 a9,没有a10; 常量表达式的值为元素的个数错误一维数组的存储构造a 一个数组的所有元素都是连续存储的 数组元素为: a0,a1,a2.a9int a10; 所占空间为:

3、类型长度*元素个数 84 : 66 80 95101010141018 :1046a0a1a2 :a9数组首地址数组元素的引用形式 数组元素的引用: 数组名下标a0 = a2+a4*2240int a10;a0=2;下标 说明(1) 下标可以是整型常量或整型表达式 如: a1 , a2*3(2) 数组定义为 int a5 , 数组长度为5 而下标在0 - 4之内, 即a0 - a4注意: 如果出现 a5 = 72 ; 编译时不会指出错误, 系统会将a4后下一个存储单元 赋值为72, 但这样可能会破坏数组以外其他变量的值。一维数组的初始化概念 : 在定义一维数组时对各元素指定初始 值称为数组的初

4、始化如: int a5 = 1 , 3 , 5 , 7 , 9 ;2. 说明 初值用 括起来, 数据之间用逗号分开. 对数组的全体元素指定初值,可以不指明数组的长度, 系统会根据 内数据的个数确定数组的长度。 如 : int a = 1 , 3 , 5 , 7 , 9 ;(3) 对数组中局部元素指定初值 ( 这时不能 省略数组长度 ) 如 : int a5 = 1 , 3 , 5 ; (4) 使数组中的全部元素初始值都为 0 如: int a5 = 0 , 0 , 0 , 0 , 0 ;更简单的写法: int a5= 0 ;例: 输入50个成绩,求平均分输出高于平均分的个数#include v

5、oid main( ) int i , overn=0 , mark50 ; float ave=0; for ( i=0; imark i; ave=ave+marki; ave=ave/50; for(i=0;i=ave) overn+; cout “平均分:ave“ 高于平均分的人数有:ai;输入整个数组元素:for (i=0;iai;输出方法:输出第i个数组元素:coutai;输出整个数组元素:for (i=0;i10;i+) coutai;例:用一维数组求Fibonacci 数列#includevoid main() int i; int f 20 = 1,1; for ( i=2;

6、 i20; i+ ) f i = f i-2 +f i-1; for ( i=0; i20; i+) if ( i%5 = 0) coutn; cout“tf i ; 1 1 0 0 0 0 : 0f0f1f2f3f4f5 :f19i=2f2=f0+f1i=3f3=f1+f2i=4f4=f2+f323586765例: 输入一个数据,在数组中查找是否有该数据 5 8 0 1 9 2 6 3 7 49a0a1a2a3a4a5a6a7a8a9#include void main() int i , x ; int a10= 5, 8, 0, 1, 9, 2, 6, 3, 7, 4 ; cinx; f

7、or ( i=0 ; i10 ; i+) if ( x=ai ) cout“find!endl; break; if ( i=10 ) cout “no find! endl; #include Void main( ) int f20=1,1, j; for(j=2;j=0; j- -) / 逆序显示 coutfj; coutaij;输入整个数组的元素:for ( i=0; i2; i+ ) for ( j=0; jaij;输出方法:输出第i行第j列元素:coutaij;输出整个数组的元素:for ( i=0; i2; i+) for ( j=0; j3; j+) coutaij;例: 有一

8、个3*4的矩阵, 编程求出其中的最大值及其所在的行号和列号。52093712610418maxrowcol1212#include void main( ) int i , j, row=0, col=0 , max ; int a34= 5, 2, 0, 9, 3, 7, 12, 6,10, 4, 1, 8 ; max=a00; for ( i=0 ; i3 ; i+ ) for ( j=0 ; jmax ) max=aij ; row=i ; col=j ; cout“max= max; cout“max=arow col;输出:max=12max=a12例: 将一个矩阵进展转置(即原来的

9、行变为列)5209371261041840#includevoid main( ) int a34, b43 , i , j ; for ( i=0 ; i3 ; i+ ) for ( j=0 ; jaij ; for ( i=0 ; i3 ; i+ ) for (j=0 ; j4 ; j+) bji=aij; for ( i=0 ; i4 ; i+ ) for ( j=0 ; j3 ; j+ ) cout bij ; cout endl; 输入数组a进展矩阵转置输出数组ba02b20a21b12练习:输出杨辉三角。11 11 2 11 3 3 11 4 6 4 1#include#inclu

10、devoid main()int i,j,a1010=0; 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;j10-i;j+) cout ; for (j=0;j=i;j+) coutsetw(4)aij ; coutendl;课堂练习:1. 数组元素ai是该数组中的第个元素.2 . 元素类型为int的数组a10共占用字节的存储空间,其中元素a5的字节地址为.3 .元素类型为double的数组a46共占用字节的存储空间,其中元素a25

11、的字节地址为.4.元素类型为char的数组a1030共占用字节的存储空间,其中元素a34的字节地址为.答案: 1. i+1 2. 40 a+20 3. 192 a+136 4. 300 a+94 利用数组进展数值计算3 数组的应用利用数组进展统计数据排序冒泡法选择法查找数据 顺序查找不要求数组元素有序排列二分查找要求数组元素有序排列根本算法举例1.排序(1)冒泡法排序 例:输入5个数,进展由小到大排序: 9 8 5 4 2算法:两两比较,大数向后移,找到最大数放在最后,再在剩余的的4个数中进展两两比较,找到最大数,以此类推.总是小数往前放,大数往后放,相当于气泡上升,故称之为:冒泡法85429

12、542842524比较4次第一轮比较3次第二轮比较2次第三轮比较1次第四轮9854289542859428549285425842548254242452对 n 个数,那么要进展n-1趟扫描,在第 i 趟扫描中要进展 n-i 次比较。可以推知:/*排序*/ for (i=0; iN-1; i+) for ( j=0;jaj+1) t =aj; aj=aj+1; aj+1=t;#include#define N 10void main() int i, j, aN, t; for(i=0;iai; for(i=0;iN;i+)/输出 coutai ;/*排序*/for (i=0;iN-1;i+)

13、 for(j=0;jaj+1) t=aj; aj=aj+1; aj+1=t;for(i=0;iN;i+) /输出 coutai ;(2)选择法排序特点:比较后不立即互换元素,而是记下其位置并在每一轮比较完毕后和互换排序过程:1首先通过9次比较,从10个数中找出最小的, 将它与第1个数交换第一趟选择排序,结果最小的数被安置在第1个元素位置上2再通过8次比较,从剩余的9个数中找出次小的数,将它与第2个数交换第二趟选择排序3重复上述过程,共经过9趟排序后,排序完毕 49 38 65 97 76 13 27 kj第1趟 (i = 0):1349 13 38 65 97 76 49 27 2738 13

14、 27 65 97 76 49 38 13 27 38 97 76 49 65 13 27 38 49 76 97 65 13 27 38 49 65 97 76 13 27 38 49 65 76 97 kkkkjjjjjjjjjj第2趟 (i =1 ):第3趟 (i =2 ):第4趟 (i =3 ):第5趟 (i =4 ):第6趟 (i =5 ):输入10个数给a0 到 a9for i=0 to 8for j =i+1 to 9ajak真假k=j输出a0 到 a9k = iai ak交换i != k真假#include const int N=10;void main( ) int aN

15、, i , j , k , t; for ( i=0 ; iai; for ( i=0 ; iN-1 ; i+) k=i ; for ( j=i+1 ; jN ; j+) if ( ajak ) k=j ; if ( k!=i ) t=ai ; ai=ak ; ak=t ; for ( i=0 ; iN ; i+) coutai;A0 A1 A2 A n-1 A0 A1 A2 A n-1 A0 A i-1 A i . . A n-1 A0 A1 . . A n-2 A n-1 例:在有序数组中插入一个数后使原数组仍然有序。例如: 3 5 7 12 18m=5, 将b=10插入步骤:(1)要找到

16、b在数组中的位置(2)给b让位置(3)将b放到该位置上(4)数组元素的个数 m 加 1b=103571218(2)357121218(3)for(i=0;ib)break;for(j=m-1;j=i;j-) aj+1=aj;ai=b;121810(1)3571218a0a1a2a3a4a5m=m+1;(4)3 5 7 10 12 18 (m=6), 将b=10删除步骤:(1) 要找到b在数组中的位置(2) 后面的数组元素依次前移,覆盖该位置 上的数组元素即可实现删除(3) 数组元素的个数 m 减 1例:在有序数组中删除一个数,例如:357101218(1)357101218(2)3571212

17、18for(i=0;im;i+) if (ai=b)break;101218for(j=i;jc0c1c2 ; for ( i=0 ; i ci ;2. 整个数组的输入输出,即按数组名输入输出 (仅用于字符数组),因数组名本身代表数组的 首地址字符数组的输入和输出注意 : (1) 输入、输出字符串时不包括“ (2) cin输入时系统一直读取字符,直到遇到“空白 符为止。例如:输入数据 hello world C数组中内容为hellocoutc;cinsetw(20)c;补充get( )函数(包含在“iostream.h) 如想输入含空格的字符串,如“hello world 只能使用get( )

18、函数,使用格式如下: (字符数组名,字符串长度,规定的完毕符) 其中,规定的完毕符省略时,默认为回车键。 如: char str20; (str,20)字符串处理函数字符串函数的原型保存在中 字符串连接函数: strcat(s1,s2); char *strcat ( char *s1, const char *s2 ); 连接s1和s2两个字符串赋给s1,返回s1的值 字符串拷贝函数: strcpy(s1,s2); char *strcpy ( char *s1, const char *s2 ); 将s2中的字符串赋给s1,返回s1的值 字符串比较函数: strcmp(s1,s2) 求字符

19、串长度函数:strlen(s) 函数值为整数(返回字符个数参数为字符数组名5 字符数组程序应用 字符串的长度 逆序 字符串函数例:求字符串长度扫描数组,只要不是0,计数器就加1源程序:#includevoid main() int i; char s50; cins; for (i=0;i50 & si!= 0; i+) ; cout“Lengh of “s“isi ;acd0bifor (i=0; i50& si+ != 0 ;) ;ii=0字符串连接函数/*例: STRCAT*/#includevoid main() int i , j; char s140, s220; cins1s2;

20、 for( i=0; i40 & s1i!=0;i+) ; for( j=0; j20 & s2j!=0;j+)s1i+=s2 j; s1i=0; /*s1i=s2j;*/ couts1;s1s2acd0beg0facdebfg0s1/ i=strlen(s1); /*例: STRCPY*/#include void main() char p180,p280; int i; cinp2; for (i=0;p2i!=0;i+) p1i=p2i; p1i=0; cout“p1=“p1“np2=“p2“n;字符串复习字符数组用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。一、

21、字符数组的定义char 数组名常量表达式;char c4; /*每个元素占一个字节 */c0=I; c1=m; c2=_;类型数组名数组大小二、字符数组的初始化与数值数组的初始化一样,取其相应字符的ASCII值。char c10=I, , a, m, , a, , b, o, y; 随机yob a ma Icc0c9如果字符个数大于数组长度,做错误处理;如果数值个数小于数组长度,后面的字节全部为0。如果省略数组长度,那么字符数即为数组长度。static char c =I, , a, m, , a, , g, i, r,l; 同理,也可定义和初始化一个二维或多维的字符数组。分层或省略最后一维。

22、char st1 =65, 66, 68;ABD三、字符数组的引用void main(void) char c10=I, , a, m, , a, , b, o, y; int i; for (i=0; i10; i+) coutci; cout“n;定义输出四、字符串和字符串完毕标志C+语言将字符串作为字符数组来处理。字符串常量:“CHINA,在机内被处理成一个无名的字符型一维数组。CHINA0C+语言中约定用0作为字符串的完毕标志,它占内存空间,但不计入串长度。有了完毕标志0后,程序往往依据它判断字符串是否完毕,而不是根据定义时设定的长度。字符串与字符数组的区别:char a =C,H,I

23、,N,A;char c =“CHINA; 随机随机ANIHC长度占5个字节随机0ANIHC长度占6个字节字符数组字符串可以用字符串的形式为字符数组赋初值char c =“I am a boy; /*长度11字节,以0结尾 */char a =I, , a, m, , a, , b, o, y; /* 长度10字节 */如果数组定义的长度大于字符串的长度,后面均为0。char c10=“CHINA; 00000ANIHCc0的ASCII为0,而 (空格)的ASCII为32。char w =T, u, r, b, o, 0;Turbo0char w =“Turbo0;Turbo0char w =“

24、Turbo0;Turbo0char w =Turbo0;非法char a25=“abcd, “ABCD;abcd0ABCD0在语句中字符数组不能用赋值语句整体赋值。char str12;str=“The String”;str为字符数组在内存中存储的地址,一经定义,便成为常量,不可再赋值。char str12=“The String;非法,在语句中赋值定义数组,开辟空间时赋初值字符数组的输入输出 逐个字符的输入输出。这种输入输出的方法,通常是使用循环语句来实现的。如:char str10;cout“输入十个字符:;for(int i=0;istri;/A .A行将输入的十个字符依次送给数组st

25、r中的各个元素。定义赋值把字符数组作为字符串输入输出。对于一维字符数组的输入,在cin中仅给出数组名;输出时,在cout中也只给出数组名。void main (void )char s150,s260;cout s1;cin s2;cout “n s1 = “ s1;cout “n s2 = “ s2 “n;输入:abcdstringcin只能输入一个单词,不能输入一行单词。数组名数组名输出到0为止当要把输入的一行作为一个字符串送到字符数组中时,那么要使用函数cin.getline( )。这个函数的第一个参数为字符数组名,第二个参数为允许输入的最大字符个数。 cin.getline(数组名,

26、数组空间数);char s180;.cin.getline(s1, 80);首先开辟空间参数是数组名void main (void ) char s381; cout输入一行字符串:; cin.getline(s3,80);/A couts3=s3n;/B当输入行中的字符个数小于80时,将实际输入的字符串不包括换行符全部送给s3;当输入行中的字符个数大于80时,只取前面的80个字符送给字符串。 定义从键盘接收一行字符输出到0为止六、字符串处理函数C中没有对字符串变量进展赋值、合并、比较的运算符,但提供了许多字符串处理函数,用户可以调用 #include “string.h所有字符串处理函数的实

27、参都是字符数组名1、合并两个字符串的函数 strcat (str1, str2)static char str120=“I am a ;static char str2 =“boy;strcat (str1, str2);Iama00boy0Iamaboy0将第二个字符串 str2 接到第一个字符串 str1 后。注意:第一个字符串要有足够的空间。空间足够大2、复制两个字符串的函数 strcpy (str1, str2)static char str120=“I am a ;static char str2 =“boy;strcpy (str1, str2);00amaIstr10yobstr

28、200a0yobstr1strcpy ( str1, “CHINA);0ANIHCstr1strcpy (“CHINA, str1);str1=str2; str1=“CHINA; 字符串正确赋值均为非法3、比较两个字符串的函数 strcmp (str1, str2)此函数用来比较str1和str2中字符串的内容。函数对字符串中的ASCII字符逐个两两比较,直到遇到不同字符或0为止。函数值由两个对应字符相减而得。该函数具有返回值,返回值是两字符串对应的第一个不同的ASCII码的差值。假设两个字符串完全一样,函数值为0。 if ( strcmp (str1, str2)=0) . 用来判断两字符

29、串是否相等static char str120=“CHINA;static char str2 =“CHINB;cout strcmp (str1, str2)endl;输出:-1static char str120=“CHINA;static char str2 =“AHINB;coutstrcmp (str1, str2)endl;输出:2if (str1= =str2) cout“yesn;if (strcmp (str1,str2)= =0) cout“yesn;非法正确4、求字符串长度的函数 strlen (str1)长度不包括0。函数参数为数组名,返回值为数组首字母到0的长度。并非

30、数组在内存中空间的大小。char s80;strcpy(s, “abcd);coutstrlen(s)endl;输出: 400a0yobstr1输出: 3coutstrlen(str1)endl;coutsiziof(s)endl;输出: 80char str120=“CHINA;coutstrlen (str1)endl;输出:5char sp =“x69082;coutstrlen (sp)endl;输出:6char sp =“tv0willn;coutstrlen (sp)endl;输出:3char str120=“a book;coutstrlen (str1)endl;输出:15、

31、strlwr (str1)将str1中的大写字母转换成小写字母。6、 strupr (str1)将str1中的小写字母转换成大写字母。7、函数strncmp(字符串1,字符串2 , maxlen)函数原型为: int strncmp(char str1 , char str2 ,int m)第三个参数为正整数,它限定了至多比较的字符个数假设字符串1或字符串2的长度小于maxlen的值时,函数的功能与strcmp( )一样。当二个字符串的长度均大于maxlen的值时,maxlen为至多要比较的字符个数。coutstrncmp(“China,“Chifjsl;kf,3)n;输出:0第三个参数为正整数,它限定了至多拷贝的字符个数假设字符串2的长度小于maxlen的值时,函数的功能与strcpy( )一样。当字符串2的长度大于maxlen的

温馨提示

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

评论

0/150

提交评论