ページ 11

文字の出現数、出現率

Posted: 2017年7月20日(木) 10:24
by pop
ある文字のASCII コード、その文字の出現数、入力され
た文字の総数の3 つを引数とし、出現数を'*' でプロットする関数hist() を作成せよ。また、その文字の
出現率[%] も併記せよ。出現数が0 の文字はプロットしなくて良い。画面への出力は実行例を参照のこと。
この関数を用いて以下の機能を持つプログラムを作成せよ。

といった課題について、とりあえず出現数をプロットはできたのですが他がさっぱりです、、よれけば教えてもらえると光栄です。

コード:

#include <stdio.h>
int main(void)
{
int i = 0, num = 0, table[26]={0};
int j;
char str[218];
gets(str);

while (str[i]){
if (str[i] >= 97 && str[i] <= 122){
table[str[i] - 97]++;
num++;
}

i++;
}

for (i=0; i<26; i++){ 
printf("'%c':" ,97 + i);

for(j=0; j<table[i];j++)
putchar('*');
printf("\n");
}

return 0;
}
実行例
aa bbb ccc (←この行はキーボードからの入力)
~ あと4 回入力を繰り返す ~
'a':*******************: 32.2[%] ('a' の出現数と出現率※すべて関数内で表示させる)
'b':************************: 40.7[%] ('b' の出現数と出現率)
'c':****************: 27.1[%] ('c' の出現数と出現率)

Re: 文字の出現数、出現率

Posted: 2017年7月20日(木) 10:41
by かずま
n = str - 'a' で、str が 'a' から何番目かを求める。
str は、
 n == 0 なら 'Z'
 n == 25 なら 'A'
 n が奇数なら、'A' + n + 1
 n が偶数なら、'A' + n - 1
まずは、これでやってみてはいかがでしょうか?

他にもいろいろな方法があります。

コード:

#include <stdio.h>

void cipher(char str[])
{
    for (char *p = str; *p; p++)
        if (*p >= 'a' && *p <= 'z')
            *p = "ZCBEDGFIHKJMLONRQPSRUTWVYXA"[*p - 'a'];
}

int main(void)
{
    char str[128];

    if (fgets(str, sizeof str, stdin) == NULL) return 1;
    cipher(str);
    printf("%s", str);
    return 0;
}

Re: 文字の出現数、出現率

Posted: 2017年7月20日(木) 10:50
by かずま
すみません。
文字列入れ替えのプログラムについての回答をこちらに送信してしまいました。

この掲示板に投稿するときは、名前を統一してください。

Re: 文字の出現数、出現率

Posted: 2017年7月20日(木) 19:01
by かずま
pop さんが書きました:実行例
aa bbb ccc (←この行はキーボードからの入力)
~ あと4 回入力を繰り返す ~
この意味がよくわかりません。
全部で 5行入力するということですか?

とりあえず書いてみますので、上の疑問に答えて、
書き直したものを提示してください。

コード:

#include <stdio.h>

void hist(char c, int count, int total)
{
    if (count != 0) {
        printf("%c: ", c);
        for (int i = 0; i < count; i++)
            putchar('*');
        printf(": %.1f%%\n", count * 100.0 / total);
    }
}

int main(void)
{
    int i, j, num = 0, table[26] = { 0 };
    char str[218];

    for (i = 0; i < 5; i++) {
        if (fgets(str, sizeof str, stdin) != NULL) return 1;
        for (j = 0; str[j]; j++) {
            if (str[j] >= 'a' && str[j] <= 'z') {
                table[str[j] - 'a']++;
                num++;
            }
        }
    }
    for (i = 0; i < 26; i++)
        hist('a' + i, table[i], num);
    return 0;
}
インデントをちゃんとしてください。
97 や 122 ではなく、'a' や 'z' と書いてください。
行入力には、gets ではなく、fgets を使いましょう。

Re: 文字の出現数、出現率

Posted: 2017年7月21日(金) 08:53
by かずま
かずま さんが書きました:

コード:

        if (fgets(str, sizeof str, stdin) != NULL) return 1;
すみません。判定が逆でした。

コード:

        if (fgets(str, sizeof str, stdin) == NULL) return 1;