Zum Inhalt springen

Bedingte/Erlaubte Eingabe


Stefan21j

Empfohlene Beiträge

Hallo zusammen,

ich habe ein kleines Programm als Hilfe geschrieben. Fragt mich nicht wofür denn eigentlich ist der Aufwand größer als der nutzen.

Nur habe ich noch ein kleines Problem.

Eigentlich sollte nuur w, s oder g eingeben werden, um die Aufgaben zu lösen. Aber ich habe festgestellt das ich auch mehr als einen Buchstaben eingeben kann und sich das Programm dann aufhängt (while-Schleife als wirkliche Schleife....)

Wie kann ich es umgehen?

Definieren das ich nur genau die Buchstaben als zulässige EIngabe erkenne?

Einfach nur zulassen das er nur genau einen Buchstaben erkennt? Auch wenn mehr da stehen?

Was denkt dir ist die sauberste Lösung?

Und entschuldigt das Chaos im Programm.....

Danke im Vorraus für Tips.

LG Stefan

#include <cstdlib>

#include <iostream>

#include <iomanip>

#include <string>

#include <cmath>

using namespace std;

void gwcalc (void) // 1. void-Container (Name: gwcalc)

{

float pwert; // "pwert" wird als float deklariert

float psatz; // "psatz" wird als float deklariert

cout<<"Sie haben die Berechnung des Grundwerts gewaehlt.\n\n\n";

cout<<"Bitte geben Sie den Prozentsatz ein.\n";

cin>>psatz; // die eingegebene Zahl wird als "psatz" eingelesen

cout<<endl; // Zeilenumbruch mit Pufferleerung

cout<<"Bitte geben Sie den Prozentwert ein.\n";

cin>>pwert; // die eingegebene Zahl wird als "pwert" eingelesen

cout<<endl;

cout<<"Grundwert: "<<pwert*100/psatz<<endl<<endl;

// ^^ Der berechnete Wert wird neben "Grundwert:" ausgegeben

}

void pwcalc (void) // 2. void-Container (Name: pwcalc)

{

float gwert;

float psatz;

cout<<"Sie haben die Berechnung des Prozentwerts gewaehlt.\n\n\n";

cout<<"Bitte geben Sie den Grundwert ein.\n";

cin>>gwert;

cout<<endl;

cout<<"Bitte geben Sie den Prozentsatz ein.\n";

cin>>psatz;

cout<<endl;

cout<<"Grundwert: "<<gwert*psatz/100<<endl<<endl;

}

void pscalc (void) // 3. void-Container (Name: pscalc)

{

float gwert;

float pwert;

cout<<"Sie haben die Berechnung des Prozentsatzes gewaehlt.\n\n\n";

cout<<"Bitte geben Sie den Grundwert ein.\n";

cin>>gwert;

cout<<endl;

cout<<"Bitte geben Sie den Prozentwert ein.\n";

cin>>pwert;

cout<<endl;

cout<<"Grundwert: "<<100*pwert/gwert<<endl<<endl;

}

int main(int argc, char *argv[])

