0

Person という構造体へのポインタのリンク リストで構成されるデータベースを検索する必要があります。Person の内部には、名前、姓、社会保障などの一連のデータがあります。これらはすべて架空のものであり、取るに足らないものです。私の問題は、ユーザー入力に基づいて検索を行う必要があることです。これにより、構造体のどの部分が検索のために比較されるかが決まります。すべてのデータは struct Person のメンバーとして格納されるため、これを行う最善の方法は (8 つの検索関数を記述しないように) マッピングを使用することだと思いますが、私のマッピングの理解は貧弱で、ほとんど存在しません。 . 関連するコードは次のとおりです。

List * find(List * database, //mapping stuff, string name)
{
     //run search
     return database;
}

void search(List * database)
{
    string field, searchtype, userinput;
    cout << "To search for a person, enter information in this format: 'field equal
    value' or 'field begins value'. Type 'clear' to 
    return to original database. Type 'exit' to leave the program\n";

while(field != "exit")
{
    cin >> field >> searchtype >> userinput;
    if(userinput == "firstname")  //this is just for example, I would have to write one of these out for each parameter.
    {
        List * smallerdb = find(database, map(//mapping stuff?), string userinput);
    }
}
}

これは学校用なので、別のライブラリを使用することはできません。ありがとうございました!

4

1 に答える 1

0

各データ型は別々に比較する必要があるため、データ型を明示的に知らなければ運が悪い. 文字列はアルファベット順に比較され、数値は値で比較されます。他のカスタム データ型があるかどうかはわかりません。

したがって、ケースバイケースの各シナリオを実行する以外に、ここでは多くのオプションはありません。例えば

    if type == 'name'                // compare each Person.name as string
    else if type == 'socialSecurity' // compare Person.socialSecurity as int
    else if ...

このコードをもう少し堅牢にするための提案を次に示します。

それぞれのケースで検索ロジックを処理する代わりに、関数ポインタを返すだけで、2 つの を比較する方法を教えてくれますPersons実際の関数は、名前、年齢、社会保障などで比較する場合がありますが、検索関数は、2 つのPersonオブジェクトを比較する方法を指示する関数ポインターを取得すると、それを気にする必要はありません。

于 2013-04-24T18:30:51.290 に答える