同时绘制正弦和余弦曲线

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_indentc_indent中哪个较大。
  • 将这些变量复制到两个新变量largestsmallest
  • 使用 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 "*"
    }
}