72582


以下のプログラム（`*` を横に並べるグラフ）を元に、数字文字の出現回数を `*` を縦に並べたグラフで表したいのですが、どうすればいいのかがわかりません。

とりあえず、`*` を横に並べるグラフは以下のようにプログラムを作成しました。

[code]

    #include <stdio.h>
    int main(void)
    {
        int i,j,ch;
        int cnt[10]={0};
        while((ch=getchar())!=EOF){
            if('0'<=ch && ch<='9'){
                cnt[ch-'0']++;
            }
        }
        printf("数字文字の出現回数\n");
        for(i=0;i<10;i++) {
            putchar('\'');
            putchar('0'+i);
            putchar('\'');
            printf(":");
            for(j=0;j<cnt[i];j++)
             putchar('*');
             putchar('\n');
        }
        return 0;
    }
    
[/code]

上記プログラムの実行結果

[code]

    $ ./a.out
    223467.3345
    (CTRL+D)
    数字文字の出現回数
    '0':
    '1':
    '2':**
    '3':***
    '4':**
    '5':*
    '6':*
    '7':*
    '8':
    '9':
    
[/code]

今回作成したいプログラムでの期待している実行結果

[code]

    $ ./a.out
    223467.3345
    (CTRL+D)
    数字文字の出現回数
    
             *
          *  *  *
          *  *  *  *  *  *
    0  1  2  3  4  5  6  7  8  9
    
[/code]

毎度、初歩的な質問申し訳ありませんが、よろしくお願いします。


CC BY-SA 4.0
2020-12-11T03:59:15.460
72580
2020-12-31T05:18:24.580
2020-12-31T05:18:24.580
3060
41837
question
c
数字文字の出現回数を *を縦に並べたグラフで表したい。


学校の課題等でCでやることが決められているとかでなければ、描画ツール(たとえばgnuplotなど)で描くようにするのがやりやすいと思います。

一例ですが作ってみました。

[code]

    #include <stdio.h>
    int main(void)
    {
        int i,j,ch,max;
        int cnt[10]={0};
        while((ch=getchar())!=EOF){
            if('0'<=ch && ch<='9'){
                cnt[ch-'0']++;
            }
        }
    
        /* あらかじめ最も多く出現した値を調べておく */
        max = 0;
        for ( i = 0 ; i < 10 ; i++ ) {
            if ( max < cnt[ i ] ) {
                max = cnt[ i ];
            }
        }
    
        printf("数字文字の出現回数\n\n");
        /* グラフの上のほうから順番に表示する */
        for ( j = max; j >= 1 ; --j ) {
            for ( i = 0 ; i < 10 ; ++i ) {
                if ( cnt[ i ] >= j ) {
                    printf( "*  " );
                }
                else {
                    printf( "   " );
                }
            }
            putchar( '\n' );
        }
    
        /* 横軸の数字を表示する */
        for ( i = 0 ; i < 10 ; ++i ) {
            printf( "%1d  ", i );
        }
        putchar( '\n' );
    
        return 0;
    }
    
[/code]

実行結果

[code]

    $ ./a.out
    0.#12345678911122233333
    数字文字の出現回数
    
             *                    
             *                    
       *  *  *                    
       *  *  *                    
       *  *  *                    
    *  *  *  *  *  *  *  *  *  *  
    0  1  2  3  4  5  6  7  8  9  
    $ ./a.out
    0111111111123
    数字文字の出現回数
    
       *                          
       *                          
       *                          
       *                          
       *                          
       *                          
       *                          
       *                          
       *                          
    *  *  *  *                    
    0  1  2  3  4  5  6  7  8  9  
    
[/code]


CC BY-SA 4.0
2020-12-11T05:47:17.827
72582
2020-12-11T05:47:17.827
30745
72580
answer