第5讲结构化程序设计(PartII)提要课件.ppt

上传人:小飞机 文档编号:3836827 上传时间:2023-03-24 格式:PPT 页数:77 大小:973KB
返回 下载 相关 举报
第5讲结构化程序设计(PartII)提要课件.ppt_第1页
第1页 / 共77页
第5讲结构化程序设计(PartII)提要课件.ppt_第2页
第2页 / 共77页
第5讲结构化程序设计(PartII)提要课件.ppt_第3页
第3页 / 共77页
第5讲结构化程序设计(PartII)提要课件.ppt_第4页
第4页 / 共77页
第5讲结构化程序设计(PartII)提要课件.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《第5讲结构化程序设计(PartII)提要课件.ppt》由会员分享,可在线阅读,更多相关《第5讲结构化程序设计(PartII)提要课件.ppt(77页珍藏版)》请在三一办公上搜索。

1、第5讲结构化程序设计(Part II),2018年10月11日,1,谢谢观赏,2019-8-17,谢谢观赏,提要,C程序简介函数基础知识文件的简单用法简单程序设计实例,2,2019-8-17,谢谢观赏,提要,C程序简介函数基础知识文件的简单用法简单程序设计实例,3,2019-8-17,谢谢观赏,C程序简介,一个C程序可由若干个源程序文件组成一个源文件可以由若干个函数和预处理命令以及全局变量声明部分组成 一个函数由变量定义部分和执行语句组成一个源程序文件也是可独立编译的单位,所以C程序可以按源程序文件分别编写、分别编译,4,2019-8-17,谢谢观赏,5,2019-8-17,谢谢观赏,C语句,

2、C语句是C程序的基本组成单元C语句可以分为以下5类空语句表达式语句复合语句控制语句函数调用语句,6,2019-8-17,谢谢观赏,C语句(续),控制语句有9种if()else(条件语句)switch(多分支选择语句)for()(循环语句)while()(循环语句)do while()(循环语句)continue(结束本次循环语句)break(中止执行switch或循环语句)goto(转向语句)return(从函数返回语句),7,2019-8-17,谢谢观赏,C语句(续),函数调用语句由一次函数调用加一个分号构成表达式语句由一个表达式加一个分号构成,如赋值语句空语句只有一个分号的语句,它什么也不

3、做复合语句用 把一些语句括起来构成,又称分程序,8,2019-8-17,谢谢观赏,C程序的三种基本结构,顺序结构条件控制结构if else 循环结构while()do while()for(),9,2019-8-17,谢谢观赏,提要,C程序简介函数基础知识正文文件的简单用法简单程序设计实例,10,2019-8-17,谢谢观赏,函数基础知识,结构化程序设计中,将复杂的功能分解成若干简单的子功能,用函数编码实现子功能,通过调用函数实施子功能要求函数是一个实现指定功能、逻辑上独立的代码段对函数使用者来说,把它看作“黑盒”,只需知道要传送给函数的数据(输入),和函数执行后能得到什么结果(输出)函数可以

4、定义局部对象,使函数在逻辑上作为程序的一个相对独立单位,不受主函数或其它函数的程序对象命名的影响,11,2019-8-17,谢谢观赏,函数基础知识(续),函数可带形参,使函数执行时,操作对象、求值方式等可随不同调用的需要而改变函数为程序的层次构造和开发提供支持,使设计新程序能在已有函数基础上构造功能更强的函数和程序一个C程序以 main()函数作为程序的主函数。程序运行时,从它开始执行在C语言中,函数不能嵌套定义,一个函数并不从属于另一个函数除不能调用 main()函数外,其它函数可以相互调用,12,2019-8-17,谢谢观赏,函数库,把一些公用的、基本的计算功能所对应的函数集中起来,构成一

5、个库,我们称之为函数库,相应的函数成为库函数函数库中的函数具有预先定义的、标准的输入、输入接口C语言中定义了一些基本的标准函数编程环境工具厂商(Microsoft、Borland等)往往提供更多的函数供编程者使用,13,2019-8-17,谢谢观赏,函数库(续),C语言使用头文(header file,即*.h文件)对函数库中的函数进行定义和说明函数库中的函数经编译后,绑定在一起件,构成一个库文件(library file,即*.lib文件)C程序调用C语言或者编程环境提供的函数时,要在程序中包含(include)相应的头文件;在产生执行文件时,需要与库文件中相应的目标函数代码连接为了使用方便

