リストについてです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
さんま

リストについてです。

#1

投稿記事 by さんま » 12年前

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

box
記事: 2002
登録日時: 15年前

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

#2

投稿記事 by box » 12年前

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

かずま

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

#3

投稿記事 by かずま » 12年前

コード:

#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';
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 12年前

「リスト構造を使って」という指定だけで、std::mapを使ってはいけないという縛りは無いようなので、
まず入力された文字をリスト構造で保持し、それを走査してstd::mapで出現頻度を数えていけばいいと思います。

別の観点から提案すると、文字列をデフォルトでリストとして扱うHaskellを使うという方法もあると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る