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.编写程序求的π值,公式如下:
其中arctan用如下形式的级数计算:
直到级数的某一项绝对值不大于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); //左对齐
#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.计算如下公式,并输出结果:
其中r,s的值由键盘输入,sinx的近似值按如下公式计算:
计算精度为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)为其设置的。