ページ 11

リストについてです。

Posted: 2013年11月26日(火) 21:51
by さんま
リスト構造を使って、入力された文字の出現頻度を表示させるプログラムがわかりません。
入力された文字をそのまま表示させるものは作れたのですが、出現回数をどのようにして計算し表示させるのかがわからないのです。
どうかご指南頂けないでしょうか?

Re: リストについてです。

Posted: 2013年11月26日(火) 21:58
by box
さんま さんが書きました:リスト構造を使って、入力された文字の出現頻度を表示させるプログラムがわかりません。
「文字」の定義を示してください。
英文字に限るのか、
数字を含むのか、
日本語などの2バイト文字にも対応する必要があるのか、等々。
さんま さんが書きました: 入力された文字をそのまま表示させるものは作れた
そのコードを貼ってみてください。

Re: リストについてです。

Posted: 2013年11月27日(水) 22:22
by かずま

コード:

#include <iostream>
#include <map>

int main()
{
    char c;
    std::map<char, int> a;

    while (std::cin >> c) a[c]++;
    for (auto i = a.begin(); i != a.end(); ++i)
        std::cout << i->first << ' ' << i->second << '\n';
}
実行結果

コード:

hello world     入力
^Z   または ^D  EOF
d 1
e 1
h 1
l 3
o 2
r 1
w 1
map を使うとこんなに簡単ですが、あえて list を使うなら

コード:

#include <iostream>
#include <list>

struct node {
    char c;
    int count;
    node(char c) : c(c), count(1) {}
};

int main()
{
    char c;
    std::list<node> a;

    while (std::cin >> c) {
        auto i = a.begin();
        while (i != a.end() && i->c < c) ++i;
        if (i != a.end() && i->c == c) i->count++;
        else a.insert(i, node(c));
    }
    for (auto i = a.begin(); i != a.end(); ++i)
        std::cout << i->c << ' ' << i->count << '\n';
}

Re: リストについてです。

Posted: 2013年12月01日(日) 15:30
by みけCAT
「リスト構造を使って」という指定だけで、std::mapを使ってはいけないという縛りは無いようなので、
まず入力された文字をリスト構造で保持し、それを走査してstd::mapで出現頻度を数えていけばいいと思います。

別の観点から提案すると、文字列をデフォルトでリストとして扱うHaskellを使うという方法もあると思います。