第四章函数--函数初体验项目5拓展2输出三角函数表v2.0

上机内容:接上一项目拓展1 输出三角函数表v1.0,进行改进:可以实现输出任意角到任意角(100度以内)的正弦函数值(角度值由行号*10+列号确定)
上机目的:利用函数编程
我的程序:
//version2.0  输出任意角到任意角(100度以内)的正弦函数值(角度值由行号*10+列号确定)
/*  
* 程序的版权和版本声明部分:  
* Copyright (c) 2013, 青岛农业大学理信学院  
* All rights reserved.  
* 文件名称:输出三角函数表.cpp  
* 作    者:幻影行者  
* 完成日期:2013 年 8 月 4 日  
* 版 本 号:v1.0  
* 对任务及求解方法的描述部分: 
* 输入描述:略  
* 问题描述:要求在main()函数中调用show_sin_table(min_angle, max_angle),
            显示角度值为min_angle到max_angle之间的所有角度(间隔为1度)的正弦值。
			要求不能用数学库函数,自定义mysin函数用于计算sin值。
			例如show_sin_table(0, 90)可以显示出所有0到90度的正弦值。
			为取得更好的效果,可以考虑像英尺到米的转换一样,以速查表格的形式给出结果。 
* 程序输出:输出三角函数表  
* 问题分析:略 
* 算法设计:略  
*/

#include<iostream>
#include<iomanip>
using namespace std;
const double pi=3.141592653;   //常变量
double myabs(double);    //函数声明部分,自定义求绝对值函数,用于判断循环结束条件,设置类型为double,因需要设置精度小于0.00001时结束累加
double mysin(double);    //自定义sin函数
double mycos(double);    //自定义cos函数
double factorial(double); //自定义求阶乘的函数
void show_sin_table(int,int);  //自定义输出三角函数表的函数

int main()
{
	double minAngle,maxAngle;   //角度的最小值和最大值
	cout<<"please enter the minimum angle and the maximum angle: "<<endl;
	do
	{
      cin>>minAngle>>maxAngle;
	  if(minAngle>maxAngle)
	  {
		  cout<<"input error! please ensure the angle you input is between minimum and maximum."<<endl;
		  cout<<"continue to input:"<<endl;
	  }
	}while(maxAngle<minAngle);  //输错处理:确保从小角到大角进行输出
	cout<<"The table is:"<<endl;
	show_sin_table(minAngle,maxAngle);
	return 0;
}

//自定义输出三角函数表的函数
void show_sin_table(int min_angle,int max_angle)
{
	int i,j,k,m;
	cout<<"sinx"<<'\t';  //第一行输出:先输出表头
	for(m=0;m<=9;++m)     //再输出表头后面的内容
	{
		cout<<m<<'\t';
	}
	cout<<endl;
	
    //自第二行以后的输出
	for(i=0;i<=(max_angle/10);++i)    //角度值由(行号i*10+列号j)确定
	{
		cout<<i<<'\t';
		for(j=0;j<=9;++j)
		{
			double d=i*10+j;  //由行号列号确定角度值
			cout.precision(4);  //设置精度
			
			if(0<=d&&d<min_angle) //小于最小角min_angle的角的sin值不输出
			{
				cout<<" "<<"\t"; //输出空格,确保小于最小角min_angle的角的sin值不输出
				if((j+1)==10)   //输入10个值后换行
					cout<<endl;
			}
			else if((i==(max_angle/10))&&(j>(max_angle%10))) //只输入所求最大角max_angle以内的角的sin值
			{
				//什么也不做,确保不再输出大于最大角度max_angle的sin值
			}
			else    //其他情况下正常输出
			{
				cout<<mysin(d*pi/180)<<"\t";
				if((j+1)==10) //输入10个值后换行
					cout<<endl;
			}
			if(d>max_angle) //若角度大于所输入的最大角度max_angle,则不再输出,换行
			{
				cout<<endl;
			}
		}
	}	
}

//自定义sin函数
double mysin(double x)
{
	int k=1,sign=-1;  // sign用于控制每一项前面的符号,为方便计算,从第二项开始,故sign初值为-1,k=1
	double sum=x,item;     //sum代表函数值,从第二项开始,sum初值为x,item代表每一项的值
	double n=x,d;    // n代表分子(numerator),d代表分母(denominator)
	do
	{
		n*=(x*x);      //每一项的分子中,x的幂都相应地比它前一项多2
		d=factorial(2*k+1);   //调用factorial函数求阶乘,每一项的分母中都是奇数的阶乘
		item=sign*(n/d);   //计算每一项的值,并累加到sum中
		sum+=item;  
		sign=-sign; // 实现加一项减一项
		++k;
		}while(myabs(item)>1e-5);  //思维误区:易写成myabs(item)<1e-5,正确理解,“当最后一项的绝对值小于0.00001时,累加结束”
	                              
	return sum;	
}

//自定义cos函数
double mycos(double x)
{
	int k=1,sign=-1;  
	double sum=1,item;     //相比于mysin函数,这里sum初值为1
	double n=1,d;          //这里n=1
	do
	{
		n*=(x*x);      
		d=factorial(2*k);   //每一项的分母中都是偶数的阶乘
		item=sign*(n/d);   
		sum+=item;  
		sign=-sign; 
		++k;
	}while(myabs(item)>1e-5); 
	return sum;	
}

//自定义求绝对值的函数
double myabs(double a)
{
	//return((a>=0)?a:-a);
	if(a>=0)
		return a;
	else 
		return -a;		
}

//自定义求阶乘的函数
double factorial(double a)
{
	double sum=1;
	for(int i=1;i<=a;++i)
		sum*=i;
	return sum;
}


运行结果:

心得体会:

1.当输入不合法时,利用do...while循环可以很方便的进行重新输入

2.合理利用多重for循环实现表格的输出,输出是注意分两部分处理第一部分,处理第一行的输出,包括表头的输出;第二部分处理第二行以后的输出,

本例中需要输出最小角min_angle到最大角max_angle之间的角度的sin值,这就需要再分三部分处理

(1)处理小于最小值的角,其sin值不输出(利用输出空格代替)

(2)处理大于最大角的角,其sin值亦不需要输出(此时利用空语句什么也不做即可)

(3)调用show_sin_table函数正常输出最小角min_angle到最大角max_angle之间的角度的sin值,注意每行输出10个sin值后要换行.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值