chap5_数组Old_第1页
chap5_数组Old_第2页
chap5_数组Old_第3页
chap5_数组Old_第4页
chap5_数组Old_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、数组 一维数组一维数组 一维数组应用一维数组应用 二维数组二维数组 字符数组和字符串字符数组和字符串 一维数组与指针一维数组与指针 二维数组与指针二维数组与指针 字符串与指针字符串与指针 指向指针的指针指向指针的指针 实例研究实例研究一维数组int score10;数组是具有相同类型的数据的集合。 一维数组 数组下标:在数组名后的方括号内的数值或表达式,用于区分数组中的不同元素。 长度为n的数组其各个元素的下标应该是从0到n-1,而不是从1到n。一维数组 【例例5-1】给所有的数组元素赋初值。某学生期中考试4门课程的成绩分别为88,91,80,79,求其本次考试的平均成绩。float a4=8

2、8,91,80,79; /*给所有元素赋初值*/float sum=0,ave=0;sum=a0+a1+a2+a3;ave=sum/4;printf(Average=%.1fn,ave); 一维数组 【例例5-2】 给部分数组元素赋初值。求某学生4门课程的平均成绩,并将平均成绩放置在数组的最后一个元素中。float a5=88,91,80,79; /*给部分元素赋初值,最后一个元素预留给平均成绩,暂不初始化*/float sum=0;sum=a0+a1+a2+a3;a4=sum/4; /*将平均成绩放置在数组的最后一个元素中*/printf(Average=%.1fn,a4);一维数组 【例例

3、5-3】从键盘输入5位同学的年龄,计算他们的平均年龄。(循环)int age5,i,sum; sum=0;for(i=0;i5;i+) /*控制数组元素的下标从 0到4变化*/scanf(%d,&agei); sum+=agei; printf(The Average Age=%.1fn,sum/5.0);一维数组【例例5-5】 用数组处理Fibonacci数列问题,输出数列的前20项。#define N 20 /*用符号常量表示数组长度*/int i;int fN=1,1; /*数列的第1,2个元素为1*/for(i=2;iN;i+) fi=fi-1+fi-2;for(i=0;iN;i+)i

4、f(i%5=0) printf(n); /*控制每行输出5个*/printf(%8d,fi); 一维数组应用 一维数组与查找 顺序查找顺序查找 【例例5-6】 程序设计集训队举行一场老队员欢送活动,期间有一个猜数游戏,每次电脑随机产生20个数字(大小在100以内),参加的同学也有机会报一个数字,如果同学报出的数字刚好在20个随机数中间,则该同学就是幸运儿了,可以获得一份礼物。请编程实现这一过程。一维数组应用#define N 20 /*随机数的个数*/int i,scoreN,guess;srand(unsigned)time(NULL);for(i=0;iN;i+) scorei=rand(

5、)%100; /*产生N个100以内随机数*/printf(“Enter your number:”);scanf(“%d”,&guess); /*输入同学猜的数据*/*顺序查找同学猜的数据是否在随机数中*/for(i=0;iN;i+)if(scorei=guess) break; /*若存在,则退出循环*/if(iN) printf(n*Lucky Boy!*n);else printf(n-Try Again-n);一维数组应用【例例5-7】 已知有10个学生的成绩,请找出其中的最高分和最低分。#define N 10 int aN;int i,min,max,minloc,maxloc;

6、for(i=0;iN;i+) scanf(%d,&ai);min=max=a0; /*以第一个元素作为比较的参照数*/minloc=maxloc=0; /*以第一个元素的下标作为最大最小值的初始下标*/for(i=0;iai) min=ai;minloc=i;if(maxai) max=ai;maxloc=i;printf(nMin Score=%d,Location=%dn,min,minloc);printf(nMax Score=%d,Location=%dn,max,maxloc);一维数组应用 一维数组查找二分查找一维数组应用【例例5-8】 用二分查找法在已经排好序的数列中查找用户输

