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://如果和数为7或11则为胜,状态为WIN
case 11:
sttus=WIN;
break;
case 2://和数为2、3或12责为负,状态为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;
}