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\n";
    else
        cout<<"Player loses\n";
    
    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)为其设置的。

posted @ 2013-10-07 17:47  AI Algorithms  阅读(753)  评论(0编辑  收藏  举报