Ergebnis 1 bis 6 von 6

Thema: Durchlaufstopp nach "cin"

  1. #1
    HTML Newbie
    Registriert seit
    27.06.2009
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard Durchlaufstopp nach "cin"

    Guten Morgen, Leute!

    Als erstes, entschuldigt, wenn ich es in die falsche Ecke gepostet habe, aber c++ sah für mein c++ Problem ganz gut aus

    Genau, zum C++ lernen wollte ich für unsere Rollenspielrunde einen Exp-Berechner machen (später auch noch anderes...), gibt es zwar schon, aber egal.
    Hier erstmal der Programmschnipsel mit dem Fehler:

    Code:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <map>
    using namespace std;
    
    main() 
    {
        
        //...
    
        string Eingabe; //soll String sein
        int Monster[Anzahl.Monster][2]; //Par2: Anzahl - HG, Par1: für jedes Monster
        cout << "Marke vor WhileSchleife"; //Prüfungsausgabe
        for(i=0; i < Anzahl.Monster; i++) {                                                       //Neue Schleife für neue Eingabe
            cout << "[#" << i+1 << "],[HG]: " << endl;
              //Zeile mit "Fehler":
            cin >> Eingabe; //von 1,1 bis 999,20 (Ohne Leerzeichen!)
            cout << "Test: nach einlesen"; //schauen, ob er soweit kommt
            ...
        }
    Das Programm läuft eigentlich ganz gut. Aber wenn er bei dieser Schleife den letzten Durchlauf macht, dann gibt er noch (beispielsweise)

    [#3],[HG]:

    aus, dann kann man was hinschreiben, aber es passiert anschließen nichts mehr, es wird auch nicht der Text danach ausgegeben.

    Das komplette "Programm" hängt mit dran.

    ähhm ja, Danke schonmal für eure Mühen und Antworten

    Grüße, Rasensprenger
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!
    Geändert von Rasensprenger (27.06.2009 um 12:55 Uhr)

  2. #2
    HTML Newbie
    Themenstarter

    Registriert seit
    27.06.2009
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Durchlaufstopp nach "cin"

    Uups, vergessen hochzuladen, jetzt sollte es dran sein
    Oh,und ich programmiere unter Linux.

    -------------

    Ich denke, das ist für Viele einfacher:
    Code:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <map>
    using namespace std;
    
    int GetIntVal(string strConvert) {
      int intReturn;
      intReturn = atoi(strConvert.c_str());
      return(intReturn);
    }
    
    main() 
    {
    	string ZwSp;
    	int ExpTabelle[20][20]={ /*Stufe 1*/{300,600,900,1350,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400,345600},/*Stufe 2*/{300,600,900,1350,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400,345600},/*Stufe 3*/{300,600,900,1350,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400,345600},/*Stufe 4*/{300,600,800,1200,1600,2400,3200,4800,6400,9600,12800,19200,25600,38400,51200,76800,102400,153600,204800,307200},/*Stufe 5*/{300,500,750,1000,1500,2250,3000,4500,6000,9000,12000,18000,24000,36000,48000,72000,96000,144000,192000,288000},/*Stufe 6*/{300,450,600,900,1200,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400},/*Stufe 7*/{263,350,525,700,1050,1400,2100,3150,4200,6300,8400,12600,16800,25200,33600,50400,67200,100800,134400,201600},/*Stufe 8*/{200,300,400,600,800,1200,1600,2400,3600,4800,7200,9600,14400,19200,28800,38400,57600,76800,115200,153600},/*Stufe 9*/{0,225,338,450,675,900,1350,1800,2700,4050,5400,8100,10800,16200,21600,32400,49200,64800,98400,129600},/*Stufe 10*/{0,0,250,375,500,750,1000,1500,2000,3000,4500,6000,9000,12000,18000,24000,36000,48000,72000,96000},/*Stufe 11*/{0,0,0,275,413,550,825,1100,1650,2200,3300,4950,6600,9900,13200,19800,26400,39600,52800,79200},/*Stufe 12*/{0,0,0,0,300,450,600,900,1200,1800,2400,3600,5400,7200,10800,14400,21600,28800,43200,57600},/*Stufe 13*/{0,0,0,0,0,325,488,650,975,1300,1950,2600,3900,5850,7800,11700,15600,23400,31200,46800},/*Stufe 14*/{0,0,0,0,0,0,350,525,700,1050,1400,2100,2800,4200,6300,8400,12600,16800,25200,33600},/*Stufe 15*/{0,0,0,0,0,0,0,375,563,750,1125,1500,2250,3000,4500,6750,9000,13500,18000,27000},/*Stufe 16*/{0,0,0,0,0,0,0,0,400,600,800,1200,1600,2400,3200,4800,7200,9600,14400,19200},/*Stufe 17*/{0,0,0,0,0,0,0,0,0,425,638,850,1275,1700,2550,3400,5100,7650,10200,15300},/*Stufe 18*/{0,0,0,0,0,0,0,0,0,0,450,675,900,1350,1800,2700,3600,5400,8100,10800},/*Stufe 19*/{0,0,0,0,0,0,0,0,0,0,0,475,713,950,1425,1900,2850,3800,5700,8550},/*Stufe 20*/{0,0,0,0,0,0,0,0,0,0,0,0,500,750,1000,1500,2000,3000,4000,6000} };
    	struct complex
    	{
    		int Spieler;
    		int Monster;
    		int Aktoren;
    	};
    
    	complex Anzahl;
    	cout << "Bitte lesen sie vor der Benutzung dieses Progrämmchens die LIESMICH.TXT, da sie ansonsten nichts hinkriegen." << endl;
    	cout << "Geben sie bitte die Anzahl der Spieler an.";
    	cin >> Anzahl.Spieler;
    	cout << endl << "Geben sie bitte die Stufe jedes Spielers an." << endl;
    	int Spielerlvl[Anzahl.Spieler];
    	for (int a=0; a<Anzahl.Spieler; a++)
    	{
    		cin >> Spielerlvl[a];
    	}
    	int Komma = 0;
    	int k = 0;
    	cout << "Anzahl aller unterschiedlicher bewältigten Kreaturen: ";
    	cin >>  Anzahl.Monster;
    	cout << endl;
    	Neue_Eingabe:
    	cout << "Geben sie die Anzahl der Monster mit dem dazugehörigen Herausforderungsgrad an:" << endl;
    	int i = 0;
    	string Eingabe; //soll String sein
    	int Monster[Anzahl.Monster][2]; //Par2: Anzahl - HG, Par1: für jedes Monster
    	cout << "Marke vor WhileSchleife"; //Testkomment
    	for(i=0; i < Anzahl.Monster; i++) { 	  												//Neue Schleife für neue Eingabe
    		cout << "[#" << i+1 << "],[HG]: " << endl;
    		cin >> Eingabe; //Eingabe von: 1,1 bis 99..99,20
    		cout << "Marke nach einlesen";
    		if (Eingabe[1]==*",")
    			Komma=1;
    		else if (Eingabe[2]==*",")
    			Komma=2;
    		else Komma=3;
    		cout << "Marke nach if zeug";
    
    		if (Komma == 0) {
    			cerr << "Komma fehlt!"; 	//Wenn Komma fehlt, diese eingabe wiederholen
    			goto Neue_Eingabe;
    		}	
    			cout << "Marke1.0";
    			switch (Komma) {						//Zerlegung der Eingabe in Anzahl und HG
    				case 1: Monster[i][0] = int(Eingabe[0]);
    					ZwSp="";
    					for (int l=2; Eingabe[l]!=*"";l++) {
    						ZwSp += Eingabe[l];
    					}
    					Monster[i][1]=GetIntVal(ZwSp);
    					cout << "Marke Switch1"; //Testkomment
    					break;
    				case 2: Monster[i][0] = int(Eingabe[0]+Eingabe[1]);
    					ZwSp="";
    					for (int l=3; Eingabe[l]!=*"";l++) {
    						ZwSp += Eingabe[l];
    					}
    					Monster[i][1]=GetIntVal(ZwSp);
    					cout << "Marke Switch2"; //Testkomment
    					break;
    				case 3: Monster[i][0] = int(Eingabe[0]+Eingabe[1]+Eingabe[2]);
    					ZwSp="";
    					for (int l=4; Eingabe[l]!=*"";l++) {
    						ZwSp += Eingabe[l];
    					}
    					Monster[i][1]=GetIntVal(ZwSp);
    					cout << "Marke Switch3"; //Testkomment
    					break;
    			}//Ende Zerlegung
    	cout << "Marke2"; //Testkomment
    	}//Ende while-Schleife
    	int Summe = 0;
    	int n = 0;
    	cout << "Marke1"; //Testkomment	
    	for (int m=0; m<Anzahl.Spieler; m++) {
    		for (n=0; n<Anzahl.Monster; i++) {
    			Summe = 0;
    			Summe += (Monster[n][0]*ExpTabelle[(Spielerlvl[n]-1)][Monster[n][1]]);
    		}
    		Summe /= Anzahl.Spieler;
    		cout << "Spieler mit LVL " << Spielerlvl[n] << " erhalten " << Summe << " Erfahrungspunkte." << endl;
    	}//Ende for-Schleife der ExpBerechnung
    return 0;
    }
    The User
    Angehängte Dateien Angehängte Dateien
    Geändert von The User (27.06.2009 um 13:11 Uhr) Grund: Code eingefügt

  3. #3
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Durchlaufstopp nach "cin"

    Hallo!

    Forum stimmt schon.

    Zunächst einmal solltest du deinen Quellcode etwas aufräumen:
    -Die Struktur hat einen sinnlosen Namen (man denkt da an komplexe Zahlen) und dieser scheint auch nicht in Übereinstimmung mit deiner Namenskonvention zu stehen,
    -for-Schleife sieht so aus:
    Code:
    for(int i = 0; i != Anzahl.Monster; ++i)
    Das solltest du dir angewöhnen.
    -if(Komma == 0): Dieser Fall kann nicht eintreten, da das if-else if-else-Konstrukt alles abdeckt. Also kannst du es entfernen.
    -*"," ist sehr unverständlich, verwende statt dessen einfach ',' dann hast du direkt einen char-Typen.
    -Die Einrückung ist unsauber
    -Die Variable "Komma" erfüllt keinerlei Sinn, mach in der Schleife einfach das:
    Code:
    if(Eingabe[1] == ',')
    {
      // bla
    }
    else if(Eingabe[2] == ',')
    {
      // bla
    }
    else
    {
      // bla
    }
    Wenn du nicht nur 1 und 2 sondern beliebige Stellen prüfen möchtest, solltest du std::string::find_first_of(',') sowie std::string::substr verwenden.
    -"Monster[i][0] = int(Eingabe[0])" tut wahrscheinlich nicht das Gewünschte: Der ASCII-Code der Zahl in der Eingabe wird dann gespeichert. Wenn es nur von 0-9 gehen soll, mach es mit "Monster[i][0] = Eingabe[0] - '0'", das funktioniert dann. Doch ist dein Monster-Array auch eher unsauber. Eigentlich sollte es ein eindimensionales Array sein. Wenn du zwei Stellen haben möchtest, musst du einfach die erste mit 10 multiplizieren, z.B.:
    Code:
    Monster[i] = 10 * (Eingabe[0] - '0') + Eingabe[1] - '0'
    -Die Funktion GetIntVal schreibst du besser so:
    Code:
    inline int GetIntVal(const string& str)
    {
      return atoi(str.c_str());
    }
    -Die Summe jedes Mal auf 0 zurückzusetzen ist eher ungeschickt.

    Verrat mir vor allem, ob beliebig lange Zahlen verwendet werden können sollen.

    Viele liebe Grüße
    The User

  4. #4
    HTML Newbie
    Themenstarter

    Registriert seit
    27.06.2009
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Durchlaufstopp nach "cin"

    Oh, ja, mit Sauberkeit hab ichs am Anfang selten^^"
    Dann werd ich das erstmal aufräumen.
    Das Monster-Array soll zweidimensional sein, da es einmal die Anzahl der Monster speichert, und dann deren Herausforderungsgrad.

    Bei dem *"," hatte ich es erst ohne * stehen, und in der Fehlermeldung stand etwas von char* also hab ich das hingesetzt und es funktionierte, aber okai
    Geändert von Rasensprenger (27.06.2009 um 13:59 Uhr)

  5. #5
    HTML Newbie
    Themenstarter

    Registriert seit
    27.06.2009
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Durchlaufstopp nach "cin"

    So, jetzt ist alles geändert

    Ich glaube, die EInrückung ist zum Teil immer noch falsch (hab eig nur das vom Switch geändert)

    Ja, ich finde es unlogisch, 1000 oder mehr (eigentlich schon ab 500) Kreaturen zu töten. Entweder ist man da imm Krieg, und man bekommt kaum Exp, da alles auf die anderen verteilt wird, oder man ist bereits episch oder so, da kriegt man keine EP mehr für die Monster. --> Nein, es sollen keine beliebig lange Zahlen verwendet werden könne

    Code:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <map>
    using namespace std;
    
    inline int GetIntVal(const string& str)
    {
      return atoi(str.c_str());
    }
    
    main() 
    {
        string ZwSp;
        int ExpTabelle[20][20]={ /*Stufe 1*/{300,600,900,1350,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400,345600},/*Stufe 2*/{300,600,900,1350,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400,345600},/*Stufe 3*/{300,600,900,1350,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400,345600},/*Stufe 4*/{300,600,800,1200,1600,2400,3200,4800,6400,9600,12800,19200,25600,38400,51200,76800,102400,153600,204800,307200},/*Stufe 5*/{300,500,750,1000,1500,2250,3000,4500,6000,9000,12000,18000,24000,36000,48000,72000,96000,144000,192000,288000},/*Stufe 6*/{300,450,600,900,1200,1800,2700,3600,5400,7200,10800,14400,21600,28800,43200,57600,86400,115200,172800,230400},/*Stufe 7*/{263,350,525,700,1050,1400,2100,3150,4200,6300,8400,12600,16800,25200,33600,50400,67200,100800,134400,201600},/*Stufe 8*/{200,300,400,600,800,1200,1600,2400,3600,4800,7200,9600,14400,19200,28800,38400,57600,76800,115200,153600},/*Stufe 9*/{0,225,338,450,675,900,1350,1800,2700,4050,5400,8100,10800,16200,21600,32400,49200,64800,98400,129600},/*Stufe 10*/{0,0,250,375,500,750,1000,1500,2000,3000,4500,6000,9000,12000,18000,24000,36000,48000,72000,96000},/*Stufe 11*/{0,0,0,275,413,550,825,1100,1650,2200,3300,4950,6600,9900,13200,19800,26400,39600,52800,79200},/*Stufe 12*/{0,0,0,0,300,450,600,900,1200,1800,2400,3600,5400,7200,10800,14400,21600,28800,43200,57600},/*Stufe 13*/{0,0,0,0,0,325,488,650,975,1300,1950,2600,3900,5850,7800,11700,15600,23400,31200,46800},/*Stufe 14*/{0,0,0,0,0,0,350,525,700,1050,1400,2100,2800,4200,6300,8400,12600,16800,25200,33600},/*Stufe 15*/{0,0,0,0,0,0,0,375,563,750,1125,1500,2250,3000,4500,6750,9000,13500,18000,27000},/*Stufe 16*/{0,0,0,0,0,0,0,0,400,600,800,1200,1600,2400,3200,4800,7200,9600,14400,19200},/*Stufe 17*/{0,0,0,0,0,0,0,0,0,425,638,850,1275,1700,2550,3400,5100,7650,10200,15300},/*Stufe 18*/{0,0,0,0,0,0,0,0,0,0,450,675,900,1350,1800,2700,3600,5400,8100,10800},/*Stufe 19*/{0,0,0,0,0,0,0,0,0,0,0,475,713,950,1425,1900,2850,3800,5700,8550},/*Stufe 20*/{0,0,0,0,0,0,0,0,0,0,0,0,500,750,1000,1500,2000,3000,4000,6000} };
        struct Menge
        {
            int Spieler;
            int Monster;
            int Aktoren;
        };
    
        Menge Anzahl;
        cout << "Bitte lesen sie vor der Benutzung dieses Progrämmchens die LIESMICH.TXT." << endl;
        cout << "Geben sie bitte die Anzahl der Spieler an.";
        cin >> Anzahl.Spieler;
        cout << endl << "Geben sie bitte die Stufe jedes Spielers an." << endl;
        int Spielerlvl[Anzahl.Spieler];
        for (int a=0; a!=Anzahl.Spieler;++a)
        {
            cin >> Spielerlvl[a];
        }
        int Komma = 0;
        int k = 0;
        cout << "Anzahl aller unterschiedlicher bewältigten Kreaturen: ";
        cin >>  Anzahl.Monster;
        cout << endl;
        Neue_Eingabe:
        cout << "Geben sie die Anzahl der Monster mit dem dazugehörigen Herausforderungsgrad an:" << endl;
        int i = 0;
        string Eingabe;
        int Monster[Anzahl.Monster][2]; //Par2: Anzahl - HG, Par1: für jedes Monster
        //cout << "Marke vor WhileSchleife"; //Testkomment
        for(i=0; i != Anzahl.Monster; ++i) {//Neue Schleife für neue Eingabe
            cout << "[#" << i+1 << "],[HG]: " << endl;
            cin >> Eingabe; //Eingabe von: 1,1 bis 999,20
            //cout << "Marke nach einlesen";
            if (Eingabe[1]==',')
                Komma=1;
            else if (Eingabe[2]==',')
                Komma=2;
            else Komma=3;
            //cout << "Marke nach if (1)";    
            //cout << "Marke1.0";
            switch (Komma) {                        //Zerlegung der Eingabe in Anzahl und HG
                case 1: Monster[i][0] = (Eingabe[0]);
                    Monster[i][1]=GetIntVal(Eingabe.substr(2));
                    Monster[i][1]=GetIntVal(ZwSp);
                    //cout << "Marke Switch1"; //Testkomment
                    break;
                case 2: Monster[i][0] = 10*(Eingabe[0]-'0')+ (Eingabe[1]-'0');
                    Monster[i][1]=GetIntVal(Eingabe.substr(3));
                    Monster[i][1]=GetIntVal(ZwSp);
                    //cout << "Marke Switch2"; //Testkomment
                    break;
                case 3: Monster[i][0] = 100*(Eingabe[0]-'0') + 10*(Eingabe[1]-'0') + (Eingabe[2]-'0');
                    Monster[i][1]=GetIntVal(Eingabe.substr(4));
                    Monster[i][1]=GetIntVal(ZwSp);
                    //cout << "Marke Switch3"; //Testkomment
                    break;
            }//Ende Zerlegung
            //cout << "Marke2"; //Testkomment
        }//Ende for-Schleife
        int Summe = 0;
        int n = 0;
        //cout << "Marke1"; //Testkomment    
        for (int m=0; m!=Anzahl.Spieler; ++m) {
            Summe = 0;
            for (n=0; n!=Anzahl.Monster; ++n) {
                Summe += (Monster[n][0]*ExpTabelle[(Spielerlvl[n]-1)][Monster[n][1]]);
            }
            Summe /= Anzahl.Spieler;
            cout << "Spieler mit LVL " << Spielerlvl[n] << " erhalten " << Summe << " Erfahrungspunkte." << endl;
        }//Ende for-Schleife der ExpBerechnung
    return 0;
    }
    Muss dann jetzt bei der Zuweisung ( Monster[i][1]=GetIntVal(Eingabe.substr(2)); ) noch das GetIntVal hin, oder macht er das selber zu einer Integer Zahl??

    Oh stimmt, die Summe war in der falschen for Schleife, geändert


    Oh, ich glaube, der Fehler lag an der letzten Schleife, dort stand
    for (n=0; n!=Anzahl.Monster; ++i) {
    anstatt

    for (n=0; n!=Anzahl.Monster; ++n) {

    Na super -.-

    Okai, dann dank ich dir erstmal Es kommt noch das falsche Ergebnis raus, aber es läuft jetzt durch, das ist das wichtigste

    Dann werd ich mir bald mal auch die Regeln der Einrückung, formatierung und den guten Programmierstil anschauen und aneignen,

    Danke sehr

    Rasensprenger

  6. #6
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Durchlaufstopp nach "cin"

    1. Du verwendest substr falsch
    2. Für beschränkte Längen solltest du lieber die Variante mit 100 * (Eingabe[0] - '0') + 10 * (Eingabe[1] - '0') + Eingabe[2] - '0' verwenden

    Im Übrigen gibt es keine falsche Einrückung, sie muss nur konsistent sein.

Ähnliche Themen

  1. SuSE10.2/Plone: Site "verschwunden" nach Online-U
    Von FastEddy im Forum Zope & Plone - das deutsche Hilfeforum
    Antworten: 0
    Letzter Beitrag: 30.10.2007, 17:02
  2. Explorer-Kontextmenü "Symbole anordnen nach..."
    Von volksjammer im Forum Computer - Internet Forum
    Antworten: 2
    Letzter Beitrag: 10.10.2007, 16:18
  3. "nach oben"-Button HTML Code
    Von im Forum HTML & CSS Forum
    Antworten: 9
    Letzter Beitrag: 21.04.2006, 21:00
  4. nach Zeichen kette mit "#" am Anfang suchen und e
    Von Peter im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 7
    Letzter Beitrag: 10.02.2006, 21:16
  5. suche schon ewig nach einem bestimmten "Spielzeug"
    Von CHIEFmaster im Forum Off Topic und Quasselbox
    Antworten: 1
    Letzter Beitrag: 19.01.2006, 20:29

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •