函数(一)

C++函数(一)

1.函数定义

C++

函数定义的语法形式

类型标识符 函数名(形式参数表)

{

语句序列

}

2.函数的调用

//计算x的n次方
double power(double x,int n){
double val =1.0;
while(n--) val *=x;
return val;
}
#include"iostream"
using namespace std;

double power (double x,int n);
int main()
{
int value =0;
cout<<"Enter an 8 bit binary number ";
for(int 1=7;i>=0;i--){
char ch;
cin >> ch;
if (ch == '1')
value += ststic_cast<int>(power(2,i));
}
cout <<"Decimal value is "<<value <<endl;
return 0;
}
double power(double x,int n)
{
double val =1.0;
while(n--) val *=x;
return val;
}

例:寻找并输出11~999之间的数M,它满足m,m*m和m*m*m均为回文数
回文:各位数字左右对称的整数
例如:11满足上述条件
#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(sym(m)&&symm(m*m)&&symm(m*m*m)){
cout<<"m="<<m;
cout<<"m*m="<<m*m<<m*m*m<<endl;
}
return 0;
}

原型:void srand (unsigned int seed)

参数:seed产生随机数种子

所需头文件:

功能:为使rand()产生一序列伪随机数而设置始点。使用1作为seed参数,可以重新初化rand()

#inclide"iostream"
#include"cstdib"
using namespace std;

enum GameStatus{WIN,LOSE,PLIYING};
int main()
{
int sum,myPoint;
GameStatus status;
usigned seed;
int roolCice();
cout<<"Please enter an unsigned integer:";
cin>>seed;//产生随机种子
srand(seed);//将种子传给rand()
sum=rollDice();//第一轮投骰子、算和数
switch(sum){
case 7://如果和数为711则为胜,状态为WIN
case 11:
sttus=WIN;
break;
case 2://和数为2312责为负,状态为LOSE
case 3:
case 12;
starus=LOSE;
break;
default://其他情况,尚无结果,状态为PLAYING,记下点数
status = PLAYING;
myPoint=sum;
cout<<"point is"<<myPoint<<endl;
break;
}
while(status==PLAYING){//只要状态为PLAYING,继续
sum=rollDice();
if(sum==myPoint)//某轮的和数等于点数则取胜
status=WIN;
else if(sum==7)//出现和数为7则为负
status=LOSE;
}
//当状态不为PLAYIN时循环结束,输出游戏结果
if(status==WIN)
cout<<"play wins"<<endl;
else
cout<<"play loses"<<endl;
return 0;
}
//投骰子、计算和数、输出和数
int rollDice(){
int die1=1+rand()%6;
int die2=1+rand()%6;
int sum =die1+die2
cout<<"player rolled"<<die1<<"+"<<die2<<"="<<sum<endl;
return sum;
}

3.函数的嵌套调用

例:嵌套调用
#include"iostream"
using namespace std;
int fun2(int m){
return m*m;
}
int fun1(int x,int y){
return fun2(x)+fun2(y);
}
int main(){
int a,b;
cout<<"Please enter two integers(a and b):";
cin>>a>>b;
cout<<"The sum of square of a and b:"<<fun1(a,b)<<endl;
return 0;

}

4.函数的递归调用

定义:

函数直接或间接地调用自身,称为递归调用

例:计算n!
公式1:n!=n*(n-1)*(n-2)*(n-3).....2*1
#include"iostream"
using namespace std;

//计算n的阶乘
unsigned fac(unsigned n){
unsigned f;
if(n==0)
   f=1;
   else
   f=fac(n-1)*n;
   return f;
}
int main()
{
unsigned n;
cout<<"Enter a possitive integer:";
cin >> n;
unsigned y=fac(n);
cout << n <<"!="<<y<<endl;
return 0;
}

5.例题

(1)用递归计算从n个人中选择k个人,组成一个委员会的不同组合数

分析:

由n个人里选k个人的组合数=由 n-1个人里选k个人的组合数+n-1个人里面k-1个人

的组合数

当n=k或k=0时,组合数为1

#include"iostream"
using namespace std;
int comm(int n,int k){
if(k>n)
return 0;
else if(n==k||k==0)
return 0
else
return comm(n-1,k)+comm(n-1,k-1);
}
int main(){
int n,k;
cout<<"Please enter two integers n and k:";
cin>>n>>k;
cout<<"C(n,k)="<<comm(n,k)<<endl;
return 0;
}

(2)有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上

分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:

(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;

(2)将A杆中剩下的第n号盘移至C杆;

(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

#include"iostream"
using namespace std;
void move(char src, char dest) {
	cout << src << "--->" << dest << endl;
}
//把n个牌子从srd针移动到dest针,以medium针为中介
void hanoi(int n, char src, 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;
		cout << "the steps to moving" << m << "diskes:" << endl;
		hanoi(m, 'A', 'B', 'C');
		return 0;
	}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值