上机内容:要求在main()函数中调用show_sin_table(min_angle, max_angle),
我的程序:
运行结果:
显示角度值为min_angle到max_angle之间的所有角度(间隔为1度)的正弦值。上机目的:利用函数编程,学会自定义sin和cos函数
要求不能用数学库函数,将项目6中的mysin函数拷贝到这个程序中,用于计算sin值。
例如show_sin_table(0, 90)可以显示出所有0到90度的正弦值。
为取得更好的效果,可以考虑像英尺到米的转换一样,以速查表格的形式给出结果。
注:version1.0 输出0到任意角(100度以内)的正弦函数值
我的程序:
/*
* 程序的版权和版本声明部分:
* 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度的正弦值。
为取得更好的效果,可以考虑像英尺到米的转换一样,以速查表格的形式给出结果。
* 程序输出:输出三角函数表
* 问题分析:略
* 算法设计:略
*/
//version1.0 输出0到任意角(100度以内)的正弦函数值
#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;
cin>>minAngle>>maxAngle;
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;
if(min_angle<max_angle) //自第二行以后的输出
{
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(3); //设置精度
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;
}
}
}
}
else
{
}
}
//自定义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;
}
运行结果: