第4章程序设计课件

上传人:仙*** 文档编号:241644958 上传时间:2024-07-12 格式:PPT 页数:70 大小:814.50KB
返回 下载 相关 举报
第4章程序设计课件_第1页
第1页 / 共70页
第4章程序设计课件_第2页
第2页 / 共70页
第4章程序设计课件_第3页
第3页 / 共70页
点击查看更多>>
资源描述
4 4第四章数组和结构2024/7/12基本数据类型:整型、浮点型、字符型、双精度型构造类型:数组、结构、联合、枚举基本数据类型的特点:变量是单值变量,由变量名直接访问;数据是不可再分的原子类型。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 构造类型的特点:由多个分量组成的数据结构;变量通常具有一个以上的分量;每个分量都是一个变量(简单变量或构造变量);其数据难以用变量名直接访问.2024/7/12电子科技大学计算机学院电子科技大学计算机学院 内容要点一维数组的定义、初始化、操作与应用二维数组的定义、初始化与应用实例字符数组的定义、初始化、操作与应用结构的概念、定义、初始化、操作与应用结构数组的概念和定义2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1 一维数组例4.1要求输入计算机10个同学的外语成绩,并按与输入相反的次序显示外语成绩.。算法分析:算法分析:如图(a)方法一:要解决这个问题,可以用10个变量,分别取名为score1,score2,score10来存储10名学生的外语成绩。方法二:通常使用数组,方便、扩展性好:2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1 一维数组4.1.1 一维数组的定义和使用类型定义符类型定义符 数组名数组名 元素个数元素个数;例如:int score10;这里,定义了一个这里,定义了一个包含有包含有10个整型数据成员,名个整型数据成员,名为为score的数组。的数组。其特点是:数组元素数据类型相同其特点是:数组元素数据类型相同 数组元素个数确定数组元素个数确定2024/7/12电子科技大学计算机学院电子科技大学计算机学院 右图是定义数组score时,编译系统对数组进行内存分配的图示说明。需要注意的是:C语言中数组元素是由数组下标的索引值进行标注的。第一个元素的索引值一定是0,而不是1或其它值。图中add代表数组第一个元素在内存中的位置,由于数组元素均是int型,假设,每个数组元素都占用4字节,数组score共占用40字节的内存空间 2024/7/12电子科技大学计算机学院电子科技大学计算机学院 在定义一维数组时 类型定义符 数组名常量表达式;应注意:1.数组名的第一个字符应为英文字母,其它要求与定义变量名时相同。2.用方括号将常量表达式括起。3.常量表达式定义了数组元素的个数。4.数组下标从0开始。如果定义了10个元素,是从第0个元素到第9个元素。5.常量表达式中不允许包含变量。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.2 一维数组元素的引用在C语言中,对数组元素的处理是通过下标变量的处理来完成的。一维数组下标变量的格式为数组名下标 其中下标可以是常量、变量或表达式,下标必须是整型数,其取值范围为0到数组长度减1。下标0对应数组的第一个元素,数组长度减1对应数组的最后一个元素。如int score10;则数组的下标变量为score0,score1,score2,score9。数组score的第一个下标变量为score0,最后一个下标变量为score9。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 按上述定义按上述定义,实际上实际上scorei(下标(下标i在在 0n-1间)间)可以看成可以看成是一个整型变量是一个整型变量,因此因此,可以对其进行赋值、读、可以对其进行赋值、读、写等操作。写等操作。score 0=123;scanf(”%d”,&score 9);printf(”%d”,score0);求解上述问题的程序段为求解上述问题的程序段为:for(i=0;i=0;i-)printf(“%d”,scorei);如果不使用数组,这个问题的解决就复杂如果不使用数组,这个问题的解决就复杂2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例:计算fibonacci数的前15个数.特性:第一个数和第二个数分别是0和1,从第三个数开始每个数是它前面两个数之和。0 1 1 2 3 5 8 13 21 34 55 89377main()int f15,i;f0=0;f1=1;printf(“%4d%4d”,f0,f1);for(i=2;i15;i+)fi=fi-1+fi-2;printf(”%4d”,fi);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.3 一维数组的初始化在定义数组的同时可以初始化数据.一般形式:类型说明符 数组名元素个数=数值表;例如:int a5=1,2,3,4,5;float b3=3.14,3.141,3.1415;2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.3 一维数组的初始化1.给全部数组元素赋初值。将数组元素的初值依次放在一对花括号内,初值之间用逗号分隔。例如,下面的语句 int score3=78,89,98;表 4.1.1 score数组的下标变量与对应值的关系数组元素score0score1score2值7889982024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.3 一维数组的初始化2.给部分元素赋初值。当所赋初值的个数少于数组元素的个数时,C语言将会自动给后面的元素补上初值0。例如,下面的语句int score5=78,89,98;表 4.1.2 score数组的下标变量与对应值的关系数组元素Score0score1score2score3score4值788998002024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.3 一维数组的初始化3.当所赋初值的个数大于数组长度时,则出错。4.当所赋初值的个数与数组长度相等时,在定义时,可以忽略数组的大小,如int score=78,89,98;与语句int score3=78,89,98的作用相同。即可以通过初值的个数来确定数组的大小 2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.4 一维数组程序举例例4.2 求200以内的所有素数。算法分析求素数的算法很多,下面采用经典算法Eratasthenes筛选法。其算法思路如下:1)取最小的数2,并声明它是素数,同时筛去它及它的所有倍数;2)取未筛去的数中最小者,声明它是素数,同时筛去它及它的所有倍数;3)重复步骤2),至筛中无数为止,得到所有素数。筛法实际上是筛去合数,留下素数。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.1.4 一维数组程序举例 本例使用数组,让数组下标就是200以内的数,让数组元素的值作为筛去与否的标志,这里设数组元素的初值为0,筛去以后的值变为1。图4.1.3 筛法思路:让数组元素值作为筛去的标志。算法程序请参见4_2.cpp2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例4.3 给定由6个整数组成的序列2,8,4,3,5,9,将其按从大到小的顺序排列。算法分析:u首先用一个一维数组存储待排序的序列。u冒泡排序法是一种交换排序方法,它的思路是:从序列的一端开始,依次将相邻两个元素比较,当发现它们不合顺序时就进行一次交换,这样就象水箱里的气泡一样,每个气泡最后将到达它的平衡位置。u第一趟排序过程如下图所示2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.2 二维和多维数组如果数组的元素是一个数组,即成了数组的数组数据结构,称这种数据结构为多维数组。一般形式:类型定义符 数组名元素个数1元素个数2 元素个数n;例如:定义一个二维数组,int two1020;有10行20列,共200个元素.每个元素用twoij访问(0=i10,0=j20);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.2 二维和多维数组例例4.4 科考队员在北极发现了一座新的冰山,他们想算出冰山在水面上的体积,为此需测量冰山的高度。冰山上各处的高度是不同。如图4.2.1所示,可以给冰山打上格子,以海面为参照,测量出冰山上每个格子处的平均高度,就可以从整体上描述冰山的地貌,从而计算出它的体积。图中0表示海面,数字表示高度,单位为米。设每一格的大小为10m10m。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.2 二维和多维数组例4.4用于描述冰山高度的数组定义为int ice57;这个声明定义了一个名为ice的数组,它含有5个一维数组,每个一维数组含7个元素,一共35个元素,这些元素都是整型变量。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.2 二维和多维数组int ice57 以行主序方式存放2024/7/12电子科技大学计算机学院电子科技大学计算机学院 可以定义一个二维数组:int score53;许多实际问题中的数据需要用二维数组描述.如描述5个学生,三门课程成绩,课程1课程2课程3学号1758690学号2838289学号3687579学号4737475学号59092952024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.2.2 二维数组元素的引用u与一维数组类似,对二维数组元素的处理也是通过对其下标变量的处理来完成的。二维数组元素的一般表示方法如下:数组名下标1下标2 其中下标1和下标2都是整型数,可以是常量、变量或表达式。其中下标1的值为从0到前面定义数组时的常量表达式1的值减1,下标2的值为从0到常量表达式2的值减1。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.2.3 二维数组的初始化(1)对二维数组的全部元素赋初始值 例4.2所示,可在定义时就将二维数组所描述的冰山高度赋给变量ice。int ice57=0,1,1,2,1,2,1,1,4,2,1,4,3,1,2,5,3,5,2,2,3,2,3,4,1,2,1,0,1,0,3,0,1,0,0;图4.2.3 赋过初值的数组ice2024/7/12电子科技大学计算机学院电子科技大学计算机学院 (2)部分赋初值与一维数组相同,如果对二维数组部分赋初值,则剩余元素的值也将被初始化为0。例如,int a33=1,2,3;赋值后的元素值为1,0,0,2,3,0,0,0,0。例如,int a33=1,2,3;赋值后的元素值为1,2,3,0,0,0,0,0,0。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 (3)在对数组的全部元素赋初值时,C语言规定可以省略第一维的长度,但不能省略第二维的长度。例如nt a22=1,2,3,4;可以写成int a2=1,2,3,4;C语言会自动确定a的第一维的长度。但不能写成 int a2=1,2,3,4;2024/7/12电子科技大学计算机学院电子科技大学计算机学院 多维数组的定义和使用方法与二维数组类似.如定义一个三维数组.int student453;共有60个元素,使用三个下标可访问数组中任一元素.studentijk;其中,i=03;j=04;k=02.2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例4.4 求二维数组中最大值和最小值元素的行号和列号.void main()int m34;int i,j,maxv,minv,maxr,maxc,minr,minc;for(i=0;i3;i+)for(j=0;j4;j+)scanf(”%d”,&mij;);/*输入数据*/maxv=-32768;minv=32767;2024/7/12电子科技大学计算机学院电子科技大学计算机学院 for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j4;j+)for(j=0;jmaxv)if(mijmaxv)maxv=mij;maxr=i;maxc=j;maxv=mij;maxr=i;maxc=j;if(mijminv)if(mijminv)minv=mij;minr=i;minc=j;minv=mij;minr=i;minc=j;printf(printf(”The max value=%d,row=%d,col=%dnThe max value=%d,row=%d,col=%dn”,maxv,maxr,maxc);maxv,maxr,maxc);printf(printf(”The min value=%d,row=%d,col=%dThe min value=%d,row=%d,col=%d”,minv,minr,minc);minv,minr,minc);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 运行结果:输入:18 10 34 45 23 66 74 19 12 28 68 99 输出:The max value=99,row=2,col=3 The min value=10,row=0,col=1 2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.3 字符数组存放字符的数组称为字符数组,每个元素为一个字符,一个一维数组可以存放一个字符串.4.3.1 定义和初始化 char str10;可赋值:str0=c;str1=h;str2=i;str3=n;str4=a;可初始化:char str10=c,h,i,n,a;char s120=”How do you do“;char s120=”How do you do”;用字符串常量初始化时,自动加结束标志0.2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.3.2 4.3.2 字符数组的输入输出字符数组的输入输出 1.单个字符输入输出单个字符输入输出 char str10;for(i=0;i=0;i-)printf(”%c”,stri);2.字符串整体输入输出字符串整体输入输出 char str10;scanf(”%s”,str);/*数组名数组名str是数组的起始地址,不是数组的起始地址,不用用&str*/printf(”%s”,str);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.3.2 字符数组的输入输出3 gets函数来输入一个字符串,其一般形式为gets(字符数组名)作用是从终端输入一个字符串到字符数组。比如gets(word);用于从键盘输入一个字符串,存储到word数组中,该字符串由换行符以前的所有字符组成,系统也会自动为这个字符串加上0结束标 4 使用puts函数来输出一个字符串,其格式为 puts(字符数组名)其作用是将一个字符串输出到终端,并在输出时将字符串结束标记0转换则n,即输出完字符串后换行。如char word=abc,word1=def;puts(word);puts(word1);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 二维数组可以存放多个字符串.例如:char str2580;可存放25个字符串,str0为存放第1个字符串的一维数组名,str24为存放第25个字符串的一维数组名,str00为第1个字符串的第一个字符.例:合并两个字符串s1s22024/7/12电子科技大学计算机学院电子科技大学计算机学院 void main()char s150,s220;int i,j;scanf(”%s%s”,s1,s2);i=0;while(s1i!=0)i+;/*测测s1的长度的长度*/j=0 do s1i=s2j;/*s2的字符加到的字符加到s1的后面的后面*/i+;j+;while(s2j-1!=0);printf(”%sn”,s1);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.3.3 与字符处理有关的几个函数与字符处理有关的几个函数1.字符串连接函数strcat调用形式:strcat(字符数组1,字符数组2);功能:将字符数组2连接于字符数组1的后面.例如:char str120=”This is a”;char str2=”string.”;printf(”%s”,strcat(str1,str2);输出输出:This is a string.2024/7/12电子科技大学计算机学院电子科技大学计算机学院 2.字符串拷贝函数strcpy调用形式:strcpy(字符数组1,字符数组2);功能:将数组2 拷贝到 数组1中.例如:char str120,str2=”name”;strcpy(str1,str2);printf(”%s”,str1);输出:name也可表示为:strcpy(str1,”name”);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 3.字符比较函数strcmp调用形式:strcmp(字符串1,字符串2);功能:将两字符串的字符从左到右逐个进行比较.返回值为比较结果.字符串1=字符串2 返回值为0 字符串1字符串2 返回值为正数 字符串1字符串2 返回值为负数例如:i=strcmp(”chinese”,”china”);则:i等于42024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.测试字符串长度函数strlen调用形式:strlen(字符数组);功能:测试字符数组中字符串的实际长度.例如:char str110=”Turbo c”;printf(%d”,strlen(str1);输出:7 2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例如:编写一个程序输入 n个人的姓名,然后统计其中有多少个以“M”字母开头的名字,并把所有以“M”开头的姓名和最长的姓名显示出来。#include void main()char name2020,str20;int i,k,number,len=0,count=0;printf(”Enter the number of studentsn”);scanf(”%d”,&number);printf(”Enter the name of studentsn”);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 for(i=0;inumber;i+)if(namei0=M)count+;printf(”%dn”,namei);print(”There are%d names beginning with M.n”,count);printf(”The names beginning with m are:n”);for(i=0;inumber;i+)scanf(”%s”,namei;k=strlen(namei);if(lenk)len=k;strcpy(str,namei);2024/7/12电子科技大学计算机学院电子科技大学计算机学院 printf(”The longest name is%s”.n”,str);程序执行结果程序执行结果:Enter the number of students6Enter the name of studentsHuanglinGaopuqingMajianYuchuanZhanglinMiying 输出输出:There are 2 names beginning with M.The names beginning with m are:Majian Miying The longest name is Gaopuqing.2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.3.4 字符串应用举例例4.6 地下工作者A与上级B之间常使用电报联系,为了保密,A发给B的电文需首先翻译成英文,再将英文按一定规律加密,然后将加密后的电文通过电报局发给B,B接到电文后,需先解密,再翻译,才能读出A给B的信息。假设A和B之间约定的英文加密规律为:首先,为所有的字母规定了一个顺序,a,b,c,dz,A,B,C,Z,依次编号为1,2,3,52,A要发出的英文按如下方式加密,将任何一个字母转为序号为这个字母的3倍的字母,如果序号的3倍超过了52,则进行取余运算,以使值落在52内,以对应相应的字母。例如:字母a的序号为1,转换为c,字母b的序号为2,转换为f,字母A的序号为27,转换为序号为27*3%52=19的字母,即字母s,以此类推,字母Z的依然转为字母Z。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 u算法分析:算法分析:u本例首先从键盘输入明文,再依次将明文的各字符按规律转换即可。u要将明文的一个字符ch进行转换,首先需得到明文字符ch的序号,如ch为小写字母,则其序号为ch-a+1;如为大写字母,则为ch-A+27。当得到密文字符的序号num后,如其值在1到26之间,则相应的字符的ASCII码为num+a-1,如果值在27到52之间,则为num-27+A。u将明文的字符依次按上面的规律转换便可到密文,最后需为密文字符串加上结束标志。u程序参见46.cpp2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.4 4.4 结构结构 结构是一个或多个变量的集合,与数组不同,结构中结构是一个或多个变量的集合,与数组不同,结构中的变量可能为不同的类型,为了处理的方便将这些变量组织的变量可能为不同的类型,为了处理的方便将这些变量组织在一个名字之下。由于结构将一组相关的变量看作一个存储在一个名字之下。由于结构将一组相关的变量看作一个存储单元,而不是各自独立的实体,因此结构有助于组织复杂的单元,而不是各自独立的实体,因此结构有助于组织复杂的数据。数据。C C语言提供了结构这种构造数据类型,可以方便地把一组语言提供了结构这种构造数据类型,可以方便地把一组相关数据组合在一起。通过使用结构,可以简化很多编程任相关数据组合在一起。通过使用结构,可以简化很多编程任务。务。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.4.1 4.4.1 结构及结构变量的定义结构及结构变量的定义 结构类型定义的一般格式为struct 结构类型名类型名1 成员名1;类型名2 成员名2;类型名n 成员名n;2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.4.1 4.4.1 结构及结构变量的定义结构及结构变量的定义 例4.7 学生信息,可以定义一个名为student的结构类型,struct studentchar name21;/姓名:最多20个字符 int sex;/性别:男/女,用1表示男,0表示女 int birthday;/生日:(年月日)double height;/身高:1.74(m);struct是结构类型的标志,它是C的保留字,不能省略。student是结构类型名,是由编程者自己选定的,它与系统定义的int,float,double,char一样,也可以用于定义变量的类型。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 定义结构变量 比如前面已经定义了一个结构类型struct student,可以用它来定义变量,如:struct student stu1,stu2;定义了两个名为stu1和stu2的student类型的变量,编译系统为stu1和stu2变量分别分配如图所示的内存空间。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 注意:(1 1)结构类型名和各成员名都应是)结构类型名和各成员名都应是C C语言合法的标志符,语言合法的标志符,结构类型名不得与其它变量的名字相同,但成员名可以结构类型名不得与其它变量的名字相同,但成员名可以与变量名相同,例如在程序中也可以定义一个名为与变量名相同,例如在程序中也可以定义一个名为heightheight的变量,它与的变量,它与studentstudent结构中的结构中的heightheight成员是两成员是两回事,互不干扰。回事,互不干扰。(2 2)结构类型定义之后一定要跟一个分号。)结构类型定义之后一定要跟一个分号。(3 3)与数组的定义不同,定义数组时直接定义变量,编)与数组的定义不同,定义数组时直接定义变量,编译系统为变量分配了相应的内存空间;而这里定义的是译系统为变量分配了相应的内存空间;而这里定义的是结构类型,不是变量。比如,前面定义的结构类型,不是变量。比如,前面定义的struct struct studentstudent是一个结构类型,其用法与是一个结构类型,其用法与C C的基本类型的基本类型intint,floatfloat,charchar等相同,以后的程序可以用它来定义变量。等相同,以后的程序可以用它来定义变量。只有定义了变量,只有定义了变量,C C编译系统才会按结构类型的定义为编译系统才会按结构类型的定义为变量分配每个成员所需要的内存单元。变量分配每个成员所需要的内存单元。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.4.2 结构成员的访问结构成员的访问 定义好结构类型,定义了结构变量后,就可以引用结构变量了。结构变量中各成员的引用方式为:结构变量名.成员名 一般形式:结构变量名.结构成员名 例如:stu1.name-表示结构变量stu1的name成员。这里“.”是成员运算符,为了便于记忆,不妨将“.”读作“的”。printf(%sn,stu1.name);读作输出stu1的name成员。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 下面是一个定义结构类型和变量的简单例子:#includestruct weather float temp;int wind;void main()struct weather today;today.temp=25.5;today.wind=4;printf(”Temp=%fn”,today.temp);printf(”Wind=%dn”,today.wind);结果:结果:Temp=25.5Temp=25.5 Wind=4 Wind=42024/7/12电子科技大学计算机学院电子科技大学计算机学院 4.43 4.43 结构变量的初始化结构变量的初始化 与数组类似,在定义结构变量的同时可以给其各个成员赋初值,这称为结构变量的初始化,结构变量初始化的一般形式是:struct 结构类型 结构变量名=初始化数据;结构变量的初始化与数组变量的初始化的方法相同。花括号中的初值赋予结构变量各成员,其数据类型、顺序要与结构类型说明的成员相匹配,数据之间用逗号分隔。例如,把前面定义的结构变量today定义为外部结构变量,可以用下面的语句初始化:struct weather today=32.5,5;数组不能彼此赋值,但同类型的结构变量可以彼此赋值。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例如:下面是对结构变量初始化和赋值的程序例子。#include struct person char name20;unsigned long id;float salary;struct person pr1=“Li ming”,1082422,5300.0;void main()/*结构变量初始化*/struct person pr2;pr2=pr1;/*结构变量赋值*/printf(”%st%ult%f”,pr2.name,pr2.id,pr2.salary);结果:结果:Li ming 1082422 5300.02024/7/12电子科技大学计算机学院电子科技大学计算机学院 注意:注意:1.不同类型的结构变量不允许相互赋值,即使两者包含有相同的成员。2.在C 中结构类型名必须包含关键字struct,故定义语句为:struct person worker,manager;3.结构变量的初始化与数组变量的初始化相同。结构变量同其他变量一样也具有存储类型。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 如果一个数组的元素是同一种结构类型的变量,那么这种数组称为结构数组。要定义一个结构数组,必须先定义一个结构类型,然后再定义具有这种结构类型的一个数组。例如,定义一个包含100个元素的person 结构数组:struct person char name20;unsigned long id;float salary;struct person allone100;4.5 4.5 结构数组结构数组2024/7/12电子科技大学计算机学院电子科技大学计算机学院 数组中每个元素是一个完整的结构变量,它包含name、id、salary三个成员分量。allone0 访问第一个数组元素;allone99 访问最后一个数组元素。例如:下面程序对一个person 结构数组中的元素进行“冒泡法”排序,工资高的排在后面。#include struct person char name20;unsigned long id;float salary;2024/7/12电子科技大学计算机学院电子科技大学计算机学院 struct person allone6=“jone”,12345,3390.0,“david”,13916,4490.5,“marit”,27519,3110.0,“jasen”,42876,6230.5,“peter”,23987,4000.2,“yoke”,12335,5110.0;void main()struct person temp;for(int i=1;i6;i+)/*控制排序轮次数的循环*/for(int j=0;jallonej+1.salary)/*工资高后移*/temp=allonej;allonej=allonej+1;alonej+1=temp;2024/7/12电子科技大学计算机学院电子科技大学计算机学院 for(int k=0;k6;k+)printf(“”%stt%ultt%f”,allonek.name,allonek.id,allonek.salary);运行结果为:运行结果为:marit 27519 3110.0jone 12345 3390.0peter 23987 4000.2david 13916 4490.5yoke 12335 5110.0jasen 42876 6230.52024/7/12电子科技大学计算机学院电子科技大学计算机学院 例4.8 假设同学录中共有40位同学,编写程序输入这些同学的信息,并按身高从低到高的顺序对这40位同学排序,然后按这个顺序输出这些同学的姓名和身高。算法分析:本例只需顺序输入这40位同学的信息,再使用冒泡排序法按身高从低到高排序,然后输出就可以了。注意到前面例4.2的冒泡排序是按数组元素的值从大到小排序,而这里,则需要按数组元素的height成员的值从小到大排序,因此,在每次扫描时,比较的对象和方法都有了区别。本例用结构数组stu存储40位同学的信息,用n表示同学的数量。参考程序如4-8.cpp2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例例4.9 顺序查找顺序查找 有7个数存放在一个数组中,从键盘输入1个数,查找这个数是否在数组中,如果在,输出其下标,如果不在,输出0。数组的下标i表示第i个元素,数组的下标0处不存储数。算法思路:算法思路:依次将数组元素与输入的数进行比较,如果相等则终止循环。如果元素比较完还未找到输入的数,则输出0。方法方法1 从第1个元素到第n个元素依次与输入元素比较,若不相同,则继续比较下一个元素,若相等则退出循环。循环结束后,需根据i的值的不同来判断查找是否成功。scanf(%d,&x);/输入待查找元素for(i=1;i=n;i+)/循环比较当前数组元素 if(ai=x)/与x是否相同 break;/若相同则退出 if(i=1;i-)/循环比较当前数组元素 if(ai=x)/与x是否相同break;/若相同则退出printf(%dn,i);/输出结果2024/7/12电子科技大学计算机学院电子科技大学计算机学院 方法方法3 3 从第n个元素到第1个元素依次与输入元素比较,使用监视哨scanf(%d,&x);/输入待查找元素a0=x;/以a0为哨兵for(i=n;ai!=x;i-);/循环比较当前数组元素printf(“查找到的位置为:%dn,i);/输出结果2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例4.10 折半查找 有7个数已经按从小到大的顺序存储在数组中,输入一个数,用折半查找法查找这个数是否在数组中,如果在,输出其下标,如果不在,输出0。数组的下标i表示第i个元素,数组的下标0处不存储数。算法思路:折半查找又称对分查找,是对有序表进行的一种查找。其基本思想是:先确定待查找的数据元素的范围,然后逐步缩小范围直到找到要查找的数据元素或无法找到该元素为止。具体思路是:最初待查找的数据元素的范围是整个数组,找到数据元素范围的“中间元素”,将其与待查找的元素x比较,如果当前元素的值与给定值x相等,则查找成功;如果当前元素小于给定值x,则说明被查找数必在前半区间内;反之则在后半区间内。这样把查找区间缩小了一半,继续进行查找。程序见4-10.cpp2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例例4.114.11 用直接插入排序法对7个整数按从小到大的顺序排序。算法分析:算法分析:直接插入排序法是最简单的排序方法之一,它的基本操作是将个元素插入到已排好序的序列中,从而得到一个新的、元素个数增l的有序序列。序列21,25,49,26,18,8,31进行排序的过程 2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例4.12 输入同学录中40位同学的信息。然后输入一个字符串,查找姓名为这个字符串的所有同学的位置,如果成功,则输出存储这些同学的生日,否则输出查询不成功的信息。本例希望能进行模糊查找,即可以只输入姓名的一部分来进行查找。算法分析:本例希望进行模糊查找,比如可以只输入姓或名来查找相应的同学的信息,因此,即便同学的信息已按姓名排序,也无法使用折半查找,只能使用顺序查找。u因为要进行模糊查找,因此不能直接比较同学的姓名与输入的字符串相等,而要使用字符串的查找函数strstr(字符串1,字符串2),它用于查找字符串2是否在字符串1中,如果不在,则返回NULL(其值0)。u因此这个例子的主要算法是:用一个结构数组stu存储同学的信息,结构的定义与例4.5相同。存储时,数组元素stuI存储第I位同学的信息,stu0不存储同学信息。u在输入同学的信息后,输入要查找的字符串,再将监视哨stu0.name置为输入的字符串,然后从数组尾部向前依次比较,如果待查找的字符串在当前同学的姓名中,则输出当前同学的生日。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 例例4.13 输入同学录中40位同学的信息,并在输入的同时对这些同学的信息按姓名排序,使得最终得到按姓名从小到大顺序排列的各位同学的信息。算法分析算法分析:要在输入的同时排序,其算法类似于直接插入排序,即前i个同学的信息存储好后,要加入第i+1个同学的信息,只需从第i个同学开始依次向前查找,将第i+1位同学的信息放置在合适的地方。与前面例4.7不同之处在于,例4.7中数组元素为整型,因此排序时比较的是整型数,而这个例子中,要比较的是同学的姓名,这就不能使用=来比较,而应使用C的库函数strcmp来进行比较。当然,在顺序查找之前,本例也需设置监视哨为stu0。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 第四章第四章 小结小结1.数组是一个顺序排列的有相同类型的若干个元素的集合,用于描述同一种类型的数据的集合,属于构造类型的数据结构。2.数组的所有元素均按行主序方式存放在一个连续的存储空间中,数组名就是这个存储空间的首地址(即第一个元素的存放地址)的符号地址。3.下标访问这是常见的数组访问方法。4.定义数组时需要有确定的空间大小,因此,在定义时必须用常量表达式来定义数组元素的个数。个数一经确定,在程序中不得更改。5.在C语言中,数组的下标是从0开始,最后一个下标是数组的长度减1。在使用时,数组下标不能超过这个范围,否则会出现数组越界错误。而这种错误C的编译器并不报告,因此更要当心。2024/7/12电子科技大学计算机学院电子科技大学计算机学院 结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best,Failure Is Great,So DonT Give Up,Stick To The End69谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way演讲人:XXXXXX 时 间:XX年XX月XX日 70
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!