7、入的数。#define N 10 int location; /*标识找到的位置*/int aN= 45,67,70,82,85,89,90,91,94,98;int low,high,mid,key;scanf(%d,&key);/*二分查找法*/low=0; high=N-1;while(low=high)mid=(low+high)/2;if(key=amid) sucess=1;location=mid;break;if(keyamid) high=mid-1;elselow=mid+1;一维数组应用 一维数组与删除一维数组应用【例例5-9】 有5个整型数据存储在数组中,再输入一个数值

8、key,删除数组中第1个等于key的元素。如果key不是数组中的元素,则显示“No such number!”。#define N 5 int aN=80,65,93,100,81;int i,j,key;scanf(%d,&key);for(i=0;iN&ai!=key;i+) ; /*查找key是否存在,此处循环体为空语句*/if(i=N) /*说明元素不存在*/printf(No such Number!n); /*输出错误信息后就返回了*/return 0;for(j=i;jN-1;j+) /*初始时,iN&ai=key*/aj=aj+1; /*元素向前移动*/printf(New A

9、rray:n);for(i=0;iN-1;i+) printf(%d ,ai);一维数组应用 一维数组与插入一维数组应用#define N 6 int aN=61,65,78,87,95; /*多留一个数组空间*/int i,j,key;scanf(%d,&key);for(i=0;iN-1&ai=i;j-) /*元素依次后移动,腾出空位*/ aj+1=aj; ai=key; /*在下标为i的位置插入元素*/printf(New Array:n);for(i=0;iN;i+) printf(%d ,ai); /*输出插入以后的全部数组元素*/ 一维数组应用 一维数组与统计 【例例5-11】 某

10、学生参加项目结题汇报,假设有N位老师作为评委。计算学生最终得分的方法如下:首先去掉一个最高分和一个最低分,然后计算剩余N-2个分数的平均值,所得结果就是该学生的最后得分。编程实现此功能。一维数组应用#define N 8 /*假设N为8*/float aN,sum=0,ave,min,max;int i;for(i=0;iN;i+) scanf(%f,&ai);min=max=a0; for(i=0;iai) min=ai; if(max=A&ch=a&ch=z) letterch-a+; for(i=0;iNUM;i+) if(letteri!=0) printf(%c:%dn,A+i,le

11、tteri);一维数组应用表5-2 选择排序过程初始状态786437212277第1次216437782277第2次212237786477第3次212237786477第4次212237647877第5次212237647778一维数组应用【例例5-13】 随意输入10个学生的成绩,按从低到高的序列显示。#define N 10 int aN, i,j,minloc,temp;for(i=0;iN;i+) scanf(%d,&ai);/*选择排序*/for(i=0;iN-1;i+) minloc=i; /*先假设未排序区域的第一个数为最小值,将其下标i保存到minloc中*/for(j=i+

12、1;jN;j+) /*选择iN-1之间真正最小的数值,记录其下标到minloc中*/if(ajaminloc) minloc=j;if(minloc!=i) /*若最后选出的最小值不是原来假设的未排序区域的第一个数,则两数交换*/ temp=ai; ai=aminloc; aminloc=temp;约瑟夫问题约瑟夫问题 模拟这个游戏。n个人围坐一圈,从第1个人开始数,沿顺时针方向数到m,最后数到的人被淘汰。然后接下去数,数到m,再淘汰一人。重复上述过程,直到剩下1人为止。剩下的这个人是获胜者。一维数组应用#include void main()int m,n,i,k=1,x,n1, a1000

