Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.06.2016, 20:30

[C++] Brauche Hilfe bei der Fehlersuche im Code für einen "Taschenrechner"

Heyho ihr fleißigen Spieleprogrammierer :)

ich habe erst vor kurzem mit C++ begonnen und heute mal versucht die erste längere Aufgabe zu lösen. Entstehen sollte ein kleiner "Taschenrechner". Leider werden mir immer wieder verschiedene Fehlermeldungen angezeigt und wenn ich das Programm dann endlich zum Starten bringe, passiert leider nicht das, was ich mir erhoffe. Ich dachte, dass mir vielleicht einer von euch helfen und mir sagen kann, wo der Fehler liegt? Ich versuche mich gerade an Funktionen und den Switch-Case-Befehlen, es kann also gut sein, dass das alles ziemlicher Käse ist. Ich habe nun schon stundenlang rumprobiert und trete irgendwie auf der Stelle.

Worauf ich hinaus will ist eben, wenn ich den Anfangsbuchstaben der Rechenart eingebe, dass ich dann durch Eingabe zweier Zahlen ein ergebnis bekomme. Bisher tauchten aber immer Fehlermeldungen á la "no match for operator <<"; "too few arguments" usw auf, besonders in Zeile 21, wo offenbar ein größeres Problem vorliegt. Das eine oder andere Mal habe ich es dann geschafft das Programm vermeintlich fehlerfrei zu starten, doch dann konnte ich keine vernpnftige Eingabe machen. Immer, wenn ich einen Buchstaben eigegeben habe, wurde der zwar angezeigt, aber es passierte nichts, bis ich Enter gedrückt habe und dann wurde das Programm komplett beendet. Außerdem konnte ich so viele Buchstaben hintereinander hängen wie ich wollte, auch solche, die in der Auflistung nicht auftauchen, das ist natürlich auch nicht ganz das Ziel der Übung gewesen..

Vielleicht wird ja einer von euch schlau aus dieser Code-Fehler-Suppe^^

C-/C++-Quelltext

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>

using namespace std;

void addition(float x, float y);
void subtraktion(float x, float y);
void multiplikation(float x, float y);
void division(float x, float y);


int main (void)
{
    cout << "Druecke A fuer Addition, S fuer Subtraktion, M fuer Multiplikation und D fuer Division. Zum Beenden druecke E." << endl;
    
    float x,y;
    char wahl;
    cin >> wahl;
    
    switch( wahl ) {
        case 'a':
        case 'A': cout << addition(x,y)
            break;
        case 's': 
        case 'S': cout << subtraktion();
            break;
        case 'm': 
        case 'M': cout << multiplikation();
            break;
        case 'd': 
        case 'D': cout << division();
            break;
        case 'e':
        case 'E':
            return 0;
        default: 
                cout << "Ungueltige Eingabe. Das Programm wird beendet";
            
    cin.sync();
    cin.get();
    return 0;
    
}

cout << "" << endl;
return main();


}


void addition();
{
    float x,y;
    cout << "Zahl 1 eingeben: ";
    cin >> x;
    cout << "Zahl 2 eingeben: ";
    cin >> y;
    return x+y;
}

void subtraktion(float x, float y);
{
    float x, y;
    cout << "Zahl 1 eingeben: ";
    cin >> x;
    cout << "Zahl 2 eingeben: ";
    cin >> y;
    return x - y;
}

void multiplikation(float x, float y);
{
    float x, y;
    cout << "Zahl 1 eingeben: ";
    cin >> x;
    cout << "Zahl 2 eingeben: ";
    cin >> y;
    return x * y;
}

void division(float x, float y);
{
    float x, y;
    cout << "Zahl 1 eingeben: ";
    cin >> x;
    cout << "Zahl 2 eingeben: ";
    cin >> y;
    return x / y;
}



achja, durch meine herumprobiererei tauchen an manchen Stellen Variablen auf und an anderen nicht, wo sie möglicherweise hingehören, das habe ich vor allem gemacht, um Fehler auszumerzen und zu sehen, ob es klappt bzw was passiert.

Danke schonmal im Voraus an alle, die sich damit beschäftigen und euch einen schönen Abend :)

Liebe Grüße,
Arriey

2

02.06.2016, 20:38

* deine Funktion gibt keinen Wert zurück
* die Add-Funktion nimmt keine Parameter
* doppelte Variablen in den Funktion
* keine Eingabe der Zahlen
...
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

02.06.2016, 20:38

Oh je, in deinem Programm ist leider fast alles falsch. Lies doch bitte die Fehlermeldungen des Compilers sorgfältig, dann solltest du die meisten Fehler schon finden.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

