掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23842

大小比較を最後に結果表示する方法
投稿者---キキ(2005/10/26 10:16:26)


2つの値の大小をどんどん入力していって、最後に大きい順にまとめて表示したいのですが、どうすればいいでしょう。

(入力例)
a>b
b<c
a<c

(出力例)
a>b
b<c
a<c
大きい方からcab


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:大小比較を最後に結果表示する方法 23845 nop 2005/10/26 11:50:31
<子記事> Re:大小比較を最後に結果表示する方法 23848 かずま 2005/10/26 18:14:09
<子記事> Re:大小比較を最後に結果表示する方法 23857 まきじ 2005/10/26 23:31:30


No.23845

Re:大小比較を最後に結果表示する方法
投稿者---nop(2005/10/26 11:50:31)


>どうすればいいでしょう。

1.仕様のまとめ
2.設計
3.コーディング
4.テスト

と言う手順で作成すれば良いのでは?


# 2ch辺りだと、「首吊(ry」とか言われそうだな(w


この投稿にコメントする

削除パスワード

No.23848

Re:大小比較を最後に結果表示する方法
投稿者---かずま(2005/10/26 18:14:09)


> 2つの値の大小をどんどん入力していって、最後に大きい順にまとめて
> 表示したいのですが、どうすればいいでしょう。

各チーム(値)について、対戦相手と自分の負け数を記録しておいて、
負け数ゼロがチャンピオン。
記録から、チャンピオンの対戦相手の負け数を減らします。
チャンピオンを記録から除いて、新たなチャンピオンを選びます。
これを繰り返せばよいでしょう。

参考にならないかもしれませんが、C++ のプログラムを書いてみました。
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <cctype>
using std::cout;

typedef std::multiset<char> Set;

struct Team {
    int lose;
    Set rivals;

    Team() : lose(0) { }
};

typedef std::map<char, Team> Map;

void input(Map &record)
{
    std::string buf;
    while (cout << "> ", getline(std::cin, buf)) {
        std::istringstream iss(buf);  char n1, op, n2, x;
        if (!(iss >> n1) || n1 == '.') break;
        if (!(iss >> op >> n2) || iss >> x || op!='<' && op!='>'
                || !std::islower(n1) || !std::islower(n2))
            cout << "bad input\n";
        else {
            Team *t1 = &record[n1];  t1->rivals.insert(n2);
            Team *t2 = &record[n2];  t2->rivals.insert(n1);
            (op == '<') ? t1->lose++ : t2->lose++;
        }
    }
}

char get_winner(Map &record)
{
    char winner = 0;
    for (Map::iterator it = record.begin(); it != record.end(); ++it)
        if (it->second.lose == 0) {
            if (winner) return 0;
            winner = it->first;
        }
    return winner;
}

void remove(Map &record, char team)
{
    Set *s = &record[team].rivals;
    for (Set::iterator it = s->begin(); it != s->end(); ++it) {
        Team *t = &record[*it];
        t->lose -= t->rivals.erase(team);
    }
    record.erase(team);
}

int main()
{
    Map record;
    input(record);
    while (record.size() > 0) {
        char winner = get_winner(record);
        if (winner == 0) { cout << "can't sort\n"; return 1; }
        cout << winner;
        remove(record, winner);
    }
    cout << '\n';
}

-----------------------------
実行結果
> a>b
> b<c
>  a < c
> .
cab



この投稿にコメントする

削除パスワード

No.23857

Re:大小比較を最後に結果表示する方法
投稿者---まきじ(2005/10/26 23:31:30)


>2つの値の大小をどんどん入力していって、最後に大きい順にまとめて表示したい
>a>b
>b<c
>a<c

配列を用意して、配列に < > の左右の値(a,b,c)があるか探す。
両方なければ、< > に従って共に追加する。
両方あれば、< > に従って移動させる。
片方があれば、< > に従って無いほうを挿入する。


この投稿にコメントする

削除パスワード

No.23865

Re:大小比較を最後に結果表示する方法
投稿者---かずま(2005/10/27 10:16:39)


>> a>b
>> b<c
>> a<c
>
> 配列を用意して、配列に < > の左右の値(a,b,c)があるか探す。
> 両方なければ、< > に従って共に追加する。
> 両方あれば、< > に従って移動させる。
> 片方があれば、< > に従って無いほうを挿入する。

a>b で、配列に a b を追加した後、
b<c で、c をどこに挿入するのですか?


この投稿にコメントする

削除パスワード

No.23866

Re:大小比較を最後に結果表示する方法
投稿者---まきじ(2005/10/27 23:43:41)


>>>> 片方があれば、< > に従って無いほうを挿入する。
>a>b で、配列に a b を追加した後、
>b<c で、c をどこに挿入するのですか?

大きい順なので b の左。
b>c だと b の右。

初期状態:{'\0'};
a>b と入力:{'a','b','\0'}

b<c と入力:
 b 以降を右にずらして:{'a','b','b','\0'}
 c を挿入:{'a','c','b','\0'}

a<c と入力:
 a から c - 1の間を右にずらして:{'a','a','b','\0'}
 c を挿入:{'c','a','b','\0'}


この投稿にコメントする

削除パスワード

No.23867

Re:大小比較を最後に結果表示する方法
投稿者---かずま(2005/10/28 00:07:47)


a>b
c>d
d>a
の場合どうなりますか?


この投稿にコメントする

削除パスワード

No.23869

Re:大小比較を最後に結果表示する方法
投稿者---まきじ(2005/10/28 00:48:00)


>a>b
>c>d
>d>a
>の場合どうなりますか?

{'a','b','\0'}
   ↓
{'a','b','c','d','\0'}
   ↓
{'a','a','b','c','\0'}
   ↓
{'d','a','b','c','\0'}

となります・・出来てないですね(^^;;

# スイマセン ワスレテクダサイ


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