Dobieranie elementów według parametrów.

Dobieranie elementów według parametrów.
AM
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:1
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:

Kopiuj
#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ć.

AK
Na pewno zamiarem stawiającego to zadanie było brutalne mnożenia case'ów w programie? Może chodziło o jakieś struktury danych? Np otagowałeś słowem "lista", o której tu obecnie ani widu, ani słychu
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 18 godzin
  • Lokalizacja:Szczecin
0

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


JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
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.

Kopiuj
#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;
}
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:530
0

Wersja wykorzystująca magic_enum ( C++17 )

Kopiuj
#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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.