Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Else-problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
08.03.2004, 22:23 Uhr
Pablo
Supertux
(Operator)


Das mit dem EPSILON sollte etwas generisches sein. Wie ich schon sagte, wenn man mit double oder floats arbeitet und auf Gleichheit überprüfen soll, sollte man nicht mit == überprüfen, denn Rundungsfehlern immer vorhanden sind.

Um 2 float miteinander auf Gleichheit vergleichen zu können, sollte man eine Schranke setzen, das mache ich mit dem EPSILON. Stell dir vor a und b sollen die Zahl 3.444 darstellen. a == b genau dann, wenn b um eine kleine Schranke von a abweicht, z.b. 3.444 und 3.4440001 kann man schon al gleiche Zahlen interpretieren. Mathematisch ausgedrückt, wenn |a-b|<Konstante, die Größer als 0 sein soll. Die Funktion fabs leifert den Absolutbetrag einer Zahl, deren Typ Float ist. Meine Schranke ist EPSILON, deshlab return fabs(x-y)<EPSILON, in anderen Worten, liefere TRUE zurück, wenn x von y um höchstens EPSILON abweicht.

Natürlich kann passieren, dass man tatsächlich mit == das richtige bekommt, wenn es keine Rundensfehler gibt. Aber man sollte lieber auf Nummer sicher gehen und die Floats auf meine vorgeschlagene Art und Weise überprüfen.

#define ist ein MAKRO und sagt dem Compiler: Ersetze alle Vorkommen von EPSILON durch .0001. Ja, das mit const könnte man auch so machen.
Wie du das in deinem Programm hinzufügst? Einfach Copy & Paste machen und benutzen.

Meine Frage an dieser Stelle wäre: Wenn du in a und b entweder 1 oder 2 speichern willst, wieso nimmst du denn float und nicht int????

Ich hab schon gesagt, wenn man using namespaces std; benutzt, braucht man std:: vor cout und endl; gar nicht. Das ist eben der Sinn der using Anweisung Aber man kann es trotzdem tun.


ich dachte, dass mit den if-else Block wäre schon gelöst. Was ist nun das Problem?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 08.03.2004 um 22:24 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
09.03.2004, 22:28 Uhr
Cebinem



An Pablo:

DANKE das du dir so viel Arbeit machst mir zu helfen und mir alles
ausführlich erklärst!

Also das mit EPSILON hab ich jetzt so einigermaßen verstanden.

Nun zu deiner ersten Frage:
Warum nehme ich bei a und b (1 und 2) float und nicht int? Nun ja, ich
hab bei meinem ersten Programm (siehe Seite 1) auch mit float gearbeitet
und da hat es ja auch funktioniert und komisch ist ja, dass ich das zweite
Programm mal ganz genauso wie das erste geschrieben hab (nur mit anderen
Variablennamen und Werten, aber mit float) und da hat es funktioniert und
deswegen hab ich mir gedacht ich mach das auch wieder mit float aber schon
ging es irgendwie nicht mehr!

Und da wären wir schon bei deiner zweiten Frage:
Das Problem mit dem if-else Block ist leider noch nicht ganz gelöst.
Also ich hab, wie du es gesagt hast die Zeile


C++:
cout << "\"a\" = " << a <<" " << endl;




ausgeschnitten und direkt über die Zeile


C++:
if (b == BuchstabeB)




eingefügt (die Zeile cout << "\"a\" = " << a <<" " << endl; war dann im Block)
und anschließend kompiliert.
Es hat zwar funktioniert (keine Fehlermeldung), aber wenn ich 1 eingebe erscheint wieder nichts und wenn ich nochmal 1 eingebe erscheint wieder "a" = 1 und eine Zeile darunter auch wieder Keine gueltige Zahl. Und wenn ich 2 eingebe passiert auch nichts und wenn ich nochmal 2 eingebe erscheint nur Keine gueltige Zahl. Ich hab dann noch ein bisschen probiert, aber nichts geht so, wie ich es beabsichtige (siehe auch Seite 1).

Hab ich nun irgendwas falsch ausgeschnitten oder falsch eingefügt oder etwas vergessen oder vertauscht? Und warum kommt erst nach der zweiten Eingabe von 1 und 2 der Text, er soll eigentlich gleich nach der ersten Eingabe erscheinen, hab ich da im Quellcode vielleicht eine Zeile zuviel geschrieben oder so?

Vielen DANK für die Bemühungen mir zu helfen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
09.03.2004, 22:33 Uhr
Pablo
Supertux
(Operator)


