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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43145926/article/details/90577073

函数的定义与使用
例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

猜你喜欢

转载自blog.csdn.net/qq_43145926/article/details/90577073