文档库 最新最全的文档下载
当前位置:文档库 › 第七章 函数

第七章 函数

第七章 函数
第七章 函数

第七章函数

在前面的章节中,我们编写的程序都是由一个main函数组成,在main函数中调用了scanf、printf等系统函数。然而一个实际问题的编程不可能把所有要完成的任务全都写在main函数中。这时,程序往往由一个main函数和若干个其它函数组成,每个函数各自完成相对独立的部分功能。程序从main函数开始执行(不管其位置如何),在main函数结束(除遇exit外)。其它函数只在被调用时才能被执行。

被调用的函数可以是系统提供的库函数,也可以是用户自己定义的函数。图7.1是函数间相互调用的示意图。

main() f1() f11()

{ { {

┇┇┇

f1(); f11(); }

┇┇ f12()

f2(); f12(); {

┇┇┇

} } }

f2() f21()

{ {

┇┇

f21(); }

}

图7.1 函数间相互调用的示意

7.1 库函数

库函数由系统提供,用户只要按照要求的格式正确调用即可。不同的C编译系统提供的库函数有所不同。

说明:

(1)调用库函数时要用#include命令将相关的头文件包含进来。

如:调用数学函数,用#include “math.h”或

调用输入输出函数,用#include “stdio.h”或

(2)库函数调用的一般形式:

函数名(参数表)

要注意函数的功能、参数的个数与类型、函数值的类型。

如求平方根的函数sqrt的形式是:double sqrt(double x)

即sqrt函数的参数只有一个,为双精度型,函数的返回值也是双精度型。在调用时要注意这些要求。如在判断数m是否为素数时,只需要判断该数是否能被2~m除尽即可。

用程序实现为:

int m,n,i;

……

n=(int)sqrt((double)m);

for(i=2;i<=n;i++)

……

即将整型变量m强制转换成double型后,调用sqrt函数,因函数的返回值也为double 型,再又将函数值强制换成int型后赋值给整型变量n,便于下面的处理。

(3)库函数调用以两种方式出现。

①出现在表达式中,即作为表达式的一部分参与运算。

如:计算y=x2.5+1.3,则通过以下语句调用pow函数来实现。

y=pow(x,2.5)+1.3;

②独立的语句,即调用函数后加一分号。

如:printf(“*****\n”);

(4)调用库函数时,要注意参数的一些特殊要求。如三角函数要求自变量参数用弧度表示,开平方函数要求自变量参数的值大于或等于0。

7.2 函数的定义和返回值

虽然C语言提供了丰富的库函数,但不可能满足每个用户的各种特殊需要,因此大量的函数必须由用户自己来定义(编写)。

7.2.1 函数的定义

所谓函数定义实际上就是在程序中写一个函数(模块)。

函数定义有如下两种形式:

形式一

函数返回值的类型名函数名(类型名形式参数1, /* 函数的首部 */

类型名形式参数2,……) /* 函数的首部 */ {

声明部分 /* 函数体 */

语句部分

}

形式二:

函数返回值的类型名函数名(形式参数1,形式参数2,……)/* 函数的首部 */ 形式参数类型说明 /* 函数的首部 */ {

声明部分 /* 函数体 */

语句部分

}

一般把形式一称为现代方式,而将形式二称为传统方式。Turbo C和目前使用的多数C 版本对这两种方式都允许采用,两种方式等价。ANSI新标准推荐使用形式一,即现代方式。

例如,求两个数中的较大者的程序为:

main()

{

int a,b,max;

scanf(“%d%d”,&a,&b);

max=max2(a,b);

printf(“max=%d\n”,max);

}

int max2(int x,int y)

{

int z;

if(x>y)

z=x;

else

z=y;

return(z);

}

其中:int max2(int x,int y) 也可以写成:

int max2(x,y)

int x,y;

说明:

(1)在定义时,若省略了函数返回值的类型名(函数值的类型),则默认为int类型。如上面程序中max2函数的首部可写为:

max2(int x,int y)

(2)函数名和形式参数(简称形参)均为由用户命名的标识符。同一程序中,函数名必须唯一;同一函数中,形参名也必须唯一,但可以与其它函数中的变量同名。

(3)各形参的定义之间用逗号隔开,可以没有形参(称为无参函数),但一对圆括号不能省。(4)除形参外,凡在函数中用到的变量必须在声明部分进行定义(放在语句部分之前)。(5)形参和函数体中定义的变量只在函数被调用时才临时分配存储单元,当退出函数时,这些存储单元全部被释放(称为局部性,因而与其它函数中的变量同名不会引起混淆)。(6)函数体可以为空,称为空函数。

如:dummy()

{

}

这是一个什么也不做的函数。在设计程序的初期,它仅代表这里有一个函数,而函数体的具体内容待以后再补上。

(7)函数的定义是平行的,不能在一个函数的内部再定义函数。即每个函数是一个相对独立的模块,不能在写某一个函数时又包含了另一个函数的定义。

7.2.2 函数的返回值

函数的值通过return语句返回。

return语句的形式:

return(表达式);

或 return 表达式;

表达式的值就是所求的函数值。

当执行到return语句时,程序流程返回到调用该函数的地方,并带回函数值。

说明:

(1)表达式的类型应与函数首部所说明的类型一致。若不一致,由系统自动转换为函数值的定义类型,即函数定义类型决定返回值类型。

如:main()

{

float a,b,max;

scanf(“%f%f”,&a,&b);

max=max2(a,b);

printf(“max=%f\n”,max);

}

int max2(float x,float y)

{

float z;

if(x>y)

z=x;

else

z=y;

return z;

}

则将表达式z的值(float型)自动转换为函数定义类型(int型)后带回到main函数中。

(2)若无表达式,则return语句的作用只是使流程返回到调用函数,无确定的函数值。(3)在一个函数内,可以有多个return语句,执行到哪一个return,就以此return后的表达式值作为函数值。注意,并非返回多个值。

main()

{

int a,b,max;

scanf(“%d%d”,&a,&b);

max=max2(a,b);

printf(“max=%d\n”,max);

}

int max2(int x,int y)

{

if(x>y)

return x;

else

return y;

}

尽管max2函数中出现过二个return语句,但只能返回x、y中的一个值,不能同时返回x、y的值。

(4)若函数体内无return语句,则执行到函数末尾的“}”后返回到调用函数,无确定的函数值返回。

(5)为了明确说明函数无返回值,可将函数的返回值类型定义为void,称为“无类型”或“空类型”。

如:void prm()

{

printf(“message\n”);

}

(6)在C语言中,函数名不能被赋值,这一点与有些语言是不同的。

7.3 函数的调用

7.3.1 函数调用的一般形式

所谓函数调用就是把控制流程转到被调用函数中去执行函数的各语句。

函数调用的一般形式为:

函数名(实在参数表)

实在参数(简称实参)可以是常量、变量或表达式,多于一个时,彼此间以逗号隔开。若函数定义时无形参,则调用时无实参,但一对圆括号不可少。

说明:

(1)调用函数时,其名字必须与定义的名字相同。

(2)函数调用时的实参不需要带实参类型。

如上面main函数中对max2函数的调用不能写成:

max=max2(int a,int b);

(3)实参与形参在个数、类型、次序上应保持一致。

(4)函数必须先定义,后调用。返回值类型为int或char的函数可例外。

(5)函数可直接或间接地自己调用自己(称为递归调用,在7.6节介绍)。

7.3.2 函数调用的方式

(1)作为表达式出现在允许表达式出现的任何地方。

如:c=max2(a,b);

或 printf(“%d\n”,max2(a,b));

(2)作为一条独立的语句。

形式为:函数名(实在参数表);

如:dummy();

printf(“a=%d,b=%d\n”,a,b);

(3)作为另一次函数调用的实参。

如:d=max2(max2(a,b),c);

7.4 函数的声明

在C语言中,除了主函数外,对于用户定义的函数要遵循“先定义,后使用”的规则。凡是未在调用之前定义的函数,C编译程序默认函数的返回值为int类型。对于返回值为其它类型的函数,若把函数的定义放在调用之后,应该在调用之前对函数进行声明(或称为函数原型声明,有的也称函数说明)。

7.4.1 函数声明的形式

函数声明的一般形式:

类型名函数名(参数类型1 参数名1,参数类型2,参数名2,……)或类型名函数名(参数类型1,参数类型2,……)

如:

main()

{

float a,b,c;

float max2(float x,float y); /* 函数的声明 */

scanf(“%f%f”,&a,&b);

c=max2(a,b); /* 函数的调用 */

printf(“%f\n”,c);

}

