C++程序设计 | 第三章函数

    xiaoxiao2025-02-13  14


    函数的定义与使用 例3-1

    //求x的n次方的函数 #include <iostream> using namespace std; dpuble power(double x, int n){ double val=1.0; while(n--) val*=x; reyurn val; } int main(){ cout<<power(5,2)<<endl; return 0; }

    例3-2

    //八位二进制数转换为10进制数 #include <iostream> using namespace std; double power (double x,intn){...}; int main() { int value=0; int n;//几位二进制数 cin>>n; for(int i=n;i>0;i--) { char ch; cin>>ch;//不懂为撒要输这个? if(ch='1') value+=static_cast<int>(power(2,i)); } cout<<value<<endl; return 0; }

    例3-3

    #include "stdafx.h" #include <iostream> using namespace std; double arctan(double x) { double sqr=x*x; double e=x; double r=0; int i=1; while(e/i>1e-15)//绝对值 不大于 { double f=e/i; r=(i%4==1)? r+f:r-f;//反正2不对 遇到3%2 就变成+了所以只能是4 e=e*sqr; i+=2; } return r; } int main() { double a=16.0*arctan(1/5.0); double b=4.0*arctan(1/239.0);//注意 因为整数相除结果取整,如果直接写1/5,1/239 ,结果就都是0 cout<<"pi="<<a-b<<endl; return 0; }

    例3-4

    //寻找并输出11-999之间的数m,m方,m三次均为回文数 //分析:判断一个数是否是回文数,可以用除以10取余的方法, //从最低为开始,一次去除该数的各位数字然后反序,与原数对比 #include<iostream> using namespace std; //判断n是否是回文数 bool symm(unsigned n){ unsigned i=n; unsigned m=0; while(i>0){ m=m*10+i%10; i/=10; } return m==n; } int main(){ for(unsigned m=11;m<1000;m++) { if(symm(m)&&symm(m*m)&&symm(m*m*m)){ cout<<"m="<<m; cout<<"m*m="<<m*m; cout<<"m*m="<<m*m*m<<endl; } } getchar(); return 0; }

    例3-5

    #include<iostream> #include <cmath> using namespace std; const double TINY_VALUE=1e-10;//为什么不是6呢 更精确?? double tsin(double x){ double g=0; double t=x; int n=1; do{ g+=t; n++; t=-t*x*x/(2*n-1)/(2*n-2);//公式是找规律?记住套路! }while(fabs(t)>=TINY_VALUE); return g; } int main() { double k,r,s; 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<<k<<endl; return 0; }

    例3-6

    #include<iostream> #include<cstdlib> using namespace std; //投色子 计算和数 输出和数 int rollDice(){ int die1=1+rand()%6;//余数可能为0,为了使抛出的色子不为0 则+1 int die2=1+rand()%6; int sum=die1+die2; cout<<sum<<endl; return sum; } enum GameStatus {WIN,LOSE,PLAYING}; int main() { int sum,myPoint; GameStatus status; unsigned seed; cin>>seed;//输入随机种子数 srand(seed);//将种子传递给rand() sum=rollDice();//第一轮投色子,计算和数 switch(sum){ case 7: case 11: status=WIN; break; case 2: case 3: case 12: status=LOSE; break; default://其他情况,游戏尚无结果,状态为PLAYING 记下点数,为下一轮做准备 status=PLAYING; myPoint=sum; cout<<"mypoint is"<<sum<<endl; break; } while(status==PLAYING){ sum=rollDice(); if(sum==myPoint)//和数等于点数 就赢 status=WIN; else if(sum==7) status=LOSE; } //当状态不为PLAYING时 上面的循环结束,一下程序段输出游戏结果 if(status==WIN) cout<<"player wins"<<endl; else cout<<"player loses"<<endl; getchar(); getchar(); getchar(); getchar(); return 0; }

    递归调用 例3-10

    //汉诺塔问题 #include<iostream> using namespace std; //把src最上面的圆盘移动到dest针上 void move(char src,char dest) { cout<<src<<"-->"<<dest<<endl; } //把n个盘子从src针移动到dest针,以medium针作为中介 void hanoi(int n, char medium, char dest) { if(n==1) move(src,dest); else{ hanoi(n-1,src,dest,medium); move(src,dest); hanoi(n-1,medium,src,dest); } int main(){ int m; cout<<"Enter the number of diskes:" cin>>m; hanoi(m,'A','B','C'); return 0; } } 函数的参数传递函数调用时传递的是实参的值,值传递是单向传递,形参值的改变对实参不起作用。 swap(int a, int b) 引用传递,对形参的作用会传递给实参 swap(int &a,int &b)

    内联函数

    不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。内联函数不能有循环,接口,switch,且必须出现在内联函数第一次被调用前充分简单的函数编译会自动变为内联函数。

    带默认形参值的函数

    有默认值的形参必须在形参列表的最后,也就是说,在有默认值的形参右面,不能出现五默认值的形参。 int add(int x,int y=5,int z=6); √ int add(int x=5,int y,int z=6); X int add(int x=5,int y=5,int z); X 在相同作用域内,不允许在同一个函数的多个声明中对同一个参数的默认值重复定义,即使前后的值相同也不行 int add(int x=5,int y=5); int add(int x/*=5*/,int y/*=5*/){ }

    函数重载

    两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是重载。重载函数的形参必须不同:个数或者类型不同,形参名和返回值没用

    C++系统函数 比如#include <cmath> 查阅标准C++函数的原型、用法、头文件: http://www.cppreference.com

    最新回复(0)