Taschenrechner für Brüche in 3 separaten Dateien



  • Hallo,
    ich soll diesen Code

    #include <iostream>
    using namespace std;
    struct Bruch {
    int a; //Zaehler
    int b; //Nenner
    
    };
    int main () {
    int x;
    struct Bruch op1 = {0,1}, op2 = {0,1};
    struct Bruch Erg_n;
    
    cout << "Operation eingeben +,-,*,/" << endl;
    cin >> x;
    
    cout << "Zeahler und Nenner eingeben:" << endl;
    cin >> op1.a >> op1.b;
    
    cout << "Zeahler und Nenner eingeben:" << endl;
    cin >> op2.a >> op2.b;
    
    // Addition
    if ( x == 1) {
    Erg_n.b = op1.b*op2.b;
    Erg_n.a = op1.a*op2.b + op2.a*op1.b;
    }
    
    // Subtraktion
    if ( x == 2) {
    Erg_n.b = op1.b*op2.b;
    Erg_n.a = op1.a*op2.b - op2.a*op1.b;
    }
    
    // Multiplikation
    if ( x == 3) {
    Erg_n.b = op1.b*op2.b;
    Erg_n.a = op1.a*op2.a;
    }
    
    // Division
    if ( x == 4) {
    Erg_n.b = op1.b*op2.a;
    Erg_n.a = op1.a*op2.b;
    }
    
    int r;
    int z=Erg_n.a;
    int q=Erg_n.b;
    
    do {
    	r = z%q;
    	z = q;
    	q = r;
    } while (q !=0);
    
    cout << Erg_n.a/z << " / " << Erg_n.b/z << endl;
    
    return (0);
    }
    

    aufteilen in
    1. Funktionsimplementierungen
    2. Funktionsprototypen
    3. Taschenrechner – Anwendung, ruft Funktionen aus Funktionsimplementierungen auf

    Schreiben Sie die
    Funktionsdefinitionen in eine separate Implementierungsdatei und die
    Funktionsprototypen in eine separate Headerdatei!
    Verwenden Sie folgende Funktionssignaturen:
     bruch bplus(bruch x, bruch y)
     bruch bminus(bruch x, bruch y)
     bruch bmal(bruch x, bruch y)
     bruch bdurch(bruch x, bruch y)
     void bkuerzen (bruch &x)

    Ich hab mich fast 2 Stunden versucht einzulesen usw.
    Aber ich komm nicht im ansatz weiter, kann mir jemand einen Lösungansatz bzw. einen Vorschlag geben wie ich anfangen soll?


  • Mod

    Bist du ein Kollege von dem hier?
    http://www.c-plusplus.net/forum/311628
    Da habt ihr aber einen feinen Kurs :xmas2: .

    Falls du irgendeine Aussicht auf Beantwortung deiner Frage haben möchtest, solltest du dir dringend mal den ersten Link in meiner Signatur (und Folgelinks) durchlesen. Einfach nur deine Hausaufgaben und "Weh mir! Ich habe keine Ahnung was ich tun soll." ist bloß ein Garant für blöde Witze.



  • dem hier?

    Es muss wohl heißen "der hier" 🕶 👍
    Ist selten, aber es passiert auch mal das eine weibliche Gestalt sich ins Programmierforum verirrt.


  • Mod

    Sone schrieb:

    Es muss wohl heißen "der hier" 🕶 👍
    Ist selten, aber es passiert auch mal das eine weibliche Gestalt sich ins Programmierforum verirrt.

    There are no girls on the internet. :xmas1:



  • das sagst du dem kleinen schnellsprizer sone? 😃
    mutig mutig...



  • Ich versuch mich schon den ganzen Tag daran, aber kann mir jemand sagen wo hier der Fehler ist?

    #include <iostream>
    using namespace std;
    struct Bruch {
    int a; //Zaehler
    int b; //Nenner
    
    };
    int main () {
    int x;
    struct Bruch op1 = {0,1}, op2 = {0,1};
    struct Bruch Erg_n;
    
    cout << "Operation eingeben +,-,*,/" << endl;
    cin >> x;
    
    cout << "Zeahler und Nenner eingeben:" << endl;
    cin >> op1.a >> op1.b;
    
    cout << "Zeahler und Nenner eingeben:" << endl;
    cin >> op2.a >> op2.b;
    
    // Addition
    if ( x == 1) {
    Erg_n.b = op1.b*op2.b;
    Erg_n.a = op1.a*op2.b + op2.a*op1.b;
    }
    
    // Subtraktion
    if ( x == 2) {
    Erg_n.b = op1.b*op2.b;
    Erg_n.a = op1.a*op2.b - op2.a*op1.b;
    }
    
    // Multiplikation
    if ( x == 3) {
    Erg_n.b = op1.b*op2.b;
    Erg_n.a = op1.a*op2.a;
    }
    
    // Division
    if ( x == 4) {
    Erg_n.b = op1.b*op2.a;
    Erg_n.a = op1.a*op2.b;
    
    int r;
    int z=Erg_n.a;
    int q=Erg_n.b;
    
    do {
    	r = z%q;
    	z = q;
    	q = r;
    } while (q !=0);
    
    cout << Erg_n.a/z << " / " << Erg_n.b/z << endl;
    }
    return (0);
    }
    
    bruch kuerzen (bruch x)
    {
    int a, b, r;
    bruch ergebnis =x;
    if (!x.z){
    ergebnis.n = 1;
    return (ergebnis);
    }
    // Kürzen ... return (ergebnis);
    int r;
    int z=Erg_n.a;
    int q=Erg_n.b;
    
    do {
    	r = z%q;
    	z = q;
    	q = r;
    } while (q !=0);
    
    cout << Erg_n.a/z << " / " << Erg_n.b/z << endl;
    
    return (ergebnis);
    }
    

    Ich bekomm immer den Fehler
    g++ -Wall 1.cpp 3.cpp -o 3.exe
    1.cpp:1:1: Fehler: »bruch« bezeichnet keinen Typ


  • Mod

    C++ unterscheidet Groß- und Kleinschreibung.



  • Karold schrieb:

    ...
    aufteilen in
    1. Funktionsimplementierungen
    2. Funktionsprototypen
    3. Taschenrechner – Anwendung, ruft Funktionen aus Funktionsimplementierungen auf

    Schreiben Sie die
    Funktionsdefinitionen in eine separate Implementierungsdatei und die
    Funktionsprototypen in eine separate Headerdatei!
    Verwenden Sie folgende Funktionssignaturen:
     bruch bplus(bruch x, bruch y)
     bruch bminus(bruch x, bruch y)
     bruch bmal(bruch x, bruch y)
     bruch bdurch(bruch x, bruch y)
     void bkuerzen (bruch &x)

    Ich hab mich fast 2 Stunden versucht einzulesen usw.
    Aber ich komm nicht im ansatz weiter, kann mir jemand einen Lösungansatz bzw. einen Vorschlag geben wie ich anfangen soll?

    Hallo Karold,

    Willkommen im C++-Forum.
    Vorne weg eine Frage: Sollst/Willst du C oder C++ lernen?

    In C++ würde man eine struct Bruch schreiben, die über arithmetische Operatoren verfügt. Wie das genau geht, ist z.B. hier beschrieben.

    :xmas2: Werner



  • Jetzt bin ich wenigstens schon weiter, aber ich häng jetzt und find meinen Fehler nicht, wäre super wenn jemand drüberschauen könnte.

    Header

    //Datentyp Bruch
    typedef struct bruch
    {
    int a;
    int b;
    int n;
    int z;
    } bruch;
    //Funktionen
    bruch bplus(bruch x, bruch y);
    bruch bminus(bruch x, bruch y);
    bruch bmal(bruch x, bruch y);
    bruch bdurch(bruch x, bruch y);
    void bkuerzen (bruch &x);
    void print_bruch (const bruch x);
    

    Main

    #include <iostream>
    #include "bruch_fun.h"
    using namespace std;
    
    int main (){
    
    char rechenop=' ';
    struct bruch zahl1={0,0};
    struct bruch zahl2={0,0};
    struct bruch erg={1,1};
    
    do
    {
    cout << "Geben Sie die gewuenschte Operation ein:" << endl;
    cout << "+ = Addition" << endl;
    cout << "- = Subtraktion" << endl;
    cout << ": = Division" << endl;
    cout << "* = Multiplikation" << endl;
    cin >> rechenop;
    cout << "Geben Sie bitte Bruch1 ein:" << endl;
    cin >> zahl1.z >> zahl1.n;
    cout << "Geben Sie bitte Bruch2 ein:" << endl;
    cin >> zahl2.z >> zahl2.n;
    {
    
    // Addition
    if(rechenop=='+')
    {
    erg.n = zahl1.n*zahl2.n;
    erg.z = zahl1.z*zahl2.n + zahl2.z*zahl1.n;
    }
    
    // Subtraktion
    if(rechenop=='-')
    {
    erg.n = zahl1.n*zahl2.n;
    erg.z = zahl1.z*zahl2.n - zahl2.z*zahl1.n;
    }
    
    // Multiplikation
    if(rechenop=='*')
    {
    erg.n = zahl1.n*zahl2.n;
    erg.z = zahl1.z*zahl2.n;
    }
    
    // Division
    if (rechenop==':') 
    {
    erg.n = zahl1.n*zahl2.z;
    erg.z = zahl1.z*zahl2.n;
    }
    
    //Kuerzen
    int r;
    int z=erg.z;
    int q=erg.n;
    
    do {
    	r = z%q;
    	z = q;
    	q = r;
    } while (q !=0);
    
    cout << erg.z/z << " / " << erg.n/z << endl;
    
    return (0);
    }
    

    2te zu einbindende datei mittels
    g++ -Wall Code2.cpp code3.cpp -o calculator.exe

    #include <iostream>
    using namespace std;
    struct bruch {
    int z; //Zaehler
    int n; //Nenner
    
    };
    int main () {
    int x;
    struct bruch zahl1 = {0,1};
    struct bruch zahl2 = {0,1};
    struct bruch erg;
    
    cout << "Operation eingeben +,-,*,/" << endl;
    cin >> x;
    
    cout << "Zeahler und Nenner eingeben:" << endl;
    cin >> zahl1.z >> zahl1.n;
    
    cout << "Zeahler und Nenner eingeben:" << endl;
    cin >> zahl2.z >> zahl2.n;
    
    // Addition
    if ( x == 1) {
    erg.n = zahl1.n*zahl2.n;
    erg.z = zahl1.z*zahl2.n + zahl2.z*zahl1.n;
    }
    
    // Subtraktion
    if ( x == 2) {
    erg.n = zahl1.n*zahl2.n;
    erg.z = zahl1.z*zahl2.n - zahl2.z*zahl1.n;
    }
    
    // Multiplikation
    if ( x == 3) {
    erg.n = zahl1.n*zahl2.n;
    erg.z = zahl1.z*zahl2.z;
    }
    
    // Division
    if ( x == 4) {
    erg.n = zahl1.n*zahl2.z;
    erg.z = zahl1.z*zahl2.n;
    }
    
    //Kuerzen
    int r;
    int z=erg.z;
    int q=erg.n;
    
    do {
    	r = z%q;
    	z = q;
    	q = r;
    } while (q !=0);
    
    cout << erg.z/z << " / " << erg.n/z << endl;
    
    return (0);
    }
    

    Und ich werde bestimmt noch probleme mit dem "Main()" bekommen weil sich das überlagert, hab vesucht des irgendwie wegzunehmen, aber des haut nicht hin 😕



  • Karold schrieb:

    Jetzt bin ich wenigstens schon weiter, aber ich häng jetzt und find meinen Fehler nicht, wäre super wenn jemand drüberschauen könnte.

    Header

    //Datentyp Bruch
    typedef struct bruch
    {
    int a;
    int b;
    int n;
    int z;
    } bruch;
    

    .. und Du bist sicher, dass Euer Kurs irgendwas mit C++ zu tun hat?

    Karold schrieb:

    Und ich werde bestimmt noch probleme mit dem "Main()" bekommen weil sich das überlagert, hab vesucht des irgendwie wegzunehmen, aber des haut nicht hin 😕

    das ist ganz leicht zu lösen. Lösche einfach die Datei code3.cpp - das ist doppelt.

    2.Listing Zeile 24 - das '{' ist zu viel

    2.Listing Zeile 66 fehlt

    } while( cin );
    

    Es fehlt die Implementierung der Funktionen bplus , bminus , usw.und deren Aufruf.

    :xmas2:



  • Warum hast du in dem Bruch "a", "b", "n", und "z"?



  • daddy_felix schrieb:

    Warum hast du in dem Bruch "a", "b", "n", und "z"?

    Weil ich die Variablen in der Header definiern muss, sonst hauts nicht hin.

    Werner Salomon schrieb:

    .. und Du bist sicher, dass Euer Kurs irgendwas mit C++ zu tun hat?

    Es heißt Erinführung in die Programmierung und C++ ist das Thema 😃 aber naja unser Dozent ist einfach nicht das wahre, hör ich einfach von zu vielen Seiten

    [quote="Werner Salomon"]
    Es fehlt die Implementierung der Funktionen bplus , bminus , usw.und deren Aufruf.
    /quote]

    if(calcType=='+')
    {
    erg=bplus(zahl1,zahl2);
    bkuerzen(erg);
    print_bruch(erg);
    }
    

    So so so sah ein teil vom code aus bis ichs geändert habe, aber wie kann ich blus usw implementieren?



  • Karold schrieb:

    daddy_felix schrieb:

    Warum hast du in dem Bruch "a", "b", "n", und "z"?

    Weil ich die Variablen in der Header definiern muss, sonst hauts nicht hin.

    Ich meine, wofür brauchst du vier Member? "n" und "z" sind vermutlich "nenner" und "zaehler", aber was sollen "a" und "b" sein?

    --> Hinweis: aussageklräftige Bezeichner wählen. Jeder, der deinen Code liest, wird es dir danken.



  • Wenn ich mittels
    $g++ –Wall Code2.cpp code3.cpp -o calculator.exe die Taschenrechner–Anwendung erzeugen soll, wie kann man das problem mit den "main()" umgehen?



  • Karold schrieb:

    Wenn ich mittels
    $g++ –Wall Code2.cpp code3.cpp -o calculator.exe die Taschenrechner–Anwendung erzeugen soll, wie kann man das problem mit den "main()" umgehen?

    du brauchst genau eine "main"-Funktion in deinem Projekt. Unabhängig vom Compiler.



  • Jetzt seh ichs grad a und b waren von testvariablen die ich eingefügt habe



  • wenn ich jetzt ein Testprogramm schreibe, dass drüberläuft um alles zu testen stehs bei mir so da

    #include <iostream> 
    #include "bruch_fun.h" 
    using namespace std; 
    
    int main () { 
    // ein Testprogramm für kuerzen() 
    bruch x={3,4}, y={5,6}, z={1,0};
    z = bplus(x, y);
    if (z.z != 19 || z.n!=12)
    cout << "Fehler bei bplus" << endl; 
    }
    

    Nur muss ich ja wieder main() verwenden 😕
    Ich komm einfach nicht drumrum
    wenn ich dann beide compile is wieder der main fehler, ich kanns aber ned weglassen



  • Karold schrieb:

    Jetzt bin ich wenigstens schon weiter, aber ich häng jetzt und find meinen Fehler nicht, wäre super wenn jemand drüberschauen könnte.

    Mit einer genaueren Beschreibung wird es für die anderen einfacher, dir zu helfen.

    Aber warum definierst du die Struktur 2mal? Dann auch noch inkonsistent! Einmal mit 2 Datenelementen und einmal mit 4 Datenelementen. Das ist eine ODR-Verletzung. Du kannst in der einen cpp-Datei doch auch einfach noch deinen Header inkludieren. Um eine Struktur zu definieren benutzen wir in C++ auch kein typedef!

    Karold schrieb:

    struct bruch zahl1={0,0};
    struct bruch zahl2={0,0};
    struct bruch erg={1,1};
    

    In C++ musst du auch struct nicht immer vor dem Struct-Namen schreiben.

    Verwende doch mal sinnige Namen. a, b für Zähler und Nenner ist eine schlechte Wahl. Genauso wie code2.cpp und code3.cpp.

    Vorschlag:

    bruch.hpp

    #ifndef BRUCH_HPP_INCLUDED
    #define BRUCH_HPP_INCLUDED
    
    struct bruch
    {
        long zaehler, nenner;
    
        bruch(long z=0)  // Default- und Konvertierungs-Konstruktor
        : zaehler(z), nenner(1)
        {}
    
        bruch(long z, long n)
        : zaehler(z), nenner(n)
        {}
    };
    
    bruch operator+(bruch links, bruch rechts);
    bruch operator-(bruch links, bruch rechts);
    bruch operator*(bruch links, bruch rechts);
    bruch operator/(bruch links, bruch rechts);
    bruch kuerzen(bruch b);
    void print(bruch b);
    
    #endif
    

    bruch.cpp

    #include <iostream> // fuer print
    #include "bruch.hpp"
    
    bruch operator+(bruch links, bruch rechts)
    {
        :::
    }
    bruch operator-(bruch links, bruch rechts)
    {
        :::
    }
    bruch operator*(bruch links, bruch rechts)
    {
        :::
    }
    bruch operator/(bruch links, bruch rechts)
    {
        :::
    }
    bruch kuerzen(bruch b)
    {
        :::
    }
    void print(bruch b)
    {
        using namespace std;
        :::
    }
    

    main.cpp

    #include <iostream>
    #include "bruch.hpp"
    
    using namespace std;
    
    int main()
    {
      :::
    }
    


  • Karold schrieb:

    Nur muss ich ja wieder main() verwenden 😕
    Ich komm einfach nicht drumrum
    wenn ich dann beide compile is wieder der main fehler, ich kanns aber ned weglassen

    -->

    daddy_felix schrieb:

    du brauchst genau eine "main"-Funktion in deinem Projekt. Unabhängig vom Compiler.

    Hinweis: Projekt != Datei



  • Karold schrieb:

    Nur muss ich ja wieder main() verwenden 😕
    Ich komm einfach nicht drumrum
    wenn ich dann beide compile is wieder der main fehler, ich kanns aber ned weglassen

    Nur dass ich Dich recht verstehe.
    Du hast eine Header-Datei mit der Definition von Bruch und einigen Prototypen

    // bruch.h
    // definiert die Klasse Bruch
    // und deklariert Funktionsprototypen
    
    #ifndef BRUCH_H
    #define BRUCH_H
    struct Bruch{
      int z;
      int n;
    };
    
    // gibt einen Bruch nach std::cout aus
    void print_bruch(const Bruch&);
    #endif
    

    Dann hast Du eine Datei mit den Implementierungen der Funktionen:

    // bruch.cc
    
    #include <iostream>  // std::cout
    #include "bruch.h"
    
    // gibt einen Bruch nach std::cout aus
    void print_bruch(const Bruch& b){
      std::cout << b.z << '/' << b.n << '\n';
    }
    

    Und dann hast Du eine(!) weitere Quelldatei mit Deinem Programmcode

    #include "bruch.h"
    
    int main(){
      Bruch b = { 47, 11 }; // siebenundvierzig-elftel
      print_bruch(b);
    }
    

    Und dann dengelst Du alles zusammen:

    FurbleWurble@sinsemilla /tmp $ g++ -c bruch.cc -o bruch.o
    FurbleWurble@sinsemilla /tmp $ g++ -o test test.cc bruch.o
    FurbleWurble@sinsemilla /tmp $ ./test 
    47/11
    FurbleWurble@sinsemilla /tmp $
    

    Genau eine main() Funktion...


Anmelden zum Antworten