ソートを実現するには?

解決


samurai  2006-06-01 03:54:07  No: 62019

c++で申し訳ありません。クラスの定義はこのようになっているのですが
先がわかりません。どのようにしたらソートが動くプログラムができるでしょうか?

実行結果
1両面の乗客数を入力してください:10
2両面の乗客数を入力してください:5
3両面の乗客数を入力してください:15
4両面の乗客数を入力してください:8
5両面の乗客数を入力してください:3

5両目の乗客数は3人です。
2両目の乗客数は5人です。
4両目の乗客数は8人です。
1両目の乗客数は10人です。
3両目の乗客数は15人です。

#include <iostream.h>

class CCar
{
public:
    CCar(short nCarNo,short nPassengerCount);         //コンストラクタ
    short   GetCarNo();                                    //車両番号を取得する。
    short   GetPassengerCount();                  //乗客数を取得する。
    void    SetCarNo(short nCarNo);      //車両番号をセットする。
    void    SetPassengerCount(short nPassengerCount);   //乗客数をセットする。
    void    DisplayPassengerCount();                    //乗客数を表示する。
    void    EnterPassengerCount();            //乗客数を入力する。
    ~CCar();                                            //デストラクタ
private:
    short   m_nCarNo;        //車両番号
    short   m_nPassengerCount;  //乗客数
};

inline short CCar::GetCarNo()
{
    return  m_nCarNo;
}

inline short CCar::GetPassengerCount()
{
    return  m_nPassengerCount;
}

void CCar::SetCarNo(short nCarNo)
{


KING・王  2006-06-01 05:57:04  No: 62020

> c++で申し訳ありません。クラスの定義はこのようになっているのですが
> 先がわかりません。どのようにしたらソートが動くプログラムができるでしょうか?

ではまず、ソートをせずに単に表示するソースを載せてください。


επιστημη  2006-06-01 19:24:25  No: 62021

#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>

class CCar {
public:
  CCar(short nCarNo,short nPassengerCount) 
     : m_nCarNo(nCarNo), m_nPassengerCount(nPassengerCount) {}
  friend bool operator<(const CCar& x, const CCar& y) 
    { return x.m_nPassengerCount < y.m_nPassengerCount; }
  friend std::ostream& operator<<(std::ostream& stream, const CCar& c) {
    return stream << "Car#" << c.m_nCarNo << " " 
                  << c.m_nPassengerCount << " passengers";
  }
private:
  short   m_nCarNo;        //車両番号
  short   m_nPassengerCount;  //乗客数
};

int main() {
  std::set<CCar> train;
  train.insert(CCar(1,10));
  train.insert(CCar(2, 5));
  train.insert(CCar(3,15));
  train.insert(CCar(4, 8));
  train.insert(CCar(5, 3));
  std::copy(train.begin(), train.end(), 
    std::ostream_iterator<CCar>(std::cout, "\n"));
}


PATIO  2006-06-02 23:10:49  No: 62022

そのものずばりのソースですけれど、
ちゃんと理解して使わないと突っ込まれた時に返答できなさそうですね。


επιστημη  2006-06-03 01:06:19  No: 62023

> ちゃんと理解して使わないと突っ込まれた時に返答できなさそうですね。

勿論す。 ベタコピーで提出できるよなソースは出しませんって (^^

# 不等号の向きを裏返して priority_queue 使おうかとも思ったぞ(んふふ


Ban  2006-06-03 03:44:28  No: 62024

#C言語関係質問掲示板とマルチですね(ハンドル/IPまで一致…)


サムライ  2006-06-05 22:32:37  No: 62025

解決しました!皆様ありがとうございました!


επιστημη  2006-06-05 23:38:09  No: 62026

どう解決したのか、顛末を記すのが礼儀ってもんですぜ。


samurai  2006-06-06 02:12:10  No: 62027

すみません!
色々調べてソートがちゃんと動くようになりました。
これからもっと勉強していきます


Blue  2006-06-06 02:18:31  No: 62028

だから、
> 色々調べて
を載せてくれませんでしょうか?

質問するときだけ具体的なソースを載せて、解決するときは何もなし。
これだと、情報共有も兼ねている掲示板として成り立ちませんよ。


samurai  2006-06-06 02:32:34  No: 62029

一応こういうのを作ってみました。

#include <iostream.h>
/**プロトタイプ宣言**/
int main(void);
void swap(short *x, short *y);
void sort(short nPassengerCount[], short nCarNo[]);
/**クラスCCarの定義**/
class CCar
{
private:
        short   m_nCarNo;                               //車両番号
        short   m_nPassengerCount;              //乗客数
public:
        CCar(){}                                                                                        //コンストラクタ
        short   GetCarNo();                                                                     //車両番号を取得する。
        short   GetPassengerCount();                                            //乗客数を取得する。
        void    SetCarNo(short nCarNo);                                            //車両番号をセットする。
        void    SetPassengerCount(short nPassengerCount);  //乗客数をセットする。
        void    DisplayPassengerCount();                                        //乗客数を表示する。
        void    EnterPassengerCount();                                          //乗客数を入力する。
        ~CCar(){};                                                                                      //デストラクタ
};
/**車両番号を取得する**/
short CCar::GetCarNo()
{
        return  m_nCarNo;
}
/**乗客数を取得する**/
short CCar::GetPassengerCount()
{
        return  m_nPassengerCount;
}
/**車両番号をセットする**/
void CCar::SetCarNo(short nCarNo)
{
        m_nCarNo=nCarNo;
}
/**乗客数をセットする**/
void CCar::SetPassengerCount(short nPassengerCount)
{
        m_nPassengerCount=nPassengerCount;
}
/**乗客数を入力する**/
void CCar::EnterPassengerCount()
{
        static int i=0;
        short nPassengerCount;
        if(i==5){
                i=0;
        }
        cout<<++i<<"両目の乗客数を入力してください:";
        cin>>nPassengerCount;
        SetCarNo(i);
        SetPassengerCount(nPassengerCount);
}
/**並び替えた車両番号、乗客数の表示**/
void CCar::DisplayPassengerCount()
{
        cout<<m_nCarNo<<"両目の乗客数は"<<m_nPassengerCount<<"人です。\n";
}
/**main**/
int main(void)
{
        int i;
        char cont;
        short nCarNo[5], nPassengerCount[5];
        /**オブジェクト生成**/
        CCar train[5];
        /**乗客数の入力**/
        do{
                for(i=0; i<5; i++){
                        train[i].EnterPassengerCount();
                }
                cout<<"これでいいですか?[Y/N]::";
                cin>>cont;
        }while(cont=='n');
        /**車両番号、乗客数を取得**/
        for(i=0; i<5; i++){
                nCarNo[i]=train[i].GetCarNo();
                nPassengerCount[i]=train[i].GetPassengerCount();
        }

        sort(nPassengerCount, nCarNo);

        /**結果表示**/
        for(i=0; i<5; i++){
                train[nCarNo[i]-1].DisplayPassengerCount();
        }

        return(0);
}
/**入れ替え**/
void swap(short *x, short *y)
{
        short temp = *x;
        *x = *y;
        *y = temp;
}
/**車両番号と乗客数を昇順にソート**/
void sort(short nPassengerCount[], short nCarNo[])
{
        int i, j;

        for(i=0; i<4; i++){
                for(j=i+1; j<5; j++){
                        if(nPassengerCount[i] > nPassengerCount[j]){
                                swap(&nPassengerCount[i], &nPassengerCount[j]);
                                swap(&nCarNo[i], &nCarNo[j]);
                        }
                }
        }
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加