• C++ 函数部分(1)


    1.编写一个求X的n次方的函数

    #include <iostream>
    using namespace std;
    double power(double x, int n);
        void main(void)
        {
             double x;
             int n;
             cout<<"input x and n to calc the value of the x to the power n"<<endl;
             cout<<"x = ";
             cin>>x;
             cout<<"n = ";
             cin>>n;
             cout<<x<<" to the power "<<n<<" is " <<power(x,n)<<endl;
             
             fflush(stdin);//清空输入缓冲区中的数据
             getchar(); //暂停
          
      }
       
      double power(double x , int n)
      {
          double val = 1.0;
          while (n--)
              val *= x;
          return (val);
      }

    注意:如果第16行的fflush(stdin)不加,而保留17行的getchar()语句达不到暂停效果,因为:在用cin(或scanf)输入完后回输入回车键[Enter],表明输入结束,此时[Enter]会留在输入缓冲区中,当程序运行到getchar();语句时就会读入[Enter],从而使控制台闪过,没有达到要控制台停留的效果,所以,在getchar();语句之前要用fflush(stdin);清空输入缓冲区的内容

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

    分析:将二进制转换为10进制,只要讲二进制数的每一位乘以该位的权然后相加即可。

    如:000011012 = 0(27)+0(26)+0(25)+0(24)+1(23)+1(22)+0(21)+1(20) = 1310

    #include <iostream>
       
      using namespace std;
       
      double power(double x, int n);
       
      void main(void)
      {
          int i,
              value = 0;
          char ch;
       
          cout<<"Enter an 8 bit binary number: ";
          for(i = 7; i >=0; i--)
          {    
              //sizeof(char) = 1 
              //sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
              cin >> ch; // 注意键盘输入的数字是字符形式,并且采用一个个单独接收,因为char 类型一次只能接收1个字节的长度
                if('1' == ch) // 只需要处理字符为'1'的情况
                    value += int(power(2,i));
            }
         
            cout<<"Decimal value is "<<value<<endl;
            fflush(stdin);
            getchar();
        }
         
        double power(double x , int n)
        {
            double val = 1.0;
            while(n--)
                val *= x;
            return (val);
        }

    3.编写程序求的π值,公式如下:

    clip_image002[6]

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

    clip_image002[8]

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

    #include <iostream>
     
    using namespace std;
     
    void main()
    {
        double a,b;
        double arctan(double x);
        //注意因为整数相除结果取整,如果参数写1/5,1/239,那么结果都是0
        a = 16.0*arctan(1/5.0);
        b = 4.0*arctan(1/239.0);
     
        cout<<"PI = "<<a-b<<endl;
        getchar();
    }
     
    double arctan(double x)
    {
        int i;
        double r,e,f,sqr;
        sqr = x*x;
        r = 0;
        e = x;
        i = 1;
        while(e/i >1e-15)
        {
            f = e/i;
            r = (i%4 == 1)?r+f : r-f;
            e = e*sqr;
            i += 2;
        }
     
        return r;
    }

    4.寻找并输出11~999之间的数m,它满足m,m2和m3均为回文数。

    所谓回文数是指其各位数字左右对称的整数,如121,676,95259等。满足上述条件的数如m = 11,m2 =121,m3 = 1331.

    分析:判断一个数是否为回文,可以用除以10取余的方法,从最低位开始,依次取出该数的各位数字,然后用最低位充当最高位,按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。

    #include <iostream>
    #include <iomanip>  // 使用setw()控制宽度函数
     
    using namespace std;
     
    void main()
    {
        bool symm(long n);
        long m;
        cout.flags(ios::left); //输出左对齐
        for(m = 11; m< 1000; m++)
        {
            if(symm(m)&&symm(m*m)&&symm(m*m*m))
                cout<<"m = "<<setw(5)<<m<<" m*m = "<<setw(7)<<m*m<<" m*m*m = "<<setw(12)<<m*m*m<<endl;
        }
     
        getchar();
    }
     
    bool symm(long n)
    {
        long i,m;
        i = n;
        m = 0;
        while(i)
        {
            m = m*10 + i%10; // m值上升一位 加上i的最低位
            i = i/10;  // 去掉i的最低位
        }
        return (m == n);
    }

    运行结果:

    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

    在C++中
    控制输出宽度用iosamp函数库的setw

    #include <iomanip>
    using namespace std;
    cout.setprecision(10); //控制精度
    double a = 1.2;
    cout<<setw(10)<<a<<endl; //setw()控制宽度

    C++中默认是右对齐

    cout.flags(ios::left); //左对齐 
     
    5.判断输入的字符串是否为回文
    #include <iostream>
     
    using namespace std;
    #define STACK_INIT_SIZE 100
     
    struct Stack{
        char *base;
        char *top;
    }sq;
     
    void initstack(Stack &s)
    {
        s.base = new char[STACK_INIT_SIZE*sizeof(char)];
        s.top  = s.base;
    }
     
    void push(Stack &s , char e)
    {
        *s.top = e;
        ++s.top;
    }
     
    char pop(Stack &s)
    {
        s.top--;
        return *s.top;
    }
     
    void main()
    {
        Stack s;
        initstack(s);
        int a,
            j = 0;
        char p[100];
        char c = 0,
             d = 0;
     
        cout<<"这是回文判断程序"<<endl;
        cout<<"请输入测试字符串"<<endl;
        cin.getline(p,100); //接收一个字符串, 最长长度为100个字符
        a = strlen(p); //获取字符串长度
        for(int i = 0; i<a;++i)
         push(s,p[i]);
     
        do{
            c = pop(s);
            d = p[j];
            if(c != d ) break;
            j++;
        }while(j<=a/2-1);
        if( j == a/2)
            cout<<"你输入的测试字符串为回文"<<endl;
        else
            cout<<"测试字符串不是回文"<<endl;
        fflush(stdin);
        getchar();
    }

    6.计算如下公式,并输出结果:

    clip_image002

    其中r,s的值由键盘输入,sinx的近似值按如下公式计算:

    clip_image002[4]

    计算精度为10-6.当某项的绝对值小于计算精度时,停止累加,累加和即为该精度下的sinx的近似值。

    #include <iostream>
    #include <cmath>
     
    using namespace std;
     
    void main()
    {
        double k,r,s;
        double tsin(double x);
        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;
        fflush(stdin);
        getchar();
    }
     
    double tsin(double x)
    {
        double  p = 0.000001,
                g = 0,
                t = x;
        int n = 1;
        do{
            g = g + t;
            n++;
            t = -t*x*x/(2*n-1)/(2*n-2); //自左至右运算相当于 -t*x*x/[(2*n-1)*(2*n-2)]
        }while(fabs(t) >= p);
     
        return g;
    }

    7.投骰子的随机游戏

    游戏规则是:每个骰子有6面,点数分别为1,2,3,4,5,6.游戏者在程序设计开始时输入一个无符号整数,作为产生随机数的种子。每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2,3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮,第三轮,……直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。

    #include <iostream>
    #include <cstdlib>
     
    using namespace std;
    int rolldice(void);
     
    void main()
    {
        int gamestatus,sum,mypoint;
        unsigned seed;
     
        cout<<"Please enter an unsigned integer:";
        cin>>seed;  // 输入随机数种子
        srand(seed);  //将种子传递给rand()
        sum = rolldice(); //第一轮投骰子,计算和数
        switch(sum)
        {
        case 7:   // 如果和数为7或11则为胜,状态为1
        case 11:
            gamestatus = 1;
            break;
        case 2:   // 和数为2,3或12则为负,状态为2
        case 3:
        case 12:
            gamestatus = 2;
            break;
        default: // 其它情况,游戏尚无结果,状态为0,记下点数,为下一轮做准备
            gamestatus = 0;
            mypoint = sum;
            cout<<"point is "<<mypoint<<endl;
            break;
        }
     
        while(gamestatus == 0)  // 只有状态仍为0,就继续进行下一轮
        {
            sum = rolldice();
            if(sum == mypoint)  //某轮的和数等于点数则取胜,状态置1
                gamestatus = 1;
            else
                if(sum == 7)   //出现和数为7则为负,状态置2
                    gamestatus = 2;
        }
        //当状态不为0时上面的循环结束,以下程序段输出游戏结果
        if(gamestatus == 1)
            cout<<"Player wins
    ";
        else
            cout<<"Player loses
    ";
        
        fflush(stdin);
        getchar();
    }
     
    int rolldice(void)
    { //投骰子,计算和数,输出和数
        int die1,
            die2,
            worksum;
     
        die1 = 1+rand()%6;
        die2 = 1+rand()%6;
        worksum = die1+die2;
        cout<<"player rolled "<<die1<<'+'<<die2<<'='<<worksum<<endl;
        return worksum;
    }

    结果:

    Please enter an unsigned integer:9
    player rolled 3+2=5
    point is 5
    player rolled 2+1=3
    player rolled 5+6=11
    player rolled 4+1=5
    Player wins

    系统函数int rand(void)的功能是产生一个伪随机数,调用rand(void)函数产生随机数需要一个"种子"值,如果设置的种子值相同,则产生相同的随机数,所以叫做伪随机数。如果调用rand()之前不设置"种子"值,则rand总是默认种子为1."种子"值的设置,是在调用rand()之前,通过调用void srand(unsigned int seed)为其设置的。

  • 相关阅读:
    matlab练习程序(单源最短路径Dijkstra)
    Android开发必须知道SERVICE的10件事
    Android 多种方式正确的加载图像,有效避免oom
    在Android中解决内存溢出 – OutOfMemoryError
    发布Android开源库,看这个文章就够了!
    发掘StateListAnimator的全部潜能
    Android开发中多进程共享数据
    Android使用FFMpeg实现推送视频直播流到服务器
    Android学Jni/Ndk 开发记录(一)
    一张图解释RxJava中的线程控制
  • 原文地址:https://www.cnblogs.com/AI-Algorithms/p/3355768.html
Copyright © 2020-2023  润新知