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");
    }
}

这是它生成的输出:

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

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

4

3 回答 3

4

正弦波上半部分的代码打印m个空格,一个星号,然后是多个空格x,然后是一个星号。计算数字x以便在第二个星号之后有m个空格,总共打印 31 个空格。下半部分的代码分配了 31 个空格以在上半部分覆盖的距离之后继续正弦波。这无法解释上半部分打印在 33 个字符的字段中的事实:31 个空格和两个星号。第二个循环应该在每行的开头再打印两个空格。

笔记:

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

更准确的是考虑小数字符空间并在最近的空间中打印星号。

此外,循环计数器按预期工作只是偶然的,因为使用浮点运算时不考虑发生的舍入误差。使用不同的值,循环的迭代计数可能会与期望值相差 1。最好重新编写代码以使用具有整数值的循环计数器(尽管可能仍然是浮点类型)。

于 2013-10-23T14:33:30.120 回答
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");
    }  

它将打印一条连续sine曲线。
输出

在此处输入图像描述

于 2013-10-23T14:15:49.103 回答
0

它实际上只是导致不连续性的正弦的前半部分。整个上半场是左边两个空格。真正的解决方法是针对这些缺陷调整算法,使每个象限都从正确的位置开始(Eric P. 已经很好地描述了它)。然而,廉价的修复方法是将所有内容向右移动,首先将m(x-position) 的第一个值调整为向右显示,然后使用空格在整个波形中传播修复。

此代码中更正了连续性和偏移,注释显示了更正的位置:

#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();
}   

*这是移位的连续输出的图像:*

在此处输入图像描述

于 2013-10-23T15:04:04.970 回答