Part3 函数 3.1函数定义 3.2函数调用

第三章 函数
函数:程序的功能模块

3.1函数定义
函数:定义好的可重用的功能模块
函数定义:将一个模块的算法用C++描述出来

 


3.2函数调用
函数调用之前要先声明,因为函数定义的位置可能在调用的位置之后,或不在一个文件中。

//3-1编写一个求x的n次方的函数
#include<iostream>
using namespace std;
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位二进制数,将其转换为十进制数输出
#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 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求圆周率π的值
//π的计算公式如下:
//π = 16 * arctan(1/5) - 4 * arctan(1/239)
//其中acrtan用如下的级数计算:
//arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...
//直到级数某项绝对值不大于10^-15为止;π和x均为double型。

#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);
    cout << "PI = " << a - b << endl;
    return 0;
}

 

//3-4寻找并输出11~999之间的数m,它满足m、m^2和m^3均为回文数。
#include<iostream>
using namespace std;

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

 

//3-5计算分段函数:
//k = sqrt(sin(r)^2 + sin(s)^2)   when r^2 <= s^2
//  = 1/(2 * sin(rs))             when r^2 > s^2
//其中r、s的值由键盘输入。sin(x)的近似值按如下公式计算,计算精度为10^-10:
//sin(x) = x/1! - x^3/3! + x^5/5!... 
#include<iostream>
#include<cmath>
using namespace std;

const double TINY_VALUE = 1e-10;

double tsin(double x){//叫tsin 为了和系统中的sin区别
    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-6c投骰子的随机游戏
//每个骰子有六面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。
//每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;
//和数为其它值则将此值作为自己的点数,继续第二轮、第三轮...直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。

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

#include<iostream>
#include<cstdlib>
using namespace std;

enum GameStatus{WIN, LOSE, PLAYING};
int main(){
    int sum, myPoint;
    GameStatus status;
    unsigned seed;
    int rollDice();
    cout << "Please enter an unsinged integer:";
    cin >> seed;
    srand(seed);
    sum = rollDice();
    
    switch(sum){
        case 7:
        case 11:
            status = WIN;
            break;
        case 2:
        case 3:
        case 12:
            status = LOSE;
            break;
        default:
            status = PLAYING;
            myPoint = sum;
            cout << "point is " << myPoint << endl;
            break;
    }
    
    while(status == PLAYING){
        sum = rollDice();
        if(sum == myPoint)
            status = WIN;
        else if(sum == 7)
            status = LOSE;
    }
    
    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;
}

 

posted @ 2017-11-27 17:20  LeoSirius  阅读(472)  评论(0)    收藏  举报