Dobieranie elementów według parametrów.

0

Cześć.
W ramach zajęć z C++ mam stworzyć program, który daje możliwość wybrania modelu aparatu fotograficznego, następnie zależnie od wyboru pokazuje liste modeli, potem obiektywów do wybrania, a po wybraniu obiektywu wypisuje jakieś parametry.
Nie wiem jak najprościej mogę stworzyć taki program.
Próbowałem użyć switch, aby stworzyć pierwszą część wyboru:

#include <iostream>
using namespace std;

int main()
{
	int marka;

    cout << "Wybierz producenta body" << endl;
    cout << "*******************" << endl;
    cout << "1. Sony" << endl;
    cout << "2. Canon" << endl;
    cout << "3. Nikon" << endl;

    cout << "Wybierz: ";
    cin >> marka;

	///////////////
	
	switch(marka)
	{
		case 1:
		{
			cout << "Wybierz model" << endl;
			cout << "*******************" << endl;
			cout << "1. Alpha A7" << endl;
			cout << "2. A6400" << endl;
			cout << "3. NEX-6" << endl;			
			
		}
		break;
		
		case 2:
		{
			cout << "Wybierz model" << endl;
			cout << "*******************" << endl;
			cout << "1. Alpha A7" << endl;
			cout << "2. A6400" << endl;
			cout << "3. NEX-6" << endl;
		}
		break;
		
		case 3:
		{
			cout << "Wybierz model" << endl;
			cout << "*******************" << endl;
			cout << "1. Alpha A7" << endl;
			cout << "2. A6400" << endl;
			cout << "3. NEX-6" << endl;
		}
		break;
	}
	return 0;
}		

Nie udało mi się pomyślnie wstawić kolejnego switch z wyborem modelu, nie wiem jak jeszcze mógłbym to rozwiązać.

0
amatorszczyzna napisał(a):

Nie udało mi się pomyślnie wstawić kolejnego switch z wyborem modelu, nie wiem jak jeszcze mógłbym to rozwiązać.

Co to znaczy nie udało? Nie wiesz gdzie go umieścić? masz jakiś błąd kompilacji?

0

Możesz sobie zrobić coś na kształt mojej klasy Menu stąd: https://gist.github.com/KrzaQ/10a035a905d6cfe1a458#file-db-cpp-L135

0

przede wszystkim to nie powielać kodu poprzez Copy&Paste, tylko wyodrębniać te kawałki i wstawiać do osobnych funkcji. Prosta implementacja mogłaby wyglądać jak poniżej, trzeba tylko usprawnić pobieranie wyboru. Listy producentów, modeli i obiektywów najlepiej wczytywać z pliku (jakiś format tekstowy, xml, json, ini, etc.). Nap pewno przydałoby się stworzyć jakieś struktury i zadbać o poprawność danych w listach.

#include <iostream>
#include <map>
#include <vector>

using namespace std;

int wybierz(vector<string> lista) {
    for (size_t i = 0; i < lista.size(); ++i) {
        cout << i + 1 << ". " << lista[i] << endl;
    }
    cout << "wybierz: ";
    int wybor;
    cin >> wybor;
    return wybor - 1;
}

int main() {
    vector<string> producent{"Sony", "Canon", "Nikon"};  // index is id for modele
    vector<vector<string>> modele{
        {"sony1", "sony2"}, {"canon1", "canon2", "canon3"}, {"nikon1"}};
    map<pair<int, int>, vector<string>> obiektywy{
        {{0, 0}, {"s1ob1", "s1ob2"}}, {{1, 0}, {"c1ob1", "c1ob2"}}
        //etc.
    };

    int  wybor_producenta = wybierz(producent);
    int  wybor_modelu     = wybierz(modele[wybor_producenta]);
    auto prod_model       = make_pair(wybor_producenta, wybor_modelu);
    int  wybor_obiektywu  = wybierz(obiektywy[prod_model]);

    cout << "podsumowanie:" << endl
         << "  producent: " << producent[wybor_producenta] << endl
         << "  model    : " << modele[wybor_producenta][wybor_modelu] << endl
         << "  obiektyw : " << obiektywy[prod_model][wybor_obiektywu] << endl;

    return 0;
}
0

Wersja wykorzystująca magic_enum ( C++17 )

#include <iostream>
#include <map>
#include <vector>
#include <variant>
#include "magic_enum.hpp"

using namespace std;

enum class Brand { Sony , Kodak , Nikon };
enum class Model { Sony1 , Sony2 , Sony3 , Kodak1 , Kodak2 , Nikon1 , Nikon2 };
enum class Lens  { SonyL1 , SonyL2 , SonyL3 , KodakL1 , KodakL2 , KodakL3 , NikonL1 , NikonL2 };

class Selector
{

public:

    static void process()
    {
        history.clear();
        choose( model_lens[ choose( models[ choose(products) ] ) ] );
        cout << "Summary " << endl;
        cout << "Selected brand : " ; visit([](auto&& arg){ cout <<  magic_enum::enum_name(arg) << endl;}, history[0] );
        cout << "Selected model : " ; visit([](auto&& arg){ cout <<  magic_enum::enum_name(arg) << endl;}, history[1] );
        cout << "Selected lens  : " ; visit([](auto&& arg){ cout <<  magic_enum::enum_name(arg) << endl;}, history[2] );
    }

private:

    template< typename T >
    static T choose( const vector<T>& data )
    {
        cout << "Choose " << endl;
        for( size_t i {0} ; i<data.size() ; ++i ) cout << i+1 << " : " <<  magic_enum::enum_name(data[i]) << endl;
        int index {0}; cin >> index;
        history.emplace_back(data.at(index-1));
        return data.at(index-1);
    }

    inline static vector<variant<Brand,Model,Lens>> history;

    inline static vector<Brand> products { Brand::Sony , Brand::Kodak , Brand::Nikon };
    inline static map<Brand,vector<Model>> models {
                                                   {Brand::Sony,{Model::Sony1,Model::Sony2,Model::Sony3}},
                                                   {Brand::Kodak,{Model::Kodak1,Model::Kodak2}},
                                                   {Brand::Nikon,{Model::Nikon1,Model::Nikon2}}
                                                  };
    inline static map<Model,vector<Lens>> model_lens {
                                                      {Model::Sony1,{Lens::SonyL1,Lens::SonyL2}},
                                                      {Model::Sony2,{Lens::SonyL1,Lens::SonyL2,Lens::SonyL3}},
                                                      {Model::Sony3,{Lens::SonyL2,Lens::SonyL3}},
                                                      {Model::Kodak1,{Lens::KodakL1,Lens::KodakL2}},
                                                      {Model::Kodak2,{Lens::KodakL2}},
                                                      {Model::Nikon1,{Lens::NikonL1,Lens::NikonL2}},
                                                      {Model::Nikon2,{Lens::NikonL1}}
                                                     };

};

int main()
{
    Selector::process();
    return 0;
}

Wandbox

1 użytkowników online, w tym zalogowanych: 0, gości: 1