Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi leutz..

Muss für die Schule nen Taschenrechner programmieren und soll Fehler dabei abfangen!

Wie mache ich das bitte, dass mein Prog nicht abstürzt,

wenn Zahlen wie 123df3 eingeben werden.. Also wie lese ich einen String (eine Zeichenkette) an Zahlen ein und üperprüfe diese???

Geschrieben
Also wie lese ich einen String (eine Zeichenkette) an Zahlen ein und üperprüfe diese???
In dem du die entsprechenden IO-Funktionen aus einer Standardbibliothek nutzt.

Deine Frage ist viel zu unspezifisch. Wo genau hast du Probleme, was möchtest du erklärt bekommen? Hast du Probleme dabei den Algorithmus für dein Programm zu entwickeln (wie soll überprüft werden, ob die Eingabe eine gültige Zahl darstellt?) oder hast du Probleme mit der konkreten Umsetzung in C(++)? Was hast du bereits probiert, wie sieht dein Lösungsansatz aus?

Geschrieben

hatte den gedankengang mit isdigit den eingegebene string zu überprüfen, doch der überprüft ja leider nur die erste zahl

ich bin anfängerin und habe da so meine probleme

soll also nen rechner programmieren (ist soweit auch fertig) nur die beiden einzugebenene zahlen sollen auch nur zahlen sein!

nur wenn der string aus ziffern besteht soll das programm weiterlaufen

(die auswahl der rechenoperation beginnen...)

Geschrieben
soll also nen rechner programmieren (ist soweit auch fertig) nur die beiden einzugebenene zahlen sollen auch nur zahlen sein!
Ja, das hast du in deinem Ursprungsposting schon gesagt.

Daher nochmal: Was willst du hier hören? Es wird dir niemand ein fertiges Programm vorsetzen und sagen "Bitteschön, das ist es" - das wäre auch kontraproduktiv. Du sollst an dem Beispiel lernen, wie die verschiedenen Funktionen und Programmierparadigmen eingesetzt werden. Das geht nur durch "Learning by Doing". Und wenn du dann Detailfragen hast - stell sie einfach. Aber komm nicht mit einer Rundumfrage "Muss das machen, wie geht das?" an.

Die Idee mit "isDigit" ist doch schonmal gut - jetzt musst du das nur auf den Anwendungsfall übertragen. Als kleiner Hint: Ein String besteht aus mehreren Zeichen. Wenn du also nicht den String als ganzes kontrollieren kannst dann lauf einfach über die einzelnen Characters und führe die Überprüfung für jeden Character durch.

Geschrieben
//if anweisung einbauen, in der eine Fehlermeldung auftritt, wenn buchstaben bzw falsche zahlen eingegeben werden.

#include <stdlib.h>

#include <math.h>

#include <iostream.h>

#include <conio.h>

#include <ctype.h>



double  zahl1,zahl2,ergebnis,ergebnis2; //Benoetigte Werte

char wdh,x; //Wiederholung des Programmes,eingegebene Auswahl der Rechenoperation


