2016-12-04 50 views
-3

我正在嘗試編寫一個程序,該程序使用多個字符構建「建築物」。 有3個功能:我如何在同一行上打印此文件

1. int ValidateData(int low, int high, char type) 

此功能驗證該用戶的條目滿足所需的參數,並返回取決於type參數正確的數字。

這裏沒問題。

  • int drawUpperFloors(int numOfWindows)
  • 該函數應該取決於用戶如何許多窗口輸入繪製的樓層數。我的問題是,我似乎無法讓窗口畫在同一條線上。如果用戶輸入3的輸出應該是:(了一段時間來獲取右)

    +---------------+ | | | === === === | | | | | | | | | | === === === | | |

    相反,我得到一個新行窗口,直到環路達到其極限(numOfWindows),所以如果numOfWindows = 20然後我得到20個窗口在不同的線路上。我希望瞭解如何做到這一點。

  • void DrawGroundFloor(int numOfWindows)

    該功能除了第一窗口將與門來代替幾乎相同的功能drawUpperFloors() 。 因此,如果numOfWindows參數爲2,則底層將包含1扇門和1個窗口的 。 如果窗口數量只有1個,那麼只會繪製一扇門。

    請注意以下詳細信息: a)。每個窗口(和門)正好是3列寬。 b)。地板的底部用*字符繪製。

    有5個窗口,一樓的一個例子woulb是:

  • +-----------------------+ | | | === === === === === | | | | | | | | | | | | | | | | === === === === | | | | | *************************

    考慮到我已經無法做二次函數這並不令人吃驚。

    我試過使用多達3個循環使用ifelse,但我仍然不能,無論我嘗試什麼(甚至模數)讓它打印在同一行。 任何輸入將不勝感激。

    編輯 這裏爲2個函數的代碼到目前爲止

    int GetValidData(int low, int high, char type) 
    { 
        int number; 
        int number2; 
    
        int i=1; 
        int j; 
        if (type == 'F') 
        { 
         printf("Enter the amount of floors you would like(1-1000)\n"); 
         scanf("%d", &number); 
         fflush(stdin); 
    
    
         if (number < 1 || number>1000) 
         { 
          while(i!=0) 
          { 
           printf("You have entered an invalid floor number\nPlease enter a valid number: "); 
    
           scanf("%d", &number); 
           fflush(stdin); 
           if (number >= 1 && number <= 1000) 
           { 
            printf("Thank you!\n"); 
            i = 0; 
    
           } 
          } 
    
         } 
         return number; 
        } 
    
    
    
        printf("Enter the amount of windows you would like(1-20)\n"); 
        scanf("%d", &number); 
    
    
        if (type == 'W') 
        { 
         if (number < 1 || number>20) 
         { 
          while(i!=0) 
          { 
           printf("You have entered an invalid number\nPlease enter a valid number: "); 
           scanf("%d", &number); 
           if (number >= 1 && number <= 20) 
           { 
            printf("Thank You!\n"); 
            i = 0; 
           } 
          } 
    
         } 
    
         return number; 
    
    
    
    
    int drawUpperFloors(int numOfWindows) 
    { 
        int check = numOfWindows; 
        int i; 
        int j; 
        for (i = 0; i <= numOfWindows;i++) 
        { 
         printf("===\n"); 
         for (j = 0; j <= numOfWindows;j++) 
         { 
          printf("| |\n"); 
         } 
    
         printf("==="); 
        } 
    

    }

    +2

    請[編輯]你的問題標題的東西與意義。很明顯你在尋求幫助,或者你不會在這裏發帖,所以在你的頭銜中這樣說並不是必要的。您的標題應該以對未來讀者有意義的方式來描述您遇到的問題或您問的問題,這些讀者會在搜索結果中看到它。此外,尋求代碼幫助要求您以問題形式發佈相關代碼,形式爲[mcve]。添加,當你做標題編輯。 –

    +0

    'fflush(stdin)'具有未定義的行爲。 – melpomene

    +0

    你的代碼不能編譯。它缺少閉合的大括號。 – Schwern

    回答

    0

    我的問題是,我似乎無法獲得Windows繪製在同一直線上。

    基本問題是你在繪製單個窗口時向打印語句添加換行符。

    for (i = 0; i <= numOfWindows;i++) 
    { 
        /* There shouldn't be a newline here */ 
        printf("===\n"); 
        for (j = 0; j <= numOfWindows;j++) 
        { 
         /* Nor a newline here */ 
         printf("| |\n"); 
        } 
    
        printf("==="); 
    } 
    

    您還計數從0的窗口,導致一個窗口太多。從1開始或直到i < numOfWindows

    您必須在其自己的循環中繪製每條線,包括外壁,以換行符結束。首先是上面的窗臺,然後是窗戶,然後是下面的窗臺。

    void drawUpperFloors(int numOfWindows) 
    { 
        int i; 
    
        /* Draw the upper sills, including the outer walls */ 
        printf("| "); 
        for (i = 1; i <= numOfWindows;i++) 
        { 
         printf("=== "); 
        } 
        printf(" |\n"); 
    
        /* Draw the windows, including the outer walls */ 
        printf("| "); 
        for (i = 1; i <= numOfWindows;i++) 
        { 
         printf("| | "); 
        } 
        printf(" |\n"); 
    
        /* Draw the lower sills, including the outer walls */ 
        printf("| "); 
        for (i = 1; i <= numOfWindows;i++) 
        { 
         printf("=== "); 
        } 
        printf(" |\n"); 
    } 
    

    這會變得重複,因此最好將繪製一條底線放入函數中。

    void drawFloorLine(int num, const char *to_repeat) { 
        int i; 
    
        printf("| "); 
        for (i = 1; i <= num;i++) 
        { 
         printf("%s", to_repeat); 
        } 
        printf(" |\n"); 
    } 
    
    void drawUpperFloors(int numOfWindows) 
    { 
        drawFloorLine(numOfWindows, "=== ");  
        drawFloorLine(numOfWindows, "| | "); 
        drawFloorLine(numOfWindows, "=== "); 
    } 
    
    +1

    哇!先生,你是一個天才。這整段時間我都在想,這有一些竅門。不要以爲我一次只寫1行。使用'drawFloorLine()'函數我似乎無法重新創建它,因此它可以與'drawGroundFloor()'一起使用,但我仍在測試。感謝您的幫助。 – YoungDisciple

    +0

    您使用'drawFloorLine()'繪製底層的前兩行,然後您必須特別處理其餘部分。至於能夠一次繪製多行,你想看看像[curses](https://en.wikipedia.org/wiki/Curses_%28programming_library%29),它可以讓你移動一個光標在屏幕上創建基於文本的用戶界面。 – Schwern