03.06.2016, 11:28

Nachdem ich dummerweise meinen Text grad gelöscht habe gibts jetzt ne kürzere Variante ;)

Wenn du mit einem Buch arbeitest, geh noch mal ein paar Kapitel zurück und guck dir die Sachen noch mal vernünftig an. Sind Aufgaben in dem Buch vorhanden versuch sie vernünftig zu lösen. Das sollte schon mal allgemein weiter helfen.
Davids Tipp ist wichtig. Versuch die Fehlermeldungen zu verstehen. Auch wenn diese am Anfang etwas kryptisch wirken ist es unglaublich wichtig zu verstehen was der Compiler dir sagen will. Versuch die Fehlermeldungen die dir genannt werden den Fehlern zuzuordnen. Dann ist dir beim nächsten mal klarer was das ganze soll.
Deine Deklarationen der 4 Funktionen oben sagen aus dass die Funktionen jeweils nichts zurück geben und jeweils 2 Parameter vom Typ float erwarten. In Main rufst du die Funktionen ohne Parameter auf und erwartest einen Rückgabewert den du an den Stream geben möchtest. Der Compiler wird sich vermutlich beschweren dass er die Funktion "int subtraktion(void)" oder so nicht kennt. Bei der Variante mit der Addition übergibst du noch Werte, in denen steht aber nichts drin. Das wirkt auf mich so als hättest du einfach Code geschrieben um die Fehler zu lösen ohne zu wissen was du da tust. Das ist schlecht und zeigt dass du vorher etwas nicht verstanden hast.
In Zeile 21 fehlt das abschließende Semikolon. Fehler werden hier meistens für den Anfang der nächsten Zeile angezeigt. Für den Compiler ist es so als wäre das Statement in Zeile 21 nicht abgeschlossen und würde in Zeile 22 weiter gehen. Er sollte sich über unerwartete Statements/Token oder was auch immer in Zeile 22 beschweren.
Bei den Funktionsdefinitionen unten ist auch einiges falsch. Sie unterscheiden sich teilweise von ihren Deklarationen was vermutlich nicht gewünscht war, addition hat in diesem Fall keine Parameter, alle anderen schön, bei der Verwendung der Funktionen machst du es übrigens genau anders herum, wirkt alles recht willkürlich. Die Funktionen haben Rückgabetyp void, sollen also nichts zurück geben, dennoch gibst du Ergebnisse zurück. Das soll ja vermutlich auch so sein, dann musst du den Funktionen eben einen vernünftigen Rückgabetyp verpassen. Allgemein solltest du dich entscheiden ob die Werte von der Konsole direkt in den Funktionen eingelesen werden sollen so wie es aktuell ist, dann kannst du die Parameter x und y entfernen, oder ob du die Parameter erst einlesen willst und dann an die jeweiligen Funktionen weiter geben möchtest.
Fehlermeldungen für diese Funktionsgeschichten werden übrigens sein dass die aufgerufenen Funktionen nicht vom Linker gefunden werden. Bei den Definitionen unten wird er sich über den Rückgabetyp beschweren, bzw über das return-Statement.
Als letztes fällt mir auf dass Main sich selbst aufruft. Das ist mist. Du willst in diesem Fall eine einfache Schleife. Dann benutz auch einfach eine Schleife. An sich ist Rekursion nicht ungewöhnlich, bei Main habe ich es aber selbst noch nie gesehen oder benutzt und es wirkt auf mich ziemlich befremdlich. Wie gesagt ich würde statt der Rekursion eine Schleife benutzen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

03.06.2016, 20:32

@Schorsch: Vielen lieben Dank für die hilfreiche Antwort! Du hast Recht, das Ding mit den Funktionen ist mir tatsächlich noch nicht ganz klar und ich werde noch einmal von vorne anfangen bzw mir das entsprechende Kapitel noch einmal vornehmen. Ich danke dir für die Tipps und auch für die detaillierte Rückmeldung! Tut mir Leid, dass du dir die Mühe zweimal machen musstest, sowas ist wirklich nervig :S

Und auch den anderen beiden vielen Dank. Sobald ich das nochmal durchgearbeitet habe, starte ich einen neuen Versuch, der dann hoffentlich glückt^^

Liebe Grüße

Lindraupe

Frischling

Beiträge: 62

Wohnort: Wien

  • Private Nachricht senden

6

03.06.2016, 22:47

Ist zwar kein Fehler, geht halt einfacher: statt

C-/C++-Quelltext

1
cout << "" << endl;

kannst du folgendes schreiben

C-/C++-Quelltext

1
cout << endl;

7

09.06.2016, 17:36

So, nachdem ich mich jetzt nochmal eingehend mit Funktionen usw beschäftigt habe, hab ich es nun endlich geschafft, den Taschenrechner fertig zu machen :) danke euch nochmal für die Hilfe und Denkanstöße. Falls es jemanden interessiert, poste ich mal den neuen Code. Es gibt sicherlich immer noch das eine oder andere, das sich verbessern lässt, aber er ist zumindest schonmal funktionsfähig :)

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
 # include <iostream>

using namespace std;

int addition(int a1, int a2){
  return a1+a2;
}

int subtraktion(int s1, int s2){
  return s1-s2;
}

int multiplikation(int m1, int m2){
  return m1*m2;
}

int division(int d1, int d2){
  return d1/d2;
}



int main (){

  int a1,a2,s1,s2,m1,m2,d1,d2,auswahl;

      

  cout << "Waehle die gewuenschte Rechenart." << endl;
  Anfang: cout << "1 - Addition" << endl;
  cout << "2 - Subtraktion" << endl;
  cout << "3 - Multiplikation" << endl;
  cout << "4 - Division" << endl;
  cout << "5 - Beenden" << endl;
  cout << endl;

  cin >> auswahl;

  while(auswahl > 0 && auswahl <=4){
    
    switch(auswahl){
    
  case 1:
    cout << endl;
    cout << "Du moechtest also addieren." << endl;
    cout << "Bitte gib Zahl 1 ein: ";
    cin >> a1;
    cout << "Und nun Zahl 2: ";
    cin >> a2;
    cout << "Das Ergebnis lautet: " << addition(a1,a2) << endl;

    cout << endl;
    cout << "Wie moechtest Du weitermachen? Triff eine Auswahl!" << endl;
    goto Anfang;
    break;

  case 2:
    cout << endl;
    cout << "Du moechtest also subtrahieren." << endl;
    cout << "Bitte gib Zahl 1 ein: ";
    cin >> s1;
    cout << "Und nun Zahl 2: ";
    cin >> s2;
    cout << "Das Ergebnis lautet: " << subtraktion(s1,s2) << endl;

    cout << endl;
    cout << "Wie moechtest Du weitermachen? Triff eine Auswahl!" << endl;
    goto Anfang;
    break;

  case 3:
    cout << endl;
    cout << "Du moechtest also multiplizieren." << endl;
    cout << "Bitte gib Zahl 1 ein: ";
    cin >> m1;
    cout << "Und nun Zahl 2: ";
    cin >> m2;
    cout << "Das Ergebnis lautet: " << multiplikation(m1,m2) << endl;

    cout << endl;
    cout << "Wie moechtest Du weitermachen? Triff eine Auswahl!" << endl;
    goto Anfang;

    cin >> auswahl;
    break;

  case 4:
    cout << endl;
    cout << "Du moechtest also dividieren." << endl;
    cout << "Bitte gib Zahl 1 ein: ";
    cin >> d1;
    cout << "Und nun Zahl 2: ";
    cin >> d2;
    cout << "Das Ergebnis lautet: " << division(d1,d2) << endl;
    
    cout << endl;
    cout << "Wie moechtest Du weitermachen? Triff eine Auswahl!" << endl;
    goto Anfang;
    
    
    break;

  }
  }

   if (auswahl == 5){
    
    cout << endl;
    cout << "Das Programm wird beendet...." << endl;
   }
   else{
    cout << endl;    
    cout << "Du solltest dir doch eine Zahl zwischen 1 und 5 aussuchen und nicht " << auswahl << "!" << endl;
    cout << "Wie moechtest Du weitermachen? Triff eine Auswahl." << endl;
    goto Anfang;
   }
  

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

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

09.06.2016, 18:07

Du solltest dir goto ganz schnell wieder abgewöhnen. Es gibt nur SEEEEEHR selten (bis gar nicht) wirkliche Situationen, in denen ein goto sinnvoll ist.

Lindraupe

Frischling

Beiträge: 62

Wohnort: Wien

  • Private Nachricht senden

9

09.06.2016, 18:33

Du könntest goto ersetzten indem du z.B. eine do-while Schleife um das ganze machst ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

10.06.2016, 13:05

Es gibt nur SEEEEEHR selten (bis gar nicht) wirkliche Situationen, in denen ein goto sinnvoll ist.

Gibt es nicht :) An sich gibt es für jeden Anwendungsfall von Goto vernünftigere schönere Lösungswege. Deshalb ist Goto ja mittlerweile kaum noch in Sprachen zu finden.

Hier möchtest du eigentlich eine Schleife einsetzen. While bzw do-While wären die Stichwörter, wie Lindraupe schon richtig angesprochen hat.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige