2013-10-23 34 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