版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、4.1 4.1 模块化程序设计与函数模块化程序设计与函数4.2 4.2 函数的定义与调用函数的定义与调用4.3 4.3 函数的递归调用函数的递归调用4.4 4.4 变量作用域与存储方式变量作用域与存储方式4.5 4.5 编译预处理编译预处理4.6 4.6 函数设计举例函数设计举例C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页教学目的和基本要求:教学目的和基本要求:要求学生了解模块化程序设计的思想,掌握函数的定义及调用,理解变量的作用域与存储方式的概念,理解编译预处理的概念。 教学重点:教学重点:函数的定义及调用、递归调用、变量的作用域。 C语言程序设计C语言程
2、序设计C语言程序设计C语言程序设计上一页上一页下一页下一页4.1模块化程序设计与函数模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题。部分,逐步细化,直至分解成很容易求解的小问题。这样的话,原来问题的解就可以用这些小问题来表示。这样的话,原来问题的解就可以用这些小问题来表示。 把复杂任务细分成多个问题的过程,就叫程序的把复杂任务细分成多个问题的过程,就叫程序的模块化。模块化程序设计是靠设计函数和调用
3、函数实模块化。模块化程序设计是靠设计函数和调用函数实现的。现的。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页模块与函数 C语言程序由基本语句和函数组成,每个函数可完成相对独立的语言程序由基本语句和函数组成,每个函数可完成相对独立的任务,依一定的规则调用这些函数,就组成了解决某个特定问题的任务,依一定的规则调用这些函数,就组成了解决某个特定问题的程序。程序。任务、模块与函数的关系任务、模块与函数的关系:任务模块模块模块函数函数函数函数函数函数C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页看这样一个问题:求200,1000的双胞
4、胎数的对数。双胞胎数:两素数差为2称为双胞胎数。 这是我们上一章结束的一道练习题,下面的左边是我们当时编的程序。main( ) int a,b,n=0,I; for(a=200;a=998;a+) for(I=2;Ia;I+) if(a%I=0) break; if(a=i) b=a+2; for(I=2;Ib;I+) if(b%I=0) break; if(b=i) n+; printf(“n%d”,n);我们注意到,程序中用 筐住的部分是完成了相同的功能,即判断一个数(a或b)是否是素数。我们可以考虑用一个独立的函数来完成判断素数的功能,在主函数中调用此函数即可。如下:main( ) in
5、t a,b,n=0; int f(int x); for(a=200;a=998;a+) if(f(a)=1) b=a+2; if(f(b)=1) n+; printf(“n%d”,n);int f(int x) int I; for(I=2;Ix;I+) if(x%I=0) break; if(x=I) return 1; else return 0;下面我们详细介绍函数调用的格式和语法规定。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页4.2 函数的定义与调用在C语言中,函数(Function)是一个处理过程,可以进行数值运算、信息处理、控制决策,即一段程
6、序的工作放在函数中进行,函数结束时可以携带或不带处理结果。 库函数(标准函数):系统提供自定义函数:用户自己写C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页C语言程序处理过程全部都是以函数形式出现,最简单的程序至少也有一个main函数。函数必须先定义和声明后才能调用。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页标准库函数C语言有丰富的库函数,这些函数的说明在不同的头文件(*.h)中。想要调用标准的库函数,就必须include。#includemain()printf(“%d”,1024*768);调用printf函数时,必须
7、includeC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页自定义函数可以把完成一个任务的过程写成函数。int A_to_a(int capital)int small; if (capital=A & capital=Z) small= capital (A-a); return small;返回值类型名函数名注意不要与已有库函数重名参数说明和参数列表调用函数时输入参数的格式要与之相同定义局部变量最好只使用局部变量,这样将方便调试。返回值如果不需返回则可return 0;另外请注意这样的判断,如写成AcapitalZ是不行的C语言程序设计C语言程序设
8、计C语言程序设计C语言程序设计上一页上一页下一页下一页“函数”的主要知识点函数的定义 函数的参数和返回值 函数的调用 嵌套和递归 变量的作用域C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数举例 #include main() int a,b,m; /*说明变量*/ int max(int a,int b); /*函数声明*/ scanf(%d,%d,&a,&b); /*调用库函数scanf*/ m=max(a,b); /*调用字定义函数max*/ printf(max=%dn,m); /*调用库函数printf*/ getch(); /*调
9、用库函数getch*/C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数举例int max(int a,int b) /*定义函数max*/ int y; y=(ab)? a:b; /*条件表达式 */ return y;if(ab) y=a; else y=b;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页自定义函数的声明自定义函数在调用前应先声明。使系统知道将要用到某个函数及它的类型,以便处理。函数声明应与该函数定义时给出的函数类型与名字、形参的个数、类型、次序相一致。#include “stdio.h”void main
10、()float x,y; int n; float power (float x, int n); scanf(%f,%d, &x, &n); y = power(x, n); printf(“%8.2f”,y );float power( float x, int n) int i; float t=1; for(i=1; i=n; i+) t = t * x; return t; C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求1!+2!+3!+10!算法 i =1; s=0; 当 i = 10 s=s+ i! 定义求 i! 的函数C语言程
11、序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求1!+2!+3!+10! 程序void main() long mm( int ); /*自定义求阶乘函数应先声明 */ int i; long s=0; for (i =1; i =10; i +) s+= mm(i ); /*调用求阶乘函数,求I的阶乘 */ printf(“n%ld”,s);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页定义求 n! 的函数long mm( int n) long t=1; int i; for (i =1; i b)? a:b; return y;
12、 调用时:m=max(3,6); m=max(a,b); 括号里是形式参数返回值括号里是实参在这一句调用时,形参的值是3和6其返回值y将被赋给调用语句中的mC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页形式参数与实际参数的关系n 形式参数在函数中是变量名, 在函数调用时,形参被分配相应的内存n 实际参数是表达式 负责向对应的形参标识的内存单元传递数据n 实参与形参必须个数相同n 对应的形参和实参的类型必须一致C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页实参与形参例:主调函数中有如下语句: scanf(%d,%d,&a
13、,&b); m=max(a,b+3);如果输入 6,2函数 int max(int a,int b)形参 a 得到第一个实际参数a的值 6形参 b 得到第二个实际参数b+3的值 5C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数返回值函数返回值通过return语句获得函数返回值的类型就是函数的类型 return y; 将变量y的值返回给调用者 return y+3; 将表达式的值返回给调用者C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页return 的数据类型与函数的类型矛盾时,自动将数据转换成函数的类型int fu
14、nct1() char ch; while (ch=getch( )z) ; return ch; 调用: i=funct1(); /* 返回的是int类型 */C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数没有返回值, 函数定义成空类型void putline() int i; for (i=0;i35;i+) printf(-); printf(n); 函数的功能就是输出函数的功能就是输出35个个-调用调用: putline( ); 应该的语句形式应该的语句形式 i=putline( ); 是错的是错的C语言程序设计C语言程序设计C语言程序设计C语言程
15、序设计上一页上一页下一页下一页调用函数a=function(x,y);或者function(x,y);取返回值只是操作解决更复杂问题时可以嵌套调用。n n) )! !( (m mn n! !m m! !C Cn nm mlong fac(int k)long f=1; int i; for(i=1;i=n;i+) f=f*i; retrun f;long combination(int n ,int m)long c; int i; c=fac(m)/(fac(n)*fac(m-n) ); retrun c;主函数:main( ) int n,m; long c; scanf(“%d,%d”,
16、 &n,&m); c=combination (n,m); prnit(“%ld”, c); 理论上可以a(b(d(e(x),c(f)般嵌套无数层。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页4.3 函数的递归调用函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别的函数调用自己为间接递归。void a( ). a( );.void a( ). b( ); .void b( ). a( ); .递归在解决某些问题中,是一个十分有用的方法。因为其一,有的问题它本身就是递归定义的;其二,它可以使某些看起来不易解决的问题变得容易解决,写
17、出的程序较简短。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归方法求n! 由于 n!= n*(n-1)! 是递归定义所以求n! (n-1)! (n-1)! (n-2)!(n 2)! (n-3)! 0!的问题, 根据公式有0!=1。 再反过来依次求出1!,2!直到最后求出n!。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归方法求n!long fac( int n)long f; if (n=0) f=1; else f=n* fac(n-1); return f;main( )long y; int n; scanf(“
18、%d”,&n); y=fac(n); printf(“%d!=%ld”,n,y); 刚开始的时候,这个n是前面输入的需要阶乘的n所以在这里带入的值是n而这个函数里又调用了本身,不过参数已经变成了n-1所以这里再次调用时参数已经变成了n-1注意:上次调用fac(n)还没有完,只是由于遇到了fac(n-1)而执行fac(n-1)去了.而在调用fac(n-1)时同样遇到了要调用fac(n-2)的问题,于是一层一层的包裹下去,每次调用的时候都会在内部调用一个结构相同但变量不同的函数,直到。直到调用到fac(0)时,由于内部if判断,已经不需要再继续调用另一个fac(n-1),而直接有了f=1f
19、ac(0)已经执行完毕,它的返回值被fac(1)中的f=n*fac(n-1)语句赋给了f值,同时返回了f。而这个返回的f又被fac(2)乘上当前的n值以后继续返回f直到最后的fac(n)都做完了,f的值被返回到了它的调用点:主函数中,这样就是一个递归运算。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归举例问题: 第1个月有1对兔子 过2个月,兔子就可每个月生1对兔子 问第n个月有多少对兔子? 分析: 设第n个月有f(n)对兔子 根据题意有 f(0)=0, f(1)=1 f(n)= f(n-1) + f(n-2) f(n-1): 前一个月的兔子数 f(n-2
20、): 本月生的兔子数 C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页定义函数f(n)long f(int n ) switch (n ) case 0: return 0; break ; case 1: return 1; break ; default: return f(n-1) + f(n-2); /*调用函数f(n) */ C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页兔子问题主函数void main() long f(int n ); /*自定义函数声明 */int n; printf(“n input n:”);
21、scanf(“%d”,&n); printf(“n f(%d)=%ld”,n, f(n) ); /*调用函数f(n) */C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页辗转相除法求最大公约数 求 m和 n 的公约数算法 if (m % n) = 0 n 是公约数; else 求 n 和 m % n 的公约数; C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求最大公约数的递归算法 int gcd(int m, int n) if (m % n) = 0 return n ; else return gcd(n, m %
22、n); C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求最大公约数的主函数void main() int m,n,t;int gcd(int m, int n);scanf(“%d %d”,&m,&n);if (mn) t=m; m=n; n=t; t= gcd( m, n); /*调用函数gcd( m, n); */ print(“n gcd=%d”,t);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页4.4 变量作用域与存储方式先看一个例子,错在那里?:void f1( ) int t=2; a *= t;
23、 b /= t; main() int a, b; printf(“ Enter a,b:”); scanf(“%d,%d”, &a, &b); f1( ); /* 调用函数f1( ) */ printf (“a=%d,b=%d”, a, b); 编译程序会提示出错: Undefined symbol a 和 Undefined symbol b 。为什么?C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页一.变量的作用域 即变量的有效范围1.变量按作用域分为全局变量全局变量和局部变量局部变量2.比较: 全局变量(外部变量) 局部变量(内部变量)定
24、义位置: 函数体外 函数体内作用域 : 从定义处到本源 从定义处到本函数结束文件结束举例 : 所有函数体外定义的变量 (1)所有在函数体内定义 (2)形式参数注意与局部变量同名的处理 局部变量屏蔽全局变量不同函数中同名局部变量互不干扰 C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 3 3、局部变量 C C语言程序是由函数组成的,有且只能有一个语言程序是由函数组成的,有且只能有一个mainmain函数。函数。 变量定义可以出现在函数内,亦可出现在函数外或者是函变量定义可以出现在函数内,亦可出现在函数外或者是函数的参数中。数的参数中。按照变量定义语句出现的位置,
25、可以分为:按照变量定义语句出现的位置,可以分为:局部变量:局部变量:在函数或复合语句内定义;在函数或复合语句内定义; 只在该函数或复合语句中才能使用。只在该函数或复合语句中才能使用。 全局变量:全局变量:在函数外定义;在函数外定义; 从它被定义的位置起从它被定义的位置起, ,在在之后的之后的所有函数中有效。所有函数中有效。形式参数:形式参数:定义为函数的参数;定义为函数的参数; 只在该函数中才能使用。只在该函数中才能使用。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 在函数内部说明的变量或者在复合语句中定义的变在函数内部说明的变量或者在复合语句中定义的变量称
26、为局部变量。其作用范围是其所在的函数或复合量称为局部变量。其作用范围是其所在的函数或复合语句。语句。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 又称全程变量又称全程变量或外部变量,在或外部变量,在函数外部说明。函数外部说明。其作用范围从它其作用范围从它被定义的位置起,被定义的位置起,在之后的程序段在之后的程序段中都是起作用的。中都是起作用的。4、全局变量C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 如果在全局变量定义之前的函数想引用该外部变如果在全局变量定义之前的函数想引用该外部变量,则应该在该函数中用关键字量,则应该在
27、该函数中用关键字externextern作作“外部变外部变量说明量说明”。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页int a, b; int a, b; void swap( ) void swap( ) int t; int t; t = a; a = b; b = t; t = a; a = b; b = t; printf(“swap:a=%d,b=%dn”,a,b); printf(“swap:a=%d,b=%dn”,a,b); main()main() printf( printf(“ Enter a,b: Enter a,b:”);); sc
28、anf( scanf(“%d,%d%d,%d”, &a, &b);, &a, &b); swap( ); swap( ); printf ( printf (“main:a=%d,b=%dmain:a=%d,b=%d”,a,b); ,a,b); Enter a,b:Enter a,b:5,35,3 swap:a=3,b=5swap:a=3,b=5main:a=3,b=5main:a=3,b=5运行结果运行结果C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页int a, b; int a, b; void swap( ) void
29、swap( ) int t; int t; t = a; a = b; b = t; t = a; a = b; b = t; printf(“swap:a=%d,b=%dn”,a,b); printf(“swap:a=%d,b=%dn”,a,b); main()main() printf( printf(“ Enter a,b: Enter a,b:”);); scanf( scanf(“%d,%d%d,%d”, &a, &b);, &a, &b); swap( ); swap( ); printf ( printf (“main:a=%d,b=%dmain:
30、a=%d,b=%d”,a,b); ,a,b); 运行结果运行结果int a,b;int a,b;程序在编译时,屏幕将程序在编译时,屏幕将提示有错误提示有错误: : Undefine symbol aUndefine symbol a Undefine symbol b Undefine symbol bC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页int a, b; int a, b; void swap( ) void swap( ) int t; int t; t = a; a = b; b = t; t = a; a = b; b = t; printf
31、(“swap:a=%d,b=%dn”,a,b); printf(“swap:a=%d,b=%dn”,a,b); main()main() printf( printf(“ Enter a,b: Enter a,b:”);); scanf( scanf(“%d,%d%d,%d”, &a, &b);, &a, &b); swap( ); swap( ); printf ( printf (“main:a=%d,b=%dmain:a=%d,b=%d”,a,b); ,a,b); 运行结果运行结果int a,b;int a,b;int a=5,b=3;int a=5,b=
32、3;Enter a,b:Enter a,b:5,35,3 swap:a=3,b=5swap:a=3,b=5main:a=5,b=3main:a=5,b=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页#include int a,b; /*a,b为全局变量*/ void f1(int x ) int t1,t2,a; a=t1 = x* 4; t2 = b * 3; b = 10; printf (“f1:t1=%d,t2=%d,a=%d,b=%dn”, t1,t2,a,b); main( ) a=2; b=4; /* 此a,b是全局变量,赋值 */ f1(
33、a); /* 调用函数f1( ) */ printf (“main: a=%d,b=%d”, a, b); 程序输出结果为: f1:t1=8,t2=12,a=8,b=10main:a=2,b=10C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页若将程序改为:#include int a=2,b=4; /*a,b为全局变量*/ void f1( ) int t1,t2; t1 = a * 2; t2 = b * 3; b = 100; printf (“t1=%d,t2=%d,b=%dn”, t1, t2,b); main() int b=4; /* 此b是局部变
34、量,赋值 */ f1( ); /* 调用函数f1( ) */ printf (“a=%d,b=%d”, a, b); 结论:全局变量与局部变量同名时,局部变量起作用,全局变量被屏蔽(不影响),应小心使用程序输出结果为:t1=4,t2=12,b=100a=2,b=4C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页二.变量的存储特性1.变量按存在时间分变量按存在时间分 静态变量 动态变量静态存储类型的变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,通常称它们为永久存储。动态存储类型变量只生存在某一段时间内。例如,函数的形参和函数体或分程序中定义的变量
35、, 只是在程序进入该函数或分程序时才分配存储空间, 当该函数或分程序执行完后,变量对应的存储空间又被撤销了。2.c语言中每一个变量有两个属性语言中每一个变量有两个属性:数据类型数据类型,存储特性存储特性完整的变量定义: 存储特性 数据类型 变量名;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页3.变量的存储特性变量的存储特性 自动型 auto 静态型 static 寄存器型 register 外部型 extern(1) auto型每次进入程序是自动分配内存,不长期占用内存例如:形式参数,自动型局部变量(2)static 型 局部静态变量 全局静态变量长期占用内
36、存C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页例例1 1:分析执行结果f(int a)int b=0; static int c=3;b+;c+;printf(“%5d%5d%5d”,a,b,c);return(a+b+c);main()int a=2,k;for(k=0;k3;k+)printf(“%5dn”,f(a);静态变量只初始化一次结果:2 1 4 (a,b,c) 7 (f(a)2 1 5 82 1 6 9C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页(3) register型将使用频率高的变量定义为registe
37、r型,可以提高运行速度. 数据内存 运算器 运算器 结果 控制器 数据寄存器寄存器变量只限于整型、字符型、指针型的局部变量。寄存器变量是动态变量,而且数目有限, 一般仅允许说明两个寄存 器变量。例如: register int d; register char c;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页(4)extern型型引用: extern 类型 变量名;如果某个模块文件中要用到另一个模块文件中的全局变量,就要用extern说明例如:程序模块file1.c中定义了全局变量 int s ;而在另一个程序模块file2.c中的函数fun1( )中需要使
38、用这个变量s。为此,可以在file2.c的函数fun1( )中加上外部变量说明语句:fun1( ) extern int s;/*表明变量s是在其他文件定义的*/ .定义时分配内存,其他文件引用时不再分配内存.C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页4.5编译预处理 “编译预处理”是C语言编译系统的 一个组成部分。是在编译前由编译系统中的预处理程序对源程序的预处理命令进行加工。 源程序中的预处理命令均以“#”开头,结束不加分号,以区别源程序中的语句,它们可以写在程序中的任何位置,作用域是自出现点到源程序的末尾。n 预处理命令包括执行宏定义执行宏定义(宏替
39、换宏替换)、包含文件和、包含文件和条件编译条件编译。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页一.宏定义 简单宏定义1. .一般形式为一般形式为: #define 宏名 串 (宏体) 如: #define PI 3.14159 /*定义后,可以用PI来代替串3.14159*/2.宏定义的作用宏定义的作用 在宏定义之后, 该程序中宏名就代表了该字符串。3.说明说明可以用 #undef命令终止宏定义的作用域。例如:#undef PI宏定义的嵌套使用 # define R 3.0 # define PI 3.1415926 # define L 2*PI*R /
40、*宏体是表达式*/ # define S PI*R*RC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页main ( ) printf (L=%fnS=%fn,L,S); /*2*PI*R替换L, PI*R*R替换S */ 程序运行结果如下:L=18.849556双引号内与宏同名的字母不作宏展开.(见上例)n带参数的宏定义1.带参数的宏定义的一般形式为带参数的宏定义的一般形式为 # define 宏名(参数表) 字符串如: #define S (a,b) a*b #define PR (x) printf(s=%fn”, x)C语言程序设计C语言程序设计C语言程序
41、设计C语言程序设计上一页上一页下一页下一页2.带实参的宏名被展开带实参的宏名被展开 宏名被所定义的宏体替换, 宏体中的形参按从左到右的顺序被实参替换。例如: area = S (3,2); PR(area) ;展开为: area=3*2;PR(area) 展开的结果是: printf(s=%fn”, area) ;宏定义与函数的区别(1) 引用宏只占编译时间,不占运行时间。 (2) 引用宏没有返回值。如: #define squ(n) n*nvoid main (void) printf (%fn,27.0/squ(3.0); 程序输出结果为: 27.000000注意,展开为27.0/3.0*
42、3.0 不是27.0/(3.0*3.0) C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页(3) 宏替换的形参无类型 (4) 实参为表达式的情况 函数调用是先计算出实参的值函数调用是先计算出实参的值, 再将值传递给形参;再将值传递给形参; 宏的引用是用表达式替换形参宏的引用是用表达式替换形参. 例如: #define S (a,b) a*b 引用: S(a+c,b+c) 展开后的表达式为: a+c*b+cC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页二.文件包含#include1. 文件包含是指一个源文件可以将是指一个源文件可以
43、将 另一个源文件的全部内容包含进来。另一个源文件的全部内容包含进来。2. #include命令有两种格式。 (1) #include (2) #include “文件名”3. 两种格式区别(p102)C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页三.条件编译1.控制条件为常量表达式的条件编译, 有以下几种形式: ()if常量表达式 程序段 #endif功能:常量表达式为非时,程序段被编译。否则,程序段不被编译。 ()if常量表达式 程序段 else 程序段 #endif功能:常量表达式为非,程序段被编译。否则,编译程序段。C语言程序设计C语言程序设计C语言程序
44、设计C语言程序设计上一页上一页下一页下一页()if常量表达式 程序段 #elif常量表达式 程序段 . #elif 常量表达式 程序段n #else 程序段n+1 #endif.控制条件为定义标识符的条件编译)ifdef 标识符 程序段 #endif 功能:当标识符在该条件编译结构前已定义过时,程序段被编 译。否则,程序段不被编译。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页()ifdef 标识符 程序段 else 程序段 #endif功能:当标识符在该条件编译结构前已定义过时,程序段被编译。否则,编译程序段。()ifndef 标识符 程序段 else 程序
45、段 #endif功能是,当标识符在该条件编译结构之前没有被define定义过时,程序段被编译;否则,编译程序段C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页条件编译举例:#define inttag 1Main( )int ch; scanf(“%d”,ch); #if inttag printf(“%d”,ch); #else printf(“%c”,ch); #endif编译成:main( )int ch; scanf(“%d”,ch); printf(“%d”,ch); C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页1。
46、以下程序求10,1000之间能被3或5或8整除的数之和。请将程序补充完整,给出正确程序运行结果,填入相应窗口。 #include #include #include main()_long sum;sum=0;for ( i=10;i=1000;i+) if ( _ ) sum+=i; clrscr();printf(%ldn,sum);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页3下面程序是求5,75之间的所有奇数的立方和。请将程序补充完整,并给出正确结果,填入相应窗口。 #include #include #include main() long sum
47、; _ sum=0; for (i=5;i=75;i+) if (fmod(i,2)!=0) _ clrscr(); printf(%ldn,sum);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页4下面的程序是求表达式的值:s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+.+(1*2*3*.*n)/(3*5*7*.(2*n+1)请将程序补充完整,并给出当n=20时,程序的运行结果(按四舍五入保留10位小数)。#include #include #include double fun(int n) double s, t; int i;
48、 _ t=1.0; for(i=1;i=n; i+) t=t*i/(2*i+1); _ return s;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页main()printf(n %12.10lf, fun(20);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页改错题:1下面的程序是求500以内的所有的素数之和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果。#include #include #include int prime(int n) int yes, i; if(n=1) return 1; yes=1
49、; for(i=2; i=sqrt(n); i+) if(n%i=0) yes=0; break; return 1; C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页main() int sum=0, i; clrscr(); for(i=2;i=500; i+) if(prime(i) sum+=i; printf(%dn, sum);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页2下面的程序中,函数fun的功能是:根据形参m,计算下面公式的值。 T=1+1/(2*3)+1/(3*4)+1/(m*(m+1) 请改正程序中的错
50、误,并运行改正后的程序。当从键盘输入70时,给出程序运行的正确结果(按四舍五入保留6位小数)。#include #include double fun(int m) double t=1.0;int i=2;for(i=2; i=m; i+) t+=1.0/i*(i+1);return ;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页main() int m;clrscr();printf(n 请输入一个整数: );scanf(%d,&m);printf(n 结果是: %lf n, fun(m);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 包含2024年度贷款条款的房屋买卖合同2篇
- 物理课件讲义
- 煤矿生产经营长期承包协议
- 2024年度东莞市教育培训合作协议2篇
- 2024年度原材料供应与成品购买综合协议2篇
- 葡萄酒酿造工艺
- 《性激素治疗TH》课件
- 脚手架租赁合同
- 人教版九年级化学第十单元酸和碱1常见的酸和碱课时3常见的碱碱的性质教学课件
- 2024年度二手住宅按揭贷款合同3篇
- 2024年国家保安员考试题库附参考答案(考试直接用)
- 《“3S”技术及其应用》试卷
- 2024-电商控价协议范本
- 中药养颜秘籍智慧树知到期末考试答案2024年
- 手术切口感染PDCA案例
- 殡葬礼仪服务应急预案
- 校运会裁判员培训
- 烟雾病与麻醉
- 数字教育工具在智慧课堂中的创新应用
- 《光伏发电工程预可行性研究报告编制规程》(NB/T32044-2018)中文版
- 市级重点课题《初中英语分层作业的实践研究》开题报告
评论
0/150
提交评论