2 Probleme für meine Projekt arbeit



  • Hallo Zusammen
    bin absoluter neuling mit C++. Brauche für meine Projektarbeit ein bischen Schützenhilfe. Ich habe jetzt schon etliche Stunden damit verloren und schaffe es einfach nicht.
    Ich muss ein Programm schreiben das den Widerstandscode berechnet. Ich bin jetzt mal so weit, dass ich aus den richtigen eingelesen Zahlen, die richtigen Farben bekomme. bei Ring 1, sollte ich nur zwischen 0-9 wählen dürfen, und wenn eine falsche Zahl gewählt wird, die Meldung kommt, dass es eine falsche Eingabe ist und nochmal auffordert die Zahlen 0-9 zu wählen. Nach Eingabe einer korrekten Zahl, sohl die richtige Farbe angezeigt werden und mich fragen ob korrekt. dann mit 'j' quittieren oder mit 'n' nochmal versuchen. Ich schaffe es einfach nicht dies zu machen. Ich habs zwar mit "goto" geschafft, aber das will ich nicht. Ihr werdet ja wohl bestens wissen warum nicht. 🙂

    Und mein zweites Problem ist, das ich einfach nicht schnalle, wie ich die jeweiligen Farben nacher den richtigen Werten zu ordnen soll damit ich mit den Werten weiterrechnen könnte.

    Es ist wirklich nicht so, dass ich zu faul bin, hab mir zusätzlich zum Schulbuch noch ein Buch geholt, von Dirk Louis(Hanser Verlag). Leider sind all die Bücher die hier im Forum empfohlen werden, bei mir in der Schweiz entweder vergriffen oder weiss auch nicht.
    Obwohl ich im Internet schon gesucht habe und etliche Möglichkeiten serviert bekommen habe, kann ich es einfach nicht auf mein Projekt umschreiben.

    Ich bin auch für andere Lösungsvorschläge sehr dankbar, einfach so, dass ich es noch verstehe. Ich hoffe auf euer Verständnis. So genug geschwaffelt hier mein Code

    { 
    	char farben[21][20] = {"Schwarz", "Braun", "Rot", "Orange", "Gelb", "Gruen", "Blau", "Violett", "Grau", "Weiss", "Gold", "Silber","","","","","","","","", "Kein Ring"};	
    	int ring1,ring2,ring3,ring4,ring5;
    	char ausfuehren_j ='j';
    	char ausfuehren_n ='n';
    	int anz_ringe4 ='4';
    	int anz_ringe5 ='5';
    	char abfrage;
    	cout << "Farbcode von Widerstaenden berechnen" << endl<<endl;
    	cout << "Geben Sie die Anzahl ringe ein 4 oder 5! "<< endl<<endl;	
    	cout << "0 = schwarz" << endl;
    	cout << "1 = braun" << endl;
    	cout << "2 = rot" << endl;
    	cout << "3 = orange" << endl;
    	cout << "4 = gelb" << endl;
    	cout << "5 = gruen" << endl;
    	cout << "6 = blau" << endl;
    	cout << "7 = violett" << endl;
    	cout << "8 = grau" << endl;
    	cout << "9 = weiss" << endl;
    	cout << "10 = gold" << endl;
    	cout << "11 = silber" << endl;
    	cout << "20 = kein Ring" << endl<<endl;
    
    		while(ausfuehren_j =='j'){			
    
    			cout <<"geben sie die Farbe des 1. Rings ein (0 bis 9): ";
    			cin >> ring1;
    
    		if(ring1<= 9){
    			cout << farben[ring1];
    			cout <<" korrekt? (J/N)" <<endl;
    
    		}	
    		else {
    			cout << "gib bitte eine zahl von 0 bis 9 ein";}
    

    nach der korrekten abfrage sollte er dann zum zweiten Ring springen, das ist mir auch schleierhaft wie ich das machen muss. Alle 5 Ringe in einer grossen Schleife und dann in Unterschleifen?

    Hier noch mein ursprünglicher Code, der Zwar so weit funktioniert, aber auch hier schaffe ich es einfach nicht, die allererste Frage zu konstruiren. Als erstes wird gefragt ob 4 oder 5 Ringe, nach der korrekten eingabe sollen dann nur 4 oder eben 5 Ringe abgefragt werden.

    {	
    	char farben[21][20] = {"Schwarz", "Braun", "Rot", "Orange", "Gelb", "Gruen", "Blau", "Violett", "Grau", "Weiss", "Gold", "Silber","","","","","","","","", "Kein Ring"};	
    	int ring1,ring2,ring3,ring4,ring5;
    	int schwarz=1, braun=2, rot=3, orange=4, gelb=5, gruen=6, blau=7, violett=8, grau=9, weiss=10;
    	float gold=0.5, silber=0.2;
    	char ausfuehren ='j';
    	int anz_ringe4 ='4';
    	int anz_ringe5 ='5';
    	cout << "Farbcode von Widerstaenden berechnen" << endl<<endl;
    	cout << "Geben Sie die Anzahl ringe ein 4 oder 5! "<< endl<<endl;	
    	cout << "0 = schwarz" << endl;
    	cout << "1 = braun" << endl;
    	cout << "2 = rot" << endl;
    	cout << "3 = orange" << endl;
    	cout << "4 = gelb" << endl;
    	cout << "5 = gruen" << endl;
    	cout << "6 = blau" << endl;
    	cout << "7 = violett" << endl;
    	cout << "8 = grau" << endl;
    	cout << "9 = weiss" << endl;
    	cout << "10 = gold" << endl;
    	cout << "11 = silber" << endl;
    	cout << "20 = kein Ring" << endl<<endl;
    
    		while(ausfuehren =='j')
    		{
    		frage1:;
    		cout <<"geben sie die Farbe des 1. Rings ein (0 bis 9): ";
    		cin >> ring1;
    		cout << farben[ring1] <<" korrekt? (J/N)" <<endl;
    		char check1;
    		cin>>check1;
    		if (check1 == 'j') {goto frage2;}
    		else if(check1 == 'n'){
    		goto frage1;}
    

    zu meiner entlastung, möchte ich noch sagen, dass ich erst ca 40 Stunden C++ aus der Schule in meinem Kopf habe und nicht wirklich als Programmierer geboren bin. Meine Schule geht auch in eine etwas andere Richtung:)

    Sorry das ich so viel Code hier reinkopiert habe, aber vielleicht gibt mir ja der eine oder andere Verbesserungsvorschläge.
    Vielen Dank euch allen

    schönen Abend



  • Hallo,

    also zuerst aufgefallen ist mir folgendes

    int anz_ringe4 ='4';
        int anz_ringe5 ='5';
    

    Integer werden ohne ' ' zugewiesen.

    Ich würde das folgendermaßen lösen

    short int ring1=-1;
    char antwort='n';
    do
    {
        do
        {
             std::cout <<"geben sie die Farbe des 1. Rings ein (0 bis 9): ";
             std::cin >> ring1;
        }while((ring1<0)||(ring1>9));
        std::cout << "Ist " << farben[ring1] << " korrekt? [y/n]: ";
        std::cin >> antwort;
    }while(antwort!='y');
    

    Die do-while-Schleife kannst du dann für jeden Ring einzeln separat durchlaufen lassen.

    Gruß
    Maisinator



  • Vielen Dank für den schnellen Input, werde morgen sofort ausprobieren und korrigieren. es wird wohl noch mehr Ungereimtheiten haben, da ich den ganze tag lang, alles mögliche ausprobiert habe.

    Danke nochmal 👍 🙂

    Darf ich fragen warum der short int ring1=-1; mit minus 1 zugewiesen ist?

    Nachtrag: Erste Abfrage schon ausprobiert. Dies funktioniert super 🙂

    Also wäre noch das Problemchen mit der Abfrage ob 4 oder 5 Ringe
    und die Wertzuweisung



  • itjohnny schrieb:

    Darf ich fragen warum der short int ring1=-1; mit minus 1 zugewiesen ist?

    Oh da habe ich selber nicht nachgedacht. Wegen do-while kannst du da jedem belieben Wert zur initialisierung nutzen. Ich hatte auf die Schnelle im Kopf mit einer while-Schleife gedacht und dann muss ring1 einen (beliebigen) Wert ungleich 0..9 annehmen damit die Schleife wenigstens einmal durchläuft 😉



  • itjohnny schrieb:

    es wird wohl noch mehr Ungereimtheiten haben

    Ja. Das ist z.B. ziemlicher Quatsch:

    char farben[21][20]



  • hat jetzt auch mit Initialisierung 1 geklappt, werde es aber noch schnell mit -1 versuchen

    Danke



  • Mechanics schrieb:

    itjohnny schrieb:

    es wird wohl noch mehr Ungereimtheiten haben

    Ja. Das ist z.B. ziemlicher Quatsch:

    char farben[21][20]

    Dies wurde uns anhand eines anderen Beispiels in der Schule so gezeigt.
    Einfach an einem anderen Muster.
    Ich muss eine Auswahl haben bis 21, weil bei der Eingabe von 20 die Ausgabe:"Kein Ring" erscheinen muss.



  • Besser wäre

    const char* farben[21] = { /* ... */ };
    


  • Th69 schrieb:

    Besser wäre

    const char* farben[21] = { /* ... */ };
    

    Werde es gleich mal anpassen.

    Ich muss hier schon mal ein riesengrosses Kompliment aussprechen an dieses Forum. Ich hatte es mir schon länger überlegt, mich hier anzumelden, hatte aber das Gefühl, das ich dies alleine bewerkstelligen kann.
    Ich finde es wirklich super von Euch, wie hilfsbereit man in diesem Forum ist.

    Danke schon mal vorab:)



  • itjohnny schrieb:

    Also wäre noch das Problemchen mit der Abfrage ob 4 oder 5 Ringe
    und die Wertzuweisung

    Die Abfrage kannst du im Prinzip genauso aufbauen wie für die Farben. Solange Werte ungleich 4 oder 5 eingegeben werden soll die Schleife durchlaufen und abfragen.

    Ich würde mich auch von der Vorstellung trennen mit "Farben" zu rechnen. Sofern ich die Farbcodes richtig verstanden habe musst du doch nur an der 3./4. Stelle mit anderen Werten rechnen als dir deine Integer ring1, ring2, ring3,... liefern. Hier bietet sich eig. die Verwendung von switch an

    switch(ring3)
    {
        case 1:
        {
            multiplikator=XY;
            break;
        }
        case 2:
        {
            multiplikator=XYZ;
            break;
        }
        case 3:
        ...
    }
    

    Für die Toleranz an Stelle 4 kannst du das dann ähnlich aufbauen.

    Wenn du dein switch noch in eine separate Funktion "auslagerst" kannst du auch ganz bequem die Fallunterscheidung zwischen 4 und 5 Ringen vornehmen.

    Viel Spaß und nicht verzweifeln 😃



  • Maisinator schrieb:

    Hier bietet sich eig. die Verwendung von switch an

    Kann man machen, wird aber ganz schön länglich. Eigentlich reicht hier auch ein Array oder bei der Multiplikator kann man sogar eine Formel (10^ring3) nehmen.



  • ja, das hast Du richtig verstanden. bin zwar nicht mehr zum versuchen gekommen, aber heute nachmittag gehts.

    ich verstehe auch nicht wie ich beim Ring 3 die Abfrage hinbekomme, dass man nur zwischen zahl 0-6 und 10 und 11 wählen kann. Habe jetzt fast alles durchprobiert aber begreife es nicht. Obwohl ich eigentlich dieses Fach nicht wirklich mag,(hauptsächlich weil ich es nicht verstehe) finde ich, steckt eine grosses Potential dahinter um sich mehr damit zu beschäftigen. Es lässt mich manchmal gar nicht mehr los 🙂

    Also ich werde am Nachmittag noch mal alles durchprobieren und melde mich wieder.

    Hier ist noch der Code vom RIng 3 der nicht funktionieren will

    do 
    			{
    			cout <<"geben sie die Farbe des 3. Rings ein (0 bis 6 || 10 oder 11): ";
    			cin >> ring3;
    		}while((ring3<0) || (ring3>6) || (ring3==10) || (ring3==11));
    


  • So gehts:

    while((ring3<0 || ring3>6) && ring3!=10 && ring3!=11)
    

    Die Schleife wird solange ausgeführt wie ring3 nicht zwischen 0 und 6 ist, und auch nicht 10, und auch nicht 11 ist. Ich hab mich gerade aber auch ein paarmal vertan bin ich die richtige Bedingung hatte 😉



  • sebi707 schrieb:

    So gehts:

    while((ring3<0 || ring3>6) && ring3!=10 && ring3!=11)
    

    Die Schleife wird solange ausgeführt wie ring3 nicht zwischen 0 und 6 ist, und auch nicht 10, und auch nicht 11 ist. Ich hab mich gerade aber auch ein paarmal vertan bin ich die richtige Bedingung hatte 😉

    Wenigstens war ich schon mal nicht weit daneben. Ich hatte die 2 && auch schon probiert, aber wahrscheinlich die falschen vergleichsoperatoren

    Danke 😃



  • Man kann doch auch gleich den Text 1:1 umsetzen und dann die Abfrage negieren:

    do
    {
        cout <<"geben sie die Farbe des 3. Rings ein (0 bis 6 || 10 oder 11): ";
        cin >> ring3;
    } while(!((ring3>=0 && ring3<=6) || ring3==10 || ring3==11));
    

    Mittels der De Morgansche Gesetze ergibt das dann den von sebi707 beschriebenen Ausdruck.

    PS: Die Klammern um das && habe ich nur zur Verdeutlichung hingeschrieben - auch ohne wäre es richtig, da && stärker bindet als ||.



  • Th69 schrieb:

    Man kann doch auch gleich den Text 1:1 umsetzen und dann die Abfrage negieren:

    do
    {
        cout <<"geben sie die Farbe des 3. Rings ein (0 bis 6 || 10 oder 11): ";
        cin >> ring3;
    } while(!((ring3>=0 && ring3<=6) || ring3==10 || ring3==11));
    

    Mittels der De Morgansche Gesetze ergibt das dann den von sebi707 beschriebenen Ausdruck.

    PS: Die Klammern um das && habe ich nur zur Verdeutlichung hingeschrieben - auch ohne wäre es richtig, da && stärker bindet als ||.

    Danke Dir für den Tip, aber ich glaube das bring ich nicht auf die Reihe.
    Mal schauen. eins nach dem anderen

    EDIT: hab den letzten Beitrag nach mehrmaligem Lesen doch nun auch verstanden. Ist die gleiche Abfrage einfach auf einen anderen Weg.

    Zu der Frage wegen den 4 oder 5 ringen:
    Sehe ich das richtig, das diese Abfrage eine if/else ist und gehe ich da richtig vor das ich beim if einfach die 4 Ringe nach einander ausgebe und bei else dann alle 5.
    Ich habs mal so gemacht, habe aber natürlich jede menge fehler



  • Th69 schrieb:

    Man kann doch auch gleich den Text 1:1 umsetzen und dann die Abfrage negieren:

    do
    {
        cout <<"geben sie die Farbe des 3. Rings ein (0 bis 6 || 10 oder 11): ";
        cin >> ring3;
    } while(!((ring3>=0 && ring3<=6) || ring3==10 || ring3==11));
    

    Mittels der De Morgansche Gesetze ergibt das dann den von sebi707 beschriebenen Ausdruck.

    PS: Die Klammern um das && habe ich nur zur Verdeutlichung hingeschrieben - auch ohne wäre es richtig, da && stärker bindet als ||.

    Also dieser Code will bei mir so nicht funktionieren,mit oder ohne klammern.



  • Bei mir schon. Sicher das du alles richtig mit kopiert hast? Auch die Negation (Ausrufezeichen) am Anfang? Oder was funktioniert nicht richtig?



  • ja, brauchte mehrere anläufe, weil du so viele klammer gemacht hast:)
    im besten Fall, hats bei mir eben auch noch die anderen Zahlen die nicht erwünscht sind auch eingelesen, oder dann einfach nicht weitergegangen zu ring4



  • Hallo alle miteinander

    Ich bin jetzt noch auf zwei Probleme gestossen und weiss nicht mehr weiter.
    Das Code hat funktioniert, bis ich die abfrage für die toleranzwerte hinzugefügt habe. bin auch wirklich nicht sicher ob das so korrekt ist.

    wenn jemand noch mal lust hätte drauf zu schauen und mir vielleicht noch paar tipps geben kann, wäre ich sehr dankbar. die berechnung für den zweiten toleranzwert funktioniert auch nicht richtig.

    vielen Dank im voraus

    http://ideone.com/e.js/t8RwjG


Anmelden zum Antworten