13、; /k为人的序号scanf(%d%d,&n,&m); n1=n; x=1;for (i=1;i=n;i+) ai=0;while (1) /x为报数while (ak=1) k+; if (k=(n+1) k=1;if (x=m) ak=1; printf(%dn,k); n1-; if (n1=1) break; x=1; else x+; k+; if (k=(n+1) k=1;for (i=1;i=n;i+) if (ai=0) printf(WIN=%dn,i);一维数组应用二维数组二维数组int s34;二维数组二维数组 【例例5-14】按行分段赋值。有3位同学参加了数学、英语、C

14、语言三门课程的考试,在程序中对各门成绩初始化,并求出每位同学的平均成绩。#define M 3#define N 3int i,j;float scoreMN=95,68,78,65,77,88,94,82,73; /*按行分段赋值*/float sumM=0,aveM; /*每位同学的总分和平均分*/for(i=0;iM;i+) for(j=0;jN;j+) sumi=sumi+scoreij; /*求每位同学3门课程的总分*/avei=sumi/N; /*求每位同学平均分*/ 二维数组二维数组 【例例5-15】 对部分元素赋值。题目内容同例5-14。现要求将平均成绩放在每行的最后一个位置进

15、行处理。请编程实现。float score34=95,68,78,65,77,88,94,82,73;二维数组二维数组float scoreMN=95,68,78,65,77,88,94,82,73; /*只对每行的前3列元素初始化,其余自动为0*/float sumM=0; /*每位同学的总分*/for(i=0;iM;i+) for(j=0;jN-1;j+) sumi=sumi+scoreij; /*求每位同学3门课程的总分*/scoreiN-1=sumi/(N-1); /*求每位同学的平均分,保存到该行最后一列的位置上*/ 二维数组应用二维数组应用 【例例5-16】 对用作单位矩阵的数组初

16、始化。单位矩阵在主对角线上的值为1,而其他地方的值为0,并且主对角线上的行、列下标是一样的。#define N 4int i,j;int aNN;for(i=0;iN;i+) for(j=0;jN;j+)if(i= =j) aij=1; /*生成主对角线上的元素*/else aij=0; /*其他元素为0*/二维数组应用二维数组应用 【例5-18】 打印以下的杨辉三角形(要求打印出6行)。11 11 2 11 3 3 11 4 6 4 1二维数组应用二维数组应用#define N 6int i,j;int aNN;for(i=0;iN;i+) aii=1; /*对角线上元素置对角线上元素置1*

17、/ai0=1; /*第第0列元素置列元素置1*/for(i=2;iN;i+) /*给其他位置元素赋值给其他位置元素赋值*/for(j=1;ji;j+)aij=ai-1j+ai-1j-1; for(i=0;iN;i+) for(j=0;j=i;j+) printf(%4d,aij);printf(n); 字符数组和字符串char str10; str0=G; str1=o; str2=o; str3=d; str4= ;str5=N; str6=i; str7=g; str8=h; str9=t;字符数组和字符串1、逐个字符赋给数组中的元素、逐个字符赋给数组中的元素 【例5-19】 对一维字符数

18、组逐个元素赋值。char str5=F,r,a,n,k; /*将字符常量逐个赋给对应的字符数组元素*/int i; for(i=0;i5;i+)printf(%c,stri); /*逐个输出*/字符数组和字符串char str8=F,r,a,n,k;字符数组和字符串 【例5-20】 对二维字符数组逐个元素初始化。char tri35= , ,A, ,A,A,A, A,A,A,A,A ;int i,j;for(i=0;i3;i+)for(j=0;j5;j+)printf(%c,triij);printf(n);字符数组和字符串 2、用字符串常量初始化、用字符串常量初始化【例【例5-21】 用字符

19、串常量对字符数组初始化。用字符串常量对字符数组初始化。char str6=Frank; /*用字符串常量初始化字符数组用字符串常量初始化字符数组*/int i;for(i=0;i5;i+)printf(%c,stri); 字符数组和字符串【例5-22】 计算字符串的有效长度,并输出该字符串。int i,len=0;char str20=Programming C; /*用字符串常量初始化字符数组*/for(i=0;stri!=0;i+) /*若stri不等于0则继续循环*/len+; /*计算字符串有效长度的计数器增1*/printf(String is:);for(i=0;ilen;i+)

20、printf(%c,stri);printf(nLength=%dn,len);字符数组和字符串 字符数组的输入输出字符数组的输入输出1、使用格式控制符、使用格式控制符”%c”,逐个字符输入输出,逐个字符输入输出 for(i=0;ilen;i+)scanf(%c,&stri); for(i=0;i=0&stri=a&stri=z) stri-=32; i+;printf(New String is:);puts(str); /*输出转换后的字符串输出转换后的字符串*/字符数组和字符串 1.字符串长度测试函数字符串长度测试函数strlen(字符数组字符数组)char st20=”hello bo

21、y”;printf(“%d”,strlen(str); 输出结果是输出结果是9, 字符数组和字符串 2.字符串连接函数字符串连接函数strcat(字符数组字符数组1,字符数组,字符数组2) 【例【例5-26】 输入两个字符串,然后把他们连接起来。输入两个字符串,然后把他们连接起来。char str180,str230;int i=0;printf(Enter the first string:);gets(str1); printf(Enter the second string:);gets(str2); strcat(str1,str2);printf(New String is:);pu

22、ts(str1);字符数组和字符串 【例5-27】 输入两个字符串,然后把它们连接起来。不要使用strcat函数。char str180,str230;int i=0,j=0;printf(Enter the first string:);gets(str1); printf(Enter the second string:);gets(str2); while(str1i!=0) i+; /*移动到字符串1的末尾,从末尾开始接收字符串2*/while(str2j!=0) /*若字符串2未结束,则继续循环*/ str1i=str2j; /*将字符串2的内容逐一复制到字符串1*/ i+;j+;s

23、tr1i=0; /*在新的字符串末尾添加0作为结束标记*/printf(New String is:); puts(str1);字符数组和字符串 3. 字符串复制函数strcpy(字符数组字符数组1,字,字符串符串2) 例如:例如:char str180,str220= Good luck! ;strcpy(str1,str2); 则则str1数组中存放的内容也将是数组中存放的内容也将是Good luck! 。字符数组和字符串 4.字符串比较函数字符串比较函数strcmp(字符数组字符数组1,字符,字符数组数组2) int k; k=strcmp(Hi,Hello);字符数组和字符串【例5-2

24、8】 输入两个人的姓名,按字典顺序进行输出。char str120,str220;printf(Enter First Name:);gets(str1);printf(Enter Second Name:); gets(str2); if(strcmp(str1,str2)0|strcmp(str1,str2)=0) /*比较两个字符串大小*/ puts(str1);puts(str2);else puts(str2); puts(str1);一维数组与指针int a5; /*整型数组*/int *pa; /*整型指针,可以指向整型数组*/通过指针引用一维数组元素 通过指针引用一维数组元素【

25、例5-29】用下标法输出整型数组a的全部元素。int a10;int i; for(i=0;i10;i+) scanf(%d,&ai);for(i=0;i10;i+) printf(%d ,ai); /*下标法输出数组元素,ai表示下标为i的元素*/通过指针引用一维数组元素 【例5-30】用地址法输出整型数组a的全部元素。int a10;int i; for(i=0;i10;i+) scanf(%d,a+i); /*用数组名加偏移量的形式a+i表示下标为i的元素的地址*/for(i=0;i10;i+) printf(%d ,*(a+i); /*计算出地址a+i中存放的值,等价于元素ai*/ 通

26、过指针引用一维数组元素 【例5-31】用指针法输出整型数组a的全部元素。int a10;int *p,i; for(i=0;i10;i+) scanf(%d,p+i); /*用p+i表示下标为i的元素的地址*/for(p=a;p(a+10);p+) printf(%d ,*p); /*输出当前指针变量指向的数组元素的值*/通过指针引用一维数组元素 【例5-32】通过指针变量输出a数组的5个元素。(指针越界问题)int *p,i,a5;p=a; /*将数组的首地址赋给指针变量p*/for(i=0;i5;i+) scanf(%d,p+); /*每输入一个整数,放入指针当前指向的存储单元,然后移动指

27、针指向下一存储单元。循环5次*/for(i=0;i5;i+,p+) printf(%d ,*p); /*输出指针当前指向的存储单元的内容,然后移动指针指向下一存储单元。循环5次*/ 通过指针引用一维数组元素指针与一维数组的应用 【例5-33】输入10个整数存入一维数组,按逆序重新存放后输出。指针与一维数组的应用int a10,*p1,*p2,*p,t;for(p=a;pa+10;p+) scanf(%d,p); /*输入10个元素*/p1=a;p2=a+9; /*p1指向首元素,p2指向尾元素*/for(;p1p2;p1+,p2-)t=*p1; /*用三变量法交换两个指针指向的内容*/*p1=

28、*p2;*p2=t; /*一次循环结束后,p1指向后一元素,p2指向前一元素*/printf(Inverted sequence:n);for(p=a;pa+10;p+) printf(%d ,*p);二维数组与指针 int a34=1,2,3,4,5,6,7,8,9,10,11,12;int *p; p=&a00;列指针【例5-34】用列指针求二维数组的最小值及其下标。#define M 3#define N 4int aMN,min,row,col,i,j,count=0;int *p;p=&a00; /*使指针p指向数组a的首元素*/for(i=0;iM;i+)for(j=0;jN;j+

29、)scanf(%d,p); p+;min=a00; row=0;col=0; /*假设第1个元素是最小元素*/p=*a; /*使指针p重新指向数组a的首元素*/for(i=0;iM;i+) for(j=0;j*(p+i*N+j) /*用指针形式表示元素aij*/min=*(p+i*N+j);row=i;col=j; 行指针行指针【例5-35】用行指针求出二维数组每行的最大元素。int a34,i,j;int max3,col3; /*记录每行的最大值及列下标*/int(*p)4; /*定义行指针*/p=a; /*行指针p指向二维数组a的首行*/for(i=0;i3;i+)for(j=0;j4;

30、j+) scanf(%d,*(p+i)+j); /*用p表示各元素地址*/for(i=0;i3;i+)maxi=*(*(p+i)+0); /*假设每行第一个元素为最大值*/coli=0; for(j=0;j4;j+)if(maxi*(*(p+i)+j)maxi=*(*(p+i)+j);coli=j;for(i=0;i3;i+)printf(Line %d: a%d%d=%d is the maxn,i,i,coli,maxi);字符串与指针 【例5-36】用字符指针来输出字符串。char *ps; /*定义字符指针*/ps=C Language; /*把字符串的首地址赋给ps*/printf(

31、%sn,ps); /*用字符指针ps来输出字符串的内容*/字符串与指针 【例5-37】用字符指针处理字符串。 char *ps=C Language; /*将字符串首地址赋给字符指针ps*/int n=2;ps=ps+n; /*移动指针ps*/printf(%sn,ps); /*用字符指针ps来输出当前字符串的内容*/字符串与指针 【例5-38】将字符串a复制到字符串b中。(用字符指针处理)char *p=Frank comes from Thailand; /*使指针p指向存储字符串的无名空间*/char b30,*p1,*p2;int i;p1=p; /*p1与p指向同一空间*/p2=b;

32、 /*将数组b的首地址赋给指针p2*/for(;*p1!= 0;p1+,p2+) *p2=*p1;/*将指针p1指向的内容复制到指针p2所指向的空间,操作完成后p1都p2向后移动*/*p2= 0; /*在末尾添加字符串结束标记*/printf(String a is:%sn,p); /* 输出原字符串*/p2=b; /*使指针p2返回到数组b的首地址*/printf(String b is:);puts(p2); /*输出p2所指向的字符串b的内容*/指针数组指针数组【例5-39】对若干书名按字典顺序排列并输出,按由小到大顺序。#define N 5int main() /*字符型指针数组na

33、me*/char *name5=Data Structure,Programming C,Java,Operating System,Data Base;char *temp;int i,j,k; for(i=0;iN-1;i+) /*用选择法对字符串排序*/k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; /*交换指针的指向*/ for(i=0;iN;i+) /*输出排序后的各书名*/printf(%sn,namei);指针数组指向指针的指针指向指针的指针 【例5-40】使用指向指针的指针。#define N 5int main() /*字符型指针数组name*/char *name=Data structure,C Language,Basic,Fortran,Data Base;char *p; /*指向指针的指针p*/int i;for(i=0;iN;i+) p=name+i; /*使p指向namei*/ printf(%sn,*p); /* 输出

温馨提示

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

评论

0/150

提交评论