C++ 函数(模块化编程)

目录

函数定义

函数

函数定义的语法形式

函数调用

调用函数需要先声明函数原型

函数调用形式

嵌套调用

例3-1编写一个求x的n次方的函数

例3-2  数制转换

源代码:

例3-3

编写程序求π的值

arctan函数

主程序

例3-4

寻找并输出11~999之间的数M,它满足M、M2和M3均为回文数。

源代码:

例3-5 计算分段函数,并输出结果

例3-6投骰子的随机游戏

rand函数

srand函数

源代码


函数定义

函数

函数:定义好的、可重用的功能模块

定义函数:将一个模块的算法用C++描述出来

函数名:功能模块的名字

函数的参数:计算所需要的数据和条件

函数的返回值:需要返回的计算结果

函数定义的语法形式

函数名

形式参数表

语句序列

类型标识符

函数调用

调用函数需要先声明函数原型

若函数定义在调用点之前,可以不另外声明;

若函数定义在调用点之后,必须要在调用函数前声明函数原型:

函数原型:类型标识符 被调用函数名(含类型说明的形参表)

函数调用形式

函数名(实参列表)

嵌套调用

17.png

嵌套调用:在一个函数的函数体中,调用另一函数。

例3-1编写一个求x的n次方的函数

#include <iostream>

using namespace std;


//计算x的n次方

double power(double x, int n) {

double val = 1.0;

while (n--) val *= x;

return val;

}


int main() {

cout << "5 to the power 2 is "
<< power(5, 2) << endl;

return 0;

}

例3-2  数制转换

输入一个8位二进制数,将其转换为十进制数输出。

例如:从键盘输入1101

11012=1×23+1×22+0×21+1×20=1310

所以,程序应输出13

源代码:

#include <iostream>
using namespace std;

double power (double x, int n); //计算x的n次方

int main() {
    int  value = 0;
    cout << "Enter an 8 bit binary number  ";
    for (int i = 7; i >= 0; i--) {
      char ch;
      cin >> ch;
      if (ch == '1')
        value += static_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;
}

例3-3

编写程序求π的值

l  π的计算公式如下:

arctan1.gif

l  其中arctan用如下形式的级数计算:

arctan2.gif

l  直到级数某项绝对值不大于10-15为止;π和x均为double型。

arctan函数

#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;

                   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、M2和M3均为回文数。

l  回文:各位数字左右对称的整数。

l  例如:11满足上述条件

n  112=121,113=1331。

分析:

用除以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 * m << endl;

        }

      return 0;

}

运行结果:

m=11  m*m=121  m*m*m=1331

m=101  m*m=10201  m*m*m=1030301

m=111  m*m=12321  m*m*m=1367631

例3-5 计算分段函数,并输出结果

其中r、s的值由键盘输入。sin x的近似值按如下公式计算,计算精度为10-10:

 

3-6投骰子的随机游戏

每个骰子有六面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。

每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮...直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。

rand函数

l  函数原型:int rand(void);

l  所需头文件:<cstdlib>

l  功能和返回值:求出并返回一个伪随机数

 

srand函数

l  void srand(unsigned int seed);

l  参数:seed产生随机数的种子

l  所需头文件:<cstdlib>

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

源代码

#include <iostream>
#include <cstdlib>
using namespace std;
enum  { WIN=0, LOSE=1, PLAYING=2 };
int main() {
	
	int sum, myPoint;
	int  status;
	unsigned seed;
	int rollDice();
	cout << "Please enter an unsigned integer: ";
	cin >> seed; //输入随机数种子
	srand(seed); //将种子传递给 rand()
	sum = rollDice(); //第一轮投骰子、计算和数
	switch (sum) {
	case 7: //如果和数为 7 或 11 则为胜,状态为 WIN
	case 11:
		status = WIN;
		break;
	case 2: //和数为 2、3 或 12 则为负,状态为 LOSE
	case 3:
	case 12:
		status = 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;
	}
	//当状态不为 PLAYING 时循环结束,输出游戏结果
	if (status == WIN)
		cout << "player wins" << endl;
	else
		cout << "player 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值