2017-01-15 4 views
1

私はまもなくC++試験の演習を解決します。次の練習を考えてみましょう:C++で2つの文字列を返す

旅行代理店はリストを使用して旅行を管理します。各旅行代理店は、出発のその点を登録、到着、距離と時間の時点/期間

1)のための旅行

2のリストを表すために必要な構造を定義)整数I与えられ、関数を書きます

struct list{ 
    char departure[100]; 
    char arrival[100]; 
    double distance; 
    double time; 
    list* next = NULL; 
}; 

私の問題は、関数である:私は構造を定義

が容易な位置に旅の到着の出発地点のポイントを返します。実際の仕事は、i番目の旅行を見つけるのは簡単です。しかし、どのように私は2つの文字配列/文字列の出発と到着を返すことができますか?これが私の試験の質問だったら、私はこれを次のように解決したでしょう:

typedef list* list_ptr; 

list_ptr get_trip(list_ptr head, const int i){ 
    if(i<0 || head==NULL){ 
     return NULL; 
    } 

    for(int k = 0; k<i;k++){ 
     head = head->next; 
     if(head==NULL){ 
      return NULL; 
     } 
    } 

    return head; 
} 

私はリスト要素へのポインタを返しています。 1つは出発と到着を印刷する必要があります。私は戻り値の型char *を持つ関数を使って出発点または到着を簡単に返すことができました。 2弦を正しく返すにはどうすればいいですか? 私はstd :: tupleを使ってこれを行う方法があることを知っていますが、私たちが講義でそれを持っていないのでこれを使うことはできません(クラスまで、本当に基本的なものしか持っていませんでした)。

追加ライブラリを使用しなければ両方の文字列を返すことはできません。で開始する

乾杯

+3

[コンテナ](http://en.cppreference.com/w/cpp/container):

今、あなたは、単純な関数を書くことができますか?構造? [ペア](http://en.cppreference.com/w/cpp/utility/pair)? [タプルズ](http://en.cppreference.com/w/cpp/utility/tuple)? –

+4

また、2つの文字列参照を関数に渡して、入力することもできます。そして、char配列の代わりに 'std :: string'を使います。 – Unimportant

+0

[関数からの戻り値]関数を見てください(http://stackoverflow.com/documentation/c%2b%2b/487/returning-several-values-from-a-function) – Jarod42

答えて

2

OK、あなたlistタイプは、いくつかの問題があります。あなたが本当に必要な場合を除いて、C++でchar[]を使用しないでください(注意:必要があると思われる場合は間違いでしょう)。 C++はそのアプリケーションではすばらしい標準ライブラリを提供しています(Cと比較して)。あなたはそれを使用するべきです。特に、私はstd::stringについて話しています。あなたはおそらく距離と期間のためにdoubleを使用してOKですが、ユニットの欠如はあなたが悪い時間を持つつもりであることを意味します。

だが、これを試してみましょう:

struct Trip { 
    std::string departure; 
    std::string arrival; 
    double distance_km; 
    double duration_hours; 
}; 

今、あなたはstd::vectorstd::liststd::slistを使用するか、または独自のリストをロールバックすることができます。最後を仮定しよう。

class TripList { 
    public: 
     TripList() = default; 

     // Linear in i. 
     Trip& operator[](std::size_t i); 
     const Trip& operator[](std::size_t i) const; 

     void append_trip(Trip trip); 
     void remove_trip(std::size_t i); 

    private: 
     struct Node { 
      Trip t; 
      std::unique_ptr<Node> next; 
     }; 
     std::unique_ptr<Node> head; 
     Node* tail = nullptr; // for efficient appending 
}; 

この実装はお任せします。 listとtripは別々の概念であることに注意してください。そこで、別々の型を扱っています。

std::pair<string, string> GetDepartureAndArrival(const TripList& list, std::size_t index) { 
    const auto& trip = list[index]; 
    return {trip.departure, trip.arrival}; 
} 
関連する問題