int main(void){



	do {


	system ("cls");


	cout<<"<....................................................>"<<endl;

	cout<<"<................ WILLKOMMEN.........................>"<<endl;

	cout<<"<....................................................>\n"<<endl<<endl;


	cout<<"Dies ist ein Taschenrechner, zur Durchfuehrung von "<<endl;

	cout<<"Rechenoperationen mit 2 Zahlen!\n"<<endl;



	cout<<"Bitte geben Sie die erste Zahl ein: \n"<<endl;

	cin >>zahl1;

	cout<<"Bitte geben Sie eine zweite Zahl ein: \n"<<endl;

	cin>>zahl2;



	if (zahl2==0){


		cout<<"Eine Division durch Null ist nicht moeglich!\n"<<endl;

		}



	else {


		do {


	system ("cls");	

	cout<<"\nBitte waehlen Sie eine Rechenoperation aus!"<<endl;


	cout<<"-------------------------------------"<<endl;

	cout<<"-- /-Addieren               (1)    --"<<endl;

	cout<<"-- /-Subtrahieren           (2)    --"<<endl;

	cout<<"-- /-Multiplikation         (3)    --"<<endl;

	cout<<"-- /-Division               (4)    --"<<endl;

	cout<<"-- /-Wurzel                 (5)    --"<<endl;

	cout<<"-- /-Quadratzahl            (6)    --"<<endl;

	cout<<"--                                 --"<<endl;

	cout<<"-- /-Programm verlassen     (0)    --"<<endl;

	cout<<"-------------------------------------"<<endl<<endl;


	cin>>x;


		}


	while (x!='0' && x!='1' && x!='2' && x!='3' && x!='4' && x!='5' && x!='6');




	{



			switch (x){


				case '1':{

						system ("cls");

						ergebnis=zahl1+zahl2;

						cout<<"Das Ergebnis lautet: "<<ergebnis<<endl;

						break;

						}


				case '2':{

						system ("cls");

						ergebnis=zahl1-zahl2;

						cout<<"Das Ergebnis lautet: " <<ergebnis<<endl;

						break;

						}


				case '3':{

						system ("cls");

						ergebnis=zahl1*zahl2;

						cout<<"Das Ergebnis lautet: " <<ergebnis<<endl;

						break;

						}


				case '4':	{

					system ("cls");

					ergebnis=zahl1/zahl2;

					cout<<"Das Ergebnis lautet: " <<ergebnis<<endl;

						break;

						}


				case '5':{

					system ("cls");

					ergebnis=zahl1*zahl1;

					ergebnis2=zahl2*zahl2;

					cout<<"Die Quadratzahl der ersten Zahl lautet: " <<ergebnis<<endl;

					cout<<"Die Quadratzahl der zweiten Zahl lautet: " <<ergebnis2<<endl;

						break;

						}


				case '6':	{

					system ("cls");

					ergebnis=sqrt (zahl1);

					ergebnis2=sqrt (zahl2);

					cout<<"Die Wurzel der ersten Zahl lautet: " <<ergebnis<<endl;

					cout<<"Die Wurzel der zweiten Zahl lautet: " <<ergebnis2<<endl;

						break;

						}


				case '0':	{

					system("cls");


					cout<<"/////////                //        //"<<endl;

					cout<<"//                                 //"<<endl;

					cout<<"//           //    //    //        //"<<endl;

					cout<<"//            //  //     //     ////////"<<endl;

					cout<<"//////         ////      //        //"<<endl;

					cout<<"//////          //       //        //"<<endl;

					cout<<"//              //       //        //"<<endl;

					cout<<"//             ////      //        //"<<endl;

					cout<<"//            //  //     //        //"<<endl;

					cout<<"/////////    //    //    //        //"<<endl<<endl<<endl<<endl<<endl<<endl<<endl;


					//system("PAUSE");

					return EXIT_SUCCESS;

					break;

						}


				default: cout<<"Falsche Eingabe!"<<endl; 


				}//Ende Switch

			}//Ende if




}//Ende else



	cout << "\nMoechten Sie das Programm wiederholen?[J]\n\n"<<endl;

	cout<<"Ansonsten Abbruch mit jeder beliebigen anderen Taste!"<<endl;


	wdh = getch();



}//Ende do


	while(wdh =='J' || wdh == 'j');



return 0;


}//Ende main

Geschrieben
out<<"Dies ist ein Taschenrechner, zur Durchfuehrung von "<<endl;

cout<<"Rechenoperationen mit 2 Zahlen!\n"<<endl;

cout<<"Bitte geben Sie die erste Zahl ein: \n"<<endl;

cin >>zahl1;

cout<<"Bitte geben Sie eine zweite Zahl ein: \n"<<endl;

cin>>zahl2;

hier habe ich das problem! ich weiß halt nicht wie ich hier die zahlen abfragen kann...

kann ja schließlich nicht jede position mit einer ifabfrage zu jedem buchstaben überprüfen

Geschrieben
cout<<"///////// // //"<<endl;

cout<<"// //"<<endl;

cout<<"// // // // //"<<endl;

cout<<"// // // // ////////"<<endl;

cout<<"////// //// // //"<<endl;

cout<<"////// // // //"<<endl;

cout<<"// // // //"<<endl;

cout<<"// //// // //"<<endl;

cout<<"// // // // //"<<endl;

cout<<"///////// // // // //"<<endl<<endl<<endl<<endl<<endl<<endl<<endl;

stellt sonst übrigens EXIT dar :-)

Geschrieben
kann ja schließlich nicht jede position mit einer ifabfrage zu jedem buchstaben überprüfen
Aber du kannst die Eingabe zunächst in einen String einlesen, anschließend den String überprüfen (Character für Character) und nach erfolgreicher Prüfung des String in einen numerischen Wert umwandeln und für die Berechnung weiterverwenden.
Geschrieben
kann ja schließlich nicht jede position mit einer ifabfrage zu jedem buchstaben überprüfen
Doch, genau das kannst du und musst du auch. Lies die Zahl als String ein, und prüf dann in einer Schleife jedes einzelne Zeichen.
Geschrieben
wie soll den das funktionieren???

das wäre ja ne endloslange if abfrage...

müsste ja abfragen, dass stringposition1 nich (a,b,c,...A,B,C ...etc.)

Die Funktion isdigit hast du doch schon gefunden. Die musst du doch nur ein einer Schleife auf jedes Zeichen des Strings anwenden.

geht das nicht auch einfacher???
Du kannst auch die Eingabe in einen Stringstream packen, in einen int einlesen und hinterher prüfen, ob das Ende-Flag des Streams gesetzt, und das Fehlerflag nicht gesetzt ist. Damit kommst du um die Schleife herum. Aber ob das einfacher ist?
Geschrieben
bin doch erst im 1. lehrjahr...
Na und? Darf man im ersten Jahr noch nicht denken? Die hier nun schon mehrfach vorgeschlagene Lösung enthält nichts, was in deinem Programm nicht schon drin wäre. Schleifen und Funktionen hast du doch schon.

