2015-02-05 42 views
1

我試圖編碼一個小程序,使用標準printf在屏幕上打印出菱形,直到現在我擁有這段代碼編譯時看不到打印輸出:使用printf()的格式說明符「%*。* s」繪製菱形

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int i, n = 5; 
    for(i = -n/2; i < n; i++) 
    printf("%*.*s\n", n/2 + 1, i, "*****"); 
    return 0; 
} 

有人能告訴我應該是這樣嗎?

所需的輸出:

enter image description here

+0

什麼是期望的輸出? – Rizier123 2015-02-05 19:36:45

+0

我編輯了我的問題以添加圖像 – cheroky 2015-02-05 19:43:22

+0

由於輸出需要9個連續的星號'*'且代碼只有5個,您註定要失敗。 – 2015-02-05 21:17:18

回答

4

另一種選擇:

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    for (int n = 11, i = -n/2; i < n/2 + 1; i++) 
     printf("%*.*s\n", n - abs(i), 1 + (n/2 - abs(i)) * 2, "***********"); 
    return 0; 
} 
+0

謝謝,高級答案,我不知道你可以用這種方法截斷一個字符串。 – 2015-02-05 20:36:46

2

方式一:

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
for(int i=1;i<10;i++) 
    printf("%.*s%.*s\n",abs(5-i),"   ",9-abs(10-(i<<1)),"**********"); 
return 0; 
} 
+0

謝謝,高級答案,我不知道你可以這樣截斷一個字符串。 – 2015-02-05 20:35:26

+0

這'欺騙'通過使用兩個'%。* s'轉換規範,而不是一個'%*。* s'。但只需一個轉換規範即可完成。 – 2015-02-05 21:20:57

+0

@WeatherVane是的,我也沒有,或者至少不記得它。這個問題很好,因爲我們通過回答來學習。 – dwn 2015-02-05 21:41:12

1

其他的答案演示瞭如何解決與時髦的數學問題。另一種方法是用軟件狀態機解決問題。該狀態機具有三種狀態變量

  • 跳過 - 就行
  • 增量所示的星號(分)的數量 - - 的空間在該行
  • 節目的開頭的編號使用調整跳過並顯示每個循環中的循環

狀態變量的這種排列使printf更容易理解。 skip+show是一行上的字符總數,show是從stars字符串中取出的星號數,而stars字符串只需要比最大值show長。

char *stars = "*********************"; 
printf("%*.*s\n", skip + show, show, stars); 

所以問題是如何更新每次通過循環的狀態變量以及循環終止條件。

服用例子n=5,值的skip序列是

4 3 2 1 0 1 2 3 4 

我們通過最初設置skip = n-1delta = -1實現此目的。將delta添加到skip會導致skip減少,直到達到0。我們強制skip = 1delta = 1改變方向,而不是讓skip消極。然後skip遞增,直到達到n,終止循環。

值的show序列是

1 3 5 7 9 7 5 3 1 

通過與show=1開始,和通過調整-2*delta產生此序列。

char *stars = "*********************"; 

int n = 5; 
int skip = n - 1; 
int delta = -1; 
int show = 1; 
while (skip < n) 
{ 
    printf("%*.*s\n", skip + show, show, stars ); 

    skip += delta; 
    if (skip < 0) 
    { 
     skip = 1; 
     delta = 1; 
    } 

    show -= delta * 2; 
}