float max2(float x,float y) /* 以下为函数的定义 */

{

float z;

if(x>y)

z=x;

else

z=y;

return (z);

}

对函数进行声明,能使C语言的编译程序在编译时对函数的调用进行有效的类型检查。说明:

(1)函数声明中的形参名是一种虚设,它们可以是任意的用户标识符,既不必与函数首部中的形参名一致,又可以与程序中的任意用户标识符同名。因此,参数名可以省略,但参数的类型、个数和次序必须与函数定义的首部一致。

如上面的例子中函数声明可写成:float max2(float,float);

(2)函数定义与函数声明是不同的,定义是写出函数的完整形式,包括函数首部及函数体,是一个完整、独立的函数单位,而声明是告诉系统此函数的返回值类型、参数的个数与类型,即函数首部的信息。

(3)若函数的返回值类型为int或char,则可以不进行函数声明(系统默认)。但是使用这种方法时,系统无法对参数的类型做检查。若调用函数时参数使用不当,在编译时也不会报

错。因此,为了程序清晰和安全,建议都进行声明为好。

(4)若定义在前,调用在后,则可不进行函数声明。因为编译系统已经先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。

如上面的例子可以写成:

float max2(float x,float y) /* 以下为函数的定义 */

{

float z;

if(x>y)

z=x;

else

z=y;

return (z);

}

main()

{

float a,b,c;

scanf(“%f%f”,&a,&b);

c=max2(a,b); /* 函数的调用 */

printf(“%f\n”,c);

}

7.4.2 函数声明的位置

(1)放在调用函数的声明部分(只有此调用函数能识别被调用函数)。可以是独立语句,也可与其它变量的定义放在同一个语句中。

如上面的用法还可写成:

float a,b,c,max2(float,float);

(2)放在所有函数的外部,被调用之前。(此时函数声明的后面所有位置上都可对该函数进行调用)。

如:float max2(float,float);

main()

{

float a,b,c;

scanf(“%f%f”,&a,&b);

c=max2(a,b);

printf(“%f\n”,c);

}

float max2(float x,float y)

{

……

}

(3)调用库函数时,要在程序的开头使用#include来包含相关的头文件,就是因为头文件

中包含了这些库函数的原型声明。

7.5 调用函数和被调用函数之间的数据传递

7.5.1 变量作为参数

当变量作为形参时,对应的实参可以是常量、已有值的变量(或数组元素)或有确定值的表达式。当调用函数时,把实参的值传递给形参,形参得到值后,在被调函数中进行运算,若有return语句,则通过return语句把函数值返回到调用函数。

说明:

(1) 形参在接收实参传过来的值时,在内存临时开辟新的存储空间,以存放形参的值,当函数执行完毕时,这些临时开辟的内存空间会被释放,并且形参的值在函数中不论是否发生变化,都不会影响实参的值的变化。这种方式称为“传值调用”,即实参向形参传递数据是一种单向传递,实参的值传递给对应的形参,但形参的值不会回传给实参。

例7.1 函数参数之间的单向传递

main()

{

void swap(int,int);

int x=10,y=20;

printf(“(1)x=%d y=%d\n”,x,y);

swap(x,y);

printf(“(4)x=%d y=%d\n”,x,y);

}

void swap(int a,int b)

{

int t;

printf(“(2)a=%d b=%d\n”,a,b);

t=a;a=b;b=t;

printf(“(3)a=%d b=%d\n”,a,b);

}

程序运行结果:

(1)x=10 y=20

(2)a=10 b=20

(3)a=20 b=10

(4)x=10 y=20

当程序执行到调用swap函数时,程序的流程转入swap函数,系统为形参a、b分配临时的存储单元,并将实参的值传给形参存入形参所分配的存储单元。在swap函数中第一次输出时,就是实参传过来的值,如上面的第二行结果。然后将a、b的值进行交换,再进行输出,就是交换以后的结果,如上面的第三行结果。当调用结束后,系统为形参分配的存储单元被释放,不会将改变了的形参值回传给实参。所以在main函数中,再输出x、y的值仍然还是原来的值,如上面的第四行结果。

(2) 被调函数通过return语句将函数值带回到主调函数。

(3) 实参向形参传递数据是按位置对应的传递,不是按名字对应传递。

例7.2 实参向形参按位置传递数据

main()

{

void ex(int z,int y,int x); /* 函数声明 */

int x=10,y=20,z=30;

printf(“(1)x=%d y=%d z=%d\n”,x,y,z);

ex(y,z,x); /* 函数调用 */

}

void ex(int x,int y,int z) /* 函数定义 */

{

printf(“(2)x=%d y=%d z=%d\n”,x,y,z);

}

程序运行结果:

(1)x=10 y=20 z=30

(2)x=20 y=30 z=10

在程序中,函数定义的形参为x、y、z,函数声明的形参为z、y、x,函数声明中的形参名字和函数定义中的形参名字不必一致,实际上函数声明中的形参仅起告诉系统有几个参数的作用,它的名字可以任意,甚至可以缺省,只用形参类型即可。函数调用的实参为y、z、x,按位置对应,即将实参y、z、x的值分别传递给对应的形参x、y、z。这样,在函数ex 中,x、y、z所得到的值就为20、30、10。见上面的输出结果。

(4)当实参表包含多个参数时,对实参表求值的顺序因C语言的版本不同而有所不同,Turbo C是按自右至左的顺序求值,而有的系统是按自左至右的顺序求值。如:

main()

{

int i=2,p;

p=f(i,++i); /* 函数调用 */

printf(“%d\n”,p);

}

int f(int a,int b) /* 函数定义 */

{

int c;

if(a>b)c=1;

else if(a==b)c=0;

else c=-1;

return (c);

}

如果按自右至左的顺序求实参的值(如在Turbo C中),则函数调用相当于f(3,3),程序运行结果为0,如果按自左至右的顺序求实参的值,则函数调用相当于f(2,3),程序运行结果为-1。由于存在上述情况,使程序的通用性受到影响,因此应当避免这种容易引起不同理

解的情况。如将main函数改为:

main()

{

int i=2,j,k,p;

j=i;

k=++i;

p=f(j,k); /* 函数调用 */

printf(“%d\n”,p);

}

则不管是按自右至左的顺序求实参的值,还是按自左至右的顺序求实参的值,程序运行结果均为-1。若将main函数改为:

main()

{

int i=2,j,k,p;

j=++i;

k=i;

p=f(j,k); /* 函数调用 */

printf(“%d\n”,p);

}

则不论采用那种顺序求实参的值,程序运行结果均为0。即将原实参的值在函数调用之前求出赋给另外的变量,通过这些变量作为新实参,而避开求值顺序的影响。

7.5.2 数组名作为参数

当数组名作为函数参数时,要求实参和形参都用数组名(或指针变量,第十章作介绍)。

由于数组名代表数组在内存分配的存储空间的首地址,这种方法称之为“传址调用”方式。当把实参数组名(首地址)传递过去时,由于形参数组名也代表首地址,这样实参数组和形参数组的首地址相同,即实参数组和形参数组占用相同的存储空间。在被调函数中,形参数组中各元素的值如发生变化会使实参数组元素的值同时发生变化。在函数调用结束后,虽然形参数组已不复存在,但实参数组元素的值已发生变化,可以在主调函数中进行使用。例7.3 用选择法对数组中10个整数由小到大排序。

所谓选择法就是先将10个数a[0]到a[9]中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换;……;每进行一轮操作,找出若干个元素中值最小的元素并与参与比较的最前面的那一个元素对换。共进行9轮操作。

下面先写出找出10个数的最小值并与a[0]对换的程序段,即第一轮操作。

i=0;

k=i;

for(j=i+1;j<10;j++)

