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 <iostream>
#include <cmath>
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;
}
为答题而简化的精简版代码:
#include <iostream>
#include <cmath>
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π的正负值两区域的直边是共线的,图中似乎星号重合了一列,没有问题。
软件业务请联系QQ:3121432464“正聪科技客服”
posted on 2017-10-05 18:17 sunshineman1986 阅读(333) 评论(0) 收藏 举报
浙公网安备 33010602011771号