2013-10-23 33 views
2

我有以下代码应输出的正弦曲线的字符图像:打印字符基于正弦曲线是不连续的

#include <stdio.h> 
#include <math.h> 

/**show the image of sine curve*/ 
main() 
{ 
    double y; 
    int m, x; 
    for (y = 1; y >= 0; y -= 0.1) { 
     m = asin(y) * 10; 
     for (x = 1; x < m; x++) 
      printf(" "); 
     printf("*"); 
     for (; x < 31 - m; x++) 
      printf(" "); 
     printf("*\n"); 
    } 
    for (y = 0; y <= 1; y += 0.1) { 
     m = 31 + asin(y) * 10; 
     for (x = 1; x < m; x++) 
      printf(" "); 
     printf("*"); 
     for (; x < 93 - m; x++) 
      printf(" "); 
     printf("*\n"); 
    } 
} 

这是它产生的输出:

 
       * * 
      *   * 
     *    * 
     *     * 
    *     * 
    *      * 
    *      * 
    *       * 
*       * 
*        * 
*        * 
           *        * 
           *        * 
           *       * 
           *       * 
            *      * 
            *      * 
            *     * 
            *     * 
             *    * 
             *   * 
              * * 

正如你所看到的,我的代码的结果是不连续的。我想知道我的代码不正确。另一方面,如果有人能给我一个更好的解决方案,我将不胜感激。

+0

@Bart:OP想绘制一条正弦曲线,它应该是连续的。该代码在下半部分绘制了一条正弦曲线,并有一个位移。 –

+0

@ Vogel612:在使用它们之前分配对象。 –

+3

@Bart:问题确实如此。代码中的注释说:“显示正弦曲线的图像”,问题中的文本显示“我的代码的结果不连续”。完全清楚期望的结果是什么以及得到的结果不正确。 –

回答

4

为正弦波打印空格,星号的上半部分中的代码,则许多空格X,然后一个星号。数字x的计算方式是,在第二个星号后面会有m间距,以达到总共打印31个空格。下半部分的代码分配31个空间,以在上半部分覆盖的距离之后继续正弦波。这没有考虑到上半部分打印在33个字符的字段中:31个空格和两个星号。第二个循环应该在每行的开头打印两个空格。

注:

大概31被选为缩放波,使得半波长是10π。在这种情况下,如果顶部被调整为在31个字符而不是33个字段中打印两个星号,则该描述将会更加精确。

更准确但将会考虑分数字符空间并在星号中打印星号最近的空间。

此外,由于使用了浮点算术而不考虑发生的舍入误差,所以只是偶尔出现循环计数器。对于不同的值,循环可能会有一个迭代次数从所需的迭代次数中减去一次。最好将代码重新配置为使用具有整数值的循环计数器(尽管可能仍然是浮点类型)。

1

曲线不连续的问题通过在第二部分(下半部分)中*之前的printf("*")语句中添加两个空格来解决。

for(y=0;y<=1;y+=0.1){ 
      m=31+asin(y)*10; 
      for(x=1;x<m;x++) printf(" "); 
      printf(" *"); 
      for(;x<93-m;x++) printf(" "); 
      printf(" *\n"); 
    } 

它会打印一个连续的曲线。
输出

enter image description here

0

它确实只是导致不连续性的正弦波的前半部分。整个上半场左边是两个空间。真正的解决方法是针对这些缺陷调整算法,使每个象限从正确的位置开始(Eric P.已经描述了它)。然而,便宜的修正是将所有的东西都转移到正确的位置,首先将m(x位置)的第一个值调整到右侧,然后使用空间将修复传播到整个波形。

连续性,和移位在该代码被纠正,带注释示出的修正是由:

#include <stdio.h> 
#include <math.h> 
/**show the image of sine curve*/ 
main(){ 
    double y; 
    int m,x; 
    for(y=1;y>=0;y-=0.1) 
    { 
     m=(asin(y)*10) +1;//"+1" to shift right 1 
     for(x=1;x<m;x++) //to get first 11 
     {     //asterisks in sync. spaces used thereafter 
      printf(" "); 
     } 
     printf("*"); 
     for(;x<32-m;x++) 
     { 
      printf(" "); 
     } 
     printf(" *\n"); //" "1 additional space to shift image right 
    } 
    for(y=0;y<=1;y+=0.1) 
    { 
      m=31+asin(y)*10; 
      for(x=1;x<m;x++) 
      { 
       printf(" "); 
      } 
      printf(" *"); //2 additional spaces to shift image right 
      for(;x<93-m;x++) 
      { 
       printf(" "); 
      } 
      printf("*\n"); 
    } 
    getchar(); 
} 

*这里是移动的,连续输出的图像:*

enter image description here