

  * 「*」をno個出力する関数 `void put_stars(int no)`
  * 半角スペースをno個出力する関数 `void put_spaces(int no)`
  * 高さnの右下が直角な二等辺三角形を「*」で描く `void put_triangle3(int n)`

とするとき、自分のプログラムではうまく行きませんでした。  
実行例は次のようになれば良いです。

[code]

    $ ./a.out
    何段ですか? 2
        *
       **
    
[/code]

しかし、自分のプログラムでは、`put_spaces`関数があってもなくても、同じように以下のようになりました

[code]

    $ ./a.out
    何段ですか?  2
    **
    *
    
[/code]

このような感じで、`put_spaces`関数がうまく機能していないように思えたのですが、実行例のように表示させるには`put_spaces`関数をどのように書いたら良いのでしょうか。

[code]

    void put_stars(int no)
    {
        int i;
        for(i=no;i>=1;i--) 
            printf("*");
    }  
    
    void put_space(int no)
    {
        int i;
        for(i=no-1;i>=1;i--) 
            printf(" ");
    
    }
    
    void put_triangle(int n)
    {
       int i;
        for(i=n;i>=1;i--) {
            put_stars(i);
            printf("\n");
        }
        return;
    }
    
    int main(void)
    {
        int ln;
        printf("何段ですか? ");
        scanf("%d",&ln);
    
        put_triangle(ln);
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-12-03T12:46:38.547
61068
2019-12-09T01:03:42.710
2019-12-04T04:37:49.643
3060
36412
question
c
右下が直角な二等辺三角形を出力するプログラム

[code]

        *
       **
      ***
     ****
    *****
    
[/code]

の 3段目の 描画をイメージしましょう。

[code]

      ***
    
[/code]

には `*` の 前に `` (スペース) が ２つ必要ですね。

あとはすぐに答えが出せると思います。


CC BY-SA 4.0
2019-12-03T12:52:15.227
61069
2019-12-03T12:52:15.227
18851
61068
answer


関数 `put_space()` を作っていますが、呼んでいませんね。もっと言うと  
関数 `put_spaces()` は作られていませんよね（タイプミスに注意）  
コンパイラはこの辺のタイプミスを斟酌することはありませんし、正しい名称の関数を作っても呼ばなければ実行されることはありません。

` ＊＊＊` スペース２つに星３つを表示したかったら（都合により全角）

[code]

    put_spaces(2); // put_space がタイプミスとして
    put_stars(3);
    
[/code]

としないとあなたの期待した動作にはならないでしょう。で、この修正がどこに必要かはほぼ自明かと。

* * *

コメントでもっと回答求むとあるので追記

もっと追記するとなるとほぼ全く答えになるのですが、宿題ならタイムアウトだろうしもういいかと。

@cubick
氏の回答にある通り「手順を考える」のが大事です。で、この手のループは数学的帰納法の考え方に似ています。開始条件ないしは終了条件と、途中の１点における挙動を考えるとだいたいうまくいきます。で、既に書かれている通りその手順は

  * `i` として `0` 以上 `n` 未満のループをする (`0` が一番上の行)
  * `i` 行目には `` が `n-(i+1)` 個
  * `i` 行目には `*` が `i+1` 個

任意 `i`
行目の挙動が一発で導けないなら、具体的な数値を一つ仮定してみるとよいです。オイラの１回目の回答みたいに２個と３個のように。そして次の行ではどうなればいいかを考えます。そうやって訓練していくと「プログラムを書くための思考」に慣れて、手早く「仕様」を考えることができるようになります。

上記手順を [c99](/questions/tagged/c99 "'c99' のタグが付いた質問を表示") 文法で忠実に書いたら

[code]

    void put_triangle(int n) {
        for (int i=0; i<n; ++i) {
            put_spaces(n-(i+1));
            put_stars(i+1);
            putchar('\n');
        }
    }
    
[/code]

[c89](/questions/tagged/c89 "'c89' のタグが付いた質問を表示") スタイルにするのはお任せします。

この手の課題をもっと一般化すると  
\- n x n の正方形キャンバスがあって  
\- 特定条件を満たすところを `*` 満たさないところを `` にする  
と、任意図形を画面に（テキストでもグラフィックでも）表示できますよね

[*で２等辺三角形を作る](https://ja.stackoverflow.com/questions/60865/) に円の実装例あり。


CC BY-SA 4.0
2019-12-04T05:35:48.113
61084
2019-12-09T01:03:42.710
2019-12-09T01:03:42.710
8589
8589
61068
answer


プログラムを記述する前に、必要な手順を洗い出して、言葉で説明してみることをおすすめします。

* * *

高さが `HEIGHT` 段の時、1行辺りに表示する文字数は(HEIGHTと同じ) `WIDTH` 個。

`n` 段目で表示する...

  * `*` はそのまま `n` 個
  * ``(半角スペースは) ~~`n` 個~~ ではなく、`WIDTH - n` 個、と考える


CC BY-SA 4.0
2019-12-04T06:02:36.233
61087
2019-12-04T06:02:36.233
3060
61068
answer