1、第第5讲讲结构化程序设计(结构化程序设计(Part II)2018年10月11日1谢谢观赏2019-8-17谢谢观赏提要提要nC程序简介n函数基础知识n文件的简单用法n简单程序设计实例22019-8-17谢谢观赏提要提要nC程序简介程序简介n函数基础知识n文件的简单用法n简单程序设计实例32019-8-17谢谢观赏C程序简介程序简介n一个C程序可由若干个源程序文件源程序文件组成n一个源文件可以由若干个函数函数和预处理命预处理命令令以及全局变量声明全局变量声明部分组成n 一个函数由变量定义部分变量定义部分和执行语句执行语句组成n一个源程序文件也是可独立编译的单位,所以C程序可以按源程序文件分别编
2、写、分别编译42019-8-17谢谢观赏52019-8-17谢谢观赏C语句语句nC语句是C程序的基本组成单元nC语句可以分为以下5类n空语句n表达式语句n复合语句n控制语句n函数调用语句62019-8-17谢谢观赏C语句(续)语句(续)n控制语句有9种nif() else (条件语句)nswitch (多分支选择语句)nfor() (循环语句)nwhile() (循环语句)ndo while() (循环语句) ncontinue (结束本次循环语句)nbreak (中止执行switch或循环语句)ngoto (转向语句)nreturn (从函数返回语句)72019-8-17谢谢观赏C语句(续)
3、语句(续)n函数调用语句n由一次函数调用加一个分号构成n表达式语句n由一个表达式加一个分号构成,如赋值语句n空语句n只有一个分号的语句,它什么也不做n复合语句n用 把一些语句括起来构成,又称分程序82019-8-17谢谢观赏C程序的三种基本结构程序的三种基本结构n顺序结构n条件控制结构nif else n循环结构nwhile()ndo while()nfor() 92019-8-17谢谢观赏提要提要nC程序简介n函数基础知识函数基础知识n正文文件的简单用法n简单程序设计实例102019-8-17谢谢观赏函数基础知识函数基础知识n结构化程序设计中,将复杂的功能分解成若干简结构化程序设计中,将复杂
4、的功能分解成若干简单的子功能,用函数编码实现子功能,通过调用单的子功能,用函数编码实现子功能,通过调用函数实施子功能要求函数实施子功能要求n函数是一个实现指定功能、逻辑上独立的代码段函数是一个实现指定功能、逻辑上独立的代码段n对函数使用者来说,把它看作对函数使用者来说,把它看作“黑盒黑盒”,只需知,只需知道要传送给函数的数据(输入),和函数执行后道要传送给函数的数据(输入),和函数执行后能得到什么结果(输出)能得到什么结果(输出)n函数可以定义局部对象,使函数在逻辑上作为程函数可以定义局部对象,使函数在逻辑上作为程序的一个相对独立单位,不受主函数或其它函数序的一个相对独立单位,不受主函数或其它
5、函数的程序对象命名的影响的程序对象命名的影响112019-8-17谢谢观赏函数基础知识(续)函数基础知识(续)n函数可带函数可带形参形参,使函数执行时,操作对象、求值方式,使函数执行时,操作对象、求值方式等可随不同调用的需要而改变等可随不同调用的需要而改变n函数为程序的层次构造和开发提供支持,使设计新程函数为程序的层次构造和开发提供支持,使设计新程序能在已有函数基础上构造功能更强的函数和程序序能在已有函数基础上构造功能更强的函数和程序n一个一个C程序以程序以 main()函数作为程序的主函数。程序运函数作为程序的主函数。程序运行时,从它开始执行行时,从它开始执行n在在C语言中,函数不能嵌套定义
6、,一个函数并不从属语言中,函数不能嵌套定义,一个函数并不从属于另一个函数于另一个函数n除不能调用除不能调用 main() 函数外,其它函数可以相互调用函数外,其它函数可以相互调用122019-8-17谢谢观赏函数库函数库n把一些公用的、基本的计算功能所对应的函数集中起来,构成一个库,我们称之为函数库函数库,相应的函数成为库函数库函数n函数库中的函数具有预先定义的、标准的输入、输入接口输入、输入接口nC语言中定义了一些基本的标准函数n编程环境工具厂商(Microsoft、Borland等)往往提供更多的函数供编程者使用132019-8-17谢谢观赏函数库(续)函数库(续)nC语言使用头文(hea
7、der file,即*.h文件文件)对函数库中的函数进行定义和说明n函数库中的函数经编译后,绑定在一起件,构成一个库文件(library file ,即*.lib文件文件)nC程序调用C语言或者编程环境提供的函数时,要在程序中包含(include)相应的头文件;在产生执行文件时,需要与库文件中相应的目标函数代码连接n为了使用方便,C语言按功能分类,提供了大量函数库,每个函数库都有自己的头文件142019-8-17谢谢观赏库函数的使用库函数的使用n使用相应库函数的程序都要在使用之前写上包含其头文件的预处理命令n常用的头文件nstdio.h (输入输出库函数)(输入输出库函数)nmath.h、st
8、dlib.h、float.h (数学库函数)(数学库函数)ntime.h (时间库函数)(时间库函数)nctype.h (字符分类和转换库函数)(字符分类和转换库函数)nstring.h (内存缓冲区和字符串处理库函数)(内存缓冲区和字符串处理库函数)ngraphics.h (图形处理库函数)(图形处理库函数)nmalloc.h、stdlib.h (内存动态分配库函数)(内存动态分配库函数)nsignal.h、process.h (进程控制库函数)(进程控制库函数)152019-8-17谢谢观赏实例实例n实例1:时间函数使用n实例2:随机函数使用(1)n实例3:随机函数使用(2)162019-
9、8-17谢谢观赏#include #include void main() struct tm *tmNow; /* 定义一个时间结构指针变量定义一个时间结构指针变量 */ long secsNow; /* 定义以秒为单位的记录时间的变量定义以秒为单位的记录时间的变量 */ char *strNow; /* 时间字符串表示的字符指针时间字符串表示的字符指针 */ time(&secsNow); /* 调用函数调用函数time(),得到当前时间得到当前时间 */ strNow = ctime(&secsNow); /* 获得时间的字符串表示获得时间的字符串表示 */ printf(自自1970年
10、年1月月1日至现在的时间日至现在的时间(以秒为单位以秒为单位):%ldn, secsNow); printf(当前时间的另一种表示:当前时间的另一种表示:%sn, strNow); tmNow = localtime(&secsNow); /* 获得结构形式的时间获得结构形式的时间 */ printf(存于存于tmNow所指结构中的时间有年中的日、年、月、日、时、分、秒所指结构中的时间有年中的日、年、月、日、时、分、秒:n); printf(%d %d-%02d-%02d %02d:%02d:%02dn, tmNow-tm_yday,tmNow-tm_year+1900, tmNow-tm_m
11、on,tmNow-tm_mday, tmNow-tm_hour,tmNow-tm_min,tmNow-tm_sec); strNow = asctime(tmNow); /* 得到字符串表示的时间得到字符串表示的时间 */ printf(当前时间的另一种表示:当前时间的另一种表示:%sn, strNow);172019-8-17谢谢观赏#include #include #include void main() int k; long now; srand(time(&now) % 60); /* 用时间初始化随机用时间初始化随机 数发生函数的初态,使初态总不相同数发生函数的初态,使初态总不相
12、同 */ for(k = 0; k 10; k+) /* 产生产生10个随机数输出个随机数输出 */ printf(”%dn”, rand(); /* 调用随机函数调用随机函数 */182019-8-17谢谢观赏#include #include #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”); 192019-8-17谢谢观赏函数定义函数定义n函数定义的一般形式为函数定义的一般形式为 类型标识符类型标识符 函
13、数名函数名(形式参数说明表形式参数说明表) 说明和定义部分说明和定义部分 语句序列语句序列 202019-8-17谢谢观赏函数定义(续)函数定义(续)n类型标识符用于标识函数执行结果返回值的类型n当函数执行不返回值时,习惯用void来标记n当函数返回int型值时,类型标识符int可以省略n函数名是一个标识符,一个C程序有且只有一个main()函数,其它的函数名可以随意命名212019-8-17谢谢观赏函数定义(续)函数定义(续)n函数名之后括号内的形式参数说明表是按需要而定n没有形参的函数,也就没有形参说明表,常用void代之,但函数名之后的一对圆括号不可省略n当函数有多个形参时,形参说明之间
14、用逗号分隔,每个形参说明指定形参的类型类型和形参形参名名222019-8-17谢谢观赏函数定义(续)函数定义(续)n最外层花括号最外层花括号“”和和“”括住的部分括住的部分是函数体是函数体n在函数体的前面部分可有函数需要的程序对在函数体的前面部分可有函数需要的程序对象的说明和定义象的说明和定义n函数体内定义的变量是局部变量,只能在函函数体内定义的变量是局部变量,只能在函数体内引用它们数体内引用它们n说明和定义之后是由语句序列组成的执行代说明和定义之后是由语句序列组成的执行代码码232019-8-17谢谢观赏例子例子1n求两个数中最小值的函数求两个数中最小值的函数min()double min(
15、double x, double y) /* 返回返回 double 型值,有两个形参型值,有两个形参 x,y,都为,都为 double 型的型的 */ /* 函数返回函数返回x和和y中的小者的值中的小者的值 */ return x b;ngcd(a, b) = gcd(a, b-a), 如如a b) a -= b; else b -= a; return a; 第第1解法解法262019-8-17谢谢观赏n步骤:n求余数求余数 求求a除除b的余数的余数rn判结束判结束 如如r等于等于0,b为最大公约数为最大公约数n替换替换 用用b置置a,r置置b,并回到步骤,并回到步骤求余数求余数 第第2解
16、法解法272019-8-17谢谢观赏 int gcd(int a, int b) int r; while(1) if(r = a % b) = 0) break; a = b; b = r; return b; 282019-8-17谢谢观赏 int gcd(int a, int b) int r = a; do a = b; b = r; r = a % b; while (r); return b; 292019-8-17谢谢观赏函数定义(续)函数定义(续)nC语言也允许在函数名后的圆括号内只给出各形参语言也允许在函数名后的圆括号内只给出各形参的名,随后才指定各形参的类型,但这种写法在的
17、名,随后才指定各形参的类型,但这种写法在C+中已不允许中已不允许ndouble min(x, y)ndouble x, y;nn return x y ? x : y;nnC语言还允许函数体为空的函数语言还允许函数体为空的函数ndummy() /* 或或 dummy(void) */nn302019-8-17谢谢观赏函数调用函数调用n函数被定义以后,凡要实现函数功能的地函数被定义以后,凡要实现函数功能的地方,就可简单地通过函数调用来完成方,就可简单地通过函数调用来完成n函数调用的一般形式为函数调用的一般形式为n函数名(实在参数表)函数名(实在参数表)n实在参数,简称实参。函数调用时,实参实在参
18、数,简称实参。函数调用时,实参按它们出现的顺序与函数定义中的形参一按它们出现的顺序与函数定义中的形参一一对应,并要求实参类型与其对应的形参一对应,并要求实参类型与其对应的形参类型相一致类型相一致312019-8-17谢谢观赏函数调用(续)函数调用(续)n函数调用有两种方式函数调用有两种方式n传值调用(传值调用(call by value)n把实参的值传给被调用函数的参数(形参)。这把实参的值传给被调用函数的参数(形参)。这时,被调用函数对参数的改变,不影响调用函数时,被调用函数对参数的改变,不影响调用函数实参的原始值实参的原始值n传引用调用(传引用调用(call by reference)n把
19、实参的地址传给被调用函数的参数(形参)地把实参的地址传给被调用函数的参数(形参)地址。这时,被调用函数对参数的改变,将影响到址。这时,被调用函数对参数的改变,将影响到调用函数实参的原始值调用函数实参的原始值322019-8-17谢谢观赏函数调用(续)函数调用(续)n对double min(double x, double y)的函数调用 w = min(u, v);n函数调用min(u, v)就是对函数min()的调用,它提供了两个实参u和v,分别对应形参x和yn如果调用无形参的函数,这时函数的调用形式变为n函数名()n其中函数名之后的一对圆括号是不能省略的 332019-8-17谢谢观赏函数
20、调用(续)函数调用(续)n按函数调用在程序中的作用,有两种不同类型的应用n函数调用只是利用函数所完成的功能函数调用只是利用函数所完成的功能。此时,将函数调用作为一个独立的语句。这种应用不要求或无视函数的返回值n如程序中经常使用的调用格式输入函数scanf()和格式输出函数printf()等。n函数调用是利用函数的返回值函数调用是利用函数的返回值:或用这返回值继续进行表达式的计算,或输出函数返回值等342019-8-17谢谢观赏函数调用的执行过程函数调用的执行过程1.为形参分配内存空间为形参分配内存空间2.计算实参表达式的值,并将值赋给对应的形参计算实参表达式的值,并将值赋给对应的形参3.为函数
21、的局部变量分配内存空间为函数的局部变量分配内存空间4.执行函数体内的语句序列执行函数体内的语句序列5.函数体执行完,或执行了函数体执行完,或执行了return语句后,释放为语句后,释放为这次函数调用分配的全部内存空间这次函数调用分配的全部内存空间6.将函数值(如果有)返回到函数调用处继续执行将函数值(如果有)返回到函数调用处继续执行352019-8-17谢谢观赏#include double x, y, d, min(double, double); void main() printf(“Enter x,y.n”); scanf(“%lf%lf”,&x,&y); d = min(x, y);
22、 printf(“MIN(%.3f, %.3f) = %.3fn”, x, y, d);double min(double a, double b) double temp; temp = a b ? b : a; return temp;362019-8-17谢谢观赏对函数调用的说明对函数调用的说明n当函数执行当函数执行return语句或执行完函数体的语句序语句或执行完函数体的语句序列后,函数的这次调用就结束,随之将控制返回列后,函数的这次调用就结束,随之将控制返回到函数调用处继续执行到函数调用处继续执行n函数的返回值是通过执行函数的返回值是通过执行return 语句时,计算语句时,计算re
23、turn之后的表达式值而获得的。如果函数不提之后的表达式值而获得的。如果函数不提供返回值,则供返回值,则return语句不包含表达式。语句不包含表达式。n如果函数有返回值,则应有确定的类型,并在函如果函数有返回值,则应有确定的类型,并在函数定义时指明。数定义时指明。若函数定义时不指明返回值类型,若函数定义时不指明返回值类型,且函数有返回值,且函数有返回值,C语言约定该函数的返回值类语言约定该函数的返回值类型为型为int型型372019-8-17谢谢观赏对函数调用的说明(续)对函数调用的说明(续)n为了明确指明函数不提供返回值,建议在函数定义时,为了明确指明函数不提供返回值,建议在函数定义时,在
24、函数名之前写上在函数名之前写上void。并在这样的函数体内,所有的。并在这样的函数体内,所有的return语句都不带表达式语句都不带表达式n当函数执行不带表达式的当函数执行不带表达式的return语句返回时,函数并不语句返回时,函数并不是一定不带回值,而是返回一个不确定的值。这时,不是一定不带回值,而是返回一个不确定的值。这时,不应该利用函数返回值进行再计算,否则会产生错误结果应该利用函数返回值进行再计算,否则会产生错误结果n函数定义中的函数定义中的return语句的表达式类型应与函数定义中语句的表达式类型应与函数定义中指明的返回值类型相一致。如果指明的返回值类型相一致。如果return语句中
25、的表达式语句中的表达式类型与函数定义指明的返回值类型不一致时,对于基本类型与函数定义指明的返回值类型不一致时,对于基本类型情况,类型情况,则以函数的返回值类型为准,系统会自动进则以函数的返回值类型为准,系统会自动进行类型转换行类型转换382019-8-17谢谢观赏实参向形参单向传递数据实参向形参单向传递数据n在函数未被调用时,函数定义中的形参和函数体在函数未被调用时,函数定义中的形参和函数体中定义的局部变量并不占用存储单元中定义的局部变量并不占用存储单元n在函数定义中,必须为函数的形参指定数据类型在函数定义中,必须为函数的形参指定数据类型n函数体中所使用的形参的初值是由函数调用时对函数体中所使
26、用的形参的初值是由函数调用时对应的实参表达式给定的应的实参表达式给定的nC语言规定,实参表达式对形参的数据传递是语言规定,实参表达式对形参的数据传递是“值传递值传递”的,即单向传递的,即单向传递n对于有多个实参的函数调用情况,对于有多个实参的函数调用情况,C语言不规定语言不规定实参的求值次序实参的求值次序392019-8-17谢谢观赏提要提要nC程序简介n函数基础知识n文件的简单用法文件的简单用法n简单程序设计实例402019-8-17谢谢观赏文件的简单用法文件的简单用法n介绍这部分内容的目的介绍这部分内容的目的n学习编写从文件输入数据和把结果输出到文学习编写从文件输入数据和把结果输出到文件的
27、程序件的程序n了解使用文件程序的结构了解使用文件程序的结构n掌握文件的一般使用方法掌握文件的一般使用方法n熟悉一些和文件操作有关的库函数的用法熟悉一些和文件操作有关的库函数的用法涉及一些较深的概念先暂且接受!涉及一些较深的概念先暂且接受!412019-8-17谢谢观赏定义文件变量定义文件变量n在程序的开始处定义文件指针变量,和在程序的开始处定义文件指针变量,和存储文件名的字符数组存储文件名的字符数组 #include FILE *fp; /* 定义文件指针变量定义文件指针变量fp */ char fname40; /* 存储文件目录路径和文件存储文件目录路径和文件名的字符数组名的字符数组 */
28、422019-8-17谢谢观赏输入文件名输入文件名printf(”输入文件名输入文件名(包括目录路径、扩展名包括目录路径、扩展名)n”);scanf(”%s%*c”,fname);/* 输入文件名及回车符输入文件名及回车符 */432019-8-17谢谢观赏打开文件打开文件n程序从正文文件输入数据程序从正文文件输入数据n程序向正文文件输出结果程序向正文文件输出结果n若被打开文件不存在,则建立一个新文件;若被打开文件已若被打开文件不存在,则建立一个新文件;若被打开文件已存在,则该文件中的数据被删除存在,则该文件中的数据被删除if (fp = fopen(fname, ”r”) = NULL) p
29、rintf(”%s文件不能打开文件不能打开n”, fname); return;fp=fopen(fname,”w”); /* 为写打开文件为写打开文件*/读打开时,要求被读打开时,要求被打开文件已存在打开文件已存在442019-8-17谢谢观赏关闭文件关闭文件n文件使用结束后,要及时关闭文件使用结束后,要及时关闭fclose(fp); /* 以后以后fp又可用于打开文件又可用于打开文件 */452019-8-17谢谢观赏文件输入输出文件输入输出n调用函数调用函数fgetc()从文件输出下一个字符()从文件输出下一个字符nch=fgetc(fp); /* 将输入字符存于变量将输入字符存于变量c
30、h */n调用函数调用函数fscanf()从文件按指定格式输出数据从文件按指定格式输出数据nfscanf(fp,”%d%d”,&k,&j); /* 从文件输出整数从文件输出整数 */n调用函数调用函数fputc()向文件输入一个字符()向文件输入一个字符nfputc(ch, fp); /* 将变量将变量ch中的字符输出到文件中的字符输出到文件*/n调用函数调用函数fprintf()向文件按指定格式输入数据向文件按指定格式输入数据nfprintf(fp,”%d %dn”, k, j); /* 向文件输入整数向文件输入整数 */462019-8-17谢谢观赏从文件逐一输出字符从文件逐一输出字符in
31、t c; /* 不能为不能为char类型类型 */ FILE *fp; /* 说明有关变量和设置初值等说明有关变量和设置初值等 */ if (fp = fopen(文件名文件名, ”r”) = NULL) printf(”不能打开文件不能打开文件 %s。n”, 文件名文件名); return; while(c = fgetc(fp) != EOF) /* 对刚读入的字符信息对刚读入的字符信息 c 作某种处理作某种处理 */ fclose(fp); /* 输出处理结果输出处理结果 */472019-8-17谢谢观赏字符逐一输入形成新文件字符逐一输入形成新文件 int c; /* 也可以是也可以是
32、char类型类型 */ FILE *fp; /* 说明有关变量和设置初值等说明有关变量和设置初值等 */ fp = fopen(文件名文件名,”w”); while(还有字符还有字符) /* 生成字符生成字符(或字节或字节)存于变量存于变量c */ fputc(c, fp); /* 将生成的字符输出将生成的字符输出 */ fclose(fp); /* 输出程序结束报告输出程序结束报告 */482019-8-17谢谢观赏例子例子n将键盘输入的字符流复制到指定的文件将键盘输入的字符流复制到指定的文件n逐行复制从键盘输入字符到指定文件,直至逐行复制从键盘输入字符到指定文件,直至输入空行结束输入空行结
33、束492019-8-17谢谢观赏#include 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); /* 处理当前行处理当前行 */ fp
34、utc(ch, fp); /* 输出换行符输出换行符 */ fclose(fp); printf(”程序复制键盘输入字符结束。程序复制键盘输入字符结束。n”);502019-8-17谢谢观赏提要提要nC程序简介n函数基础知识n正文文件的简单用法n简单程序设计实例简单程序设计实例512019-8-17【例例1】输入整数输入整数n,输出由,输出由2*n+1行行2*n+1列,以下列,以下形式形式(n = 2)的图案。的图案。 * * * * * * * * * * * * *n图案分成两部分,上面由图案分成两部分,上面由n+1行,下面有行,下面有n行行n图案中,同一行上的两个星号字符之间有一个空格符
35、图案中,同一行上的两个星号字符之间有一个空格符n对于上半部分,设第一行的星号字符位于屏幕的中间,则后对于上半部分,设第一行的星号字符位于屏幕的中间,则后行图案的起始位置比前行起始位置提前两个位置行图案的起始位置比前行起始位置提前两个位置n对于下半部,第一行的起始位置比上半部最后一行起始位置对于下半部,第一行的起始位置比上半部最后一行起始位置前进两个字符位置,以后各行也相继进两个位置前进两个字符位置,以后各行也相继进两个位置谢谢观赏522019-8-17#include void main() int n, j, k; printf(Enter n!n); scanf(%d, &n); for(
36、j = 0;j = n; j+) printf(%*c, 40 - 2*j, ); for(k = 1; k = 0; j-) printf(%*c, 40 - 2*j, ); for(k = 1; k = 2*j+1; k+) printf( *); printf(n); 谢谢观赏 “%*c”中的中的*表示输入宽度由后面的参量值确定表示输入宽度由后面的参量值确定532019-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
37、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谢谢观赏542019-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+) printf(t%d, i); for(j = 1; j2) 个整数个整数, 输出输出其中的次最大数。其中的次最大数。为求次最大,程序在循环过程中需保留两个数,当前为求次最大,程序在循环过程中需保留两个数,当前暂时最大数
38、暂时最大数max1和当前暂时次最大数和当前暂时次最大数max2。程序将输入的第一个数暂时保留,待输入第二个数后,程序将输入的第一个数暂时保留,待输入第二个数后,确定确定max1和和max2。从第三个输入数从第三个输入数x开始,根据开始,根据x调整调整max1和和max2。调。调整过程需考虑以下几种可能:整过程需考虑以下几种可能:xmax1,则以,则以max1作为新的作为新的max2,x作为新的作为新的max1;max1xmax2,则以,则以x作为新的作为新的max2;xmax2,则不调整。,则不调整。谢谢观赏562019-8-17#include void main() int n, i, m
39、ax1, max2, x, temp; printf(输入输入 n(=2)!n); scanf(%d, &n); if (n 2) return; printf(输入第输入第 %d 个整数个整数. , 1); scanf(%d, &temp); printf(输入第输入第 %d 个整数个整数. , 2); scanf(%d, &x); if (temp x) max1 = x; max2 = temp; 谢谢观赏572019-8-17 else max1 = temp; max2 = x; for(i = 3; i max1) max2 = max1; max1 = x; else if (x
40、 max2) max2 = x; printf(次最大是次最大是 %dnn, max2);谢谢观赏582019-8-17【例例4】编制对给定的整数,判该整数是否是质编制对给定的整数,判该整数是否是质数的函数,若是质数,函数返回数的函数,若是质数,函数返回1,否则函数返,否则函数返回回0。 判一个整数判一个整数n是否是一个质数有许多方法:是否是一个质数有许多方法:如如n=2,则,则n是质数;是质数;若若n是其它偶数,则是其它偶数,则n不是质数;不是质数;让整数变量让整数变量k自自3开始,每次增开始,每次增2,直至,直至k 的平方的平方超过超过n为止,若其中某个为止,若其中某个k能整除能整除n,则
41、,则n不是质不是质数。若所有这样的数。若所有这样的k都不能整除都不能整除n,则,则n是质数。是质数。谢谢观赏592019-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; 602019-8-17【例例5】编制输入整数,输出小于等于该整数的全部质编制输入整数,输出小于等于该整数的全部质数的程序。数的程序。程序首先输出质数程序首先输出质数2,之后对指定范围内的,之后对指定范围内的奇数采用例奇数采用例4的方法
42、判其是否是质数。的方法判其是否是质数。#include void main() long m, n; int j; /* j控制每行输出控制每行输出10个质数个质数 */ printf(”输入整数输入整数n”); scanf(”%ld”, &m); printf(”%6d”, 2); j = 1; for(n = 3L; n = Epsilon) s += t; /* 累计当前项累计当前项tk到部分和到部分和 */ t = f(t,k);/* 由当前项由当前项t和和k计算下一个当前项的值计算下一个当前项的值 */ k+; /* 项序号增项序号增1 */ 谢谢观赏632019-8-17对于本题,
43、首项值为对于本题,首项值为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的
44、值由输入给定,写的值由输入给定,写出程序如下:出程序如下:谢谢观赏642019-8-17#include #include #define Epsilon 0.000001 void main() int k; double s, x, t; printf(“Enter x.n”); scanf(“%lf”, &x); s = 0.0; /* 级数的部分和变量级数的部分和变量s置初值置初值0 */ t = x; /* 置通项变量置通项变量t为级数的首项值为级数的首项值 */ k = 0; /* 置项序号变量置项序号变量k为为0 */ while (fabs(t) = Epsilon) s +=
45、 t; t = -t*x*x*(2.0*k+1)/(2.0*k+3)*(k+1); k+; /* 项序号增项序号增1 */ printf(“s(%f) = %fn”, x, s);谢谢观赏652019-8-17【例例7】编制从键盘输入整数序列,并按输入顺编制从键盘输入整数序列,并按输入顺序输出到指定的文件中的程序。序输出到指定的文件中的程序。 程序循环地从键盘输入整数,将整数输出到程序循环地从键盘输入整数,将整数输出到指定的文件中。当程序发现不能从键盘输入整指定的文件中。当程序发现不能从键盘输入整数时结束循环。数时结束循环。谢谢观赏662019-8-17#include FILE *fp;in
46、t main() int x, k; char fname40; printf(”输入文件名输入文件名!n”);scanf(”%s%*c”, fname); if (fp=fopen(fname, w) = NULL) printf(不能打开文件不能打开文件 %s。n, fname); return 0; k = 1; while(scanf(”%d”, &x) = 1) fprintf(fp, ”%dt”, x); if (k+ % 5 = 0) fprintf(fp, ”n”); fclose(fp); printf(”n输出了输出了 %d个整数个整数.n”, k-1); return 1
47、;谢谢观赏/* scanf返回值表示输入参数的个数返回值表示输入参数的个数 */672019-8-17【例例8】编制从指定的文件中输出整数,并按输编制从指定的文件中输出整数,并按输出顺序输出到显示屏上。出顺序输出到显示屏上。 程序从文件循环地输入整数,将整数输出到程序从文件循环地输入整数,将整数输出到显示屏。当程序发现不能从文件输入整数时结显示屏。当程序发现不能从文件输入整数时结束循环。束循环。谢谢观赏682019-8-17#include FILE *fp;int main() int x, k; char fname40; printf(”输入文件名输入文件名!n”); scanf(”%s
48、%*c”, fname); if (fp=fopen(fname, r) = NULL) printf(不能打开文件不能打开文件 %s。n, fname); return 0; k = 1; while(fscanf(fp, ”%d”, &x) = 1) printf(”%dt”, x); if (k+ % 5 = 0) printf(”n”); fclose(fp); printf(”n从文件从文件 %s输入了输入了 %d个整数个整数.n”, fname, k-1); return 1;谢谢观赏692019-8-17谢谢观赏【例例9】求Sn=a+aa+aaa+aaa(n个a之值),其中a是一
49、个十进制数字。#includemain() long sn; int i, a, t, n; printf(“Input n and a:”); scanf(“%d %d”, &n, &a); t=a;sn=0;i=1; do sn+=t; i+;t=t*10+a; while(in); printf(“Sn=%ln”, sn);702019-8-17谢谢观赏n【例例10】有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13, 求出这个数列的前n项之和n分析:n假设这个序列的第k项为tk=ak/bk,有tk+1=(ak+bk)/ak=1+1/tkna1=2; b1=1712019
50、-8-17谢谢观赏#includemain() int i=1,n, float t, s printf(“Input n:”); scanf(“%d”, &n); s=0.0;t=2.0 while(i=n) s+=t; t=1.0+1.0/t;i+ printf(“The sum is: %f”, s);722019-8-17谢谢观赏【例例11】用迭代法求 。求平方根的迭代公式为要求前后两次求出的x的差的绝对值小于10-5。#includeMain()float a, x1,x2; printf(“Input as value:”); scanf(“%f”, &a); x1=a; do x