Poste mal (per Copy&Paste) deinen Source Code.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
09.03.2004, 23:04 Uhr
Cebinem



Also ich hab 3 Varianten des Programms ausprobiert keine funktioniert, wie ich es beabsichtige.

Variante 1: Zeile cout << "\"a\" = " << a <<" " << endl; mit im Block (wie du gesagt hast)


C++:
#include <iostream>
using namespace std;
int main()
{

float a, b;
const float BuchstabeA = 1;
const float BuchstabeB = 2;
cout << "Bitte Zahl eingeben: " << endl;
cin >> a;
cin >> b;
if (a == BuchstabeA)
{
  cout << "\"a\" = " << a <<" " << endl;
  if (b == BuchstabeB)
   cout << "\"b\" = " << b <<" " << endl;
  else
   cout << "Keine gueltige Zahl." << endl;
}
else // hier wird der Fehler (siehe oben) angezeigt
  cout << "Keine gueltige Zahl." << endl;
cin.ignore();
cin.get();
return 0;
}



Diese Variante funktioniert nicht, weil bei der Eingabe von 1 "a" = 1 und Keine gueltige Zahl erscheint.


Variante 2: Grundgerüst wie 1. Programm (siehe Seite 1)


C++:
#include <iostream>
using namespace std;
int main()
{

float a, b;
const float Buchstabe = 1;
cout << "Bitte Zahl eingeben: " << endl;
cin >> a;
cin >> b;
if (a == Buchstabe)
{
  if (b == Buchstabe + 1)
   cout << "\"b\" = " << b <<" " << endl;
  else
   cout << "\"a\" = " << a <<" " << endl;
}
else
  cout << "Keine gueltige Zahl." << endl;
cin.ignore();
cin.get();
return 0;
}



Diese Variante funtioniert nicht, obwohl sie wie das 1. Programm (siehe Seite 1) aufgebaut ist und das erste Programm (Seite 1) funktioniert.


Variante 3: Ohne else-Anweisung


C++:
#include <iostream>
using namespace std;
int main()
{

float a, b;
const float BuchstabeA = 1;
const float BuchstabeB = 2;
cout << "Bitte Zahl eingeben: " << endl;
cin >> a;
cin >> b;
{
  {
  if (a == BuchstabeA)
   cout << "\"a\" = " << a <<" " << endl;
  }
  if (b == BuchstabeB)
   cout << "\"b\" = " << b <<" " << endl;
}

cin.ignore();
cin.get();
return 0;
}



Diese Variante funktioniert zwar (zweimal muss die 1 oder 2 eingegeben werden) aber ohne eine Ausgabe bei einer Zahl die nicht 1 oder 2 ist (weil else
fehlt), nur dies war nicht beabsichtigt.

Bei allen 3 Varianten muss ich erst zweimal die 1 oder die 2 eingeben, damit eine Ausgabe als Text erfolgt, warum?

MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
10.03.2004, 01:35 Uhr
~toxic
Gast


hallo,
ich bin zwar kein ANSIer aber das ist eigentlich nicht schwer, dein problem ist offenbar das du mit dem if-else nicht ganz klar kommst... hier mal ein paar beispiele:

C++:
int a=0, b=1;

if ( a == b )
{
// dieser block wird ausgeführt wenn a gleich b ist
}
else
{
// dieser block wird dann ausgeführt wenn a nicht gleich b ist
// also immer dann wenn das obige if NICHT zutrifft
}

// mann kann jetzt natürlich auch sowas schachteln,
// dazu ist es aber unbedingt erforderlich den code "gescheit" einzurücken
// sonst verliert man schnell die übersicht

if ( a == 0 )
{
     cout << " a ist NULL " << endl;
     if ( b == 0 )
          cout << " b ist auch NULL " << endl;
     else
          cout << " b aber nicht " << endl;
}
else
     cout << " a ist alles andere als NULL " << endl;

// die blöcke { } muss man immer dann setzen wenn man mehr als
// EINE anweissung unter(hinter) das if bzw. else schreibt



nun zu deinem code:

