c++3语言程序设计(第四版



《c++3语言程序设计(第四版》由会员分享,可在线阅读,更多相关《c++3语言程序设计(第四版(67页珍藏版)》请在装配图网上搜索。
1、,,,,,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,,,单击此处编辑母版标题样式,,C++语言程序设计,清华大学 郑莉,C++,语言程序设计,1,本章主要内容,,函数的声明和调用,,函数间的参数传递,,内联函数,,带默认形参值的函数,,函数重载,,C++系统函数,2,,函数的声明,,函数是面向对象程序设计中,对功能的抽象,,函数声明的语法形式,,类型标识符 函数名(形式参数表),,{,,语句序列,,},函数的声明与使用,是被初始化的内部变量,寿命和可见性仅限于函数内部,若无返回值,写void,3,,函数的声明,,形式参数表,,
2、,1,,
3、lude ,,using namespace std;,,double power(double x, int n);,,int main(),,{,,cout<<"5 to the power 2 is " <<,power,(5,2)< 4、使用,7,,例3-2 数制转换,,题目:,,输入一个8位二进制数,将其转换为十进制数输出。,,例如:,1101,2,=1(2,3,)+1(2,2,)+0(2,1,)+1(2,0,)=13,10,,,所以,如果输入,1101,,则应输出,13,函数的声明与使用,8,,#,include ,,using namespace std;,,double,power,(double x, int n);,,int main(),,{,,int i;,,int value = 0;,,char ch;,,cout << "Enter an 8 bit binary number ";,,for ( 5、i = 7; i >= 0; i--),,{,,cin >> ch;,,if (ch == '1'),,value += int(,power,(2,i));,,},,cout <<"Decimal value is "< 6、-3编写程序求π的值,,,,其中arctan用如下形式的级数计算:,,,,直到级数某项绝对值不大于10,-15,为止;π和x均为double型。,函数的声明与使用,10,,#include,,using namespace std;,,int 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="< 7、},11,11,,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;,,},运行结果:,,PI=3.14159,12,12,,例3-4,,寻找并输出11~999之间的数m,它满足m、m,2,和m,3,均为回文数。,,回文:各位数字左右对称的整数。例如:11满足上述条件 11,2,=121,11,3,=1331。 8、,,分析:,,10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。,函数的声明与使用,13,,#include ,,using namespace std;,,int 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="< 9、mm(long n),,{,,long i, m;,,i=n ; m=0 ;,,while(,i,),,{,,m=,m*10+i%10,;,,i=i/10 ;,,},,return( m==n );,,},15,15,,运行结果:,,m=11 m*m=121 m*m*m=1331,,m=101 m*m=10201 m*m*m=1030301,,m=111 m*m=12321 m*m*m=1367631,16,16,,例3-5,,计算如下公式,并输出结果:,,,,,其中r、s的值由键盘输入。sin x的近似值按如下公式计算,计算精度为10,-6,:,,函数的声明与使用,17,, 10、#include ,,#include,,using namespace std;,,int main(),,{,,double k,r,s;,,double,tsin,(double x);,,cout<<"r=";,,cin>>r;,,cout<<"s=";,,cin>>s;,,if (r*r<=s*s),,k=sqrt(,tsin,(r)*,tsin,(r)+,tsin,(s)*,tsin,(s));,,else,,k=,tsin,(r*s)/2;,,cout< 11、g=0,t=x;,,int n=1;,,do {,,g=g+t;,,n++;,,t=-t*x*x/(2*n-1)/(2*n-2);,,}while(fabs(t)>=p);,,return g;,,},,运行结果:,,r=5,,s=8,,1.37781,19,19,,例3-6投骰子的随机游戏,,每个骰子有六面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。,,每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮...直到某轮的和数等于点数则取胜,若在此 12、前出现和数为7则为负。,,由rolldice函数负责模拟投骰子、计算和数并输出和数。,函数的声明与使用,20,,#include ,,#include ,,using namespace std;,,int,rolldice,(void);,,int main(),,{,,int gamestatus,sum,mypoint;,,unsigned seed;,,cout<<"Please enter an unsigned integer:";,,cin>>seed; //输入随机数种子,,srand(seed); //将种子传递给rand(),,sum=,rolldice,( 13、); //第一轮投骰子、计算和数,21,21,,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 "< 14、hile(gamestatus==0),//只要状态仍为 0,就继续进行下一轮,,{,,sum=,rolldice,();,,if(sum==mypoint),//某轮的和数等于点数则取胜,状态置为1,,gamestatus=1,,else,,if ( sum==7 )//出现和数为7则为负,状态置为2,,gamestatus=2;,,},,//当状态不为0时上面的循环结束,以下程序段输出游戏结果,,if( gamestatus==1 ),,cout<<"player wins\n";,,else,,cout<<"player loses\n";,,},23,23,,rand,,函数原 15、型:int rand(void);,,所需头文件:,,功能和返回值:求出并返回一个伪随机数,,srand,,函数原型:void srand(unsigned int seed);,,参数:seed产生随机数的种子。,,所需头文件:,,功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以重新初化rand()。,24,24,,int rolldice(void),,{ //投骰子、计算和数、输出和数,,int die1,die2,worksum;,,die1=1+rand()%6;,,die2=1+rand()%6;,,worksum=die1+die2;,,cou 16、t<<"player rolled "< 17、回地址,⑤,27,,嵌套调用,,函数的声明与使用,main{},,,调fun1(),,,结束,fun1(),,,调fun2(),,,返回,fun2(),,,,,返回,①,②,③,⑦,④,⑤,⑥,⑧,⑨,28,,例3-6 输入两个整数,求平方和。,#include ,,using namespace std;,,int main(),,{,,int a,b;,,int fun1(int x,int y);,,cin>>a>>b;,,cout<<"a、b的平方和:" <<,fun1,(a,b)< 18、{,,int,fun2,(int m);,,return (fun2(x)+fun2(y));,,},,,int,fun2,(int m),,{,,return (m*m);,,},,,,运行结果:,,3 4,,a、b的平方和:25,30,30,,递归调用,,函数直接或间接地调用自身,称为递归调用。,,递归过程的两个阶段:,,递推:,,,4!=4×3!,→,3!=3×2!,→,2!=2×1!,→,1!=1×0!,→,0!=1,,未知 已知,,回归:,,4!=4×3!=24,←,3!=3×2!=6,←,2!=2×1!=2, 19、←,1!=1×0!=1,←,0!=1,,未知 已知,函数的声明与使用,31,,例3-8 求n!,,分析:计算,n,!的公式如下:,,,,,这是一个递归形式的公式,应该用递归函数实现。,,函数的声明与使用,32,,源程序:,,#include ,,using namespace std;,,long,fac,(int n),,{ long f;,,if (n<0),,cout<<"n<0,data error!"< 20、return(f);,,},33,33,,int main(),,{,,long fac(int n);,,int n;,,long y;,,cout<<"Enter a positive integer:";,,cin>>n;,,y=,fac,(n);,,cout< 21、组合数,,当n==k或k==0时,组合数为1,函数的声明与使用,35,,#include,,using namespace std;,,int main(),,{ int n,k;,,int comm(int n, int k);,,cin>>n>>k;,,cout< 22、6,36,,例3-10汉诺塔问题,,有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,函数的声明与使用,A,B,C,37,,分析:,,将n 个盘子从A针移到C针可以分解为下面三个步骤:,,①将A 上n-1个盘子移到 B针上(借助C针);,,②把A针上剩下的一个盘子移到C针上;,,③将n-1个盘子从B针移到C针上(借助A针);,,事实上,上面三个步骤包含两种操作:,,①将多个盘子从一个针移到另一个针上,这是一个递归的过程。 hanoi函数实现。,,②将1个盘 23、子从一个针上移到另一针上。用move函数实现。,38,38,,#include ,,using namespace std;,,void move(char getone,char putone),,{ cout"< 24、oi(n-1,two,one,three);,,},,},39,39,,int 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 "< 25、diskes:,,A-->C,,A-->B,,C-->B,,A-->C,,B-->A,,B-->C,,A-->C,41,41,,函数的参数传递机制,,,——传递参数值,在函数被调用时才分配形参的存储单元。,,实参可以是常量、变量或表达式。,,实参类型必须与形参相符。,,传递时是传递参数值,即单向传递。,函数的声明与使用,42,,函数的参数传递机制,,,——参数值传递举例,X,N,被调函数:,主调函数:,3,2.5,A,D = power(A,3),2.5,3,double power(double X,int N),函数的声明与使用,43,,例3-11 输入两个整数交换后输出,#include 26、,,using namespace std;,,void,Swap,(int a, int b);,,int main(),,{,,int x(5), y(10);,,cout<<"x="< 37、;,,cout<<"integer < 38、ginary;,,c3=add(c1,c2);,,cout<<"complex number ("< 39、),,{,,complex c;,,c.real=c1.real+c2.real;,,c.imaginary=c1.imaginary+c2.imaginary;,,return c;,,},61,61,,运行结果:,,Enter two integer: 3 5,,integer 3+5=8,,Enter two real number: 2.3 5.8,,real number 2.3+5.8= 8.1,,Enter the first complex number: 12.3 45.6,,Enter the second complex number: 56.7 67.8,,comple 40、x number (12.3,45.6)+(56.7,67.8)= (69,113.4),,62,62,,C++系统函数,,C++的系统库中提供了几百个函数可供程序员使用。,,例如:求平方根函数(sprt)、求绝对值函数(abs)等。,,使用系统函数时要包含相应的头文件。,,例如:math.h 或 cmath,使用C++系统函数,63,,例3-17系统函数应用举例,,题目:,,从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。,,分析:,,系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件math.h和cmath中。,使用C++系统函 41、数,64,,#include,,#include,,using namespace std;,,const double pi(3.14159265);,,int main(),,{ double a,b;,,cin>>a;,,b=a*pi/180;,,cout<<"sin("<
42、35,65,65,,查找系统函数的使用说明,,查编译系统的库函数手册,,查联机帮助——,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++系统函数,66,,小结与复习建议,,主要内容,,函数的声明和调用、函数间的参数传递、内联函数、带默认形参值的函数、函数重载、C++系统函数,,达到的目标,,学会将一段功能相对独立的程序写成一个函数,为下一章学习类和对象打好必要的基础。,,实验任务,,实验三,67,,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。