您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 《C语言程序设计》第5章数组、字符串、指针-PPT资料共81页
第5章数组、字符串、指针本章要求:1、掌握C语言数组在内存中的存储形式2、掌握一维数组和二维数组的定义及使用3、掌握使用指针处理数组的方法4、掌握使用字符数组及指针处理字符串数据的方法5、掌握与数组有关的基本算法(如排序、查找、插入、删除等)的程序设计•重点:一维数组、二维数组的定义与使用方法,使用指针访问数组和字符串的方法。•难点:二维数组与指针;与数组有关的常用算法(排序、查找与插入等)。5.1数组概述例.输入10个数,求出他们的平均数。main(){intn,a,s=0;floatave;for(n=1;n=10;n++){scanf(“%d”,&a);s=s+a;}ave=s/10;printf(“Ave=%d\n”,ave);}并打印出其中大于平均数的数a变量a中只能存放一个整数需要10个变量的内存空间才可以保留10个整数如果使用:a1,a2,a3,a4,a5,a6,a7,a8,a9,a10这10个变量,代码:intn,s,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;floatave;scanf(“%d%d%d%d%d%d%d%d%d%d”,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);s=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10;ave=s/10;if(a1ave)printf(“%d”,a1);if(a2ave)printf(“%d”,a2);if(a3ave)printf(“%d”,a3);………../*实际程序是不能这样写*/思考:•发现:如果不是10个数,而是100,1000,甚至是10000,此时按上面方法编写程序就非常冗长。•如果可以使用循环来编写,程序可以简洁许多。•要使用循环:必须使用ai(i=1,2…10)的形式来代表a1,a2…a10•在C语言中使用“数组”来实现:a[i]a[0]a[1]…a[9]#includestdio.hvoidmain(){intn,i;floats=0,ave,a[10];for(i=0;i10;i++){scanf(%f,&a[i]);s=s+a[i];}ave=s/10;for(i=0;i10;i++)if(a[i]ave)printf(%f,a[i]);}声明有10个元素的一维数组aa[0]a[1]…a[9]a[i]a[i]a[i]a[i]•在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。•在C语言中,数组属于构造数据类型。①按类型分为:数值数组、字符数组、指针数组、结构数组等②按维数可分为:一维数组、二维数组、多维数组。•数组在内存中占用一片连续的存储单元5.2一维数组只有一个下标变量的数组,称为一维数组。5.2.1一维数组定义一般形式为:类型符数组名[常量表达式];其中:①类型说明符是任一种基本数据类型或构造数据类型,②数组名是用户定义的标识符;③方括号中的常量表达式表示数据元素的个数,也称为数组的长度。•例如:inta[10];floatb[10],c[20];charch[20];•数组在内存中占据一片连续的存储空间:•以inta[5]为例,在内存中为:a[0]a[1]a[2]a[3]a[4]相当于声明了5个整型变量说明:①数组的所有元素的数据类型都是相同的。②数组取名规则应符合标识符的规定,数组名不能与同一函数中其它变量名相同:inta;floata[10];是错误的。③C语言中规定数组的下标从0开始,方括号中常量表达式表示数组元素的个数。④不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:intn=5,a[n];是错误的。5.2.2一维数组的初始化1、数组声明时初始化在编译阶段进行的。这样将减少运行时间,提高效率。数组初始化的一般形式为:类型符数组名[常量表达式]={值,值…值};例如:inta[10]={0,1,2,3,4,5,6,7,8,9};相当于a[0]=0;a[1]=1;...a[9]=9;说明:①inta[10]={0,1,2,3,4};②inta[10]=1;③staticinta[3];④inta[]={1,2,3,4,5};⑤inta[5]={1,2,3,4,5,1};给前5个元素赋值,其余赋0值不能给数组整体赋值,改成{1}可以省略数组元素个数。静态存储类型,初值为0初值的个数不能超过元素个数2、使用赋值语句初始化用赋值语句初始化是在程序执行过程中实现的。例如:inta[3];a[0]=5;a[1]=8;a[2]=9;对于数组的元素用赋值语句初始化,常常使用循环来完成,例如:intk,a[10];for(k=0;k10;k++)a[k]=1;/*对数组中所有元素赋初值为1*/5.2.3数组元素的引用数组元素是组成数组的基本单元,数组元素可以看成一种变量。引用数组元素有下标法和指针法。本小节介绍下标法,指针法将在5.5节中介绍。使用下标法引用一维数组元素的一般形式为:数组名[下标]其中,的下标只能为整型常量或整型表达式。若为小数时,C编译将自动取整。说明:①intn=3,a[10];a[n]=5;a[n+1]=10;②inta[10],x,y;a[10]=5;③inta[10];printf(%d,a);正确代码。引用数组元素的时候,可以用变量。错误代码。最大下标为9,没有a[10]元素。错误代码。不能用一个语句输出整个数组。5.2.4一维数组的基本操作①可通过循环给数组元素输入数据inta[10],i,;for(i=0;i10;i++)scanf(“%d”,&a[i]);②也可通过循环输出数组元素for(i=0;i10;i++)printf(“%d”,a[i]);例,输入5个数,再按倒序输出5-1.c③求数组中最大元素#defineN10main(){inti,p,max,a[N];printf(Enter%dNumbers\n,N);for(i=0;iN;i++)scanf(%d,&a[i]);max=a[0];for(i=1;iN;i++)if(a[i]max)max=a[i];printf(TheMax=%d\n,max);}p=0;a[%d]=%d\n,p,max);{p=i;}及其下标求最大、最小值以及排序算法中的最大、最小值确定都可以采用类似方法:把第一个元素假想为当前找到的最大、最小值,在后续的比较中进行更新。5-2.c④一维数组的倒置for(i=0;iN/2;i++){t=a[i];a[i]=a[N-i-1];a[N-i-1]=t;}002468135791924681357029746813520397568134204975381642059753186420a[0]a[1]…a[9]类似问题:字符串的回文比较5-3.c5.2.5一维数组的应用举例例:如果要统计0~9,10~19,20~29,….80~89,90~99分数段及100分的人数。编程分析:①a数组用来存放20个学生成绩;②另用数组bn来存各分数段的人数:•bn[0]存0~9分的人数,•bn[1]存10~19分的人数,•…•bn[9]存90~99分的人数,•bn[10]存100分的人数。5-4.c一维数组的应用举例:5.8.1排序问题(教材P.166)•数据的排序就是将一批数据由小大到(升序)或由大到小(降序)进行排列。常用的有选择法、冒泡法。•首先要将需要排序的数据放到数组中,这样,便于我们排序。1.选择法排序•算法描述:从剩下的元素集中找一个最小的元素依次放到第i个位置。i从0开始原始数据:869327第一轮后:269387第二轮后:239687第三轮后:236987第四轮后:236789第五轮后:236789a[0]a[1]a[2]a[3]a[4]a[5]869327①6个数需要经历5轮选择(i=0~4)②每一轮做的工作:a.从第i个到最后一个中找一个最小的。b.与第i个交换。放到a[i]这个位置。代码:for(i=0;i5;i++){p=i;for(j=i+1;j6;j++)if(a[j]a[p])p=j;t=a[i];a[i]=a[p];a[p]=t;}iN-1;iN;a.从第i个到最后一个中找一个最小的。b.与第i个交换。6个数需要经历5轮选择(i=0~4)5-5.c2.冒泡法排序(升序)算法描述第一轮:8693268932689326839268329①②③④683296382963289①②③第二轮:5个数共4轮即可…代码:for(i=0;i4;i++)for(j=0;j4-i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}iN-1;iN-i-1;每轮需要经过4-i次比较发现前面的数比后面的数大则需要交换,把大的换到后面去。5个数需要经历4轮选择(i=0~3)5-6.c5.3二维数组与多维数组5.3.1二维数组的声明二维数组说明的一般形式是:类型符数组名[常量表达式1][常量表达式2];其中:–常量表达式1表示第一维下标的长度–常量表达式2表示第二维下标的长度。例如:inta[3][4];floatb[4][4];charc[5][10];inta[3][4];该数组的下标变量共有3×4个,即:a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]…a[2][3]二维数组在内存的存放顺序是“先行后列”注意:C语言允许二维数组a[3][4]可分解为三个一维数组,其数组名分别为a[0],a[1],a[2]。这三个一维数组都有4个元素。5.3.2二维数组元素的引用二维数组的元素的引用形式为:数组名[下标][下标]使用二维数组的情况举例:学生多门功课的成绩,如:a[100][3]可以用来记录100个学生3门功课的成绩。矩阵,如:a[3][3]可以用来记录3×3的矩阵。一个数组元素正好存放一个矩阵的元素。5.3.3二维数组的初始化二维数组初始化也是在类型说明时给各下标变量赋以初值。1.按行分段赋值可写为int[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};2.按行连续赋值可写为inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};注意:这两种赋初值的结果是完全相同的。说明:①inta[3][3]={{1},{2},{3}};①inta[][3]={1,2,3,4,5,6,7,8};1002003001234567805.3.4二维数组的基本操作二维数组的操作一般需要使用二重循环。1.二维数组的输入输出设数组己定义inta[N][M];其程序段如下:for(i=0;iN;i++)for(j=0;jM;j++)scanf(“%d”,&a[i][j]);for(i=0;iN;i++){for(j=0;jM;j++)printf(“%d”,a[i][j]);printf(“\n”);}2.求最大元素及其所在的行和列编程基本思路与在一维数组求最大值元素相同,row,column存放最大值所在行列号。3.矩阵的转置(方阵)对比一维数组的倒置,注意:①哪些元素要交换?②和谁交换?a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[3][0]a[3][1]a[3][2]a[3][3]如果不是方阵,则要定义另一个数组。b[j][i]=a[i][j]5.3.6多维数组的声明和引用在处理三维空问题等其它复杂问题时要使用到三维及三维以
本文标题:《C语言程序设计》第5章数组、字符串、指针-PPT资料共81页
链接地址:https://www.777doc.com/doc-3192236 .html