版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
函数的定义与使用
例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