同时绘制正弦和余弦曲线
Drawing simultaneously sine and cosine curves
我正在尝试编写一个 c 程序,通过对正弦使用“+”,对余弦使用 'x',当正弦值和余弦值相等时使用“*”同时绘制正弦和余弦曲线。这是代码:
#include<stdio.h>
#include<math.h> /* for sin(x) */
#define M_PI 3.14159265358979323846264338327950288
int main() {
double x;
int s_indent;
int c_indent;
for(x = -180.0; x <=180.0; x+=15.0) {
/* compute value */
s_indent = 10 + 10* sin(x/180 * M_PI);
c_indent = 10 + 10* cos(x/180 * M_PI);
if(c_indent == s_indent){
for(;s_indent;--s_indent) putchar(' ');
printf("*\n");
}
else{
for(; s_indent; --s_indent) putchar(' ');
printf("+\n");
/* plot x at position */
for(; c_indent; --c_indent) putchar(' ');
printf("x\n");
}
}
return 0;
}
但是代码的问题在于它逐行生成曲线。喜欢这里:
我想把它放在同一条线上:
想法?
您可以:创建一个空行
char line[] = " ";
在适当的地方设置字符
line[c_indent] = 'x';
line[s_indent] = '+';
然后输出这一行:
puts(line);
一个点同时存在正余弦的情况留给你作为练习;)
- 在
else
语句中,检查s_indent
和c_indent
中哪个较大。
- 将这些变量复制到两个新变量
largest
和smallest
。
- 使用 for 循环遍历
smallest
以打印空格,然后打印 + 或 x,具体取决于哪个最小。
- 然后从
smallest
迭代到 largest
,打印空格,然后打印 + 或 x,具体取决于哪个最大。
另一种更优雅的解决方案是创建一个函数 void printline (int n, char symbol)
然后调用它两次。
在发布的代码中,每个符号都在计算出的位置打印在单独的一行中,但是您要做的是确定符号的顺序并将它们打印在同一行中。
Consier 使用像
这样的简单函数
void print_after_n_spaces(int n, const char* str)
{
while (n-- > 0)
putchar(' ');
printf("%s", str);
}
另外,再添加一个分支,计算两个位置的差:
for(int x = -180; x <= 180; x += 15)
{
double angle = x / 180.0 * M_PI;
int s_pos = 10.5 + 10.0 * sin(angle);
int c_pos = 10.5 + 10.0 * cos(angle);
// ^^^^ To "round" the values
if (c_pos > s_pos)
{
print_after_n_spaces(s_pos, "+");
// ^^^ Don't print the newline here
print_after_n_spaces(c_pos - s_pos - 1, "x\n");
// ^^^^^^^^^^^^^^^^^ Difference between the positions
}
else if (c_pos < s_pos)
{
// Here prints first the "x" (the cosine), then the "+"
}
else
{
// Here prints only "*"
}
}
我正在尝试编写一个 c 程序,通过对正弦使用“+”,对余弦使用 'x',当正弦值和余弦值相等时使用“*”同时绘制正弦和余弦曲线。这是代码:
#include<stdio.h>
#include<math.h> /* for sin(x) */
#define M_PI 3.14159265358979323846264338327950288
int main() {
double x;
int s_indent;
int c_indent;
for(x = -180.0; x <=180.0; x+=15.0) {
/* compute value */
s_indent = 10 + 10* sin(x/180 * M_PI);
c_indent = 10 + 10* cos(x/180 * M_PI);
if(c_indent == s_indent){
for(;s_indent;--s_indent) putchar(' ');
printf("*\n");
}
else{
for(; s_indent; --s_indent) putchar(' ');
printf("+\n");
/* plot x at position */
for(; c_indent; --c_indent) putchar(' ');
printf("x\n");
}
}
return 0;
}
但是代码的问题在于它逐行生成曲线。喜欢这里:
我想把它放在同一条线上:
想法?
您可以:创建一个空行
char line[] = " ";
在适当的地方设置字符
line[c_indent] = 'x';
line[s_indent] = '+';
然后输出这一行:
puts(line);
一个点同时存在正余弦的情况留给你作为练习;)
- 在
else
语句中,检查s_indent
和c_indent
中哪个较大。 - 将这些变量复制到两个新变量
largest
和smallest
。 - 使用 for 循环遍历
smallest
以打印空格,然后打印 + 或 x,具体取决于哪个最小。 - 然后从
smallest
迭代到largest
,打印空格,然后打印 + 或 x,具体取决于哪个最大。
另一种更优雅的解决方案是创建一个函数 void printline (int n, char symbol)
然后调用它两次。
在发布的代码中,每个符号都在计算出的位置打印在单独的一行中,但是您要做的是确定符号的顺序并将它们打印在同一行中。
Consier 使用像
这样的简单函数void print_after_n_spaces(int n, const char* str)
{
while (n-- > 0)
putchar(' ');
printf("%s", str);
}
另外,再添加一个分支,计算两个位置的差:
for(int x = -180; x <= 180; x += 15)
{
double angle = x / 180.0 * M_PI;
int s_pos = 10.5 + 10.0 * sin(angle);
int c_pos = 10.5 + 10.0 * cos(angle);
// ^^^^ To "round" the values
if (c_pos > s_pos)
{
print_after_n_spaces(s_pos, "+");
// ^^^ Don't print the newline here
print_after_n_spaces(c_pos - s_pos - 1, "x\n");
// ^^^^^^^^^^^^^^^^^ Difference between the positions
}
else if (c_pos < s_pos)
{
// Here prints first the "x" (the cosine), then the "+"
}
else
{
// Here prints only "*"
}
}