MOOC清华《程序设计基础》第9章第2题:模拟输出正弦曲线

题目描述

显示正弦曲线y=35sin(x)在[0,2*pi)的部分与x轴围成的图形

要求:从x=0开始,每隔pi/30的距离在屏幕上输出一行,图形内的部分用'*'表示,图形外的部分用空格表示。曲线边界按y的绝对值四舍五入取整。 (x=0,y=0)这个点在第一行的第36个字符处用'*'表示。 图形的前几行是
"                                   *"
"                                   *****"
"                                   ********"
"                                   ************"
"                                   ***************"

问在输出的第n行中,有___个连续的'*','*'之前有____个空格。

输入格式

输入n

输出格式

输出两个数,中间以空格隔开

样例输入
2
样例输出
5 35

包含测试过程的完整代码:

#include 
#include 
using namespace std;

const double pi = 3.141592653; 

/*
int round(double number)  //round是英文四舍五入的意思,跟圆是一个单词 
{
	if(number >= 0.0)
	{
		if(number - floor(number) < 0.5)
			return (int)floor(number);
		else
			return (int)(floor(number) + 1);
	}
	else
	{
		if(fabs(floor(number)) - fabs(number) < 0.5)
			return (int)floor(number);
		else
			return (int)(floor(number) + 1);
	}
} 
*/ //重复定义了一次round函数 

//图形版 
/*
int main()
{
	double x_axis = 0.0, y_axis = 0.0, x = 0.0;
	int blank = 0;
	for(x = 0.0; x <= 2 * pi; x += pi / 30.0)
	{
		y_axis = 35 * sin(x);
		if(y_axis >= 0.0)
		{
			for(int i = 0; i < 35; i++ )
				cout << ' ';
			for(int i = 0; i <= round(y_axis); i++)
				cout << '*';
			cout << endl;
		}
		else
		{
			blank = 35 - fabs(round(y_axis));
			for(int i = 0; i < blank; i++)
				cout << ' ';
			for(int i = 0; i <= fabs(round(y_axis)); i++)
				cout << '*';
			cout << endl;
		}
	} 
	return 0;
}*/

//数据版 

int main()
{
	double x_axis = 0.0, y_axis = 0.0, x = 0.0;
	int blank = 0, blank_num = 0, star_num = 0, line_num = 0, n = 0;
	cin >> n;
	for(x = 0.0, line_num = 1; (x <= 2 * pi) && (line_num <= n); x += pi / 30.0, line_num++)
	{
		y_axis = 35 * sin(x);
		if(y_axis >= 0.0)
		{
			int tmp = 0;
			for(int i = 0; i < 35; i++ )
				tmp++;
			blank_num = tmp;
			tmp = 0;
			for(int i = 0; i <= round(y_axis); i++)
				tmp++;
			star_num = tmp;
		}
		else
		{
			blank = 35 - fabs(round(y_axis));
			int tmp = 0;
			for(int i = 0; i < blank; i++)
				tmp++;
			blank_num = tmp;
			tmp = 0;
			for(int i = 0; i <= fabs(round(y_axis)); i++)
				tmp++;
			star_num = tmp;
		}
	} 
	cout <<  star_num << ' ' << blank_num << endl;
	return 0;
}

MOOC清华《程序设计基础》第9章第2题:模拟输出正弦曲线_第1张图片

MOOC清华《程序设计基础》第9章第2题:模拟输出正弦曲线_第2张图片

为答题而简化的精简版代码:

#include 
#include 
using namespace std;

const double pi = 3.141592653; 

int main()
{
	double x_axis = 0.0, y_axis = 0.0, x = 0.0;
	int blank = 0, blank_num = 0, star_num = 0, line_num = 0, n = 0;
	cin >> n;
	for(x = 0.0, line_num = 1; (x <= 2 * pi) && (line_num <= n); x += pi / 30.0, line_num++)
	{
		y_axis = 35 * sin(x);
		if(y_axis >= 0.0)
		{
			blank_num = 35;
			star_num = round(y_axis) + 1;
		}
		else
		{
			blank = 35 - fabs(round(y_axis));
			blank_num = blank;
			star_num = fabs(round(y_axis)) + 1;
		}
	} 
	cout << star_num << ' ' << blank_num << endl;
	return 0;
}

注意事项:

1,不要把star_num和blank_num在输出语句中的位置写反了!

2,正弦曲线的图形版函数中,大于、大于等于号的使用要仔细推敲。

3,如果切换到图形界面,把星号变成一个个像素点,那么就可以得到任意精确的正弦曲线;0到π和π到2π的正负值两区域的直边是共线的,图中似乎星号重合了一列,没有问题。

你可能感兴趣的:(C/C++,MOOC清华程设基础)