6、,C语言按功能分类,提供了大量函数库,每个函数库都有自己的头文件,14,2019-8-17,谢谢观赏,库函数的使用,使用相应库函数的程序都要在使用之前写上包含其头文件的预处理命令常用的头文件stdio.h(输入输出库函数)math.h、stdlib.h、float.h(数学库函数)time.h(时间库函数)ctype.h(字符分类和转换库函数)string.h(内存缓冲区和字符串处理库函数)graphics.h(图形处理库函数)malloc.h、stdlib.h(内存动态分配库函数)signal.h、process.h(进程控制库函数),15,2019-8-17,谢谢观赏,实例,实例1:时间函

7、数使用实例2:随机函数使用(1)实例3:随机函数使用(2),16,2019-8-17,谢谢观赏,#include#include void main()struct tm*tmNow;/*定义一个时间结构指针变量*/long secsNow;/*定义以秒为单位的记录时间的变量*/char*strNow;/*时间字符串表示的字符指针*/time(,17,2019-8-17,谢谢观赏,#include#include#include void main()int k;long now;srand(time(/*调用随机函数*/,18,2019-8-17,谢谢观赏,#include#include#

8、include void main()int i;srand(time(NULL);for(i=1;i=10000;i+)printf(”%10d”,1+rand()%6);if(i%5=0)printf(“n”);,19,2019-8-17,谢谢观赏,函数定义,函数定义的一般形式为,类型标识符 函数名(形式参数说明表)说明和定义部分 语句序列,20,2019-8-17,谢谢观赏,函数定义(续),类型标识符用于标识函数执行结果返回值的类型当函数执行不返回值时,习惯用void来标记当函数返回int型值时,类型标识符int可以省略函数名是一个标识符,一个C程序有且只有一个main()函数,其它的函

9、数名可以随意命名,21,2019-8-17,谢谢观赏,函数定义(续),函数名之后括号内的形式参数说明表是按需要而定没有形参的函数,也就没有形参说明表,常用void代之,但函数名之后的一对圆括号不可省略当函数有多个形参时,形参说明之间用逗号分隔,每个形参说明指定形参的类型和形参名,22,2019-8-17,谢谢观赏,函数定义(续),最外层花括号“”和“”括住的部分是函数体在函数体的前面部分可有函数需要的程序对象的说明和定义函数体内定义的变量是局部变量,只能在函数体内引用它们说明和定义之后是由语句序列组成的执行代码,23,2019-8-17,谢谢观赏,例子1,求两个数中最小值的函数min(),do

10、uble min(double x,double y)/*返回 double 型值,有两个形参 x,y,都为 double 型的*/*函数返回x和y中的小者的值*/return x y?x:y;,return语句的执行将结束函数的执行 C语言的return语句有两种形式:return;用于不返回值的函数体中 return 表达式;用于有返回值的函数体中,24,2019-8-17,谢谢观赏,例子2,求两个正整数最大公因子的函数gcd()两个正整数a和b的最大公因子有性质:gcd(a,b)=gcd(a-b,b),如a b;gcd(a,b)=gcd(a,b-a),如a b;gcd(a,b)=a,如a

11、=b。,25,2019-8-17,谢谢观赏,int gcd(int a,int b)while(a!=b)if(a b)a-=b;else b-=a;return a;,第1解法,26,2019-8-17,谢谢观赏,步骤:求余数 求a除b的余数r判结束 如r等于0,b为最大公约数替换 用b置a,r置b,并回到步骤求余数,第2解法,27,2019-8-17,谢谢观赏,int gcd(int a,int b)int r;while(1)if(r=a%b)=0)break;a=b;b=r;return b;,28,2019-8-17,谢谢观赏,int gcd(int a,int b)int r=a;

12、do a=b;b=r;r=a%b;while(r);return b;,29,2019-8-17,谢谢观赏,函数定义(续),C语言也允许在函数名后的圆括号内只给出各形参的名,随后才指定各形参的类型,但这种写法在C+中已不允许double min(x,y)double x,y;return x y?x:y;C语言还允许函数体为空的函数dummy()/*或 dummy(void)*/,30,2019-8-17,谢谢观赏,函数调用,函数被定义以后,凡要实现函数功能的地方,就可简单地通过函数调用来完成函数调用的一般形式为函数名(实在参数表)实在参数,简称实参。函数调用时,实参按它们出现的顺序与函数定义

13、中的形参一一对应,并要求实参类型与其对应的形参类型相一致,31,2019-8-17,谢谢观赏,函数调用(续),函数调用有两种方式传值调用(call by value)把实参的值传给被调用函数的参数(形参)。这时,被调用函数对参数的改变,不影响调用函数实参的原始值传引用调用(call by reference)把实参的地址传给被调用函数的参数(形参)地址。这时,被调用函数对参数的改变,将影响到调用函数实参的原始值,32,2019-8-17,谢谢观赏,函数调用(续),对double min(double x,double y)的函数调用 w=min(u,v);函数调用min(u,v)就是对函数mi

14、n()的调用,它提供了两个实参u和v,分别对应形参x和y如果调用无形参的函数,这时函数的调用形式变为函数名()其中函数名之后的一对圆括号是不能省略的,33,2019-8-17,谢谢观赏,函数调用(续),按函数调用在程序中的作用,有两种不同类型的应用函数调用只是利用函数所完成的功能。此时,将函数调用作为一个独立的语句。这种应用不要求或无视函数的返回值如程序中经常使用的调用格式输入函数scanf()和格式输出函数printf()等。函数调用是利用函数的返回值:或用这返回值继续进行表达式的计算,或输出函数返回值等,34,2019-8-17,谢谢观赏,函数调用的执行过程,为形参分配内存空间计算实参表达

15、式的值,并将值赋给对应的形参为函数的局部变量分配内存空间执行函数体内的语句序列函数体执行完,或执行了return语句后,释放为这次函数调用分配的全部内存空间将函数值(如果有)返回到函数调用处继续执行,35,2019-8-17,谢谢观赏,#include double x,y,d,min(double,double);void main()printf(“Enter x,y.n”);scanf(“%lf%lf”,36,2019-8-17,谢谢观赏,对函数调用的说明,当函数执行return语句或执行完函数体的语句序列后,函数的这次调用就结束,随之将控制返回到函数调用处继续执行函数的返回值是通过执行

16、return 语句时,计算return之后的表达式值而获得的。如果函数不提供返回值,则return语句不包含表达式。如果函数有返回值,则应有确定的类型,并在函数定义时指明。若函数定义时不指明返回值类型,且函数有返回值,C语言约定该函数的返回值类型为int型,37,2019-8-17,谢谢观赏,对函数调用的说明(续),为了明确指明函数不提供返回值,建议在函数定义时,在函数名之前写上void。并在这样的函数体内,所有的return语句都不带表达式当函数执行不带表达式的return语句返回时,函数并不是一定不带回值,而是返回一个不确定的值。这时,不应该利用函数返回值进行再计算,否则会产生错误结果函数

17、定义中的return语句的表达式类型应与函数定义中指明的返回值类型相一致。如果return语句中的表达式类型与函数定义指明的返回值类型不一致时,对于基本类型情况,则以函数的返回值类型为准,系统会自动进行类型转换,38,2019-8-17,谢谢观赏,实参向形参单向传递数据,在函数未被调用时,函数定义中的形参和函数体中定义的局部变量并不占用存储单元在函数定义中,必须为函数的形参指定数据类型函数体中所使用的形参的初值是由函数调用时对应的实参表达式给定的C语言规定,实参表达式对形参的数据传递是“值传递”的,即单向传递对于有多个实参的函数调用情况,C语言不规定实参的求值次序,39,2019-8-17,谢

18、谢观赏,提要,C程序简介函数基础知识文件的简单用法简单程序设计实例,40,2019-8-17,谢谢观赏,文件的简单用法,介绍这部分内容的目的学习编写从文件输入数据和把结果输出到文件的程序了解使用文件程序的结构掌握文件的一般使用方法熟悉一些和文件操作有关的库函数的用法,涉及一些较深的概念先暂且接受!,41,2019-8-17,谢谢观赏,定义文件变量,在程序的开始处定义文件指针变量,和存储文件名的字符数组,#include FILE*fp;/*定义文件指针变量fp*/char fname40;/*存储文件目录路径和文件名的字符数组*/,42,2019-8-17,谢谢观赏,输入文件名,printf(

19、”输入文件名(包括目录路径、扩展名)n”);scanf(”%s%*c”,fname);/*输入文件名及回车符*/,43,2019-8-17,谢谢观赏,打开文件,程序从正文文件输入数据,程序向正文文件输出结果若被打开文件不存在,则建立一个新文件;若被打开文件已存在,则该文件中的数据被删除,if(fp=fopen(fname,”r”)=NULL)printf(”%s文件不能打开n”,fname);return;,fp=fopen(fname,”w”);/*为写打开文件*/,读打开时,要求被打开文件已存在,44,2019-8-17,谢谢观赏,关闭文件,文件使用结束后,要及时关闭,fclose(fp)

20、;/*以后fp又可用于打开文件*/,45,2019-8-17,谢谢观赏,文件输入输出,调用函数fgetc()从文件输出下一个字符ch=fgetc(fp);/*将输入字符存于变量ch*/调用函数fscanf()从文件按指定格式输出数据fscanf(fp,”%d%d”,/*向文件输入整数*/,46,2019-8-17,谢谢观赏,从文件逐一输出字符,int c;/*不能为char类型*/FILE*fp;/*说明有关变量和设置初值等*/if(fp=fopen(文件名,”r”)=NULL)printf(”不能打开文件%s。n”,文件名);return;while(c=fgetc(fp)!=EOF)/*对

21、刚读入的字符信息 c 作某种处理*/fclose(fp);/*输出处理结果*/,47,2019-8-17,谢谢观赏,字符逐一输入形成新文件,int c;/*也可以是char类型*/FILE*fp;/*说明有关变量和设置初值等*/fp=fopen(文件名,”w”);while(还有字符)/*生成字符(或字节)存于变量c*/fputc(c,fp);/*将生成的字符输出*/fclose(fp);/*输出程序结束报告*/,48,2019-8-17,谢谢观赏,例子,将键盘输入的字符流复制到指定的文件逐行复制从键盘输入字符到指定文件,直至输入空行结束,49,2019-8-17,谢谢观赏,#include

22、FILE*fp;void main()int ch;char fname40;printf(”输入文件名!n”);scanf(”%s%*c”,fname);fp=fopen(fname,w);/*以写方式打开正文文件*/while(ch=getchar()!=n)/*逐行处理,至空行结束*/do fputc(ch,fp);/*行内字符逐一复制*/while(ch=getchar()!=n);/*处理当前行*/fputc(ch,fp);/*输出换行符*/fclose(fp);printf(”程序复制键盘输入字符结束。n”);,50,2019-8-17,谢谢观赏,提要,C程序简介函数基础知识正文文

23、件的简单用法简单程序设计实例,51,2019-8-17,【例1】输入整数n,输出由2*n+1行2*n+1列,以下形式(n=2)的图案。*图案分成两部分,上面由n+1行,下面有n行图案中,同一行上的两个星号字符之间有一个空格符对于上半部分,设第一行的星号字符位于屏幕的中间,则后行图案的起始位置比前行起始位置提前两个位置对于下半部,第一行的起始位置比上半部最后一行起始位置前进两个字符位置,以后各行也相继进两个位置,谢谢观赏,52,2019-8-17,#include void main()int n,j,k;printf(Enter n!n);scanf(%d,谢谢观赏,“%*c”中的*表示输入宽

24、度由后面的参量值确定,53,2019-8-17,【例2】试编制一个程序输出以下形式的乘法表。1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81,谢谢观赏,54,2019-8-17,#include void main()int i,j;printf(nt 1 2 3 4 5 6 7 8 9n);for(i=1;i=9;i+)print

25、f(t%d,i);for(j=1;j=i;j+)printf(%4d,i*j);printf(n);printf(nnn);,谢谢观赏,55,2019-8-17,【例3】编制一个程序,实现输入n(2)个整数,输出其中的次最大数。为求次最大,程序在循环过程中需保留两个数,当前暂时最大数max1和当前暂时次最大数max2。程序将输入的第一个数暂时保留,待输入第二个数后,确定max1和max2。从第三个输入数x开始,根据x调整max1和max2。调整过程需考虑以下几种可能:xmax1,则以max1作为新的max2,x作为新的max1;max1xmax2,则以x作为新的max2;xmax2,则不调整。

26、,谢谢观赏,56,2019-8-17,#include void main()int n,i,max1,max2,x,temp;printf(输入 n(=2)!n);scanf(%d,谢谢观赏,57,2019-8-17,else max1=temp;max2=x;for(i=3;i max1)max2=max1;max1=x;else if(x max2)max2=x;printf(次最大是%dnn,max2);,谢谢观赏,58,2019-8-17,【例4】编制对给定的整数,判该整数是否是质数的函数,若是质数,函数返回1,否则函数返回0。判一个整数n是否是一个质数有许多方法:如n=2,则n是质

27、数;若n是其它偶数,则n不是质数;让整数变量k自3开始,每次增2,直至k 的平方超过n为止,若其中某个k能整除n,则n不是质数。若所有这样的k都不能整除n,则n是质数。,谢谢观赏,59,2019-8-17,谢谢观赏,int isPrime(long n)long k;if(n=2L)return 1;if(n%2=0)return 0;for(k=3L;k*k n)return 1;return 0;,60,2019-8-17,【例5】编制输入整数,输出小于等于该整数的全部质数的程序。程序首先输出质数2,之后对指定范围内的奇数采用例4的方法判其是否是质数。,#include void main

28、()long m,n;int j;/*j控制每行输出10个质数*/printf(”输入整数n”);scanf(”%ld”,谢谢观赏,61,2019-8-17,【例6】输入x,求级数s(x)的近似值。约定求和的精度为0.000001。x3 x5 x7 s(x)=x+3*1!5*2!7*3!一般地,设级数为 s(x)=t0+t1+t2+tk,谢谢观赏,62,2019-8-17,求级数部分和的算法可描述如下:s=0;/*级数的部分和变量s,置初值0*/t=首项值;/*置通项变量t为级数的首项值*/k=0;/*置项序号变量k为0*/while(fabs(t)=Epsilon)s+=t;/*累计当前项t

29、k到部分和*/t=f(t,k);/*由当前项t和k计算下一个当前项的值*/k+;/*项序号增1*/,谢谢观赏,63,2019-8-17,对于本题,首项值为x,级数第k(=0)项tk的算式为(-1)k*x(2*k+1)/(2*k+1)*k!)k+1项tk+1与k项tk有关系 tk+1=-tk*x*x*(2*k+1)/(2*k+3)*(k+1)tk是通项t的当前项值,tk+1是通项t的下一个当前项值。由当前项t和k计算t的下一个当前项值t,可用以下表达式实现:t=-t*x*x*(2.0*k+1.0)/(2.0*k+3)*(k+1)把以上式子代入上述算法,并令x的值由输入给定,写出程序如下:,谢谢观

30、赏,64,2019-8-17,#include#include#define Epsilon 0.000001 void main()int k;double s,x,t;printf(“Enter x.n”);scanf(“%lf”,谢谢观赏,65,2019-8-17,【例7】编制从键盘输入整数序列,并按输入顺序输出到指定的文件中的程序。程序循环地从键盘输入整数,将整数输出到指定的文件中。当程序发现不能从键盘输入整数时结束循环。,谢谢观赏,66,2019-8-17,#include FILE*fp;int main()int x,k;char fname40;printf(”输入文件名!n”

31、);scanf(”%s%*c”,fname);if(fp=fopen(fname,w)=NULL)printf(不能打开文件%s。n,fname);return 0;k=1;while(scanf(”%d”,谢谢观赏,/*scanf返回值表示输入参数的个数*/,67,2019-8-17,【例8】编制从指定的文件中输出整数,并按输出顺序输出到显示屏上。程序从文件循环地输入整数,将整数输出到显示屏。当程序发现不能从文件输入整数时结束循环。,谢谢观赏,68,2019-8-17,#include FILE*fp;int main()int x,k;char fname40;printf(”输入文件名!

32、n”);scanf(”%s%*c”,fname);if(fp=fopen(fname,r)=NULL)printf(不能打开文件%s。n,fname);return 0;k=1;while(fscanf(fp,”%d”,谢谢观赏,69,2019-8-17,谢谢观赏,【例9】求Sn=a+aa+aaa+aaa(n个a之值),其中a是一个十进制数字。#includemain()long sn;int i,a,t,n;printf(“Input n and a:”);scanf(“%d%d”,70,2019-8-17,谢谢观赏,【例10】有一分数序列:2/1,3/2,5/3,8/5,13/8,21/1

33、3,求出这个数列的前n项之和分析:假设这个序列的第k项为tk=ak/bk,有tk+1=(ak+bk)/ak=1+1/tka1=2;b1=1,71,2019-8-17,谢谢观赏,#includemain()int i=1,n,float t,s printf(“Input n:”);scanf(“%d”,72,2019-8-17,谢谢观赏,【例11】用迭代法求。求平方根的迭代公式为要求前后两次求出的x的差的绝对值小于10-5。#includeMain()float a,x1,x2;printf(“Input as value:”);scanf(“%f”,73,2019-8-17,谢谢观赏,【例1

34、2】打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33#includemain()int i,first,second,third;for(i=100;i=999;i+)first=i/100;second=(i/10)%10;third=(i%100)%10;if(i=first*first*first+second*second*second+third*third*third)printf(“%dn”,i);,74,2019-8-17,谢谢观赏,【例13】一个数如果恰好等于它的因子之和,这个数就称

35、为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:6s factors are 1,2,3,75,2019-8-17,谢谢观赏,#includemain()int i,j,sum;for(i=1;i=1000;i+)sum=0;for(j=1;ji;j+)if(i%j=0)sum+=j;if(i=1)printf(“1s factor is 1”)else if(sum=i)printf(“%ds factors are:”);for(j=1;ji;j+)if(i%j=0)printf(“%d,”,j);printf(“n”);,76,2019-8-17,谢谢观赏,第3章作业,习题:1,5,13,18,20,21,23,24,77,2019-8-17,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号