c语言-第五章构造体类型-(数组).ppt_第1页
c语言-第五章构造体类型-(数组).ppt_第2页
c语言-第五章构造体类型-(数组).ppt_第3页
c语言-第五章构造体类型-(数组).ppt_第4页
c语言-第五章构造体类型-(数组).ppt_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

第五章构造体类型(数组),C语言程序设计,第一节数组概述第二节一维数组第三节字符数组第四节二维数组第五节数组作为函数参数,第一节数组概述,定义:数组是有序数据的集合。数组的每个元素都属于同一个数据类型。每个数组要用一个统一的标识符标识。组成数组的数据称为数组的元素。,特点:数据元素在内存中是按顺序连续存放的。每个元素都属于同一个数据类型具有整体性,一、定义二、引用三、初始化四、输入和输出五、应用举例,第二节一维数组,定义,类型说明符数组名常量表达式;一维inta5;charc20;floatx10;,注意:数组名命名规则与变量名相同;数组名后是方括号,而不是小括号;常量表达式表示元素的个数,数组的大小是固定的,不能动态定义。例如:intn;scanf(“%d”,是错误的。,引用,数组必须先定义,后使用。只能逐个引用数组元素。例如,若定义数组inta3,则数组元素为:a0a1a2,引用形式:数组名下标;例如:a2=1;ai+j;(i,j为整型变量),注意,下标的值不要超过数组的范围。,初始化,顺序指定全部元素的初始值inta5=1,2,3,4,5;,输入和输出,C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入和输出也是依次对每个元素进行的。例5.2输入10个数,并将它们输出。,printf(pleaseenterthedata:n);for(i=0;i10;i+)scanf(%d,printf(outputthedata:n);for(i=0;i10;i+)printf(%d,arrayi);printf(n);,输入,输出,说明:在循环体内利用循环控制变量作为下标输入输出数组元素,因此数组元素输入输出的次序和数量可以控制。例如,将一个数组按照逆序打印数组元素的值?只打印一个数组的前五个元素的值?,第四节一维数组的应用,例5.1使用数组编程,计算出前10项fibonacci数列,要求一行打印5个数。,main()intf10;inti;f0=0;f1=1;for(i=2;i10;i+)fi=fi-1+fi-2;,for(i=0;i10;i+)if(i%5=0)printf(n);printf(%4d,fi);,应用举例,例5.3有一个数组,有5个整数存放其中,找出其中最大的一个数。,程序,inta5na0a1a2a3a421139032-1,13219032-1,13213290-1,13219032-1,132132-190,定义,printf(max=%dn,max);,main()inti,max,x5;,printf(enterdata:n);for(i=0;i5;i+)scanf(%d,for(i=0;ixi+1)temp=xi;xi=xi+1;xi+1=temp;,max=a4;,例5.4用冒泡法对10个整数按从小到大的顺序排列。排序的方法很多,主要有:冒泡法选择法,冒泡法,冒泡法的思想是:假设有n个数,将相邻的两个数依次进行比较,使小的在前,大的在后,那么第一轮比较n-1次就把最大的数排到了最后,第二轮比较n-2次就把次大的数排到了倒数第二,依此类推,直到第n-1轮比较1次将最小的数排到了第一,算法结束。算法的整体思路是让大的数不断地往下沉,小的数不断地往上冒,所以叫“冒泡排序法”。,for(i=1;ixj+1)temp=xj;xj=xj+1;xj+1=temp;,选择法排序,for(i=0;i10-1;i+)p=i;for(j=i+1;j10;j+)if(ajap)p=j;if(p!=i),med=ap;ap=ai;ai=med;,数据查找,线性查找基本思想:从头到尾逐个查找,效率较低。主要程序段:intb10,j,key;intfind=0;scanf(“%d”,折半查找,基本思想:先检查中间的一个数据,看它是否为所需要的数据,如果不是,则判断要找的数据是在中间数的那一边,下次就在这个范围内查找,同样与中间数进行比较。例如:一组数据1017202231445155算法:(1)设变量top、mid、bot分别表示数列的开头、中间和末尾,mid=(top+bot)/2;(2)如果x=amid,则设查到标志为“真”,打印相关信息(3)否则如果xamid,则设top=mid+1重复以上过程直到bottop或已经找到为止。,intmid,top,bot,find,a10;top=0;bot=9;find=0;domid=(top+bot)/2;if(x=amid)printf(找到了%3d,是a%d,x,mid);printf(n);find=1;elseif(xamid)top=mid+1;while(top=bot,一、二维数组的引用二、二维数组的初始化三、二维数组元素在内存中的排列顺序四、应用举例,第五节二维数组,英语数学社科王宁909089王光899195.李达9010090.,定义,类型说明符数组名常量表达式常量表达式;inta34;charc23;floatx23;,注意:数组的大小是固定的。,引用,例如,定义数组inta23,表明此数组为2行3列,数组元素为:a00a01a02,a10a11a12,引用形式:数组名下标1下标2;例如:b01=5;aij;(i,j为整型变量),注意,下标的值不要超过数组的范围。,printf(pleaseenterthedata:n)for(i=0;i3;i+)for(j=0;j2;j+)scanf(%d,for(i=0;i3;i+)for(j=0;j2;j+)printf(%nb%d%d=%d,i,j,bij);printf(n),输入,输出,二维数组的输入与输出,初始化,分行赋初值inta23=1,2,3,4,5,6;不分行赋初值intb23=1,2,3,4,5,6;,初始化(续),对部分元素赋初值intc24=0,2,3;未赋值的元素自动赋值0,而且前面的0不能省,后面的0可以省对全部元素赋初值,省略第一维的长度inta2=1,2,3,4;,二维数组元素在内存中的排列顺序,按行存放二维数组的元素在数组中的排列顺序可以计算出来:设一个mn的数组x,数组元素xij在数组中的排列顺序为in+j+1。例如43数组x,元素x31在数组的排列顺序为33+1+1=11即数组中的第11个元素。二维数组可以看成由几个一维数组构成,其中一行为一个一维数组。,应用举例,例5.5求两个3*4矩阵的和。参考程序如下:main()inta34,b34;c34;inti,j;printf(输入a矩阵的元素值n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,printf(输入b矩阵的元素值n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,/*结果存放在c矩阵中*/,printf(和矩阵为:n);for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,cij);printf(n);,例5.6将一个4*3的矩阵转置。程序片段如下:for(i=0;i4;i+)for(j=0;j3;j+)bji=aij;,例:现有四个学生,每个学生有三门课,求每个学生的平均成绩和每门课的平均成绩。,#definem4#definen3main()floatscoremn=70,80,90,90,92,94,65,67,63,80,90,72;floatavem,coursen,sum;inti,j;for(i=0;im;i+)sum=0;for(j=0;jn;j+)sum=sum+scoreij;avei=sum/n;/*求每个学生的平均成绩(确定行)*/,for(j=0;jn;j+)sum=0;for(i=0;im;i+)sum=sum+scoreij;coursej=sum/n;/*求每门课的平均成绩(确定列)*/,一、字符数组的定义二、初始化三、字符串,第六节字符数组,定义charstr20;初始化逐个为数组中各元素指定初值字符。charstr4=w,e,l,l;对一个字符数组指定一个字符串初值。charstr=goodmorning;charstr=goodmorning;,字符串,什么是字符串?字符串是用一对双引号括起来的字符序列,这些字符可以是一般的可显示字符,也可以是某些特殊的控制字符;字符串只能用字符数组来处理,没有字符串变量。字符串在内存中存放时,系统将自动在字符串的末尾添加一个字符串的结束标记0(空字符),碰到第一个0就认为字符串处理结束。,用字符串给字符数组初始化charst8=welcome;等价于charst8=w,e,l,c,o,m,e,0;,注意:这里的st不是一个字符串变量,而是字符数组的名字,代表字符数组在内存中的起始地址,是一个常量,那么这个赋值表达式是指将字符串中的每一个字符依次赋给以st开始的地址单元。,字符串的长度定义charch=Good;则数组ch的元素个数是5,而不是4,也就是说,字符串的长度是双引号中所包括的字符个数加1。,字符串的输入和输出,逐个输入输出main()inti;chara10;for(i=0;i=a,#includestdio.hmain()charst160,st260;inti;gets(st1);for(i=0;(st1i!=0);i+)printf(%c,st1i);for(i=0;(st1i!=0);i+)st2i=st1i;st2i=0;for(i=0;(st2i!=0);i+)printf(%c,st2i);,例:用程序实现将一个字符串复制到另外一个字符数组中,不能用strcpy()函数。,例5.7将10个学生的姓名按字典顺序排列。定义两个字符数组charname109,temp9;程序片段如下:#include”stdio.h”main()inti,j;charname109,temp9;printf(请输入10个学生的姓名:n);for(i=0;i10;i+)scanf(%s,namei);,/*外循环控制程序比较9轮*/for(i=1;i0)strcpy(temp,namej);/*交换两个姓名的次序*/strcpy(namej,namej+1);strcpy(namej+1,temp);,一、数组元素作为函数的实参二、数组名作为函数的参数,第五节数组作为函数参数,数组元素作为函数的实际参数,数组元素的引用与一般变量的引用是一样的,传递的是数组元素的值,属于“值传递”方式。例5.8设a8和b8分别保存了A班和B班八门课程的平均成绩,现要统计出A班有几门课程的平均成绩高于B班。,main()inti,k=0;floata8,b8;for(i=0;iave2)return(1);elsereturn(0);,数组名作为函数的实际参数,C语言中的数组名代表了数组在内存中存放的起始地址,所以数组名作为函数的参数传递的是数组的起始地址,属于“传地址”,是一种双向传递的方式。说明:(1)用数组名作为函数的参数,必须对实参数组先定义,形参必须说明成与实参数组类型一致的数组。(2)形参数组和实参数组的数组名可以不一样,数组的大小也可以不一致。由于传递的是地址,所以形参数组和实参数组在内存中实际上是共用了连续的一块地址空间。,例5.9用函数average()求30个学生英语课的平均成绩。floataverage(mark,n)intmark,n;floatave;intsum=0,i;for(i=0;in;i+)sum=sum+marki;ave=sum/n;return(ave);main()inti,score30;printf(请输入30个学生的英语成绩:n);for(i=0;i30;i+)scanf(%d,main()inta2;scanf(%d,%d,结构体类型的定义结构体变量的定义和引用结构体变量的初始化应用举例,5.7结构体类型,构造一个结构体类的数据类型的一般形式:struct结构类型名类型标识符成员名;类型标识符成员名;:类型标识符成员名;,例如:structstudentcharnumber10;charname20;charsex;intage;floatscore20;charaddr30;,定义先构造结构体类的数据类型,后定义具有这种构造的变量。struct结构体类型名类型标识符成员名;:类型标识符成员名;struct结构体类型名变量名1,变量名2.;,例如:structstudentcharnumber10;charname20;charsex;intage;floatscore20;charaddr30;structstudentstud1,stud2;,引用对结构体变量的使用是通过对其成员的引用来实现的。引用结构体成员的一般形式如下:结构变量名成员名例如stud1.age其中的圆点符号称为成员运算符,它的运算级别最高。,structstudlongnum;charname20;charsex;charaddr30;stud1=9708,”Liwei,F,144BeijingRoad”;,例5.11输入3个学生的信息并输出。#include#includestructstudlongnum;charname20;chargender;intage;floatscore;,voidmain()structstudstudent3;inti;charch;charnumstr20;for(i=0;i3;i+)printf(n输入第%d个学生的数据:n,i);gets(numstr);studenti.num=atol(numstr);gets();studenti.gender=getchar();ch=getchar();gets(numstr);studenti.age=atoi(numstr);gets(numstr);studenti.score=atof(numstr);printf(nnumtnamegenderagescoren);for(i=0;i3;i+)printf(%ld%-15s%3c%6d%6.2fn,studenti.num,,studenti.gender,studenti.age,studenti.score);,main()inti,j,k;for(i=-3;i=3;i+)for(j=1;j=abs(i);j+)printf();for(k=1;k=a,作业讲解:,#include#includevoidmain()charstr120;charstr220;inti,j=0;printf(请输入第一个字符n);gets(str1);for(i=0;istrlen(str1);i+)if(i%2=0)str2j=str1i;j=j+1;printf(%sn%s,str1,str2);,作业讲解:5-6,str2j=0;,#includestdio.hvoidmain()inta2020;inti,j,n;scanf(%d,作业讲解:5-9,#include#includevoidstr(chara)inti;for

温馨提示

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

评论

0/150

提交评论