2016-05-03 12 views
1

私はID、グレード、年、および年の値を持つ申請者のリンクリストを作成する(クラスとして保存されている)数値(スコア)。私はこのリストを検索して最高得点の申請者を検索し、それを返す関数を書く必要があります。私は最高得点を見つけることができましたが、私はその特定の応募者のクラス全体ではなく、その価値を返すだけです。私のコードを変更した後は、4つの値(ID、グレード、年、およびスコア)のそれぞれの出力を取得するようになりましたが、それらはすべて初期値である0を示します。ここにすべての関連コードがあります。C++:リンクされたリスト内のクラスの最高値を見つける

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include "applicant.cpp" 

using namespace std; 

struct Linkapp 
{ 
    Applicant person; 
    Linkapp *next; 
}; 

class Linkthem 
{ 
    protected: 
    Linkapp *start; 
    public: 
    Linkthem(void); 
    void link(Applicant); 
    void printthem(void); 
    Applicant returnbest(void); 
}; 

Applicant best; 

Linkthem::Linkthem() 
{ 
    start = NULL; 
}; 

void 
Linkthem::link(Applicant one) 
{ 
    Linkapp *p; 
    p = new Linkapp; 
    p->person = one; 
    p->next = start; 
    start = p; 
} 

Applicant Linkthem::returnbest (void) 
{ 
    Linkapp *travel; 
    travel = start; 

    best = travel->person; 

    while (travel != NULL) 
    { 
     if (travel->person.return_value() > best.return_value()) 
      best = travel->person; 
     travel = travel->next; 
    } 

    return best; 
} 

int 
main() 
{ 
    ifstream infile; 
    Applicant fellow; 
    Linkthem mylist; 
    int id, yrs; 
    char knowledge; 

    cout.setf(ios::fixed); 
    cout.precision(2); 

    infile.open("applicnt.dat"); 

    while (!infile.eof()) 
    { 
    infile >> id >> knowledge >> yrs; 
    fellow.store_id(id); 
    fellow.store_skill(knowledge); 
    fellow.store_years(yrs); 
    mylist.link(fellow); 
    } 

    mylist.printthem(); 

    cout << best.return_id() << ' ' << best.return_skill() << ' '; 
    cout << best.return_years() << ' ' << best.return_value() << endl; 

    fellow = mylist.returnbest(); 

    return 0; 
} 

そして "applicant.cpp"

class Applicant 
{ 
    protected: 
    int id; 
    char skill; 
    int years; 
    float value; 
    void calc_value(void); // <--- NOT for general use, called by return_value 
    public: 
    Applicant(void); 
    void store_id(int); 
    void store_skill(char); 
    void store_years(int); 
    int return_id(void); 
    char return_skill(void); 
    int return_years(void); 
    float return_value(void); 
}; 

から問題は間違いなく、私はちょうど場所がわからないんだけど、私のreturnbest機能内にあります。

+2

外観は - グローバル変数は 'best'に更新されたときを考えると、あなたは実際に... – Nim

+1

何らかの理由でそれを使用するとき:: std :: listを使用していない? – Aconcagua

+1

@Aconcagua:これは宿題なのでおそらく* "私は仕事に取り組んでいます" * –

答えて

0

あなたは、いくつかのヒントを独自のリストを記述するために持っているように見えるとして:

Linkappは、あなたのクラスLinkthemの内部の詳細であることを表示されませんので、プライベートな内部クラスにする全く悪い考え。

あなたのリストが空の場合、returnbest(類似の実装を前提とするとおそらくprintthem)はセグメンテーションフォールトで失敗します。最初に開始がヌルであるかどうかを確認する必要があります。

if(start) 
{ 
    // rest of your code 
} 
else 
{ 
    // return some appropriate default 
    // throw exception 
    // or whatever else seems appropriate to you 
} 

getter/setterにはまれな名前があります。

int getId(); // or get_id(), but cammel casing is more common these days 
void setId(int id); 
// vs 
int id(); 
void id(int id); 

をグローバル変数であるためにApplicant bestための必要はありません:命名のための2つの主要なバリエーションがあります。むしろそれをローカル変数として関数内に置きます。

実際の問題: main関数を詳しく見てください - どこからreturnbestを先に呼び出しますか? の後、あなたは最高の値を書きました。これは、デフォルト以外の値を割り当てたことがないことを意味します。 fellow = mylist.returnbest();の前に、の出力先を配置する必要があります。しかし、その後、あなたがやったよう

+0

このレスありがとうございました。間違いなく最も助けになりました。 – Squeeps

+0

@Squeepsもしそうなら、あなたがそれを受け入れるといいでしょう。 – Aconcagua

2

ジャスト(単独でリンクされている)std::max_elementstd::list(二重にリンクされている)またはstd::forward_listを使用しますが、私はおそらく代わりにstd::vectorをデフォルトとなります

std::max_element(begin(list), end(list), [](Applicant const& a, Applicant const& b) { 
    return (a.return_value() < b.return_value()); 
}); 

を比較関数が全体Applicantのために意図されている場合そのクラスのためにoperator<を定義することは理にかなっているかもしれません。

+5

私はあなたに同意しますが、これは宿題なので、標準ライブラリを使用するコードを手渡すことはできません。私はそうではないことを知っている。 –

+0

ええ、グラハムが言ったように、これは宿題のため標準ライブラリを使うことはできません。しかし、フィードバックをありがとう! – Squeeps

0
mylist.printthem(); 

cout << best.return_id() << ' ' << best.return_skill() << ' '; 
cout << best.return_years() << ' ' << best.return_value() << endl; 

fellow = mylist.returnbest(); 

私は、あなたがprintthem()メンバ関数で何をすべきか分からない...代わりに、最高の出力にfellowを使用して、あなたはbest returnbest関数内のローカル変数にすることは自由ですこの関数の実装を提供していませんが、変数bestを設定しないと仮定します。そのため、未設定の変数が出力されている可能性があります。あなたが何をしたいか

は可能性が高いです。呼び出しの順序で

mylist.printthem(); 

best = mylist.returnbest(); 

cout << best.return_id() << ' ' << best.return_skill() << ' '; 
cout << best.return_years() << ' ' << best.return_value() << endl; 
+0

お返事ありがとうございます。それが問題だった。 – Squeeps

関連する問題