Wie geht es einfacher ?



  • Hallo,

    folgende Aufgabenstellung:

    es sei folgende Farbtabelle gegeben (Man verschiebe die erste Zeile nach rechts um die Tabelle zu erhalten, leider kann ich hier keine Tabellen schreiben):

    grün rot violett
    grün grün gelb blau
    rot gelb rot purpur
    violett blau purpur violett

    Es soll ein Programm entwickelt werden, mit welchem man zwei farben eingeben kann (rot, grün, violett). Das Programm gibt dan die Farbe aus, welche beim mischen der beiden eingegeben Farben gemäß der Tabelle ergibt.

    Ich habe folgendes entwickelt (Funktioniert auch):

    #include<iostream.h>
    #include<string>
    using namespace std;
    string farbe1, farbe2;
    int farbwert1, farbwert2;
    int main()
    {
    	cout<<"Bitte erste Mischfarbe eingeben (rot, gruen, violett)";
    	cin>>farbe1;
    	if(farbe1=="rot") farbwert1=1;
    	if(farbe1=="gruen") farbwert1=2;
    	if(farbe1=="violett") farbwert1=3;
    	cout<<"\nBitte zweite Mischfarbe eingeben (rot, gruen, violett)";
    	cin>>farbe2;
    	if(farbe2=="rot") farbwert2=1;
    	if(farbe2=="gruen") farbwert2=2;
    	if(farbe2=="violett") farbwert2=3;
    	int ergfarbe=farbwert1, farbwert2;
    	switch(ergfarbe) {
    	case 1:  cout<<"Ergebniss: rot";break;
    	case 2:  cout<<"Ergebniss: gelb";break;
    	case 3:  cout<<"Ergebniss: purpur";break;
    	case 6:  cout<<"Ergebniss: blau"; break;
    	default: cout<<"Ergebniss: unbekannt"; break;
    	}
    	cout<<"\n";
    	system("PAUSE");
    
    }
    

    Nur kommt mir das sehr kompliziert vor, gibt es eine einfacherer Lösung ?

    Ich benutze Bloodshet Dev-C++.

    Vielen dank für Eure Hilfe.



  • int ergfarbe=farbwert1, farbwert2;

    die zeile ergibt keinen sinn. was soll der, operator da? willst du addieren? subtrahieren? multiplizieren?



  • //anstatt
    if(farbe1=="rot") farbwert1 = 1;
    if(farbe1=="gruen") farbwert1 = 2;
    if(farbe1=="violett") farbwert1 = 3;
    
    // würde ich es so schreiben
    if(farbe1=="rot") farbwert1 = 1;
    else if(farbe1=="gruen") farbwert1 = 2;
    else if(farbe1=="violett") farbwert1 = 3;
    else farbwert=DEFAULT_WERT_FÜR_FARBE;
    

    Wenn ein if stimmt, dann müssen die anderen ja nicht mehr geprüft werden.



  • bau eine map, die den string als key und den zahlenwert als value hat



  • otze schrieb:

    int ergfarbe=farbwert1, farbwert2;

    die zeile ergibt keinen sinn. was soll der, operator da? willst du addieren? subtrahieren? multiplizieren?

    Ups haste recht, sollte multipliziert werden.



  • Shade Of Mine schrieb:

    bau eine map, die den string als key und den zahlenwert als value hat

    Und wie funktioniert das ?

    mit enum irgentwie ? (Bin Anfänger).

    Vielen Dank.



  • Mightymod schrieb:

    Und wie funktioniert das ?

    Du sparst dir das if

    ich verstehe deinen algo leider nicht, weil er fehlerhaft ist. Deshalb kann ich dir dafür keine lösung geben.

    aber um für "rot" und "blau" die passenden zahlen zu bekommen, kann man

    typedef map<string, int> color_t;
    color_t colors;
    colors.insert(color_t::value_type("rot", 3));
    colors.insert(color_t::value_type("blau", 7));
    

    nun kann man per

    cout<<colors["rot"];
    

    3 ausgeben.

    das spart eine menge code, weil du dir dadurch eins switch() für strings gebaut hast 🙂



  • #include <map>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      map<string, size_t> FarbMappe;
    
      // @ Shade Of Mine
      // Warum so kompliziert?
      FarbMappe["red"]   = 1;
      FarbMappe["blue"]  = 2;
      FarbMappe["green"] = 3;
    
      for(map<string, size_t>::const_iterator it = FarbMappe.begin(); it != FarbMappe.end(); ++it)
      {
        cout << it->first << "\t=\t" << it->second << endl;
      }
    
      return 0;
    }
    

    Wenn du ganz lustig bist, kann du die "Farbmappe" auch als constante globale Variable anlegen. Die FarbMappe soll ja allgemein gültig sein, oder?

    Eventuell ist eine hash_map besser geeignet. Dafür einfach s/map/hash_map/g.
    Aber leider gibt's bei mir kein "hash_map" zum inkludieren.

    Ausgabe des Programmes:

    [hashmap] g++ main.cpp -o main
    [hashmap] ./main 
    blue    =       2
    green   =       3
    red     =       1
    


  • hehejo schrieb:

    // @ Shade Of Mine
    // Warum so kompliziert?

    Der op[] ist lahm.
    Denn: er sucht zuerst ob der Eintrag existiert. Wenn nicht, dann wird ein Default Objekt erstellt und dieses returned.



  • 💡
    und schon wieder etwas gelernt!



  • nur ne frage ( anderer ansatz )

    gibts keine FARBEN-Klasse so ne art wie COLORREF
    dann einfach die 3 Farben eingeben als RGB wert. dann kann man doch addieren und es kommt die mischfarbe raus. Da sparts man sich dann tabellen ect. Besonders wenn er mal anstatt von3 Farben mal von30 Farben wählen muss.


Log in to reply