{

system("color 6B");

char taste;

taste='j';

while(tolower(taste)=='j')

{

system("cls");

char erwert;

/* ^^

Die Leerstelle zwischen ' ' wird mit dem Variablenname "erwert" als "char"

deklariert.

*/ cout<<"Bitte geben Sie an, was Sie berechnen moechten:\n\n";

cout<<"Grundwert = g, Prozentwert = w oder Prozentsatz = s\n\n";

cin>>erwert;

cout<<endl;

if (erwert == 'g') // wenn die Eingabe = mit 'g' ist dann ...

gwcalc (); // ... fuehre den void-Container "gwcalc" aus

else if (erwert == 'w') // wenn aber die Eingabe = mit 'w' ist dann ...

pwcalc (); // ... fuehre den void-Container "pwcalc" aus

else if (erwert == 's') // wenn aber die Eingabe = mit 's' ist, dann ...

pscalc (); // ... fuehre den void-Container "pscalc" aus

else // anderenfalls schreibe ...

cout<<endl<<endl<<"Ihre Eingabe war nicht korrekt. Erneut versuchen?(j/n)";

cin>>taste;

cout<<endl;

}

return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ausm Stehgreif für main:


int main(int argc, char* argv[])

{

	int coption;

	do 

	{

		//clrscr();

		cout<<"Hier Text"<<endl;

		cout<<"Hier Text"<<endl;

		fflush(stdin);

		coption = cin.get();

		switch(tolower(coption))

		{

		case 'g':

			cout << "g" << endl;

			break;

		case 'w':

			cout << "w" << endl;

			break;

		case 's':

			cout << "s" << endl;

			break;

		default:

			cout << "Hier Text" << endl;

			break;

		}

		cout << "Nochmal?" << endl;

		fflush(stdin);

		coption = cin.get();

	} while (tolower(coption)!='n');

	cin.get();

	return 0;

}

btw: system-Befehle sind Müll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiss des das Programm nicht wirklich schön geschrieben wurde...

Hab den Code auch nur von nem Kollegen bekommen (angehender FiAE grad mit C++ angefangen) der nicht weiter kommt... hab kurz drüber geschaut und mir gefallen so ein paar Sachen nicht...

Wollte sein Code aber nicht zu sehr ändern, da das die Sachen sind mit den er grad arbeitet...

Es läuft soweit auch alles...nur sind halt schönheitsfehler drin die ich auch anders lösen würde....

Danke aber erstmal

Link zu diesem Kommentar
Auf anderen Seiten teilen

Übrigens: fflush auf Eingabeströme erzeugt undefiniertes Verhalten. ;)

War ja auch nur eine Quick&Dirty-Lösung.

Wieso eigentlich?

Ich geh aber ehrlich gesagt, lieber das Risiko ein, undefiniertes Verhalten zu provozieren, als Systembefehle zu nutzen (cls unter Linux gibts meines Wissens nach nicht)

Link zu diesem Kommentar
Auf anderen Seiten teilen

War ja auch nur eine Quick&Dirty-Lösung.

Wieso eigentlich?

Da musst du die fragen, die den Standard verfasst haben.

Ich geh aber ehrlich gesagt, lieber das Risiko ein, undefiniertes Verhalten zu provozieren, als Systembefehle zu nutzen (cls unter Linux gibts meines Wissens nach nicht)
Und fflush(stdin) bewirkt beim gcc soweit ich weiß gar nichts.

Wenn Portierbarkeit keine Anforderung ist, und du einen Compiler hast, der bei fflush(stdin) etwas Definiertes tut, ist beides gleichermaßen in Ordnung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da musst du die fragen, die den Standard verfasst haben.

hmm, bei Google find ich immer nur was von wegen undefiniertem Verhalten bzw. keinen Grund.

Ich dächte aber mich zu entsinnen, dass es eine Erweiterung im C-Standard gibt, welche das flushen des Inputstreams erlaubt. :beagolisc

Was wäre denn die portablere flush-Alternative?

fgets mit buffer auf stdin?

Link zu diesem Kommentar
Auf anderen Seiten teilen

der fflush funzt schon im iostream...

Hab bis jetzt noch nie Probs gehabt wenn ich es genutzt habe...

Das ist ein Argument, dass dir bei C und C++ schnell Kopfschmerzen bereiten kann, weil beide Sprachen leider an allen Ecken und Enden das beliebte "undefinierte Verhalten" haben.

Daraus, dass dein Code funktioniert, kannst du nicht folgern, dass er richtig ist. Es ist möglich, dass er schon morgen, oder auf einem anderen Rechner, oder mit einem anderen Compiler, nicht mehr funktioniert.

Wie gesagt, wenn du einen Compiler hast, der bei fflush auf Eingabeströmen etwas Definiertes tut, und wenn Portabilität für dich kein Thema ist, ist das in Ordnung. Ansonsten solltest du das lieber lassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde auch nie behaupten das mein Code richtig ist...

Dann würde ich ja sagen, ich wäre richtig...das bin ich nun auch nicht :)

Ich ziehe ein SPS oder eine I3E-programmierung jedem C vor ;) Damit kann ich umgehen :)

Wie gesagt C++ ist nur weil ich es mal gelernt habe. Arbeiten damit tue ich sehr selten. Und ich denke Ahnung von C++ habe ich auch nicht wirklich.

Daher kann ich nur sagen das ich bis jetzt nie Probleme hatte, bei den Sachen die ich gemacht habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...