if(a[j]

t=a[k];a[k]=a[i];a[i]=t;

用变量k记录值最小的数组元素的下标,先设k=i(=0),然后通过循环,循环变量j从

i+1(即1)开始到9,共比较9次。用当前最小值(即a[k])与a[j]进行比较,如果a[j]小于a[k],就记录当前所比较的元素中新的最小值的下标(即k=j),整个循环结束,变量k 就是这10个数中最小值的下标,最后再将a[k]与a[i](即a[0])进行对换。第一轮操作完成,a[0]就存放了这10个数的最小值。

第二轮操作,只需要将上面程序段中的变量i变成1,经过从2到9共8次比较,就可将a[1]到a[9]中的最小值的下标记录在变量k中,再经过a[1]与a[k]的对换,a[1]中就存放了a[1]到a[9]的最小值,即a[0]到a[9]的第二小值。

依此方法,将i一直变到8,共进行9轮操作,就可完成整个10个数的由小到大排序。i 的变化也可用循环来实现。即:for(i=0;i<9;i++)。

完整的程序如下:

void sort(int a[10])

{

int i,j,k,t;

for(i=0;i<9;i++)

{

k=i;

for(j=i+1;j<10;j++)

if(a[j]

t=a[k];a[k]=a[i];a[i]=t;

}

}

main()

{

int i,x[10]={5,7,4,2,8,6,1,9,0,3};

printf(“the original array:\n”);

for(i=0;i<10;i++)

printf(“%d ”,x[i]);

printf(“\n”);

sort(x);

printf(“the sorted array:\n”);

for(i=0;i<10;i++)

printf(“%d ”,x[i]);

printf(“\n”);

}

程序运行结果为:

the original array:

5 7 4 2 8

6 1 9 0 3

the sorted array:

0 1 2 3 4 5 6 7 8 9

在程序中,在调用排序函数sort之前,实参数组 x的数据是无序的,调用函数sort时,

将实参数组名x传递给形参数组名a,因数组名代表数组在内存的存储空间的的首地址,使得形参数组a与实参数组x共占同一段存储空间。这样在函数sort中对a数组的排序,实际上也就作用在x数组上。当sort函数调用结束后再输出x的值,就是已经排好序的结果。说明:

(1)用数组名作为函数参数时,应该在主调函数和被调函数中分别定义实参数组和形参数组,如上例中x是实参数组名,a是形参数组名。

(2)实参数组与形参数组的类型应一致。否则会出错。

(3)实参数组必须定义成具有确定长度的数组。由于形参数组并不另外分配存储空间,只是共享实参数组的数据,所以,形参数组的大小可以与实参数组的大小相同,可以小于实参数组的大小,还可以不指定大小,只在定义数组时在数组名后用一个空的中括弧,而另设一个参数,传递需要处理的数组元素的个数。不管采用那种形式,在使用形参数组时,不要超过实参数组的长度,否则可能导致一些意料之外的错误。

例7.4 将一个数组中的n个数据按颠倒的顺序重新存放。在操作时,只能借助一个临时存储单元而不得另外开辟数组。

解题思路为:借助于一个临时变量,将a[0]与a[n-1]对换,再将a[1]与a[n-2]对换,……,直到将a[(n-1)/2]与a[n-int((n-1)/2)-1]对换。程序采用循环来实现,设二个“位置指针变量”i和j,i的初值为0,j的初值为n-1,将a[i]与a[j]交换,然后使i 的值加1,j的值减1,再将a[i]与a[j]交换,直到i=m为止。m=(n-1)/2为“中间位置”。见图7.2所示。

10 20 30 40 50 60 70 80 90 100

i m j

100 90 80 70 60 50 40 30 20 10

图7.2 数组元素值颠倒存放的过程示意图

程序如下:

void inv(int x[],int n)

{

int t,i,j,m=(n-1)/2;

for(i=0;i<=m;i++)

{

j=n-1-i;

t=x[i];

x[i]=x[j];

x[j]=t;

}

}

main()

{

int i,a[10]={10,20,30,40,50,60,70,80,90,100};

printf(“The original array:\n”);

for(i=0;i<10;i++)

printf(“%d ”,a[i]);

printf(“\n”);

inv(a,10);

printf(“The array has been inverted:\n”);

for(i=0;i<10;i++)

printf(“%d ”,a[i]);

printf(“\n”);

}

程序运行结果为:

The original array:

10 20 30 40 50 60 70 80 90 100

The array has been inverted:

100 90 80 70 60 50 40 30 20 10

在函数inv中,未指定形参数组x的大小,而另设一个形参变量n,通过实参传递一个具体的元素个数(程序中实参值为10)。这样做可以增加函数的灵活性。如果在main函数中使用:inv(a,10);表示要求对a数组的10个元素进行颠倒排列,如果使用:inv(a,5);则表示要求将a数组的前5个元素进行颠倒排列。

函数inv还可以写成:

void inv(int x[],int n)

{

int t,i,j;

i=0;

j=n-1;

while(i

{

t=x[i];

x[i]=x[j];

x[j]=t;

i++;

j--;

}

}

即在进行完一次交换后,i、j的值分别同步加1和减1,当i大于或等于j,即达到或越过中间位置时,则结束对调操作。

(4)可以用多维数组名作为实参和形参,在被调函数中对形参数组定义时可以指定每一维

的大小,也可以省略第一维的大小,但不能省略第二维以及其它高维的大小。

例7.5 求二维数组每行元素的平均值。

main()

{

void lineave(int x[][4],float y[],int n);

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int i,j;

float b[3];

lineave(a,b,3);

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

printf(“%4d”,a[i][j]);

printf(“ ave:%6.2f\n”,b[i]);

}

}

void lineave(int x[][4],float y[],int n)

{

int i,j,s;

for(i=0;i

{

s=0; /* 注意初值的位置 */

for(j=0;j<4;j++)

s=s+x[i][j];

y[i]=s/4.0;

}

}

程序运行结果为:

1 2 3 4 ave: 2.50

5 6 7 8 ave: 6.50

9 10 11 12 ave: 10.50

在函数lineave中,省略了二维形参数组x的第一维的大小,通过另一形参变量n来接受实参传递过来的行数值。由于要计算每一行元素的平均值,在对每一行元素进行相加之前都要对存放累加值的变量进行清0,所以s=0;的位置应该放在外循环的里面,内循环的前面。

7.6函数的嵌套调用与递归调用

7.6.1 函数的嵌套调用

在C语言中,函数的定义必须是互相平行、独立的。即在定义函数时,一个函数内不能包含另一个函数。也就是说,函数的定义不允许出现嵌套。但函数的调用可以嵌套,即在调

用一个函数的过程中,又调用另一个函数。

例7.6 计算S=1!+2!+3!+……20!

本程序使用了3个函数,main函数调用sum函数求20项的累加和,但这20项的各项又是一个阶乘,因此,在sum函数中又去调用fac函数求出各项的阶乘值。

main() /* main函数定义,注意各函数的定义是平行的 */ {

float sum(int);

float add;

add=sum(20); /* main函数中调用sun函数求累加和 */

printf(“s=%e\n”,add);

}

float sum(int n) /* sum函数定义 */

{

float fac(int);

int i;

float s=0.0;

for(i=1;i<=n;i++)

s=s+fac(i); /* sum函数中调用fac函数求阶乘 */

return s;

}

float fac(int i) /* fac函数定义 */

{

float t=1;

int k;

for(k=1;k<=i;k++)

t=t*k;

return t;

}

程序运行结果为:

s=2.56130e+18

程序执行时,函数之间的调用关系如图7.3所示。

main() sum() fac()

{ { {

┇┇┇

sum(); fac(); }

┇┇

} }

图7.3 例7.6的函数调用示意图

7.6.2 函数的递归调用

在C语言中,函数可以直接或间接地自己调用自己,称为递归调用。图7.4是递归调用

的示意图。

f() f() g()

{ { {

………………

f() g() f()

………………

} } }

(a)直接递归(b) 间接递归

图7.4 递归调用示意图

要采用递归方法来解决一个问题,必须符合以下三个条件:

(1)可以把要解的问题转化为一个新的问题,而这个新的问题的解法仍与原来的解法相同,只是所处理的对象的规模有规律的递增或递减。

(2)可以应用这个转化过程使问题得到解决。

(3)要有一个明确的结束递归的条件。

例7.7 用递归的方法求n!

1 n=0,1时

n!=

n*(n-1)! n>1时

递归与递推的思想不同。虽然使用的都是以上公式,但递推是由已知求未知。即先求出1!的值,在计算2!时,只需要计算1!*2即可,然后依次类推,在得到(n-1)!值后,只要计算(n-1)!*n,就可得到n!值。它是不断由一个已知值去计算得到一个新值。而递归则采用相反的思路。要得到n!值,它只要将(n-1)!乘以n即可,然而,(n-1)!的值并非已知,它又需要将(n-2)!乘以n-1,依次往下,直到算出1!值,再递推出2!,直至n!。为了便于比较,先写出递推求n!的程序。

fac(int n)

{

int t=1,i;

if(n==1||n==0)

return 1;

else

{

for(i=1;i<=n;i++)

t=t*i;

return t;

}

}

main()

{

int m,y;

printf("Enter m:");

scanf("%d",&m);

if(m<0)

printf("Input data error!\n");

else

{

y=fac(m);

printf("\n%d!=%d\n",m,y);

}

}

递归求n!的程序为:

fac(int n)

{

int t;

if(n==1||n==0)return 1;

else

{

t=n*fac(n-1);

return t;

}

}

main()

{

int m,y;

printf("Enter m:");

scanf("%d",&m);

if(m<0)printf("Input data error!\n");

else

{

y=fac(m);

printf("\n%d!=%d\n",m,y);

}

}

下面给出求4!时程序执行的示意,见图7.5。

主函数调用fac(4)求4!

4!=4*fac(3) 3!=3*fac(2) 2!=2*fac(1) 1!=1

24 6 2 1

将24带回主函数调用点

为调用为返回

图7.4 求4!程序执行示意图

第一次由主函数调用fac,后三次调用均为自己调用自己。后三次的返回点均在fac中,最后返回到主函数调用点。

注意:由于8!=40320,已超过用2字节表示的基本整型范围,因此,如果要求较大数的阶乘,则需要将fac函数及保存阶乘结果的变量(如程序中的t、y)定义成长整型或实型。

当函数自己调用自己时,系统将自动把函数中当前的变量和形参暂时保留起来,不同次的调用占用不同的存储单元。返回时,将按调用的反方向(后调用先返回)逐层返回,并释放变量和形参所占的存储单元。

例7.8 用递归方法计算斐波那契数列的第n项。

斐波那契数列的计算公式为:

1 n=1, 2

f n=

f n-1+f n-2 n≥3

从公式中,我们很容易找出它的规律,并采用递归来实现。

程序如下:

fib(int n)

{

int t;

if(n==1||n==2)

return 1;

else

{

t=fib(n-1)+fib(n-2);

return t;

}

}

main()

{

int n,s;

scanf(“%d”,&n);

s=fib(n);

printf(“s=%d\n”,s);

}

这里需要注意的是初学者往往容易直接将计算公式不经处理地写在程序中。如在程序中写成:fib(n)=fib(n-1)+fib(n-2);这样写是错误的,因为赋值号左边不能出现函数调用。如果写成:fib=fib)n-1)+fib(n-2);也是错误的,因为在C语言中,函数名不能被赋值。请读者注意。

从计算斐波那契数列这个例子,我们可以看出,同一个问题可以采用不同的方法来实现。读者可以将例5.14、例6.2和例7.8进行比较。

采用递归,简洁明了。但由于系统要为每一层调用中的变量开辟存储单元、要记住每一层调用后的返回点、要增加许多额外的开销,因此函数的递归调用通常会降低程序的运行效

率。

7.7 程序举例

例7.9 编写函数isprime(int n)用来判断变量n是否为素数,若是,函数返回1,否则返回0。

#include

int isprime(int); /* 函数声明 */

main()

{

int x;

scanf(“%d”,&x);

if(isprime(x)) /* 或if(isprime(x)==1) */

printf(“%d is prime\n”,x); /* 当函数返回1时,输出:是素数 */

else

printf(“%d is not prime\n”,x); /* 当函数返回0时,输出:不是素数 */ }

isprime(int n)

{

int i;

for(i=2;i<=(int)sqrt((double)n);i++)

if(n%i==0)

return 0; /* n一旦能被某个整数整除,即不是素数,返回0 */ return 1; /* n不能被2到n之间任何一个整数整除,返回1 */

}

在函数isprime中,用循环将n除以2到n间的每个整数,如果能被某个整数整除,表明n不是素数,返回标志0,同时循环不再继续进行下去。如果整个循环正常结束,则n 未被2到n的任何一个整数整除,表明n是素数,此时返回标志1。

初学者在编写这个程序时往往容易写成:

if(n%i==0)

return 0;

else

return 1;

这是错误的。因为素数是不能被2到n的任何一个整数整除,并非不被其中某一个整

数整除。

例7.10 编写函数,验证任意偶数为两个素数之和并输出这两个素数。

设待验证的数放在变量x中,可依次从x中减去i,i从2变化到x/2;其步骤如下:

(1)i初值为2。

(2)判断i是否为素数,若是,执行步骤(3);若不是,执行步骤(5)。

(3)判断x-i是否为素数,若是,执行步骤(4);若不是,执行步骤(5)。

(4)输出结果,返回调用函数。

(5)使i增1。

(6)重复执行步骤(2)。

在例7.9中已经有了isprime(int n)函数可以用来验证某数是否是素数。因此在步骤(2)和步骤(3)中,只要调用该函数就可分别判断i和x-i是否是素数了。

程序如下:

#include

int isprime(int);

void even(int);

main()

{

int a;

printf(“Enter a even number: ”);

scanf(“%d”,&a);

if(a%2==0)

even(a);

else

printf(“The %d isn’t even number\n”,a);

}

void even(int x)

{

int i;

for(i=2;i<=x/2;i++)

if(isprime(i))

if(isprime(x-i))

{

printf(“%d=%d+%d\n”,x,i,x-i);

return;

}

}

isprime(int n)

{……}

程序运行结果为:

Enter a even number:10↙

10=3+7

如果要把一个偶数分解成二个素数的所有可能组合都输出的话,只需要将

实变函数习题解答(1)

第一章习题解答 1、证明 A (B C)=(A B) (A C) 证明:设x∈A (B C),则x∈A或x∈(B C),若x∈A,则x∈A B,且x∈A C,从而x∈(A B) (A C)。若x∈B C,则x∈B且x∈C,于是x∈A B且x∈A C,从而x∈(A B) (A C),因此 A (B C) ? (A B) (A C) (1) 设x∈(A B) (A C),若x∈A,则x∈A (B C),若x∈A,由x∈A B 且x∈A C知x∈B且x∈C,所以x∈B C,所以x∈A (B C),因此 (A B) (A C) ? A (B C) (2) 由(1)、(2)得,A (B C)=(A B) (A C) 。 2、证明 ①A-B=A-(A B)=(A B)-B ②A (B-C)=(A B)-(A C) ③(A-B)-C=A-(B C) ④A-(B-C)=(A-B) (A C) ⑤(A-B) (C-D)=(A C)-(B D) (A-B)=A B A-(A B)=A C(A B)=A (CA CB) =(A CA) (A CB)=φ (A CB)=A-B (A B)-B=(A B) CB=(A CB) (B CB) =(A CB) φ=A-B ②(A B)-(A C)=(A B) C(A C) =(A B) (CA CC)=(A B CA) (A B CC)=φ [A (B CC)]= A (B-C) ③(A-B)-C=(A CB) CC=A C(B C) =A-(B C) ④A-(B-C)=A C(B CC)=A (CB C) =(A CB) (A C)=(A-B) (A C) ⑤(A-B) (C-D)=(A CB) (C CD) =(A C) (CB CD)=(A C) C(B D) =(A C)-(B D)

函数与数列的极限的强化练习题答案(含详细分析)

第一讲:函数与数列的极限的强化练习题答案 一、单项选择题 1.下面函数与y x =为同一函数的是() 2 .A y= .B y= ln .x C y e =.ln x D y e = 解:ln ln x y e x e x === Q,且定义域 () , -∞+∞,∴选D 2.已知?是f的反函数,则() 2 f x的反函 数是() () 1 . 2 A y x ? =() .2 B y x ? = () 1 .2 2 C y x ? =() .22 D y x ? = 解:令() 2, y f x =反解出x:() 1 , 2 x y =?互 换x,y位置得反函数() 1 2 y x =?,选A 3.设() f x在() , -∞+∞有定义,则下列函数 为奇函数的是() ()() .A y f x f x =+- ()() .B y x f x f x =-- ?? ?? () 32 .C y x f x = ()() .D y f x f x =-? 解:() 32 y x f x = Q的定义域() , -∞+∞且 ()()()()() 3232 y x x f x x f x y x -=-=-=- ∴选C 4.下列函数在() , -∞+∞内无界的是() 2 1 . 1 A y x = + .arctan B y x = .sin cos C y x x =+.sin D y x x = 解: 排除法:A 2 1 122 x x x x ≤= + 有界, B arctan 2 x π <有界, C sin cos x x +≤ 故选D 5.数列{}n x有界是lim n n x →∞ 存在的() A 必要条件 B 充分条件 C 充分必要条件 D 无关条件 解:Q{}n x收敛时,数列n x有界(即 n x M ≤),反之不成立,(如() {}11n--有界, 但不收敛, 选A 6.当n→∞时,2 1 sin n 与 1 k n 为等价无穷小, 则k= () A 1 2 B 1 C 2 D -2 解:Q 2 2 11 sin lim lim1 11 n n k k n n n n →∞→∞ ==,2 k=选C 二、填空题(每小题4分,共24分) 7.设() 1 1 f x x = + ,则() f f x ?? ??的定义域 为

概率练习册第七章答案

概率练习册第七章答案

7-2 单正态总体的假设检验 1?已知某炼铁厂铁水含碳量服从正态分布 N(4.55,0.1082 ),现在测定了 9炉铁水,其平均含碳量 为4.484,如果估计方差没有变化,可否认为现 在生产的铁水平均含碳量为 4.55( 0.05)? 解提出检验假设 H 0 : 4.55, H 1 : 4.55 以H 0成立为前提,确定检验H 0的统计量及其分布 查标准正态分布表可得u u 0.025 1.96,而 2 说明小概率事件没有发生,因此接受 H 。.即认为 现在生产的铁水平 均含碳量为4.55. 对给定的显著性水平 =0.05,由上 P{U X 4.55 0.108/ . ? N(0,1) 分位点可知 X 4.55 0.108/、9 u ~ 0.05 X 4.55 0.108/J? 4.484 4.55 0.108/ 9 1.83 1.96

2.机器包装食盐,每袋净重量x (单位: g)服从正态分布,规定每袋净重量为500 (g), 标准差不能超过10 (g)o某天开工后,为检验 机器工作是否正常,从包装好的食盐中随机抽取 9袋,测得其净重量为: 497 507 510 475 484 488 524 491 515 以显著性水平-0.05检验这天包装机工作是否正常? 解.作假设//0:0-2>102,耳:/ < 102 选取统计量Z2=^S2=A5^Z2(W-D K 10~ 对给定的显著性水平a =0.05, 査*分布表得:加』7-1)=加列⑻= 2.733,于是拒绝域为龙$ 52.733 由已知计算得52 =22&44 而z2 =殳二2 = _A_52 =18.2752 > 2.733 0*0 & 因此接受弘,即可以认为这天包装机工作不正常。 3.根据长期的经验,某工厂生产的铜丝的折

实变函数试题库(5)及参考答案

实变函数试题库及参考答案(5) 本科 一、填空题 1.设,A B 为集合,则___(\)A B B A A 2.设n E R ?,如果E 满足0 E E =(其中0 E 表示E 的内部),则E 是 3.设G 为直线上的开集,若开区间(,)a b 满足(,)a b G ?且,a G b G ??,则(,)a b 必为G 的 4.设{|2,}A x x n n ==为自然数,则A 的基数a (其中a 表示自然数集N 的基数) 5.设,A B 为可测集,B A ?且mB <+∞,则__(\)mA mB m A B - 6.设()f x 是可测集E 上的可测函数,则对任意实数,()a b a b <,都有[()]E x a f x b <<是 7.若()E R ?是可数集,则__0mE 8.设 {}()n f x 为可测集E 上的可测函数列,()f x 为E 上的可测函数,如果 .()() ()a e n f x f x x E →∈,则()()n f x f x ?x E ∈(是否成立) 二、选择题 1、设E 是1 R 中的可测集,()x ?是E 上的简单函数,则 ( ) (A )()x ?是E 上的连续函数 (B )()x ?是E 上的单调函数 (C )()x ?在E 上一定不L 可积 (D )()x ?是E 上的可测函数 2.下列集合关系成立的是( ) (A )()()()A B C A B A C = (B )(\)A B A =? (C )(\)B A A =? (D )A B A B ? 3. 若() n E R ?是闭集,则 ( ) (A )0 E E = (B )E E = (C )E E '? (D )E E '= 三、多项选择题(每题至少有两个以上的正确答案) 1.设{[0,1]}E =中的有理点 ,则( ) (A )E 是可数集 (B )E 是闭集 (C )0mE = (D )E 中的每一点均为E 的内点

函数与极限习题与答案计算题(供参考)

高等数学 二、计算题(共 200 小题,) 1、设x x x f +=12)(,求)(x f 的定义域及值域。 2、设x x x f -+= 11)(,确定)(x f 的定义域及值域。 3、设)ln(2)(22x x x x x f -+-= ,求)(x f 的定义域。 4、的定义域,求设)(sin 51 2arcsin )(x f x x x f π+-=。 5、的定义域,求设??? ??++-=x f x f x x x f 1)(22ln )(。 6、的定义域求函数22112arccos )(x x x x x f --++=。 7、设)(x f 的定义域为[) )()()(m x f m x f x F b a ++-=,.,)0(++=。 19、及其定义域,求, 设)(02)(ln 2x f x x x x f +∞<<+-=。

答案第七章函数..(可编辑修改word版)

第七章函数 一、选择题 1.以下函数声明正确的是: C 。(02~03 第一学期试题) A)double fun(int x, int y) B) double fun(int x; int y) C) double fun(int x, int y) ; D) double fun(int x , y) 2.C 语言规定,简单变量作实参,它与对应形参之间的数据传递方式是: B 。(0 级) A)地址传递;B)单向值传递; C)双向值传递;D)由用户指定传递方式 3.以下关于C语言程序中函数的说法正确的是: B 。(0 级) A)函数的定义可以嵌套,但函数的调用不可以嵌套; B)函数的定义不可以嵌套,但函数的调用可以嵌套; C)函数的定义和调用均不可以嵌套; D)函数的定义和点用都可以嵌套。 4.以下正确的函数形式是: D 。(1 级) A)double fun(int x,int y) B)fun (int x,y) {z=x+y;return z;} {int z;return z;} C)fun(x,y) D)double fun(int x,int y) {int x,y ; double z; {double z; z=x+y; return z;} z=x+y; return z;} 5.以下说法不正确的是: B 。(1 级) C 语言规定A)实参可以是常量、变量或表达式 B)形参可以是常量、变量或表达式 C)实参可以是任意类型 D)形参应与其对应的实参类型一致 6.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 B 。(0 级) A)float 型B) int 型C)long 型D)double 型 7.以下错误的描述是 D 。(0 级) 函数调用可以 A)出现在执行语句中B)出现在一个表达式中C) 做为一个函数的实参D)做为一个函数的形参 8.若用数组名作为函数调用的实参,传递给形参的是 A 。(0 级) A)数组的首地址B)数组第一个元素的值 C)数组中全部元素的值D)数组元素的个数 9.以下正确的说法是 A 。(0 级) 如果在一个函数中的复合语句中定义了一个变量,则该变量 A)只在该复合语句中有效B)在该函数中有效C) 在本程序范围内有效D)为非法变量 10.以下不正确的说法为 D 。(0 级) A)在不同函数中可以使用相同名字的变量 B)形式参数是局部变量

实变函数第一章答案

习题1.1 1.证明下列集合等式. (1) ()()()C A B A C B A \\=; (2) ()()()C B C A C B A \\\ =; (3) ()()()C A B A C B A \\\=. 证明 (1) )()C \B (c C B A A = )()( c c C B A A B A = c C A B A )()( = )(\)(C A B A = . (2) c C B A A )(C \B)(= )()(c c C B C A = =)\()\(C A C A . (3) )(\C)\(B \c C B A A = c c C B A )( = )(C B A c = )()(C A B A c = )()\(C A B A =. 2.证明下列命题. (1) ()A B B A = \的充分必要条件是:A B ?; (2) ()A B B A =\ 的充分必要条件是:=B A ?; (3) ()()B B A B B A \\ =的充分必要条件是:=B ?. 证明 (1) A B A B B B A B B A B B A c c ==== )()()()\(的充要条 是:.A B ? (2) c c c c B A B B B A B B A B B A ===)()()(\)( 必要性. 设A B B A =\)( 成立,则A B A c = , 于是有c B A ?, 可得.?=B A 反之若,?≠B A 取B A x ∈, 则B x A x ∈∈且, 那么B x A x ?∈且与c B A ?矛盾.

充分性. 假设?=B A 成立, 则c B A ?, 于是有A B A c = , 即.\)(A B B A = (3) 必要性. 假设B B A B B A \)()\( =, 即.\c C A B A B A == 若,?≠B 取,B x ∈ 则,c B x ? 于是,c B A x ? 但,B A x ∈ 与c C A B A =矛盾. 充分性. 假设?=B 成立, 显然B A B A \= 成立, 即B B A B B A \)()\( =. 3.证明定理1.1.6. 定理1.1.6 (1) 如果{}n A 是渐张集列, 即),1(1≥??+n A A n n 则{}n A 收敛且 ∞ =∞ →=1 ;lim n n n n A A (2) 如果{}n A 是渐缩集列, 即),1(1≥??+n A A n n 则{}n A 收敛且 ∞ =∞ →= 1 . lim n n n n A A 证明 (1) 设),1(1≥??+n A A n n 则对任意 ∞ =∈ 1 ,n n A x 存在N 使得,N A x ∈ 从而 ),(N n A x N ≥?∈ 所以,lim n n A x ∞ →∈ 则.lim 1 n n n n A A ∞→∞ =? 又因为 ∞ =∞ →∞ →??1 ,lim lim n n n n n n A A A 由此可见{}n A 收敛且 ∞ =∞ →= 1 ;lim n n n n A A (2) 当)1(1≥??+n A A n n 时, 对于, lim n n A x ∞ →∈存 )1(1≥?<+k n n k k 使得 ),1(≥?∈k A x k n 于是对于任意的,1≥n 存在0k 使得n n k >0, 从而,0 n n A A x k ?∈ 可见.lim 1 ∞ =∞ →?n n n n A A 又因为,lim lim 1 n n n n n n A A A ∞ →∞ →∞ =?? 所以可知{}n A 收敛且 ∞ =∞ →=1 .lim n n n n A A 4.设f 是定义于集合E 上的实值函数,c 为任意实数,证明: (1) ??? ???+≥=>∞ =n c f E c f E n 1][1 ; (2) ?? ? ???+<=≤∞ =n c f E c f E n 1][1 ; (3) 若))(()(lim E x x f x f n n ∈?=∞ →,则对任意实数c 有 ?????? ->=????? ?->=≥∞→∞=∞ =∞ =∞ =k c f E k c f E c f E n n k n N n N k 1lim 1][111 . 证明 (1) 对任意的[],c f E x >∈ 有,)(c x f > 则存在+ ∈Z n 使得n c x f 1)(+ ≥成

概率第七章习题答案

第七章 参数估计习题参考答案 1.设,0 ()0, 0x e x f x x θθ-?>=?≤?,求θ的矩估计。 解 ,0 dx xe EX x ?+∞ -=θθ设du dx u x x u θ θ θ1 ,1 ,= = = 则0 0011 1()0()u u u EX ue du ue e du e θθθθ+∞+∞--+∞--+∞ ????==-+=+-??? ?????=θ 1 故1EX θ= ,所以x 1?=θ 。 2. 设总体X 在[]b a ,上服从均匀分布,求a 和b 的矩估计。 解 由均匀分布的数学期望和方差知 1 ()()2 E X a b =+ (1) 21()()12 D X b a =- (2) 由(1)解得a EX b -=2,代入(2)得2)22(12 1 a EX DX -= , 整理得2)(3 1 a EX DX -=,解得 ()()a E X b E X ?=-?? =?? 故得b a ,的矩估计为 ??a x b x ?=??=+??其中∑=-=n i i x x n 1 22 )(1?σ 。 3.设总体X 的密度函数为(;)! x e f x x θ θθ-= ,求θ的最大似然估计。 解 设)!)...(!)(!(),()(2111n n x n i i x x x e x f L n i i θ θ θθ-=∑===∏,则

1 1 ln ()()ln ln(!)n n i i i i L x n x θθθ===--∑∑ 11 ln ()11?0, n n i i i i d L x n x x d n θθθθ===-===∑∑ 4.设总体X 的密度函数为 , 其中 (θ>0), 求θ的 极大似然估计量. 解. 设(X 1, X 2,…, X n )是来自X 的一样本. 由极大似然估计原理,参数θ的似然函数为: , 上式两边取对数 似然方程为 解似然方程得θ的极大似然估计量是 . 5.设总体X 的密度函数1(,)()(a a x f x a x e a θθθ--=已知),求参数θ的最大似然估计。 解 1 1121 ()(,)(...)n a i i n x n n a i n i L f x a x x x e θ θθθ=--=∑==∏ 1 1 ln ()ln ln (1)ln n n a i i i i L n n a a x x θθθ===++--∑∑ 1 ln ()0n a i i d L n x d θθθ==-=∑ 解得 ∑==n i a i x n 1 1θ。

实变函数测试题1-参考答案

本试题参考答案由08统计班15号 李维提供 有问题联系 1、设 212(0,1/),(0,),0,1,2...,n n A n A n n -===n 求出集列{A }的上限集和下限集合。 2、证明:()f x 为[,]a b 上连续函数的充分必要条件是对任意实数c ,集{} ()E x f x c =≥和 {}1()E x f x c =≤都是闭集。 3、设n R E ?是任意可测集,则一定存在可测集 δ G 型集 G ,使得 E G ?,且 ()0=-E G m 4、设,n A B R ?,A B ?可测,且()m A B ?<+∞,若()**m A B m A m B ?=+, 则,A B 皆可测。 5、写出鲁津定理及其逆定理。并证明鲁津定理的逆定理。 6、设)(x f 是E 上的可测函数,G 为开集,F 为闭集,试问])(|[G x f x E ∈与 ])(|[F x f x E ∈是否是可测集,为什么? 7、设在Cantor 集0P 上定义函数()f x =0,而在0P 的余集中长为1 3n 的构成区间上定义为n (1,2,3,=L n ),试证()f x 可积分,并求出积分值。 8、设{}n f 为E 上非负可积函数列,若lim ()0,n E n f x dx →∞=? 则()0n f x ?。 9、设)(x f 是E 上. 有限的可测函数,+∞?ε,存在E 上. 有界的 可测函数)(x g ,使得 ε<>-]0|[|g f mE 。 10、求证 1 2 01 11 ln 1()∞ ==-+∑?p n x dx x x p n , (1)p >-。 解答: 1. 解:()∞=∞ →,0lim n n A ;设()∞∈,0x ,则存在N ,使x N <,因此n N >时,0x n <<, 即n A x 2∈,所以x 属于下标比N 大的一切偶指标集,从而x 属于无限多n A ,得n n A x ∞ →∈lim 又显然()∞?∞ →,0lim n n A ,所以()∞=∞ →,0lim n n A 。

C++Primer中文版_第4版_第七章_函数_习题解答_文字word版

第七章函数 题目00 What is the difference between a parameter and an argument? 形参和实参有什么区别? 【解答】 形参是在函数定义的形参表中进行定义,是一个变量,其作用域为整个函数。而实参出现在函数调用中,是一个表达式。进行函数调用时,用传递给函数的实参对形参进行初始化。 题目01 Indicate which of the following functions are in error and why. Suggest how you might correct the problems. 下列哪些函数是错误的?为什么?请给出修改意见。 (a) int f() { string s; // ... return s; } (b) f2(int i) { /* ... */ } (c) int calc(int v1, int v1) /* ... */ } (d) double square(double x) return x * x; 【解答】 (a)是错误的。因为函数头中所定义的返回值类型为int,return语句世纪返回的表达式的类 型为string,两个类型不同,而string类型又不能隐式转换为int类型。可修改为: string f(){ string s; //… Return s; } (b)是错误的。因为该函数定义中没有指定返回类型,在标准C++中,定义函数时不指定返 回类型是非法的。可修改为: Int f2(int i){/*…*/} (c)是错误的。缺少括住函数体在左花括号,而且两个形参不应该同名。可修改为: Int caic(int v1,intv2){/*…*/} (d)是错误的。缺少括住函数体的一对花括号。可修改为: Double square(double x){return x*x;}

实变函数试题库(4)及参考答案

实变函数试题库及参考答案(4) 本科 一、填空题 1.设,A B 为两个集合,则__c A B A B - . 2.设n E R ?,如果E 满足E E '?(其中E '表示E 的导集),则E 是 3.若开区间(,)αβ为直线上开集G 的一个构成区间,则(,)αβ满(i) )(b a ,G (ii),a G b G ?? 4.设A 为无限集.则A 的基数__A a (其中a 表示自然数集N 的基数) 5.设12,E E 为可测集,2mE <+∞,则1212(\)__m E E mE mE -. 6.设{}()n f x 为可测集E 上的可测函数列,且()(),n f x f x x E ?∈,则由______定理可知得,存在{}()n f x 的子列{}()k n f x ,使得.()() ()k a e n f x f x x E →∈. 7.设()f x 为可测集E (n R ?)上的可测函数,则()f x 在E 上的L 积分值存在且|()|f x 在E 上L 可积.(填“一定”“不一定”) 8.若()f x 是[,]a b 上的绝对连续函数,则()f x 是[,]a b 上的有 二、选择题 1.设(){},001E x x =≤≤,则( ) A 1mE = B 0mE = C E 是2R 中闭集 D E 是2R 中完备集 2.设()f x ,()g x 是E 上的可测函数,则( ) A 、()()E x f x g x ??≥??不一定是可测集 B 、()()E x f x g x ??≠??是可测集 C 、()()E x f x g x ??≤??是不可测集 D 、()() E x f x g x ??=??不一定是可测集 3.下列集合关系成立的是() A 、(\)A B B A B = B 、(\)A B B A = C 、(\)B A A A ? D 、\B A A ? 4. 若() n E R ?是开集,则 ( ) A 、E 的导集E ? B 、E 的开核E =C 、E E =D 、E 的导集E =

函数与极限测试题及答案(一)

函数与极限测试题(一) 一、 填空题 1、若1ln 1 1ln x f x x +??= ?-??,则()f x =_____。 2、函数()f x 的定义域为[],a b ,则()21f x -的定义域为_____。 3、若0x →时,无穷小2 21ln 1x x -+与2sin a 等价,则常数a =_____。 4、设()()2 1lim 1 n n x f x nx →∞ -=+,则()f x 的间断点为x =_____。 二、 单选题 1、当0x →时,变量 2 11 sin x x 是( ) A 、无穷小 B 、无穷大 C 、有界的,但不是无穷小 D 、无界的,也不是无穷大 2、设函数()bx x f x a e =+在(),-∞+∞上连续,且()lim 0x f x →-∞=,则常数,a b 满足( ) A 、0,0a b << B 、0,0a b >> C 、0,0a b ≥< D 、0,0a b ≤> 3、设()232x x f x =+-,则当0x →时( ) A 、()f x 与x 是等价无穷小 B 、()f x 与x 是同阶但非等价无穷小 C 、()f x 是x 的高阶无穷小 D 、()f x 是x 的低阶无穷小 4、设对任意的x ,总有()()()x f x g x ?≤≤,且()()lim 0x g x x ?→∞ -=????, 则()lim x f x →∞ 为( ) A 、存在且等于零 B 、存在但不一定等于零 C 、一定不存在 D 、不一定存在

例:()()()11 ,,22 1 x x f x x g x x x x ?==+ =+ ++ 三、 求下列极限 1 、 lim x 2、()2 21212lim 1x x x x x -→?? ?+?? 四、 确定,a b 的值,使() 32 2ln 10 011ln 0 1ax x f x b x x x x x x x ?+<==??-+?>++?? 在(),-∞+∞内连续。 五、 指出函数()1 11x x x e e f x e e --= -的间断点及其类型。 六、 设1234,,,a a a a 为正常数,证明方程 31240123 a a a a x x x x +++=---有且仅有三个实根。 七、 设函数()(),f x g x 在[],a b 上连续,且满足()()()(),f a g a f b g b ≤≥,证明: 在[],a b 内至少存在一点ξ,使得()()f g ξξ=。 函数与极限测试题答案(一) 一、1、 11x x e -+; 2、 11, 2 2a b ++?? ???? ; 3、 4-; 4、0 ; 二、1—4、DCBD 三、1 、解:原式lim 3x ==;

第七章 函数习题答案

第七章函数习题答案 1. 单项选择题 (1) 若定义的函数有返回值,则以下关于该函数调用的说法中错误的是____D____。 A. 函数调用可以作为独立的语句存在 B. 函数调用可以作为一个函数的参数 C. 函数调用可以出现在表达式中 D. 函数可以作为一个函数的形式参数 (2) 在函数的调用过程中,如果函数FUNA调用了函数FUNB,函数FUNB又调用了函数FUNA,则___B_____。 A. 称为函数的直接递归调用 B. 称为函数的间接递归调用 C. 称为函数的循环调用 D. C语言不允许这样的递归调用 (3) 在C语言中,函数的隐含存储类别是__A______。 A. auto B. static C. extern D. 无存储类别 (4) 在下列对C语言函数的描述中,正确的是___A_____。 A. 在C语言中调用函数时,只能将实际参数的值传给形式参数,形式参数的值不能传给实际参数 B. C函数既可以是嵌套定义,又可以是递归定义 C. 函数必须有返回值 D. C程序中有调用关系的所有函数必须放在同一个源程序文件中 (5) 下面函数的类型是___B_____。 f(double x) {printf("%6d\n",x);} A. 浮点型 B. int型 C. void型 D. 都不是 (6) 有以下程序: char fun(char x,char y) { if(x

实变函数试题库及参考答案

实变函数试题库及参考答案(1) 本科 一、填空题 1.设,A B 为集合,则()\A B B U A B U (用描述集合间关系的符号填写) 2.设A 是B 的子集,则A B (用描述集合间关系的符号填写) 3.如果E 中聚点都属于E ,则称E 是 4.有限个开集的交是 5.设1E 、2E 是可测集,则()12m E E U 12mE mE +(用描述集合间关系的符号填写) 6.设n E ??是可数集,则*m E 0 7.设()f x 是定义在可测集E 上的实函数,如果1a ?∈?,()E x f x a ??≥??是 ,则称()f x 在E 上可测 8.可测函数列的上极限也是 函数 9.设()()n f x f x ?,()()n g x g x ?,则()()n n f x g x +? 10.设()f x 在E 上L 可积,则()f x 在E 上 二、选择题 1.下列集合关系成立的是( ) 2.若n R E ?是开集,则( ) 3.设(){}n f x 是E 上一列非负可测函数,则( ) 三、多项选择题(每题至少有两个以上的正确答案) 1.设[]{}0,1E =中无理数,则( ) A E 是不可数集 B E 是闭集 C E 中没有内点 D 1m E = 2.设n E ??是无限集,则( ) A E 可以和自身的某个真子集对等 B E a ≥(a 为自然数集的基数) 3.设()f x 是E 上的可测函数,则( ) A 函数()f x 在E 上可测 B ()f x 在E 的可测子集上可测 C ()f x 是有界的 D ()f x 是简单函数的极限

4.设()f x 是[],a b 上的有界函数,且黎曼可积,则( ) A ()f x 在[],a b 上可测 B ()f x 在[],a b 上L 可积 C ()f x 在[],a b 上几乎处处连续 D ()f x 在[],a b 上几乎处处等于某个连续函数 四、判断题 1. 可数个闭集的并是闭集. ( ) 2. 可数个可测集的并是可测集. ( ) 3. 相等的集合是对等的. ( ) 4. 称()(),f x g x 在E 上几乎处处相等是指使()()f x g x ≠的x 全体是可测集. ( ) 五、定义题 1. 简述无限集中有基数最小的集合,但没有最大的集合. 2. 简述点集的边界点,聚点和内点的关系. 3. 简单函数、可测函数与连续函数有什么关系? 4. [],a b 上单调函数与有界变差函数有什么关系? 六、计算题 1. 设()[]23 0,1\x x E f x x x E ?∈?=?∈??,其中E 为[]0,1中有理数集,求 ()[] 0,1f x dx ?. 2. 设{}n r 为[]0,1中全体有理数,(){}[]{}12121 ,,00,1\,,n n n x r r r f x x r r r ∈??=?∈??L L ,求()[] 0,1lim n n f x dx →∞?. 七、证明题 1.证明集合等式:(\)A B B A B =U U 2.设E 是[0,1]中的无理数集,则E 是可测集,且1mE = 3.设(),()f x g x 是E 上的可测函数,则[|()()]E x f x g x >是可测集 4.设()f x 是E 上的可测函数,则对任何常数0a >,有1 [|()|]|()|E mE x f x a f x dx a ≥≤ ? 5.设()f x 是E 上的L -可积函数,{}n E 是E 的一列可测子集,且lim 0n n mE →∞ =,则 实变函数试题库及参考答案(1) 本科 一、填空题

函数与极限习题与答案

第一章 函数与极限 (A ) 一、填空题 1、设x x x f lg lg 2)(+-= ,其定义域为 。 2、设)1ln()(+=x x f ,其定义域为 。 3、设)3arcsin()(-=x x f ,其定义域为 。 4、设)(x f 的定义域是[0,1],则)(sin x f 的定义域为 。 5、设)(x f y =的定义域是[0,2] ,则)(2x f y =的定义域为 。 6、43 2lim 23=-+-→x k x x x ,则k= 。 7、函数x x y sin = 有间断点 ,其中 为其可去间断点。 8、若当0≠x 时 ,x x x f 2sin )(= ,且0)(=x x f 在处连续 ,则=)0(f 。 9、=++++++∞→)21(lim 222 n n n n n n n n 。 10、函数)(x f 在0x 处连续是)(x f 在0x 连续的 条件。 11、=++++∞→352352) 23)(1(lim x x x x x x 。 12、3) 2 1(lim -∞ →=+e n kn n ,则k= 。 13、函数2 31 22+--=x x x y 的间断点是 。 14、当+∞→x 时, x 1 是比3-+x 15、当0→x 时,无穷小x --11与x 相比较是 无穷小。 16、函数x e y 1=在x=0处是第 类间断点。 17、设1 1 3 --= x x y ,则x=1为y 的 间断点。 18、已知33=?? ? ??πf ,则当a 为 时,函数x x a x f 3sin 31sin )(+=在3π=x 处连续。

19、设?? ???>+<=0)1(02sin )(1x ax x x x x f x 若)(lim 0 x f x →存在 ,则a= 。 20、曲线2sin 2 -+=x x x y 水平渐近线方程是 。 21、1 14)(2 2-+ -= x x x f 的连续区间为 。 22、设?? ?>≤+=0 ,cos 0 ,)(x x x a x x f 在0=x 连续 ,则常数 a= 。 二、计算题 1、求下列函数定义域 (1)2 11 x y -= ; (2)x y sin = ; (3)x e y 1= ; 2、函数)(x f 和)(x g 是否相同?为什么? (1)x x g x x f ln 2)(,ln )(2 == ; (2)2)(,)(x x g x x f = = ; (3)x x x g x f 22tan sec )(, 1)(-== ; 3、判定函数的奇偶性 (1))1(2 2 x x y -= ; (2)3 2 3x x y -= ;

第七章_频响函数的估计

如果S yx 不为零,则可得系统的频响函数的第二种计算式 7.频响函数的估计(相干分析) 7.1. SISO 系统的频响函数及其估计 对于SISO 系统,其频响函数的估计有很多计算方法, 主要的有三种估计式。 在没有噪声污染的情况下,它们的估计是等价的。但是实际上,由于不可避免的 存在噪声,三种估计有所差异。 本节讨论在主要的三种噪声污染下,三种传统估计式与真值之间的误差 7.1.1. 随机激励下的频响函数 考虑一个SISO 时不变线性系统,其频率响应函数为H 。设随机输入和响 应信号分别为x(t)和y(t),其傅立叶变换分别为X()和Y(),贝U 有 上式两端乘以X * ,取时间平均及集合平均,并注意 H 与平均无关,则 lim - Y X * H lim - X X T T T T 如果S x 不为零,则可得系统的频响函数的第一种计算式 S xy S x 同样,如果在系统输入/出频谱式两端乘以Y * ,取时间平均和集合平均,得 S yx xy H S x H i S y

(1) H 2 将系统输入/出频谱式两端取共轭,得 * Y 乘以原输入/出频谱式,并去时间平均和集合平均,得 考虑一个SISO 时不变线性系统,其频率响应函数为 H 。设系统的实际 输入和响 应信号分别为u(t)和v(t),其傅立叶变换分别为U()和2(),它们的 测量信号分别为x(t)和y(t),其傅立叶变换分别为X()和Y()。 输出端噪声的影响 若只有输出端受到噪声信号n(t)的污染,并设它与系统的u(t)和v(t)无关 则有 S y S yx 7.1.2 S y H 2 S 可得系统的频响函数的幅值计算式 H a 2 S y S x 频响函数的估计方法

第7章函数练习题(含答案)

函数练习题 1、在C语言中,正确的说法是( A ) A.函数内部和外部定义的变量同名是合法的 B.只要形参和实参都是变量,那么形实结合一定是地址传递 C.变量的定义和声明(也称说明)功能是相同的 D.没有return 的函数就失去了返回功能 2. 若程序中定义了以下函数 double myadd(double a,double B) { return (a+B) ;} 并将其放在调用语句之后,则在调用之前应该对该函数进行说明,以下选项中错误的说明是(A) A) double myadd(double a,B); B) double myadd(double,double); C) double myadd(double b,double A); D) double myadd(double x,double y); 3. 有以下程序 void f(int v , int w) { int t; t=v;v=w;w=t; } int main( ) { int x=1,y=3,z=2; if(x>y) f(x,y); else if(y>z) f(y,z); else f(x,z); printf(“%d,%d,%d\n”,x,y,z); return 0; } 执行后输出结果是( C ) A) 1,2,3 B) 3,1,2 C) 1,3,2 D) 2,3,1 4. 以下叙述正确的是(C) A) c程序由主函数构成B) c程序由函数和过程构成 C) c程序由函数构成 D) 在c程序中,无论是整形值还是实型值,只要在允许的范围内,都能准确无误的表示 5. 构成c语言程序的基本结构单位是(A) A)函数B)过程C)复合语句D)语句 6. C语言规定:在一个源程序中,main函数的位置(C)。

实变函数复习资料,带答案

《实变函数》试卷一 一、单项选择题(3分×5=15分) 1、下列各式正确的是( ) (A )1lim n k n n k n A A ∞ ∞ →∞ ===??; (B )1lim n k n k n n A A ∞ ∞ ==→∞ =??; (C )1lim n k n n k n A A ∞ ∞ →∞ ===??; (D )1lim n k n k n n A A ∞ ∞ ==→∞ =??; 2、设P 为Cantor 集,则下列各式不成立的是( ) (A )=P c (B) 0mP = (C) P P =' (D) P P =ο 3、下列说法不正确的是( ) (A) 凡外侧度为零的集合都可测(B )可测集的任何子集都可测(C) 开集和闭集都是波雷耳集 (D )波雷耳集都可测 4、设{}()n f x 是E 上的..a e 有限的可测函数列,则下面不成立的是( )(A )若()()n f x f x ?, 则()()n f x f x → (B) {}sup ()n n f x 是可测函数(C ){}inf ()n n f x 是可测函数;(D )若 ()()n f x f x ?,则()f x 可测 5、设f(x)是],[b a 上有界变差函数,则下面不成立的是( )(A) )(x f 在],[b a 上有界 (B) )(x f 在],[b a 上几乎处处存在导数 (C ))(' x f 在],[b a 上L 可积 (D) ? -=b a a f b f dx x f )()()(' 二. 填空题(3分×5=15分) 1、()(())s s C A C B A A B ??--=_________ 2、设E 是[]0,1上有理点全体,则 ' E =______,o E =______,E =______. 3、设E 是n R 中点集,如果对任一点集T 都 _________________________________,则称E 是L 可测的 4、)(x f 可测的________条件是它可以表成一列简单函数的极限函数.(填“充分”,“必要”,“充要”) 5、设()f x 为[],a b 上的有限函数,如果对于[],a b 的一切分划,使_____________________________________,则称()f x 为 [],a b 上的有界变差函数。 三、下列命题是否成立?若成立,则证明之;若不成立,则举反例

高等数学函数的极限与连续习题及答案

1、函数 ()12 ++=x x x f 与函数()11 3--=x x x g 相同. 错误 ∵当两个函数的定义域和函数关系相同时,则这两个函数是相同的。 ∴ ()12 ++=x x x f 与()113--=x x x g 函数关系相同,但定义域不同,所以()x f 与() x g 是不同的函数。 2、如果()M x f >(M 为一个常数),则()x f 为无穷大. 错误 根据无穷大的定义,此题是错误的。 3、如果数列有界,则极限存在. 错误 如:数列()n n x 1-=是有界数列,但极限不存在 4、a a n n =∞ →lim ,a a n n =∞ →lim . 错误 如:数列()n n a 1-=,1) 1(lim =-∞ →n n ,但n n )1(lim -∞ →不存在。 5、如果()A x f x =∞ →lim ,则()α+=A x f (当∞→x 时,α为无穷小). 正确 根据函数、极限值、无穷小量的关系,此题是正确的。 6、如果α~β,则()α=β-αo . 正确 ∵1lim =α β ,是 ∴01lim lim =?? ? ??-=-αβαβα,即βα-是α的高阶无穷小量。 7、当0→x 时,x cos 1-与2 x 是同阶无穷小. 正确 ∵2122sin 412lim 2sin 2lim cos 1lim 2 02 2020=????? ? ????==-→→→x x x x x x x x x 8、 01 sin lim lim 1sin lim 000=?=→→→x x x x x x x . 错误 ∵x x 1 sin lim 0→不存在,∴不可利用两个函数乘积求极限的法则计算。 9、 e x x x =?? ? ??+→11lim 0 . 错误 ∵e x x x =?? ? ??+∞ →11lim 10、点0=x 是函数x x y =的无穷间断点. 错误 =-→x x x 00lim 1lim 00-=--→x x x ,=+→x x x 00lim 1lim 00=+→x x x ∴点0=x 是函数x x y =的第一类间断点. 11、函数()x f x 1 =必在闭区间[]b a ,内取得最大值、最小值.

相关文档