《C语言程序设计》第4章数组.ppt

上传人:xin****828 文档编号:14957555 上传时间:2020-08-02 格式:PPT 页数:78 大小:3.48MB
返回 下载 相关 举报
《C语言程序设计》第4章数组.ppt_第1页
第1页 / 共78页
《C语言程序设计》第4章数组.ppt_第2页
第2页 / 共78页
《C语言程序设计》第4章数组.ppt_第3页
第3页 / 共78页
点击查看更多>>
资源描述
第四章 数 组,在实际的应用中,经常会遇到某些类型相同并相互具有联系的 数据。该类数据,经常要作相关的处理。如,一个班30个人的一门 课程的成绩,求平均成绩、最高或最低成绩。处理这类数据的最好 办法是将其定义成为一个具有共同特征的集合,这种同类型相关数 据的集合称为数组。,Chapter 4 Array,4.1 数组的基本概念,C 语言可以根据用户需要,用基本数据类型定义特殊性质的数 据类型,称为构造类型。构造类型有:数组、结构、联合。,数组:相同数据类型变量的有序集合。有序表现在数组元素在 内存中连续存放。,数组用一个名字作为标识。为区分各元素,每个元素有一个用 整型表示的序号,称之为下标。下标可以有多个,下标的个数称为 数组的维数。,如:十个整型变量 k0,k1, k9,一个下标。,数组名。,三个学生三门课程的成绩,97.5 80.5 94.5 76.5 81.4 90.0 60.0 64.5 75.0,学号 0 1 2,0 1 2 课程,下标一:行,下标二:列,数组元素:a11,/* example 4-1(b) 计算平均成绩 */ #include void main(void) int i; float math,ave; ave = 0.0; /* 平均成绩初值为0 */ for(i=0;i10;i+) /* 循环10次 */ scanf(%f, ,【例4-1】学生分数的处理问题。有10个学生参加数学考试,考试成绩由键盘输入,计算平均成绩。,/* example 4-1(b) 计算平均成绩 */ #include void main(void) int i; float math,ave; ave = 0.0; /* 平均成绩初值为0 */ for(i=0;i=ave) printf(%fn,math); /* 大于平均成绩则打印 */ ,【例4-1(b)】,/* example 4-1(c) 计算平均成绩 */ #include void main(void) int i; float math10,ave; ave = 0.0; /* 平均成绩初值为0 */ for(i=0;i=ave) printf(%fn,mathi); /* 大于平均成绩则打印 */ ,【例4-1(c)】,数组必须先说明后使用。说明的目的如下:,说明数组的名字(标识)。 说明数组的类型。 说明数组的维数。 确定各维下标的变化范围。,编译系统将根据说明,开辟内存单元按特有的顺序和相应的类 型为各元素分配内存单元。,4.2 一维数组,一维数组的说明,说明方式:,type array1常量表达式, , arrayn常量表达式;,类型说明符,根据需要可加修饰说明。说明数组的类型。,数组名,用标识符命名。,用 包含的常量表达式。数组的下标从0变化到常量达式的值减一。,int id5, iyear10; float fScore36;,当说明数组后,编译时系统会根据定义的类型分配连续的一段 内存单元给数组的各元素。,id0,id1,id2,id3,id4,系统为数组分配的连续内存单元,每个单元占两个BYTE。首地址用数组名id表示。,2. 一维数组的引用,数组是一组数,它们公用一个数组名,这是它们公有的属性,但它们在数组中的位置不同,这是它们私有的属性,为表明数组中的一个元素,既要指出其来自于哪个数组,这就需要数组名;又要声明其在这个数组中的位置,这就需要下标 。,一维数组中元素引用的一般形式为: 数组名下标值,说明: 下标通常为整型,如果为实型,系统自动取整; 下标常常巧妙的和循环变量相结合,随着循环变量的变化而变化,可以达到事半功倍的效果; C语言不做下标越界的检查,即语法上对越界的下标不报错。,3. 一维数组的存储,计算机系统中有着大量的存储单元,为区别各个存储单元,每一个存储单元都有一个唯一的代表这个存储单元的地址,就好像我们每一个人都有一个唯一的代表自己的身份证号一样。计算机系统中,存储单元的地址的编码规则是线性的,以十六进制表示,并且从0开始计数,因此存储单元的地址为:0、1、2、.9、A、B、C、D、E、F、10H、. .,如果说明的是一个数组,如:int math10; 计算机开辟20个地址连续的存储单元(TC环境下整型占2个字节,共有10个数组元素),用于存放数组中的10个数组元素,且这20个存储单元的首地址标记为:数组名math或 /*说明数组,同时初始化全部元素。*/,float fValue10=1.0,2.0,3.0; /*说明数组,给部分元素初值,其余元素为0。*/,unsigned a =0 x0000,0 x0001,0 x0002; /*当数组元素全部赋初值时,可以不指定长度*/,/* example 4-2 数组的初始化 */ #include void main(void) int i; int a5=1,2,3,4,5; int b5=1,2; int c =1,2,3; for(i=0;i5;i+) /* 循环5次 */ printf(a%d=%d ,i,ai); /* 输出a数组元素 */ printf(n); /* 换行 */ for(i=0;i5;i+) /* 循环5次 */ ,【例4-2】数组的初始化示例。编写代码4-2如下,其执行结果如图4-3所示。,printf(b%d=%d ,i,bi); /* 输出b数组元素 */ printf(n); /* 换行 */ for(i=0;i5;i+) /* 循环5次 */ printf(c%d=%d ,i,ci); /* 输出c元素,注意有危险 */ printf(n); /* 换行 */ ,5.一维数组的应用,【例4-3】兔子繁殖问题。,/* example 4-3 Fibonacci数列 */ #include void main(void) int month; int f13=1,1; for(month=2;month13;month+) /* 循环递推 */ fmonth = fmonth-1+fmonth-2; /* 计算数列 */ for(month=0;month13;month+) printf(%d ,fmonth); /* 输出数列 */ ,【例4-4】由键盘输入n个学生(设人数不超过50人)的数学成绩,分别统计优、良、中、及格、不及格的人数。,/* example 4-4 分别统计成绩 */ #include void main(void) int i,n; int a=0,b=0,c=0,d=0,e=0; /* 表示各段人数 */ float math50; printf(“n=?”); /* 输入人数 */ scanf(“%d”,i+) /* 循环n次 */ ,if(mathi=90) a+; /* 分别统计 */ else if(mathi=80) b+; else if(mathi=70) c+; else if(mathi=60) d+; else e+; printf(%dt%dt%dt%dt%dn,a,b,c,d,e); /* 打印 */ ,例:,求10个学生一门课程的平均分,并输出低于平均成绩的分数。,#include void main(void) float fScore10,aver=0; int i; for(i=0;i10;i+) scanf(“%f”, ,说明数组。,循环输入各元素的值并累加。,循环判断条件,满足条件输出。,4.3 二 维 数 组,在实际应用中,经常会遇到一些用多维索引的数据。如:四个 学生三门课的成绩。可以用下表表示:,显然,该表的每一项需要有两个索引项。表现为数组的两个下 标。超过一个下标的数组称为多维数组。,行:代表某个学生。,列:代表某门课程。,二维数组的说明,说明方式: type array常量表达式1常量表达式n,;,n个整型常量表达式,数组元素的个数?,int a23 , b452;,多维数组在内存中的顺序,int a33;,二维结构: a00 a01 a02 a10 a11 a12 a20 a21 a22,排列顺序:先行后列。,a00,a01,a02,a10,a11,a12,a20,a21,a22,下 标 为 0 的 行,总原则:最后一个下标先变化,变化一个周 期后,倒数第二个开始变化,如此类推。,a为数组在内存中的首地址。,int b234;,内存中的排列?,二维数组的初始化,数组可以在说明时初始化。,全部赋初值,int a23=1,2,3,4,5,6;,下标为0的一行,下标为1的一行,int b23=1,2,3,4,5,6;,按内存顺序赋初值。,部分赋初值,int a23= 1 , 2 ;,0行的0列的元素赋初值。0行其余值为0。,int a23=1,2;,对全体数组元素赋初值,第一维下标可以省略。,int a 3=1, 2, 3, 4, 5, 6;,二维数组元素的引用,数组定义后,具备简单变量的一切性质,可以作为表达式的运 算对象,也可以被赋值。引用时,只能引用数组元素,方式如下:,arrayexp1expn,int a1010 ,y,i=2; ai+26=20; y=ai+26*100/30; a1011=34;,对4行6列的元素赋值。,参加表达式运算。,C语言不作下标检查,语法正确,但使用危险,可能造成程序的错误!,整型表达式。,5.二维数组的应用,【例4-5】下三角矩阵。,/* example 4-5 下三角矩阵 */ #include void main(void) int i,j; int a44; for(i=0;i=j) aij = 1; /* 下三角 */ else aij = 0; /* 上三角 */ for(i=0;i4;i+), for(j=0;j4;j+) printf(“%4d”,aij); /* 输出数列 */ printf(“n”); /* 换行 */ ,【例4-6(a)】二维数组的转置 。,/* example 4-6(a)二维数组的转置 */ #include void main(void) int i,j; int a33=1,2,3,4,5,6,7,8,9; /* 定义原数组 */ int b33; /* 定义新数组 */ for(i=0;i3;i+) /* 外循环遍历行 */ for(j=0;j3;j+) /* 内循环遍历列 */ bij = aji ; /* 计算新元素 */ for(i=0;i3;i+) for(j=0;j3;j+) printf(“%4d,aij); /* 输出原数组 */ printf(“n”); /* 换行 */, printf(“n”); /* 换行 */ for(i=0;i3;i+) for(j=0;j3;j+) printf(%4d,bij); /* 输出新数组 */ printf(“n”); /* 换行 */ ,/* example 4-6(b) 二维数组的转置 */ #include void main(void) int i,j,t; int a33=1,2,3,4,5,6,7,8,9; /* 定义原数组 */ for(i=0;i3;i+) for(j=0;j3;j+) printf(%4d,aij); /* 输出原数组 */ printf(n); /* 换行 */ for(i=0;i3;i+) /* 外循环遍历行 */ for(j=0;ji;j+) /* 注意内循环范围 */ t = aij ; /* 互换元素 */ aij = aji;,【例4-6(b)】,aji = t; for(i=0;i3;i+) for(j=0;j3;j+) printf(%4d,aij); /* 输出新数组 */ printf(n); /* 换行 */ ,4.4 字 符 数 组,C语言没有字符串变量,可以定义字符数组,每个元素存放一 个字符,从而达到存放字符串的目的。,字符数组的说明,char charrayconst exp1const expn,; char a10,b212;,字符数组的初始化,一维数组赋初值,char str16= h, e, l, l, o,0; char str2 =”hello ”;,用单个字符对每一个元素赋值。,用字符串对数组赋初值。,可以指定长度,也可不指定长度。,系统会在字串的结尾加0,表示字符串结束。因此,说明数组 时,长度指定应至少比实际长度大1,保证赋初值正确。,0,存储结构:,h,e,l,l,o,0,二维数组赋初值,二维数组的每一行可以存放一个字符串。,char str36=”wang”,”zhang”,”liu”;,str数组在内存中的首地址。,存储结构,字符数组的输入输出,格式输入输出函数,输出: for(i=0;iSTRLEN;i+) printf(“%c”,str i ); /*通过循环输出各元素*/ printf(”%s”,str); /*用字符串形式输出*/,输入: scanf(”%s”,str); /*用字符串输入整个数组*/,用scanf函数输入时space作为输入的分隔符,因此输入带空格 的字符串,会造成输入不全。,char a20; scanf(”%s”,a); 输入:China Anhui Hefei 结果a数组的内容是:China0,为了解决这个问题,系统定义如下专用于字符数组的i/o函数。,gets( )字符串输入函数,用法:,char str 80; gets(str);,作用: 读入一个以换行符为终结符的字符串到str中,用0代替换行符。,数组名作为函数的参数。,puts( )字符串输出函数,用法:,char string =”China”; puts(string);,数组名作为函数的参数。,作用: 输出以NULL 即0结尾的字符串string,自动加上换行符。,【例4-7】用格式符%c逐个输入和输出示例。,/* example 4-7 用格式符c逐个输入和输出 */ #include void main(void) int i; char a12; for(i=0;i12;i+) scanf(%c, ,【例4-8】用格式符s整体输入和输出示例。,/* example 4-8 用格式符s整体输入和输出 */ #include void main(void) char a12; scanf(%s,a); /* 输入a数组元素 */ printf(“%s”,a); /* 输出a数组元素 */ printf(n); ,【例4-9】字符输入输出举例,#include void main(void) char str80; int i; gets(str); for(i=0 ; str i !=0; i+) if(stri=a ,判断字符串结束。,常用的字符处理函数,C语言定义了一系列的字符处理函数用于字符串的处理,该类 函数的原型定义在string.h中。因此,在使用该类函数时,应在程 序的开始处,加#include ,字符串拷贝函数strcpy(str1,str2),作用:将str2拷贝到str1中。,用法: char str110, str2 =”Computer”; strcpy(str1,str2); /*str1的内容是“Computer”*/ strcpy(str2,”Program”); /*str2的内容是“Program”*/,说明:,str1的长度要足够长; str1只能是字符数组名,str2可以是字符数组或字符串常量。,字符串连接函数strcat(str1, str2),作用:将str2连接到str1后(去掉str1的0)。,用法: char str115=“Anhui ”, str2 =”Hefei”; strcat(str1,str2); puts(str1); /*输出结果为 Anhui Hefei */,说明:,str1的长度要足够长; str1只能是字符数组名,str2可以是字符数组或字符串常量。,测试字符串长度函数strlen(str),作用:测试字符串的实际长度。函数运算得到整型值,该值是 字符串的长度!,int iLenStr; char str =“China”; iLenStr=strlen(str); printf(“%d”,iLenStr);,结果?,字符串的比较 strcmp(str1,str2),作用:对str1和str2 进行逐位无符号字符(ASCII码)比较, 直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。,字符的数值关系也就是字符的ASCII码值的数值关系。,比较结果如下:,char str1 =”abcd”; char str2 =“abcd”; int iRe1,iRe2,iRe3; iRe1=strcmp(str1,”abdc”); iRe2=strcmp(str1,str2); iRe3=strcmp(”abcde”,str2);,abcd,abdc,c,d,c-d -1 结果小于0。,strlwr(str)将str中的大写字母转换成小写字母。,strupr(str)将str中的小写字母转换成大写字母,#include #include void main(void) char str1 =c programming! 123,str2=Computer; strlwr(str2); strupr(str1); puts(str1); puts(str2); ,C PROGRAMMING! 123 computer,【例4-10】字符处理函数示例1,/* example 4-10 字符处理函数 */ #include #include void main(void) int k; char a20=Hello; char b20=world; char c20; k = strlen(a); /* 测a串长度 */ printf(k=%dn,k); printf(“%d n”,strcmp(a,b); /* 比较a串和b串 */ strcat(a,b); /* 连接b串到a串 */ strcpy(c,b); /* 复制b串到c串 */ puts(a); /* 输出a串 */ puts(b); /* 输出b串 */ puts(c); /* 输出c串 */ ,【例4-11】从键盘任意输入5个学生的姓名,找出按ASCII码的顺序排在最前面的学生姓名。,/* example 4-11 找出排在最前面的学生姓名 */ #include #include void main(void) int i; char name20,minname20; printf(please enter 1 name:); gets(name); /* 输入第1个姓名 */ strcpy(minname,name); /* 设第1个姓名为最前面的姓名 */ for (i=2;i=5;i+) printf(please enter %d name:,i); gets(name); /* 输入第i个姓名 */ if(strcmp(name,minname)0) /* 比较第i个姓名 */ strcpy(minname,name); /* 修正最前面的姓名 */ puts(minname); /* 输出最前面的学生姓名 */ ,例:统计一行文字中大写字母、小写字母及数字的个数。,#include #include void main(void) char str80; int i, iAnum=0, ianum=0,i0num=0; gets(str); for(i=0; i=A ,4.5 数组的应用举例,数组是同类型数据的集合。便于整体处理数据,数组操作的主 要算法有:,求极值 排序 查找 4.倒序,求极值及其位置,算法演示,一维数组的极值,#include void main(void) int a10=1,6,-2,5,4,32,47,-66,13,14; int iMax, iPos, i; iPos=0; iMax=a0; for(i=1; iiMax) iMax = ai; iPos = i; printf(“Max=%5d Position=%5d”,iMax,iPos); ,假定最大值及其位置。,循环比较,当前元素比最大值大,将其 赋值为新的最大值并记录其位置。,二维数组求极值,#include void main(void) float a34= 1.0, 3.0, 5.2, 7.4, 4.6, 5.5, 4.2, 1.2, 10.5, 0.23,1.3, 0.5; int i, j, iRow=0,iCol=0; for(i=0; i3; i+) for(j=0;j4;j+) if(aijaiRowiCol) iRow = i; iCol = j; printf(”%f7.2,iRow%5d,iCol%5d”,aiRowiCol,iRow,iCol); ,假定最小值的位置。,二重循环遍历所有元素,比较求最小值,记录其位置。,/* example 4-12 计算最高分 */ #include void main(void) int i,kmax; float math10,maxmath; printf(please enter:); for(i=0;i10;i+) /* 循环 */ scanf(“%f”,i+) /* 循环依次与后面的数比较 */,【例4-12】已知10个学生的数学成绩,由键盘输入,问最高分是多少?, if(mathi maxmath) /* 如果后面的数大于假设的最大 */ kmax = i; /* 修改位置 */ maxmath = mathi; /* 修改最大 */ printf(k=%d,max=%fn,kmax,maxmath); /* 输出 */ ,【例4-13】已知10个学生的数学成绩,由键盘输入,问最低分是多少?解题分析:解决了最高分问题,不能发现,只要将比赛规则,稍加修改即可。找最高分是找分数高的,而找最低分是找分数低的,将上述代码4-12中的大于号改为小于号即可,当然表示最小数和其位置的变量名也应作适当的修改(如最小数用minmath表示、最小数位置用kmin表示),在此不再叙述代码。,/* example 4-14 计算最高分和最低分 */ #include void main(void) int i,kmax,kmin; float math10,maxmath,minmath; printf(please enter:); for(i=0;i10;i+) /* 循环 */ scanf(“%f”,i+) /* 循环依次与后面的数比较 */,【例4-14】已知10个学生的数学成绩,由键盘输入,问最高分和最低分各是多少?, if(mathi maxmath) /* 如果后面的数大于假设的最大 */ kmax = i; maxmath = mathi; /* 修改最大 */ else if(mathi minmath) /* 如果后面的数小于假设的最小 */ kmin = i; minmath = mathi; /* 修改最小 */ printf(kmax=%d,max=%fn,kmax,maxmath);/* 输出最大 */ printf(kmin=%d,min=%fn,kmin,minmath);/* 输出最小 */ ,/* example 4-15 计算最高分 */ #include void main(void) int i,j,k1max,k2max; float score103,maxsco; printf(please enter:); for(i=0;i10;i+) /* 循环 */ for(j=0;j3;j+) scanf(%f,i+) /* 外循环遍历行 */,【例4-15】已知10个学生的数学、物理、化学成绩,由键盘输入,问最高分是多少?, for(j=0;j maxsco) /* 如果后面的数大于假设的最大 */ k1max = i; /* 修改位置 */ k2max = j; maxsco = scoreij; /* 修改最大 */ printf(k1=%d,k2=%d,max=%fn,k1max,k2max,maxsco); ,查 找,查找是在一组数中,寻找一个特定的数,并显示结果。,顺序查找,顺序查找算法:构造循环,使循环的变量遍历数组每个元素的 下标。循环的过程中让特定的数和每个元素比较,相等则表示找到 该数,并输出其下标(位置)。,程序设计中标志的设置和应用:,在程序设计中,经常要记录一些状态,作为判断的条件。因此 需要在程序中设置一些标志,通常标志是整型变量。,如查找问题,可以先设置一个整型变量iFlag=0表示没有找到, 在查找的过程中一旦找到后,将iFlag赋值为1,结束查找后,可以 由iFlag值所代表的逻辑状态,确定是否已找到特定的数。,标志设置框图,int iFlag;,iFlag=0;,是否找到?,iFlag=1;,yes,no,顺序查找程序,#include void main(void) int i,j,iFlag,a10=4,3,5,1,10,12,2,6,7,9; iFlag=0; scanf(“%d”, ,设置标志为没找到。,循环遍历所有元素,比较设置标志输出位置。,chp4ex7,/* example 4-16 顺序查找 */ #include #include void main(void) int i; int flag=0; /* 设置标志 */ float math10=85,84,75,74,92,90,68,55,66,94; float score; printf(“please enter:”); /* 输入待查找数据 */ scanf(%f, /* 循环继续向后进行 */,【例4-16】已知10个学生的数学成绩,由键盘任意输入1个成绩,查找是否有此成绩。, if(flag=1) printf(%f in %dn,score,i); /* 输出找到的位置 */ else printf(not found n); /* 输出没有找到 */ ,折半查找适用于在有序数组中查找,在一个有序的一维数组中查找某一个数。已知某数组按升序排 列,给定一个数,找出该数在数组中的位置。 可以通过将区间折半,快速缩小查找区间,提高效率!,折半查找算法演示,/* example 4-17 折半查找 */ #include #include void main(void) int low,high,mid; int flag=0; /* 设置标志 */ float math10=55,65,68,72,75,83,86,88,90,95; /* 有序表 */ float score; printf(“please enter:”); /* 输入待查找数据 */ scanf(%f, /* 修改标志 */ else if(scoremathmid),【例4-17】已知10个学生的数学成绩,而且已经按由小到大的顺序排列,由键盘任意输入1个成绩,查找是否有此成绩。,high = mid-1; /* 缩到前一半,修改上界 */ else low = mid+1; /* 缩到后一半,修改下界 */ while( low=high /* 输出没有找到 */ ,算法的效率,无论是选择排序,还是冒泡排序其循环次数相同。 外层循环i从0到MAX-1 内层循环j从i+1到MAX,总次数: r=1+2+n-1 n*n/2, n为数组元素个数。,问 题:400个元素求前十名,如何高效率地排序?,方法一:对400个元素排完序后,取前10个。次数为80000次。,方法二:选择10个最大值。次数为4000次。,假如一次循环需要1ms 方法一需要80s 方法二需要4s,如何构造400取前十名的算法?,折半查找程序,#include void main(void) int iTop,iBot,iMid,iS,iFlag,a10=1,2,3,5,6,8,9,10,11,12; iFlag=0; iTop=0; iBot=9; scanf(“%d”, ,初始化查找标志及顶、底。,查找循环,折半。,找到。,没找到,调整iTop或iBot,chp4ex8, 排 序,排序的概念,排序是将一组随机排放的数按下标顺序从大到小或从小到大重 新排列。,1 ,5,4,6,7,9,9,7,6,5,4,1,1,4,5,6,7,9,降序,升序,冒泡排序算法,冒泡排序算法演示,冒泡排序程序如下:,#include void main(void) int i, j, a10=4,3,5,1,10,12,2,6,7,9, iTemp; for(i=0; i9 ;i+) for( j=i+1;j10;j+) if(aiaj) iTemp=a i ; a i =a j ; a j =iTemp; for(i=0;i10; i+) printf(”%4d”,ai); ,外层循环i变化,内层循环j变化,比较交换,chp4ex5,/* example 4-18 冒泡排序 */ #include void main(void) int i,j; float math10,temp; printf(please enter:); for(i=0;i mathj+1) temp = mathj; mathj = mathj+1; mathj+1 = temp; /* 交换 */ for(i=0;i10;i+) /* 循环 */ printf(%5.1f ,mathi); /* 输出 */ ,【例4-18】已知10个学生的数学成绩,对其按升序排列。,思考题,升序的条件如何构造?,联合排序问题 已知一个班有36个同学,a数组存放一门课的成绩,m数组存放 其学号。要求将成绩从大到小排序。,提示:应考虑的问题是当a数组元素比较交换时,m数组如何处 理?,a 5 89.5 m 5 1005 a 7 90.0 m 7 1007,被动排序方。,选择排序,冒泡排序在内层循环的比较中,满足条件的每次都需要交换。 其中一些交换是无效的,交换算法会占用系统时间,从而降低算法 效率。,选择排序算法的基本思路,每轮排序将a i 假定为极值,每次 在a i 到 aMAX中找出个极值,记录其位置,最后让极值位置的 元素与a i 交换。 选择排序保证每轮排序只有一次交换,且为有效的交换!,选择排序算法演示,选择排序程序,#include void main(void) int i, j,iMax,a10=4,3,5,1,10,12,2,6,7,9, iTemp; for(i=0; i9 ;i+) iMax=i; for( j=i+1;j10;j+) if(aiMaxaj)iMax=j; if(iMax!=i) iTemp=ai; ai=aiMax; aiMax=iTemp; for(i=0;i10; i+) printf(”%4d”,ai); ,排序循环,假定最大值位置。,循环比较找出最大值的位置。,与本次比较的第一个元素交换。,chp4ex6,升序如何构造?,/* example 4-19 选择排序 */ #include void main(void) int i,j,k; float math10,temp; printf(please enter:); for(i=0;i mathj) k = j; /* 修正最小数位置 */ if(k!=i),【例4-19】已知10个学生的数学成绩,利用选择排序对其按升序排列。, temp = mathi; mathi = mathk; mathk = temp; /* 将最小数交换到前面 */ for(i=0;i10;i+) /* 循环 */ printf(%5.1f ,mathi); /* 输出 */ ,4. 倒序,【例4-20】利用循环以实现反向输出。,/* example 4-20 反向输出 */ #include void main(void) int i; int math10; printf(please enter:); for(i=0;i=0;i-) /* 循环 */ printf(%d ,mathi); /* 从后向前输出 */ ,【例4-21】用另一个数组 。,/* example 4-21 利用辅助数组 */ #include void main(void) int i; int math110,math210; printf(please enter:); for(i=0;i10;i+) /* 循环 */ scanf(%d, /* 从前向后输出 */ ,【例4-21】就地逆置 。,/* example 4-22 就地逆置 */ #include void main(void) int i,temp; int math10; printf(please enter:); for(i=0;i10;i+) /* 循环 */ scanf(“%d”, /* 从前向后输出 */ ,4.6 算法与效率,通过上述一些例子,可以发现同一个问题往往存在几种不同的算法,多种算法都可以解决问题,每一种算法都有它的特点,当然每一种算法都有它的开销,究竟如何评价这些算法的好坏呢?,算法首先必须是正确的,即算法都能解决问题,得到了正确的结果,除此之外,还需考虑以下几个方面的问题:,(1)执行算法所耗费的时间; (2)执行算法所耗费的存储空间; (3)算法应该易于理解、易于调试、易于维护等等。,1.算法所耗费的时间,一个算法所耗费的时间应该是算法中每条语句的执行时间之和,而每条语句的执行时间是该语句的执行次数与该语句的执行时间之乘积。每条语句的执行时间与所使用的计算机系统有关,同样的语句在不同的计算机系统中其执行时间不一定相同,这给精确度量算法的时间带来困难。,为此我们抛开具体的软硬件环境,假设每一条语句的执行时间是相同的,为一个标准单位时间,这样算法的执行时间就是所有语句的执行次数之和,一条语句的执行次数与其是否在循环中以及循环的次数有关。 可见语句的执行次数在很大程度上依赖于循环的次数,降低循环的次数以及循环的层数就可以降低算法的时间。,2.算法所耗费的空间,一个算法所耗费的存储空间来自于3个方面:,(1)算法自身在计算机系统中占有的空间; (2)算法运行过程中各种数据占有的空间; (3)算法运行过程中所需要的辅助空间。,算法运行过程中所需要的辅助空间是度量算法空间性能的主要指标。,3.算法的可读性、可调性、可维护性,算法的可读性、可调性、可维护性是衡量现代程序性能的一个重要的指标,一个结构清晰、接口简单、易于阅读的程序,不仅大大减少程序的调试和维护成本,也增加程序的稳定性和可靠性。,【例4-23】求1100以内的偶数之和。 以下列出3种解法,都可以解决1100以内的偶数之和。,/* example 4-23(a) 求1-100以内的偶数之和 */ #include void main(void) int i; int sum=0; /* 初始化和 */ for(i=2; i=100; i=i+2) /* 循环变量的变化就是偶数 */ sum = sum+i; /* 求和 */ printf(sum=%d ,sum); /* 输出偶数之和 */ ,/* example 4-23(b) 求1-100以内的偶数之和 */ #include void main(void) int i; int sum=0; /* 初始化和 */ for(i=1; i=100; i=i+1) /* 循环变量的变化是所有数 */ if (i%2=0) sum = sum+i; /* 求偶数之和 */ printf(sum=%d ,sum); /* 输出偶数之和 */ ,/* example 4-23(c) 求1-100以内的偶数之和 */ #include void main(void) int i; int sum=0; /* 初始化和 */ for(i=1; i=100; i=i+1) /* 循环变量的变化是所有数 */ if (i%2!=0) continue; /* 奇数跳过 */ else sum = sum+i; /* 求偶数之和 */ printf(sum=%d ,sum); /* 输出偶数之和 */ ,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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