C++:
#include <iostream>
using namespace std;
int main()
{
// hier schon mal int nehmen, oder eben den vergleich mit der pabloschen-EPSILON-methode machen
float a, b;
const float BuchstabeA = 1;
const float BuchstabeB = 2;
cout << "Bitte Zahl eingeben: " << endl;
cin >> a;// hier giebst du eine zahl ein
cin >> b;// und hier auch, dh. du musst 2 zahlen eingeben, bevor die if-anweissung überhaupt ausgeführt wird
if (a == BuchstabeA)
{
  cout << "\"a\" = " << a <<" " << endl;
  if (b == BuchstabeB)
// dieser if-zweig wird nur ausgeführt wenn a auch GLEICH BuchstabeA ist !
// sonst kommts garnicht bis hier hin
   cout << "\"b\" = " << b <<" " << endl;
  else
   cout << "Keine gueltige Zahl." << endl;
}
else // dieses else ist eigentlich korrectda es am ende des blocks steht
  cout << "Keine gueltige Zahl." << endl;
cin.ignore();
cin.get();
return 0;
}

also so würde ich den code schreiben... wie gesagt bin kein ANSIer ich benutze kein cin cout und hab daher keine ahnung wie sich so eine zeile (cout << "\"b\" = " << b <<" " << endl in einem if-zweig verhält.

C++:
// ist jetzt nur die main.
int main()
{
    int a, b;
    const int BuchstabeA = 1;
    const int BuchstabeB = 2;
    cout << "Bitte Zahl eingeben: " << endl;

    cin >> a;// a eingeben

    if ( a == BuchstabeA )
    {
         cout << "Zahl a ist eine 1" << endl;
    }
    else
    {
         cout << "Zahl a war keine 1" << endl;
    }

    cin >> b;// b eingeben

    if ( b == BuchstabeB )
         cout << "Zahl b ist eine 2" << endl;
    else
         cout << "Zahl b ist keine 2" << endl;

// jetzt legen wir noch einen zahn zu... ;)
    if ( a == 2 && b == 1 )
         cout << "a ist 2 und b ist 1" << endl;

    cin.ignore();
    cin.get();
    return 0;
}


so das wars... gute nacht !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
10.03.2004, 22:09 Uhr
Cebinem



an alle, die sich die Zeit genommen haben mir zu helfen!!!!!!!!!!!!!!!!!!!

Das Programm funktioniert jetzt richtig!!!!!!!! Das mit if- und else-Anweisungen hab ich jetzt auch verstanden!

Hab jetzt nur noch 2 Fragen:

1.
Wie kann ich fehlerhafte Eingaben abfangen, also wenn der Benutzer statt 1 oder 2 z. B.: d, /, *, rt, =5'j oder irgendein anderes Zeichen oder Symbol eingibt (also keine Zahl)? Mir ist schon klar, dass ein Computer nur mit Zahlen rechnen kann aber gibt es für falsche Eingaben auch eine Funktion oder
einen Befehl, der diese fehlerhaften Eingaben abfängt und ein Meldung ausgibt?

2.
Mein Programm läuft bestens, wenn ich zuerst 1 und dann 2 eingebe. Aber wenn ich erst 2 eingebe erscheint "Keine gueltige Zahl, bitte Reihenfolge beachten." Das selbe passiert wenn ich als letztes 1 eingebe.
Ein weiterer Fehler ist, wenn ich zweimal hintereinander 1 oder 2 eingebe, erscheint beim zweiten mal 1 eingeben wieder "Keine gueltige Zahl, bitte Reihenfolge beachten." und beim ersten mal 2 eingeben auch.

Zum besseren Verständnis:


C++:
// vorher alles richtig geschrieben

cin >> a; // danach cin >> b; (im anderen Block)
cin >> b; // im anderen Block

// gebe ich nun aber als erstes 2 (also b) ein -> "Keine gueltige Zahl, bitte Reihenfolge beachten."
// nochmal 2 (also b) -> "b" = 2

// gebe ich als zweites 1 (also a) ein -> "Keine gueltige Zahl, bitte Reihenfolge beachten."
// 1 beim ersten mal -> "a" = 1

// nachher und dazwischen alles richtig geschrieben



Dies liegt wohl daran, dass ich zuerst cin >> a; und dann cin >> b; deklariert hab, aber wie kann ich diesen logischen Fehler ausschließen (wenn es geht bitte wieder mit if und else)?

Hier nochmal der komplette Quellcode:


C++:
#include <iostream>
using namespace std;
int main()
{
    int a, b;
    const int BuchstabeA = 1;
    const int BuchstabeB = 2;
    cout << "Bitte Zahl eingeben: " << endl;
    cin >> a;
    if (a == BuchstabeA)
    {
         cout << "\"a\" = " << a <<" " << endl;
    }
    else
    {
         cout << "Keine gueltige Zahl, bitte Reihenfolge beachten." << endl;
    }
    cin >> b;
    if (b == BuchstabeB)
    {
         cout << "\"b\" = " << b <<" " << endl;
    }
    else
    {
         cout << "Keine gueltige Zahl, bitte Reihenfolge beachten." << endl;
    }
    cin.ignore();
    cin.get();
    return 0;
}


--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
10.03.2004, 23:18 Uhr
~(un)wissender
Gast


Dein Programm verhält sich korrekt!
Willst du sowas?

C++:
cin >> a;
if(a != BuchstabeA && a != BuchstabeB)
cout << "Weder 1 noch 2!" << endl;
else
cout << a << endl;

cin >> b;
if(b != BuchstabeA && b != BuchstabeB)
cout << "Weder 1 noch 2!" << endl;
else
cout << b << endl;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
11.03.2004, 15:11 Uhr
Cebinem



An Wissender:

Also ich glaub, du hast meine Frage nicht richtig verstanden. Trotzdem DANKE!!!
Mein Programm läuft nur richtig wenn ich zuerst 1 und dann 2 eingebe. Es erscheint "a" = 1 und "b" = 2.
Aber es läuft falsch wenn ich zuerst 2 und dann 1 eingebe. Es erscheint bei beiden Keine gueltige Zahl, bitte Reihenfolge beachten.

Beispiel:


C++:
// vorher alles richtig geschrieben

cin >> a; // danach cin >> b; (im anderen Block)
cin >> b; // im anderen Block

// gebe ich nun aber als erstes 2 (also b) ein -> "Keine gueltige Zahl, bitte Reihenfolge beachten."
// nochmal 2 (also b) -> "b" = 2

// gebe ich als zweites 1 (also a) ein -> "Keine gueltige Zahl, bitte Reihenfolge beachten."
// 1 beim ersten mal -> "a" = 1

// nachher und dazwischen alles richtig geschrieben



1.
Wie kann ich dies verhindern?

2.
Wie kann ich fehlerhafte Eingaben abfangen, also wenn der Benutzer statt 1 oder 2 z. B.: d, /, *, rt, =5'j oder irgendein anderes Zeichen oder Symbol eingibt (also keine Zahl)? Mir ist schon klar, dass ein Computer nur mit Zahlen rechnen kann aber gibt es für falsche Eingaben auch eine Funktion oder
einen Befehl, der diese fehlerhaften Eingaben abfängt und ein Meldung ausgibt?

Hier nochmals der gesamte Quellcode:


C++:
#include <iostream>
using namespace std;
int main()
{
    int a, b;
    const int BuchstabeA = 1;
    const int BuchstabeB = 2;
    cout << "Bitte Zahl eingeben: " << endl;
    cin >> a; // gebe ich hier 2 ein erscheint "Keine gueltige Zahl, bitte Reihenfolge beachten."
    if (a == BuchstabeA)
    {
         cout << "\"a\" = " << a <<" " << endl;
    }
    else
    {
         cout << "Keine gueltige Zahl, bitte Reihenfolge beachten." << endl;
    }
    cin >> b; // gebe ich hier 1 ein erscheint "Keine gueltige Zahl, bitte Reihenfolge beachten."
    if (b == BuchstabeB)
    {
         cout << "\"b\" = " << b <<" " << endl;
    }
    else
    {
         cout << "Keine gueltige Zahl, bitte Reihenfolge beachten." << endl;
    }
    cin.ignore();
    cin.get();
    return 0;
}




Ich hoffe ihr versteht mich!
DANKE für alle Hinweise und jede Hilfe!!!!!!!!!!!!!!!

MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
11.03.2004, 15:37 Uhr
~(un)wissender
Gast



Zitat:

Aber es läuft falsch wenn ich zuerst 2 und dann 1 eingebe. Es erscheint bei beiden Keine gueltige Zahl, bitte Reihenfolge beachten.



Natürlich passiert das, du hast es ja auch so im Quelltext festgelegt, das meinte ich mit, dein Programm verhält sich korrekt.
Wenn du mal mein Codefragment ausprobieren würdest, dann könntest du sehen, dass man die 1,2 in beliebiger Reihenfolge eingeben kann und nicht anderes.
Ich hoffe, dass ist es, was du willst, ansonsten verstehe ich dich nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
11.03.2004, 15:45 Uhr
~Cebinem
Gast


Ok, ich werde es mal ausprobieren. Dein Codefragment sah nur auf den ersten Blick nicht logisch aus, aber wenn ich es mir nochmal durch den Kopf gehen lasse, scheint es wirklich zu funktionieren! Jetzt hast du mich auch verstanden!

an dich und für deine Bemühungen und an die anderen auch!!!!!!!!!!!

MFG
Cebinem
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: