5、,,查联机帮助,——,VC++6.0,联机帮助的使用方法:,,help/Contents,,->(“,活动子集”栏,)Visual C++ Documentation,,-> Visual C++ Documentation ->Using Visual C++ -> Visual C++ Programmer's Guide -> Run-Time Library Reference,,->Run Time Routines by Category -> Run Time Routines by Category,使 用,C++,系 统 函
6、数,,7,,,,计算机基础教研室,函数声明的语法形式,,类型标识符 函数名(形式参数表),,{,,,语句序列,,},若无参数,写,void,是被初始化的内部变量,寿命和可见性仅限于函数内部,若无返回值,写,void,,形式参数表,, name1, name2, ..., namen,,函数的返回值,,由,return,语句给出,例如:,return 0,;,,无返回值的函数(,void,类型),不必写,return,语句。,,函 数 的 定 义 与 使 用,函数的定义,,8,,,,计算机基础教研室,调用前先声明函数原型:,,在调用函数中,或程序文件中所有函数之外,按如下形式说明:,,类
7、型标识符 被调用函数名(含类型说明的形参表),;,,调用形式,,,函数名(实参列表),,嵌套调用,,函数可以嵌套调用,但不允许嵌套定义。,,递归调用,,函数直接或间接调用自身。,函 数 的 定 义 与 使 用,函数的调用,,9,,,,计算机基础教研室,编写一个求,x,的,n,次方的函数,#,include ,,using namespace std;,,Double,,power (double x, int n);,,void main(void),,{,,cout << "5 to the power 2 is " << power(5,2) << endl;,,},,D
8、ouble,,power (double x, int n),,{,,double val = 1.0;,,while (n),,,{,val = val*x;,,n--;,,return(val);,,},函 数 的 定 义 与 使 用,,10,,,,计算机基础教研室,数制转换,题目:,,输入一个,8,位二进制数,将其转换为十进制数输出。,,,例如:,(,1101,),2 = 1(2,3,) + 1(2,2,) + 0(2,1,) + 1(2,0,)=,(,13,),10,,所以,,如果输入,1101,,则应输出,13,函 数 的 定 义 与 使 用,,11,,,,计算机基础教研室,#,in
9、clude ,,using namespace std;,,double power (double x, int n);,,void main(void),,{,,int i;,,int value = 0;,,char ch;,,cout << "Enter an 8 bit binary number ";,,for (i = 7; i >= 0; i--),,{,,cin >> ch;,,if (ch == '1'),,value += int(power(2,i));,,},,cout <<"Decimal value is "<
10、 power (double x, int n),,{,,double val = 1.0;,,while (n--),,val *= x;,,return(val);,,},运行结果:,,Enter an 8 bit binary number 01101001,,Decimal value is 105,函 数 的 定 义 与 使 用,,12,,,,计算机基础教研室,,,其中,arctan,用如下形式的级数计算:,,,,,直到级数某项绝对值不大于,10,-15,为止;,π,和,x,均为,double,型。,函 数 的 定 义 与 使 用,÷,ø,ö,ç,è,æ,-,ø,ö,ç,è,æ,
11、=,239,1,arctan,4,5,1,arctan,16,p,编写程序求,π,的值,,13,,,,计算机基础教研室,#include<,iostream,>,,using namespace std;,,void main(),,{,,double a,b;,,double,arctan(double,x) ;,,//,函数原型声明,,,a=16.0*arctan(1/5.0) ;,,b=4.0*arctan(1/239.0) ;,,//,注意:因为整数相除结果取整,,,//,如果参数写,1/5,,,1/239,,结果就都是,0,,,cout,<<"PI="<
12、;,,},double,arctan(double,x),,{,int,i;,,double,r,e,f,sqr,;,,,sqr,=x*x;,,r=0; e=x; i=1;,,,while(e/i,>1e-15),,{,,f=,e/i,;,,r=(i%4==1)?,r+f,:,r-f,;,,e=e*,sqr,; i+=2;,,},,return r ;,,},函 数 的 定 义 与 使 用,,14,,,,计算机基础教研室,寻找并输出,11-999,之间的数,m,,,它满足,m,、,m2,和,m3,均为回文数。,,回文:各位数字左右对称的整数。例如:,11,满足上述条件
13、,11,2,=121,,,11,3,=1331,。,,分析:,,10,取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。,函 数 的 定 义 与 使 用,寻找回文数,,15,,,,计算机基础教研室,#include <,iostream,>,,using namespace std;,,void main(),,{,,,bool,,symm(long,n);,,long m;,,for(m=11; m<1000; m++),,if (,symm(m)&&symm(m,*,m)&&symm(m,*m*m)),,,cout,<<"m=
14、"<
15、 与 使 用,,17,,,,计算机基础教研室,计算如下公式,并输出结果:,,,,,,其中,r,、,s,的值由键盘输入。,SIN x,的近似值按如下公式计算,计算精度为,10-6,:,,函 数 的 定 义 与 使 用,计算,sin(x,),的值,,18,,,,计算机基础教研室,#include <,iostream,>,,#include<,cmath,>,,using namespace std;,,void main(),,{,,double k,r,s;,,double,tsin(double,x);,,,cout,<<"r=";,,,cin,>>r;,,,cout,<<"s=";,,,c
16、in,>>s;,,if (r*r<=s*s),,k=,sqrt(tsin(r,)*,tsin(r)+tsin(s,)*,tsin(s,)) ;,,else,,k=,tsin(r,*s)/2;,,,cout,<=p);,,return g;,,}
17、,,运行结果:,,r=5,,s=8,,1.37781,函 数 的 定 义 与 使 用,,20,,,,计算机基础教研室,游戏规则是:每个骰子有六面,点数分别为,1,、,2,、,3,、,4,、,5,、,6,。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。,,每轮投两次骰子,第一轮如果和数为,7,或,11,则为胜,游戏结束;和数为,2,、,3,或,12,则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮,...,直到某轮的和数等于点数则取胜,若在此前出现和数为,7,则为负。,,由,rolldice,函数负责模拟投骰子、计算和数并输出和数。,函 数 的 定 义 与
18、使 用,投骰子的随机游戏,,21,,,,计算机基础教研室,int,,rolldice(void,),,{ //,投骰子、计算和数、输出和数,,,int,die1,die2,worksum;,,die1=1+rand()%6;,,die2=1+rand()%6;,,,worksum,=die1+die2;,,,cout,<<"player rolled "<,,
19、#include <,cstdlib,>,,using namespace std;,,int,,rolldice(void,);,,void main(),,{,,,int,,gamestatus,sum,mypoint,;,,unsigned seed;,,,cout,<<"Please enter an unsigned integer:";,,,cin,>>seed; //,输入随机数种子,,,srand(seed,); //,将种子传递给,rand(),,sum=,rolldice,(); //,第一轮投骰子、计算和数,函 数 的 定 义 与 使 用,,23,,,,计算机
20、基础教研室,,switch(sum),,{,,case 7: //,如果和数为,7,或,11,则为胜,,,状态为,1,,case 11:,gamestatus,=1;break;,,case 2: //,和数为,2,、,3,或,12,则为负,,,状态为,2,,case 3:,,case 12:,gamestatus,=2;break;,,default: //,其它情况,,,游戏尚无结果,,,状态为,0,,记下点数,,,为下一轮做准备,,,gamestatus,=0;,,,mypoint,=sum ;,,,cout,<<"point is "<<,mypoint,<<,endl,
21、;,,break;,,},函 数 的 定 义 与 使 用,,24,,,,计算机基础教研室,,while (,gamestatus,==0),,//,只要状态仍为,0,,就继续进行下一轮,,,{ sum=,rolldice,();,,,if(sum,==,mypoint,),,//,某轮的和数等于点数则取胜,,,状态置为,1,,,gamestatus,=1 ;,,else,,if (sum==7) //,出现和数为,7,则为负,,,状态置为,2,,,gamestatus,=2;,,} //,当状态不为,0,时上面的循环结束,,,以下程序段输出游戏结果,,,if(gamestatus,=
22、=1),,,cout,<<"player wins\n";,,else,,,cout,<<"player loses\n";,,},运行结果:,,Please enter an unsigned integer:23,,player rolled 6+3=9,,point is 9,,player rolled 5+4=9,,player wins,函 数 的 定 义 与 使 用,,25,,,,计算机基础教研室,函数调用的执行过程,main(),,,调,fun(),,,,结束,fun(),,,,,返回,①,②,④,⑥,⑦,保存:,,返回地址,,当前现场,③,恢复:,,主调程序现场,,返回地址,
23、⑤,函 数 的 定 义 与 使 用,,26,,,,计算机基础教研室,嵌套调用,main{},,,调,fun1(),,,,结束,fun1(),,,调,fun2(),,,返回,fun2(),,,,,返回,①,②,③,⑦,④,⑤,⑥,⑧,⑨,函 数 的 定 义 与 使 用,,27,,,,计算机基础教研室,,输入两个整数,求平方和,#include <,iostream,>,,using namespace std;,,void main(void),,{,,,int,a,b;,,,int,fun1(int,x,int,y);,,,cin,>>a>>b;,,,cout,<<"a,、,b,的平方和,"<
24、
25、1! → 1!=1×0! → 0!=1,,回归:,,4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1,函 数 的 定 义 与 使 用,,30,,,,计算机基础教研室,求,n!,分析:计算,n!,的公式如下:,,,,,这是一个递归形式的公式,应该用递归函数实现。,,函 数 的 定 义 与 使 用,,31,,,,计算机基础教研室,//,源程序:,,#include <,iostream,>,,using namespace std;,,long,fac(int,n),,{,,long f;,,if (n<0),,,cout,<<"n<0,data erro
26、r!"<<,endl,;,,else if (n==0) f=1;,,else f=fac(n-1)*n;,,return(f);,,},函 数 的 定 义 与 使 用,,32,,,,计算机基础教研室,void main(),,{,,long,fac(int,n);,,,int,n;,,long y;,,,cout,<<"Enter a positive integer:";,,,cin,>>n;,,y=,fac(n,);,,,cout,<
27、 与 使 用,,33,,,,计算机基础教研室,组合数,用递归法计算从,n,个人中选择,k,个人组成一个委员会的不同组合数。,,分析:,,由,n,个人里选,k,个人的组合数,,,=,由,n-1,个人里选,k,个人的组合数,,,+,由,n-1,个人里选,k-1,个人的组合数,,当,n==k,或,k==0,时,组合数为,1,函 数 的 定 义 与 使 用,,34,,,,计算机基础教研室,#include<,iostream,>,,using namespace std;,,void main(),,{,int,n,k;,,,int,,comm(int,n,,int,k);,,,cin,>>n>>k;
28、,,,cout,<<,comm(n,k,) <<,endl,;,,},,int,,comm(int,n,,int,k),,{ if ( k>n ) return 0;,,else if( n==k||k==0 ),,return 1;,,else,,return comm(n-1,k)+comm(n-1,k-1) ;,,},运行结果:,,18 5,,8568,函 数 的 定 义 与 使 用,,35,,,,计算机基础教研室,汉诺塔问题,有三根针,A,、,B,、,C,。,A,针上有,N,个盘子,大的在下,小的在上,要求把这,N,个盘子从,A,针移到,C,针,在移动过程中可以
29、借助,B,针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,A,B,C,函 数 的 定 义 与 使 用,,36,,,,计算机基础教研室,分析:,,将,n,个盘子从,A,针移到,C,针可以分解为下面三个步骤:,,①,将,A,上,n-1,个盘子移到,B,针上(借助,C,针),;,,②,把,A,针上剩下的一个盘子移到,C,针上,;,,③,将,n-1,个盘子从,B,针移到,C,针上(借助,A,针),;,事实上,上面三个步骤包含两种操作:,,①,将多个盘子从一个针移到另一个针上,这是一个递归的过程。,hanoi,函数实现。,,②,将,1,个盘子从一个针上移到另一针上。用,mo
30、ve,函数实现。,函 数 的 定 义 与 使 用,,37,,,,计算机基础教研室,#include <,iostream,>,,using namespace std;,,void move(char,getone,char,,putone,),,{,cout,<<,getone,"<<,putone,<<,endl,; },,void,hanoi(int,n,char one,char two,char three),,{ void move(char,getone,char,,putone,);,,if (n==1) move (one,three);,,else,,{,hanoi,(n-
31、1,one,three,two);,,move(one,three);,,hanoi(n-1,two,one,three);,,},,},函 数 的 定 义 与 使 用,,38,,,,计算机基础教研室,void main(),,{,,void,hanoi(int,n,char one,char two,char three);,,,int,m;,,,cout,<<"Enter the number of,diskes,:";,,,cin,>>m;,,,cout,<<"the steps to moving "<
32、,'C,');,,},运行结果:,,Enter the number of diskes:3,,the steps to moving 3,diskes,:,,A-->C,,A-->B,,C-->B,,A-->C,,B-->A,,B-->C,,A-->C,函 数 的 定 义 与 使 用,,39,,,,计算机基础教研室,在函数被调用时才分配形参的存储单元。,,实参可以是常量、变量或表达式。,,实参类型必须与形参相符。,,传递时是传递参数值,即单向传递。,函 数 的 定 义 与 使 用,函数的参数传递机制,——,传递参数值,,40,,,,计算机基础教研室,参数值传递举例,X,N,被调函数:,主调函
33、数:,3,,2.5,A,D = power(A,3),,2.5,3,double power(double X,,int,N),函 数 的 定 义 与 使 用,,41,,,,计算机基础教研室,函 数 的 定 义 与 使 用,函数调用过程,,42,,,,计算机基础教研室,输入两整数交换后输出,#include<,iostream,>,,using namespace std;,,void,Swap(int,a,,int,b);,,int,main(),,{,,,int,x(5), y(10);,,,cout,<<"x="<
34、ut,<<"x="<
35、,a,10,,b,5,t,在,Swap,子函数中,返回主函数以后,5,x,10,y,函 数 的 定 义 与 使 用,,44,,,,计算机基础教研室,函数的参数传递,—,用引用做形参,引用,(,&,),是标识符的别名,,,是一种派生数据类型,不占存储空间。,例如,:,,int,,someInt,;,int,&,rInt,=,someInt,;,//,建立一个,int,型的引用,rInt,,,并将其,//,初始化为变量,someInt,的一个别名,,声明一个引用时,必须,同时对它进行初始化,,使它指向一个已存在的对象。,,一旦一个引用被初始化后,,就不能改为指向其它对象。,,引用可以作为形参,vo
36、id,swap(int,& a,,int,& b) {...}(,作用,),函 数 的 定 义 与 使 用,,45,,,,计算机基础教研室,输入两个整数交换后输出,#include<,iostream,>,,using namespace std;,,void,Swap(int,& a,,int,,,int,main(),,{,int,x(5), y(10);,,,cout,<<"x="<>m>>n;,,,cout,<<"integer "<>x>>y;,,,cout,<<
46、"real number "<>c1.real>>c1.imaginary;,,,cout,<<"Enter the second complex number: ";,,,cin,>>c2.real>>c2.imaginary;,,c3=add(c1,c2);,,,cout,<<"complex number (" <
47、<',',,<