You are not logged in.

  • Login

1

Wednesday, August 8th 2007, 10:21pm

Unbekanntes Problem

HI,
zur Abwechslung mal wieder was Banales ;-)
War nur so eine Spielerei zwischendurch, aber es funktioniert iwie nicht...

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <string>
 
using namespace std;
 
int beenden();
 
float dividend;
float divisor;
float ergebnis;
 
 
int main (void)
{
  cout << "\nD I V I S I O N" << endl << endl
   	<< "Bitte Eingabe:" << endl;
 
  cin >> dividend;
  cin >> divisor;
 
  if ( (dividend == false) || (divisor == false) || (divisor == 0) ) {
   	cout << "Fehler bei Eingabe!" <<endl;
 
   	beenden();
   	}
 
 
  cout << "Das Ergebnis lautet " << dividend / divisor << endl;
 
  beenden();
 
 
}
 
int beenden()
{
	char eingabe;
 
	cout << "\nb fuer Beenden \nw fuer weiter";
 
	cin >> eingabe;
 
	if (eingabe == 'b') {
   	exit (1);
   	}
	else {
     	main();
     	}
}


Es sollen zwei Zahlen eingegeben werden, das Programm soll prüfen, ob sie für eine Division passen und dann das Ergebnis ausgeben. Bei Fehler soll in die Beenden- Funktion gesprungen werden. Wenn man jetzt wirklich einen Buchstaben statt einer Zahl eingibt, stürzt das Programm aber ab...

Danke schonmal,
Alex

2

Wednesday, August 8th 2007, 10:35pm

Mach kein C++ und weiß nicht ob das hilft: divident und divisor sind zwei Variablen vom Typ float. Du solltest sich nicht auf false vergleichen. Du prüfst die Eingaben nie, entweder du liest einen String ein und wandelst dann sicher um oder liest anders von stdin ein. Die Variable Ergebnis wird nicht verwendet.

3

Thursday, August 9th 2007, 9:46am

Also ich vermute mal dass der Eingabestream durch deine "fehlerhafte" eingabe in einen ungültigen Zustand versetzt wird (->fail-bit). Dadurch könnte die 2. eingabeaktion zu Problemen führen.

Die überprüfung auf false ist IMHO unsinnig, der Compiler dürfte das zuerst in int konvertieren und dann auf != 0 prüfen.

EDIT://
Bei mir geht er da in eine art Endlosschleife die in einem Segmentation fault endet ...

4

Friday, August 10th 2007, 5:17pm

Also, das mit der Überprüfung an sich funktioniert schon, wenn man z.B. einfach

C/C++ Quellcode

1
if ( (cin>> eingabe) == false) {}


macht, das geht.

5

Friday, August 10th 2007, 7:34pm

Was heißt "das geht"?

1. Das lässt sich kompilieren
2. Das macht sogar twas sinnvolles und prüft ob überhaupt etwas eingegeben wurde.
oder 3. Das prüft ob etwas eingeben wurde und wenn ja obs auch zum Datentyp passt.

Mach nach jedem cin einfach mal:

C/C++ Quellcode

1
2
3
4
5
...
if (cin.fail()) {
//FEHLER!!!! 
}
...

6

Saturday, August 11th 2007, 11:05am

C/C++ Quellcode

1
if ( (cin>> eingabe) == false) {}


Dürfte schon das erwartete tun, da cin.operator>>() einen istream zurückgibt der sich auf true/false prüfen lässt.

In diesem Sinne wird aus:

C/C++ Quellcode

1
2
3
4
5
6
7
8
cin >> dividend;
 
  cin >> divisor;
 
   if ( (dividend == false) || (divisor == false) || (divisor == 0) ) {
   	cout << "Fehler bei Eingabe!" <<endl;
    	beenden();
   	}


ein

C/C++ Quellcode

1
2
3
4
5
if ( !(cin>>dividend) || !(cin>>divisor) || divisor==0)
{
    cout << "Fehler bei der Eingabe" << endl;
    beenden();
}

7

Monday, August 13th 2007, 2:16pm

Hi,
erstmal Danke für eure schnellen Antworten ... Das Programm läuft aber immer noch nicht; ist ja nicht so, dass es sonderlich wichtig wäre, aber mich würde schon interessieren, warum es nicht funzt.
Denke eher, es handelt sich um ein logisches Problem, deswegen auch die Endlosschleife.oder? Ist denn der main() - Aufruf in Zeile 47 so einfach zulässig?

Danke, Alex

8

Monday, August 13th 2007, 5:39pm

Ist denn der main() - Aufruf in Zeile 47 so einfach zulässig?

Warum riskieren. Unschön ist es allemal ;-)

9

Wednesday, August 15th 2007, 10:53am


Ist denn der main() - Aufruf in Zeile 47 so einfach zulässig?

Warum riskieren. Unschön ist es allemal ;-)
Und wenn du es lange genug machst, bekommst du einen Stack-Overflow :)

10

Wednesday, August 15th 2007, 12:48pm

Ist denn der main() - Aufruf in Zeile 47 so einfach zulässig?



Genau das habe ich mich auch gerade gefragt.

Aber anscheinend geht es, ist aber wirklich nicht von Vorteil :) :

Ist denn der main() - Aufruf in Zeile 47 so einfach zulässig?

Warum riskieren. Unschön ist es allemal ;-)
Und wenn du es lange genug machst, bekommst du einen Stack-Overflow :)

Social bookmarks