Eingabe in Variable ohne anschließenden Zeilenvorschub gesucht



  • Leider geht das mit dem goto(x,y) nicht

    goto ist ja schon vorbelegt vom alten Pascal her als Sprungbefehl zu einem Label innerhalb des Programmes.
    In der conio.h gibt es zwar auch gotoxy(int x,int y) aber leider kann meine IDE nichts damit anfangen, und der Compiler meckert.

    Ich hab ein wenig weiter geforscht in den Mechanismen die da wohl hinter der Eingabe stecken.
    Anscheinend wird beim cin >> var der Wert in var gespeichert, aber das Return wird an die Console gegeben, da das cin keine nicht druckbaren Zeichen in Variablen ablegt.
    mit cin.getline bleibt das Return genauso wie beim normalen cin im Eingabestream. Aber ich habe gelesen das man Zeichen die noch im Eingabestream zurückbleiben irgendwie löschen kann, damit sie nicht in die nächste Eingabe rutschen.
    Ausserdem muss ich bei cin.getline mit einem char array[int] arbeiten, dann dieses Array in String konvertieren die If abfrage machen, und dann falls das eine Zahl ist und nicht das Abbruchzeichen, den String in double konvertieren. Das finde ich relativ umständlich und unübersichtlich

    menge_chr = cin.getchar;
    menge_str = menge_chr;
    
    if (menge_str=="*"|| menge_str=="+")
    {
    
    tagessumme = tagessumme + kundensumme;
    break;
    }
    
    cout << "               ";
    cin >> preis;
    menge = atoi(menge_str.c_str());
    kundensumme = kundensumme + (menge * preis);
    tagesmenge = tagesmenge + menge;
    

    Da das Return im Eingabestream hängt passiert nämlich folgendes wenn ich in meinem Quellcode das cin durch

    cin.getline(var, char variable)
    

    ersetze.
    Sobald ich für Menge einen Wert eingegeben habe und mit Return bestätige landet der wert in der Variablen "menge_str".
    Das Return bleibt im Eingabestream zurück und landet sobald die Eingabeaufforderung für den Preis kommt in der Variablen "preis" und erzeugt anscheinend dann den Zeilenvorschub, so als wenn ich bei der Eingabe einer Variablen einfach Return drücke.
    Da aber noch kein Zeichen eingegeben wurde das mithilfe von cin.getline in menge_str gespeichert werden soll, wird die Eingabe nicht beendet, sondern findet nur eine Zeile tiefer statt.

    Ich hoffe das meine "Analyse" vielleicht den ein oder andern hier im Forum auf eine Idee gebracht hat der dann eine Lösung für dieses "Problem" findet.



  • Hallo xgrnsxs!
    Warum so kompliziert?
    Ich würde mir eine eigene Format-funktion schreiben, so zum Beispiel:

    inline void printLine(const int& menge, const double& preis)
    {
          std::cout << menge << "\t\t" << preis << std::endl;
    }
    

    Diese Funktion rufst du einfach nach jedem Einlesen der Menge und dem Preis, (selbstverständlich mit den aktuell eingelesenen Werten) auf.

    Nur so ein Vorschlag ...
    Caipi



  • Danke 😉

    Ich werde das gleich mal ausprobieren.

    Ich muss dazu sagen das ich n ziemlicher Anfänger bin was Programmieren mit C++ angeht und dann das mit diesen Funktionen usw. damit hab ich mich noch gar nicht beschäftigen können. Habe vor 3 Tagen angefangen mich mit C++ zu beschäftigen, weil ich java zum ko.... naja nicht so toll finde.

    VIelleicht magst du mir das was du da gemacht hast eben erklären. Das hört sich für viele Zwecke sehr praktisch an.

    thx



  • @xgrnsxs
    Ja, was soll ich sagen, die Funktion, die ich gepostet hab, ist eine wirklich simple Funktion. Sie erwartet zwei Read-Only Referenzen (=Es werden keine Kopien der Argumente erzeugt, sonderen diese werden direkt übergeben), die erste auf int, die zweite auf double.
    Nun gibt die Funktion als einzige Anweisung die beiden Argumente (Menge und Preis) aus.

    Wenn du bei dieser Funktion Probleme mit dem Verstehen haben solltest, würde ich dir empfehlen mal in den folgenden beiden Tutorials das Kapitel Funktionen, Referenzen etc. durchzulesen.

    http://www.volkard.de/vcppkold/inhalt.html
    http://tutorial.schornboeck.net/

    viel Erfolg!

    Caipi



  • Thx für den Tip.
    Hab das soweit verstanden wie das mit den Funktionen geht. Leider gibt es da noch ein Problem, denn diese Funktion gibt zwar die Zahlen in einer Zeile aus, nur die EIngabe erzeugt ja immer noch Zeilenvorschübe.
    Ausserdem bewirkt die Funktion das die Zahlen ja dann doppelt da stehen, das ist auch nicht so optimal

    das sieht dann so aus:

    Menge       Preis
      2
                  1.99
      2           1.99
      3 
                  4.95
      3           4.95
    

    Irgendwie muss ich das bei der Eingabe schon verhindern, das der mir den Zeilenvorschub macht. Das Return aus dem Inputstream muss verschwinden... das muss irgendwohin geschluckt werden damit es nicht auf der Konsole auftaucht. Ich weis nur nicht wie.

    Aber trotzdem danke für die Mühe 🙂



  • du koenntest das ganze mit

    getch();
    

    eingben lassen, dass lässt gar kein Zeichen anzeigen--> Das ganze in ein char array --> dann in einen String und dann irgenwie in einen double oder int??? und mit ein bisschen Formatieren und probieren dann wieder auf der Konsole ausgeben lasse???

    Gruß unknown12345

    p.s.: Wenn ich etwas mehr Zeit habe schau ich mir das mal an und schreib ein Beispiel



  • ok ich habe eindeutig zu viel Zeit, der Code ist zwar etwas unübersichtlich und nicht verkommentart, aber so ungefähr funktioniert dein Problem!

    #include <iostream> 
    #include <string> 
    #include <conio.h>
    #include <cmath>
    using namespace std; 
    
    double ein(char *einer)
    {
    	double a;
    	a = atof(einer);
    	cout << a;
    	return a;
    }
    
    int main() 
    { 
    	bool a = true;	
    	string ab;
    	char *b;
    	double c;
    	int d;
    	double f;
    
    	cout << "Registrierkassenprogramm:\n\n";
    
    	cout << "Menge			Preis\n";
    
    	while(a)
    	{		
    		ab = getch();
    
    		b = new char[ab.length()+1];
    		ab.copy(b, string::npos);
    		b[ab.length()] = 0;
    
    		if(*b == '*')
    		{
    			a = false;
    		}
    		else
    		{		
    			d = ein(b);
    
    			cout << "			";
    
    			*b = getch();
    
    			c = ein(b);
    
    			f = f + (c*d);
    
    			cout << "\n";
    		}
    	}
    
    	return 0;
    }
    

    Du musstihn halt noch verbessern!



  • hi, mir fällt grad auf, dass man auch immer nur eine Zahl nur eingeben kann, dass kannst du aber machen indem du den Wert von getch erstmal in ein int gibst und dann warten laesst, bis der wert 13 auftaucht (fuer Enter) und dann abbrechen laesst!

    gruß unknown12345



  • @unknown

    Hey ... das klappt soweit *freudentanz*

    Ich frag mich nur warum das bei mir mit getch() nie gefunzt hat. Hab versucht das mit dem conio.h zu bekommen, aber irgendwie hat der Compiler trotzdem jedesmal gemeckert.

    jetzt muss ich das nur noch hinbekommen, das ich das mit dem * und dem + halt abbrechen kann, aber das werd ich noch schaffen glaub ich.
    Da bin ich sehr hartnäckig 😉 thx

    Achja und nochwas. Hab vorher schonmal mit #include <conio.h> versucht um an dieses gotoxy(int x, int y) zu kommen aus Pascal zeiten, aber anscheinend wurde diese Funktion wohl aus dem Header entfernt. Vielleicht hat ja jemand ne Idee wie und ob man sone Funktion (oder ist es ne Methode???) nicht irgendwie wiederbeleben kann, oder ob es dafür vielleicht n Ersatz gibt. Ich kann mir kaum vorstellen das Programmierer, die Programme für Eingabeaufforderung oder für Linux Konsole schreiben, auf solche Funktionen, wie den Cursor auf beliebige Koordinaten zu setzen, verzichten können.



  • Hi also ich habe einen vorschlag
    lies doch deine eingaben in einen char ein und schneide das letzte zeichen (\n) einfach weg:

    wortlänge bestimmen und dann dies:

    wort[wortlänge] = ' ';

    zum schluss wandelst du das in double oder int um.



  • Wenn dus mit gotoxy machen willst, dann schreib dir halt eine eigene Funktion, nachdem ich ein wenig nachgeforscht habe bin ich auf das gekommen:

    #include <windows.h>
    
    void gotoxy(short x, short y)
    {
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(hCon, pos); 
    }
    

    probier das mal aus, ist aber ungetestet

    Gruß unknown12345



  • Allerbesten Dank an alle die mir geholfen haben 😉

    der Vorschlag von unknown12345 funktioniert. Ich find das gut das mir so viele geholfen haben. Sonst wär ich sicher schon verzweifelt und hätte mich mit was anderem beschäftigen müssen.
    Wenn es jemanden interessiert kann ich ja mal das fertige Programm hier reinposten, sobald es so funzt wie ich mir das vorgestellt hab.
    Vielleicht taucht ja nochmal das ein oder andere Problemchen auf... dann hört ihr wieder von mir *grins*


Anmelden zum Antworten