Schaltung mit boolesche Operation berechnen



  • Hallo Zusammen, ich hab wieder eine neue Aufgabenstellung bekommen:
    https://ibb.co/gTf9WYh

    In der folgenden Abbildung ist eine Schaltung angegeben, die zu
    den Booleschen Eingangssignalen a0, a1 und a2 die Ausgabewerte
    b0, b1 und b2 berechnet. Schreiben Sie eine C++ Prozedur
    void berechne b(bool a[], bool b[]) ,
    die aus dem Eingabevektor a der Lange 3 den Ausgabevektor b
    berechnet. Realisieren Sie dazu die Gatter mit Hilfe der Booleschen
    Operatoren &&(AND), jj(OR) und !(NOT).

    Mein Ansatz ist wie gefolgt:

    int main(){
    
    //Aufgabe 3.a)
    void berechne_b(bool a[], bool b[])
    
    {
    bool b[0]= !a[0];
    bool b[1]= (a[0] && a[1]) || (!a[0] * a[1]);
    bool b[2]= ((a[0] && a[1]) || (a[0] && a[1] && a[])) && !(a[0] && a[1] && a[2]);
    }
    

    Ist der Grundansatz richtig?
    wie pack ich das ganze in eine Prozedur, oder wie kann ich die Rechnung damit realisieren?
    Danke mal wieder für eure Hilfe!:-)



  • @steven-w sagte in Schaltung mit boolesche Operation berechnen:

    Ist der Grundansatz richtig?

    Was ist „der Grundsatz“?

    wie pack ich das ganze in eine Prozedur, oder wie kann ich die Rechnung damit realisieren?

    Erkläre die Frage



  • @steven-w sagte in Schaltung mit boolesche Operation berechnen:

    wie pack ich das ganze in eine Prozedur,

    Hast du doch schon - nennt sich in C++ Funktion
    Allerdings werden Funktionen außerhalb von main definiert.

    Du musst die jetzt noch aufrufen und mit dem Ergebnis etwas machen.



  • @steven-w sagte in Schaltung mit boolesche Operation berechnen:

    void berechne_b(bool a[], bool b[])
    {
    bool b[0]= !a[0];

    Das geht doch so nicht. Es ist doch schon b im Parameter deklariert. Also kein Wiederholen des Datentyps beim Zugriff.

    Nicht: bool b[0]= !a[0];
    Sondern: b[0] = !a[0];

    Und bitte bitte benutze
    ```
    code
    ```
    damit der Code lesbar wird, du bist doch nicht erst seit heute hier im Forum.

    PS: mir ist das Bild tatsächlich zu klein, um da gut was erkennen zu können. Zumindest das b[0] sieht richtig aus, die anderen habe ich nicht geprüft.



  • 3. In Dieser Aufgabe soll das Verhalten einer Schaltung durch ein C++ Programm simuliert werden.
    a) In der folgenden Abbildung ist eine Schaltung angegeben die zu den Boolschen Eingagssignalen
       a0, a1 und a2 die Ausgabewerte b0, b1 und b2 berechnet. Scheiben Sie eine C++ Prozedur
       void berechne_b(bool a[], bool b[]) die aus dem Eingabevector a der Länge 3 den Ausgabevektor
       b berechnet. Realisieren Sie dazu die Gatter mit Hilfe der Boolschen Operatoren && (AND), || (OR) und !(NOR).
    
    
            ┌───┐
    a0 ───┬─│ 1 │o─────────────────────────── b0
          │ └───┘
          │    ┌───┐
          ├────│ & │
          │ ┌─o│   │──┐
          │ │  └───┘  │ ┌──────┐
          │ │         └─│ >= 1 │───────────── b1
          │ │  ┌───┐  ┌─│      │
          ├─│─o│ & │──┘ └──────┘
    a1 ───│─┼──│   │
          │ │  └───┘
          │ │  ┌───┐    ┌─────┐   ┌───┐
          │ ├──│ & │────│ >=1 │───│ & │────── b2
          ├────│   │  ┌─│     │ ┌─│   │
          │ │  └───┘  │ └─────┘ │ └───┘
          │ │         │         │
    a2 ─┬─│─│─────────┘         │
        │ │ │  ┌───┐            │
        │ │ └──│   │            │
        │ └────│ & │o───────────┘
        └──────│   │
               └───┘
    


  • Bei b[1] hast a Negation übersehen und was soll die Multiplikation da??

    void berechne_b(bool a[], bool b[])
    {
        b[0] = !a[0];
        b[1] = (a[0] && !a[1]) || (!a[0] && a[1]);
        //     |________________________________|
        //       was für eine Operation ist das?
        b[2] = ((a[0] && a[1]) || a[2]) && !(a[0] && a[1] && a[2]);
    }
    


  • @Swordfish Die Multiplikation macht da natürlich garkeinen Sinn. Hatte es glaube als ODER interpretiert. Ist dein Vorschlag die Korrektur davon?



  • @steven-w Mein "Vorschlag" ist das was in der Schaltung steht.



  • @Swordfish Danke



  • Kennt jemand diese beiden Gatter?

    A)
      ┌───┐
    ──│ ? │──
      └───┘
    B)
      ┌───┐
    ──│ ? │o──
      └───┘
    


  • @Swordfish
    Coole ASCII Art Grafik. Wusste gar nicht dass das hier geht.

                      __ __
                    ,;::\::\
                  ,'/' `/'`/
              _\,: '.,-'.-':.
             -./"'  :    :  :\/,
              ::.  ,:____;__; :-
              :"  ( .`-*'o*',);
               \.. ` `---'`' /
                `:._..-   _.'
                ,;  .     `.
               /"'| |       \
              ::. ) :        :
              |" (   \       |
              :.(_,  :       ;
               \'`-'_/      /
                `...   , _,'
                 |,|  : |
                 |`|  | |
                 |,|  | |
             ,--.;`|  | '..--.
            /;' "' ;  '..--. ))
            \:.___(___   ) ))'
                   SSt`-'-''
    

    @DocShoe
    Wenn man ? durch eine 1 ersetzt, kenne ich Gatter B als NOT Gatter.

    Ein anderes Gatter mit einem Eingang und einem Ausgang kenne ich nicht.



  • @DocShoe RND? -.-
    @Quiche-Lorraine Wennst noch statt ``` ein ```plain machst wirds nicht so bunt.



  • Erstmal danke für eure Hilfe. Ich hätte eine letzte Frage dazu:
    Wenn man a0, a1, a2 eine 0 eingibt wird grafisch ein E ausgegeben. Wie kann ich nach der Schleife, die Werte von berechne_b an a übergeben und mir eine zweite grafische Ausgabe ausgeben lassen?

    #include <iostream>
    using namespace std;
    
    //Aufgabe 3.a)
    void berechne_b(bool a[], bool b[])
    {
    b[0]= !a[0];
    b[1] = (!a[0] && a[1]) || (a[0] && !a[1]);
    b[2] = (!(a[0] && a[1] && a[2])) && ((a[0] && a[1]) || a[2]);
    }
    
    //Aufgabe 3.b
    void berechne_c(bool b[], bool c[])
    {
    c[0] = (b[0] && !b[2] || !b[0] && b[2]);
    c[1] = !b[0] && !b[1] && b[2];
    c[2] = !b[0] && b[2];
    c[3] = b[2] && !(b[0] && b[1]) || b[0] && !b[1] && !b[2];
    c[4] = !(b[0] && b[1] && b[2]) || b[0] && b[1] && b[2];
    c[5] = b[2] && !(b[0] && b[1]) || b[0] && !b[2];
    c[6] = !b[2] && (b[0] || b[1]) || !b[0] && b[1] && b[2];
    }
    
    bool a[3];
    bool b[3];
    bool c[6];
    
    int main(){
    
    
    cout << "Gebe a0 ein" << endl;
    cin >> a[0];
    
    cout << "Gebe a1 ein" << endl;
    cin >> a[1];
    
    cout << "Gebe a2 ein" << endl;
    cin >> a[2];
    
    berechne_b(a, b);
    cout << "--Berechnung der Ausgänge B--" << endl;
    cout << "" << endl;
    cout << "Ausgang B0 ist: " << b[0] << endl;
    cout << "Ausgang B1 ist: " << b[1] << endl;
    cout << "Ausgang B2 ist: " << b[2] << endl;
    
    berechne_c(b, c);
    cout << "--Berechnung der Ausgänge C--" << endl;
    cout << "" << endl;
    
    cout << "Ausgang C0 ist: " << c[0] << endl;
    cout << "Ausgang C1 ist: " << c[1] << endl;
    cout << "Ausgang C2 ist: " << c[2] << endl;
    cout << "Ausgang C0 ist: " << c[3] << endl;
    cout << "Ausgang C1 ist: " << c[4] << endl;
    cout << "Ausgang C2 ist: " << c[5] << endl;
    cout << "Ausgang C2 ist: " << c[6] << endl;
    
    
    //Aufgabe 3.c
    //000= E
    //
    
    
    {
    
    if (c[0] == 1)
        cout << "* * * * " << endl;
    else
        cout << "         " << endl;
    if (c[5] == 1)
        cout << "";
    else
        cout << " ";
    if (c[1] == 1)
        cout << "       " << endl;
    else
        cout << "        " << endl;
    if (c[5] == 1)
        cout << "";
    else
        cout << " ";
    if (c[1] == 1)
        cout << "       " << endl;
    else
        cout << "        " << endl;
    if (c[6] == 1)
        cout << "* * * " << endl;
    if (c[4] == 1)
        cout << "";
    else
        cout << " ";
    if (c[2] == 1)
        cout << "       " << endl;
    else
        cout << "        " << endl;
    if (c[4] == 1)
        cout << "";
    else
        cout << " ";
    if (c[2] == 1)
        cout << "       " << endl;
    else
        cout << "        " << endl;
    if (c[3] == 1)
        cout << "* * * *" << endl;
        cout << "" << endl;
    }
    }
    


  • @steven-w sagte in Schaltung mit boolesche Operation berechnen:

    Wenn man a0, a1, a2 eine 0 eingibt wird grafisch ein E ausgegeben. Wie kann ich nach der Schleife, die Werte von berechne_b an a übergeben und mir eine zweite grafische Ausgabe ausgeben lassen?

    Wat? Werte von berechne_b an a übergeben? Was soll das sein, in berechne_b wird das globale Array C beschrieben, da stehen dann doch die "Werte" von berechne_b drin? Und man übergibt Werte an Funktionen, aber nicht an Arrays, meinst du eine Zuweisung? Ich versteh´ die Frage nicht...

    Hilfestellung zu oben:
    Gatter A) ist ein "Warum," damit dürfte B auch klar sein 😉



  • @DocShoe Dann verstehe ich meine Aufgabenstellung nicht:

    Erweitern Sie Ihr Hauptprogramm um eine Schleife, um die Schaltung
    im \Dauerbetrieb" zu simulieren. Dazu sollten Sie willkurlich
    a = (0; 0; 0) als erste Eingabe festlegen und daraus b und c fur die erste
    LCD-Anzeige berechnen. Dann weisen Sie die Werte des Vektors
    b als neue Eingabe dem a zu und erzeugen die zweite LCD-Anzeige,
    u.s.w.. Auf diese Weise ergibt sich eine Folge von Ausgabezeichen.
    Uberlegen Sie sich, wie oft Sie die Schleife ausfuhren mussen, um
    alle erzeugten Zeichen einmal gesehen zu haben.



  • Dazu solltest du deinen Quelltext so umbauen, dass es für die verschiedenen Aufgaben (Berechnung, Ausgabe, etc.) eigene Funktionen gibt. Anschließend solltest du das laut Aufgabenstellung einfach runterschreiben können (ich halte mich mal an deinen Quelltext mit globalen Variablen. Da sie global sind schlage ich mich dann auch nicht mehr mit Parametern für die Funktionen rum. Das ganze Programm ist aber stark verbesserungswürdig und sieht mehr nach C als C++ aus.):

    bool A[3];
    bool B[3]:
    bool C[6];
    
    void initialize_data()
    {
        A[0] = false;
        A[1] = false;
        A[2] = false;
    }
    
    void process_data()
    {
       // Werte des Arrays B und C berechnen, hast du ja schon
    }
    
    void print_data()
    {
        // Ausgabe gemäß der Werte in C, hast du ja auch schon
    }
    
    void update_data()
    {
       // hier sollen die Werte von B als neue Eingabewerte benutzt werden.
       // Was sind deine Eingabedaten? (steht in der Aufgabe)
       // Wie werden die Eingabedaten aktualisiert? (steht auch in der Aufgabe)
    }
    
    int main()
    {
        intialize_data();
        while( true )
        {
           // Daten auswerten
           process_data();
    
           // berechnete Daten ausgeben
           print_data();
    
           // neue Eingabedaten bestimmen
           update_data();
       }
    }
    

    Edit:
    Warum werden in der Aufgabenstellung bool-Werte eigentlich mit 0 oder 1 intialisiert und gegen 0 oder 1 geprüft? Das ist C++, da gibt´s true und false.


Log in to reply