also habt nen herz und nicht so nervige antworten, sorry, aber das hilft mir dann auch nicht weiter :(
Du hast hier klare Anweisungen bekommen, wie du das Problem lösen kannst. Wenn du das nicht umsetzen kannst, liegt das nicht daran, dass die Antworten "nervig" sind.

Wenn du etwas an der vorgeschlagenen Lösung nicht verstehst, dann erkläre, was genau das Problem ist.

Geschrieben

bool tryparse(int character)

{

	return ((character >= 0x30) && (character <= 0x39));

}


int parse(int character)

{

	return (character-0x30);

}
in Main:
int character;


double value = 0;


while(tryparse(character = getch()))

{

	value *= 10 + character;

}

Geht sicher noch sauberer/übersichtlicher... :rolleyes:

Geschrieben
eure antworten sind nicht nervig...
Ich habe es weiter oben schon geschrieben: Willst du etwas lernen oder nicht? Wenn nein brauchen wir gar nicht weiter zu diskutieren - die fertige Lösung wirst du hier nicht bekommen - es sei denn du bist bereit meinen Standard-Stundensatz zu zahlen, dann mache ich nichts anderes als die das entsprechende Programm zu schreiben. Wenn du dennoch etwas lernen willst: Setz dich dran und denk selbst. Ob du im ersten Lehrjahr oder im 20. Berufsjahr bist macht da keinen Unterschied - aber das eigenständige Denken wird dir hier niemand abnehmen.

Und zum Tonfall: Du willst etwas von uns - nämlich Hilfe. Und dann solltest du es denjenigen, die bis von ein paar Postings sicher noch bereits waren dir zu helfen so einfach wie möglich machen und nicht bei jedem Mal wo dir geholfen wird auch noch meckern.

bin doch froh über jede hilfe
Aber scheinbar nicht für den Tipp (auch) selbst denken zu wollen.
Geschrieben
bool tryparse(int character)
{
return ((character >= 0x30) && (character <= 0x39));
}

int parse(int character)
{
return (character-0x30);
}[/CODE] tryparse tut dasselbe wie die Standardfunktion isdigit.
[CODE]
while(tryparse(character = getch()))
{
value *= 10 + character;
}

getch ist nicht im Standard.

Deine Lösung hat zudem das Problem, dass sie bei ungültigen Zeichen einfach vorzeitig abbricht, statt einen Fehler zu melden.

Geschrieben
tryparse tut dasselbe wie die Standardfunktion isdigit.

getch ist nicht im Standard.

Deine Lösung hat zudem das Problem, dass sie bei ungültigen Zeichen einfach vorzeitig abbricht, statt einen Fehler zu melden.

getch war auch nur ein Lösungsansatz.

Das mit dem Abbrechen ist mir auch klar, ich wollte ihr nur ein (unfertiges) Beispiel zeigen, für Geistesblitz und so.

Geschrieben
getch war auch nur ein Lösungsansatz.

Das mit dem Abbrechen ist mir auch klar, ich wollte ihr nur ein (unfertiges) Beispiel zeigen, für Geistesblitz und so.

War ja auch nur ein Hinweis :).

Ich finde solche Lösungen mit Einlesen einzelner Zeichen immer etwas "frickelig", vor allem, wenn das alles auch sauber mit Standardmitteln geht. Hier kann man die Prüfung ja auch prima nach der Eingabe machen.

Geschrieben

Ich finde solche Lösungen mit Einlesen einzelner Zeichen immer etwas "frickelig", vor allem, wenn das alles auch sauber mit Standardmitteln geht. Hier kann man die Prüfung ja auch prima nach der Eingabe machen.

Dito.

Ich habe extra auf eine Zeicheniteration verzichtet und getch() nur genommen, damit sie sieht, wie sie jedes einzelne Zeichen abprüfen kann.

Soviel zu "endloslange if abfrage...". :)

getchar(), was ja meines Wissens im Standard ist, wollte ich nicht nehmen, weil das Enterdrücken bei großen Zahlen auf dauernd sicher nervig ist. :D

Geschrieben

bool eingabe ( char zahl1 [7] )

    {

     int anzahl = 0, stelle = 50;

     for (int i = 0; i < 7; i++)

        {

         if (isdigit(zahl1[i]))

           {

        if (zahl1[i] <= stelle)

          {

           if (i == 0) {stelle = 51; anzahl++;}

           else if ((i == 1)|(i == 3)) {stelle = 53; anzahl++;}

           else if ((i == 2)|(i == 4)) {stelle = 57; anzahl++;}

           else if (i == 5) {anzahl++;}

          }

           }

        }

     if (anzahl == 6) {cout<<"Falsche Eingabe";}

     else { ..... }//Wiederholung mit Abfrage der 2ten zahl

    }

wo ist denn jetzt bitte mein gedankenfehler....

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...