kramann.info
© Guido Kramann

Login: Passwort:










Archiv
2 SoSe2022
..2.1 MIK
..2.2 SRT
..2.3 HDL
..2.4 AUT
..2.5 SLE
2 WS2020_21
..2.1 RTS
....2.1.1 day_by_day
..2.2 IE
....2.2.1 day_by_day
..2.3 ES
..2.4 EFSEE
....2.4.1 day_by_day
..2.5 KF
....2.5.1 day_by_day
....2.5.2 Haikus
....2.5.3 Haikus_en
..2.6 CC
....2.6.1 day_by_day
2 WS2021_22
..2.1 RTS
....2.1.1 day_by_day
....2.1.2 Versuch002
....2.1.3 Versuch003
....2.1.4 Versuch004
....2.1.5 Versuch005
....2.1.99 Material
..2.2 FTS
....2.2.1 day_by_day
..2.3 ESY
....2.3.1 day_by_day
..2.4 INFmecha5
....2.4.1 day_by_day
..2.5 REGmecha5
....2.5.1 day_by_day
2 WS2023_24
..2.1 day_by_day_RST
..2.2 day_by_day_SRT
..2.3 day_by_day_FTS
..2.4 day_by_day_KF
3 SoSe2021
..3.1 STR
....3.1.1 day_by_day
..3.2 SLE
....3.2.1 day_by_day
..3.3 HDL
....3.3.1 day_by_day
..3.4 MIK
....3.4.1 day_by_day
3 SoSe2024
..3.1 Mik_21_03_2024
..3.2 Mik_04_04_2024
..3.3 Mik_11_04_2024
..3.4 Mik_18_04_2024
..3.5 Mik_25_04_2024
..3.6 Mik_02_05_2024
..3.7 Mik_16_06_2024
..3.8 Mik_23_05_2024
..3.9 Mik_30_05_2024
..3.10 Mik_05_06_2024
..3.11 Mik_13_06_2024
3 WS2022_23
..3.1 day_by_day_RST_3MB
..3.2 day_by_day_RT2_5MT
..3.3 day_by_day_EMB_7MT
..3.4 day_by_day_ABP_7MT
..3.5 day_by_day_FTS_MMB
..3.6 day_by_day_KF
4 SoSe2023
..4.2 RTS_day_by_day
..4.3 MIK_day_by_day
..4.4 AUT_day_by_day
..4.5 HDL_day_by_day
4 WS2024_25
..4.1 ING_day_by_day
....4.1.1 ING_Do_26_09_2024
....4.1.2 ING_Do_10_10_2024
....4.1.3 ING_Do_17_10_2024
....4.1.4 ING_Do_24_10_2024
....4.1.5 ING_Do_07_11_2024
....4.1.6 ING_Do_14_11_2024
....4.1.7 ING_Do_21_11_2024
....4.1.8 ING_Do_28_11_2024
....4.1.9 ING_Do_05_12_2024
....4.1.10 ING_Do_12_12_2024
....4.1.11 ING_Do_19_12_2024
..4.2 INF_day_by_day
....4.2.1 INF_Fr_27_09_2024
....4.2.2 INF_Fr_04_10_2024
....4.2.3 INF_FR_18_10_2024
....4.2.4 INF_Fr_25_10_2024
....4.2.5 INF_Fr_08_11_2024
....4.2.6 INF_Fr_15_11_2024
....4.2.7 INF_Fr_22_11_2024
....4.2.8 INF_Fr_29_11_2024
....4.2.9 INF_Fr_06_12_2024
....4.2.10 INF_Fr_13_12_2024
....4.2.11 INF_Fr_20_12_2024
....4.2.12 INF_Fr_10_01_2025
..4.3 FTS_day_by_day
....4.3.1 FTS_Mi_25_09_2024
....4.3.2 FTS_Mi_02_10_2024
....4.3.3 FTS_Mi_09_10_2024
....4.3.4 FTS_Mi_16_10_2024
....4.3.5 FTS_Mi_23_10_2024
....4.3.6 FTS_Mi_30_10_2024
....4.3.7 FTS_Mi_06_11_2024
....4.3.8 FTS_Mi_13_11_2024
....4.3.9 FTS_Mi_20_11_2024
....4.3.10 FTS_Mi_27_11_2024
....4.3.11 FTS_Mi_04_12_2024
....4.3.12 FTS_Mi_11_12_2024
....4.3.13 FTS_Mi_18_12_2024
6 Ing
..6.1 Bauplan
....6.1.1 Bootstick
....6.1.2 Xubuntu
....6.1.3 Webserver
....6.1.4 Hotspot
....6.1.5 Videostream
....6.1.6 Lampe
....6.1.7 Chassis
....6.1.8 Akku
....6.1.9 Motore
....6.1.10 Laborsteckboard
....6.1.11 Antriebstest
7 007
..7.1 Einschalten
..7.2 Vorversuche
kramann.info
© Guido Kramann

Login: Passwort:




Inhalte zur Vorlesungswoche #3, Informatik 1 im Wintersemester 2024/25

(EN google-translate)

(PL google-translate)

Themen

  1. Subtraktion im Binärbereich unter Verwendung des Zweierkomplements
  2. Einführung der for-Schleife
  3. Konsolidierung der Verwendung einfacher Integer-Arrays
  4. Zahlenumwandlungen programmieren (Dezimal-Binär / Binär-Dezimal) und Modulo-Division
  5. Übung

1 Subtraktion im Binärbereich unter Verwendung des Zweierkomplements


7-3=4

Binär bei 8 Bit:

7 = 00000111
3 = 00000011

-3 = 11111100 + 1 = 11111101 (Zweierkomplement)

Subtraktion als Addition des Zweierkomplements:

 7
-3

    00000111
   +11111101
 (1)11111110  (Überträge)
    --------
 (1)00000100 = 4



Code 0-1: Beispiel zur praktischen Nutzung des Zweierkomplements für die Subtraktion.

  • Bei dem zweiten nun folgenden Rechenbeispiel ergibt sich als Ergebnis eine negative Zahl.
  • Diese liegt im Zweierkomplement vor.
  • Als Probe wird das Zweierkomplement rückgängig gemacht.
  • Man erhält den Betrag der Zahl.

3-7=-4

Binär bei 8 Bit:

3 = 00000011
7 = 00000111

-7 = 11111000 + 1 = 11111001 (Zweierkomplement)

Subtraktion als Addition des Zweierkomplements:

 3
-7

    00000011
   +11111001
    00000110  (Überträge)
   ---------
    11111100 = -4 

PROBE

    11111100 = -4(?) 
         - 1 
  = 11111011
Einerkomplement:
    00000100 =  4 OKAY.

Code 0-2: Subtraktion mit negativem Ergebnis und anschließender Proberechnung.

2 Einführung der for-Schleife


Es werden im Unterricht Beispiele kodiert.


#include <iostream>
using namespace std;
int main(void)
{
    for(int i=0;i<4;i++)
    {
        cout<<i<<endl;
    }
    return 0;
}

Code 0-3: Beispiel for-Schleife.

3 Konsolidierung der Verwendung einfacher Integer-Arrays.


Es werden im Unterricht Beispiele kodiert.


#include <iostream>
using namespace std;
int main(void)
{
    int arr[4];
    for(int i=0;i<4;i++)
    {
        arr[i]=i*i;
    }
    for(int i=0;i<4;i++)
    {
        cout<<arr[i]<<endl;
    }
    return 0;
}

Code 0-4: Beispiel, Integer-Array mit vier Plätzen.

4 Zahlenumwandlungen programmieren (Dezimal-Binär / Binär-Dezimal) und Modulo-Division


Ausgangspunkt soll die Programmierübung der zweiten Gruppe von gestern sein und eine studentische Lösung der ersten Aufgabe:


Im Unterricht wurde eine Methode zur handschriftlichen Transformation einer im Dezimalsystem dargestellten Zahl ins Binärsystem besprochen.

Nachfolgend finden Sie ein kleines Programm, das diese Umwandlung automatisiert, jedoch die Ziffern in umgekehrter Reihenfolge ausgibt.

Dabei kommt die Modulodivision zum Einsatz, Operator %

Die Modulo-Division wird auch Rest-Division genannt.


Symbol des Modulo-Operators in der Programmiersprache C: %

Beispiele:
4%2=0
5%2=1
6%3=0
8%3=2


Code 0-5: Die Modulo Division

#include <iostream>
using namespace std;
int main(void)
{
    int x = 126;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;
    cout<<x%2;
    x=x/2;

    return 0;
}

Code 0-6: Einfaches Programm zur Binärdarstellung einer Zahl, wobei die Ziffern in umgekehrter Reihenfolge dargestellt werden.

  • Testen Sie das Programm.
  • Ergänzen Sie eine Eingabeaufforderung, die es ermöglicht beliebige Zahlen zwischen 0 und 127 umzuwandeln und testen es.
  • Suchen Sie in den vergangenen Vorlesungen nach Beispielen, die eine for-Schleife verwenden und versuchen dann die sich wiederholenden Befehle in einer for-Schleife zusammenzufassen.
#include <iostream>
using namespace std;
int main(void)
{
    int x;
    cout<<"Welche Zahl soll in Binär umgewandelt werden?"<<endl;
    cin>>x;
    int y[7];
    if(x >= 0 && x <= 127)
    {
        for(int i = 0; i<=7; i++)
        {
            y[i] = x%2;
            cout<<y[i];
            x=x/2;
        }
       
        cout<<endl<<"Einerkomplement: ";
       
        for(int i = 0; i<=7; i++)
        {
            y[i] = 1 - y[i];
            cout<<y[i];
        }
       
        cout<<endl;
    }

    else
    {
        cout<<"Zahl ist nicht zwischen 0 und 127."<<endl<<"Das Programm wird beendet."<<endl;
    }
    return 0;
}

Code 0-7: Studentische Lösung zu Aufgabe 1.

Aufgabe 2

  • Ausgangspunkt bilden die Ergebnisse aus Aufgabe 1.
  • Schreiben Sie das Programm von Aufgabe 1 so um, dass statt der ursprünglichen Zahl das Einerkomplement gebildet wird und ausgegeben wird.
  • Überlegen Sie sich, welche Schritte nötig wären, um bei Eingabe negativer Zahlen zwischen -1 und -128 auch das Zweierkomplement zu bilden.
  • Versuchen Sie ein entsprechendes Programm umzusetzen.
  • Führen Sie alles bisher Erarbeitete zusammen und schreiben ein Programm, das die 8-Bitmuster von Dezimalzahlen zwischen -128 und +127 in richtiger Reihenfolge ausgibt.
#include <iostream>
using namespace std;
int main(void)
{
    int x;
    cout<<"Welche Zahl soll in Binär umgewandelt werden?"<<endl;
    cin>>x;
    int y[8];
    if(x >= 0 && x <= 127)
    {
        for(int i = 0; i<=7; i++)
        {
            y[i] = x%2;
            //cout<<y[i];
            x=x/2;
        }

        for(int i = 7; i>=0; i--)
        {
            cout<<y[i];
        }
       
        cout<<endl<<"Einerkomplement: ";
       
        for(int i = 0; i<=7; i++)
        {
            y[i] = 1 - y[i];
            //cout<<y[i];
        }

        for(int i = 7; i>=0; i--)
        {
            cout<<y[i];
        }
       
        cout<<endl;
    }

    else
    {
        cout<<"Zahl ist nicht zwischen 0 und 127."<<endl<<"Das Programm wird beendet."<<endl;
    }
    return 0;
}

Code 0-8: Verbessern der Ausgabe: Die erfolgt jetzt in der richtigen Reihenfolge.


#include <iostream>
using namespace std;
int main(void)
{
    int x;
    cout<<"Welche Zahl soll in Binär umgewandelt werden?"<<endl;
    cin>>x;
    int y[8];
    if(x >= 0 && x <= 127)
    {
        for(int i = 7; i>=0; i--)
        {
            y[i] = x%2;
            x=x/2;
        }

        for(int i = 0; i<=7; i++)
        {
            cout<<y[i];
        }
       
        cout<<endl<<"Einerkomplement: ";
       
        for(int i = 7; i>=0; i--)
        {
            y[i] = 1 - y[i];
        }

        for(int i = 0; i<=7; i++)
        {
            cout<<y[i];
        }       
        cout<<endl;
    }

    else
    {
        cout<<"Zahl ist nicht zwischen 0 und 127."<<endl<<"Das Programm wird beendet."<<endl;
    }
    return 0;
}

Code 0-9: Weitere Verbesserung: Schon im Array werden die Ziffern 1 und 0 in der richtigen Reihenfolge abgelegt.

#include <iostream>
using namespace std;
int main(void)
{
    int x;
    cout<<"Welche Zahl soll in Binär umgewandelt werden?"<<endl;
    cin>>x;
    int y[8];
    if(x >= 0 && x <= 127)
    {
        for(int i = 0; i<=7; i++)
        {
            y[7-i] = x%2; // 7-i liefert: 7,6,5,4,3,2,1,0
            x=x/2;
        }

        for(int i = 0; i<=7; i++)
        {
            cout<<y[i];
        }
       
        cout<<endl<<"Einerkomplement: ";
       
        for(int i = 0; i<=7; i++)
        {
            y[i] = 1 - y[i];
        }

        for(int i = 0; i<=7; i++)
        {
            cout<<y[i];
        }       
        cout<<endl;
    }

    else
    {
        cout<<"Zahl ist nicht zwischen 0 und 127."<<endl<<"Das Programm wird beendet."<<endl;
    }
    return 0;
}

Code 0-10: VARIANTE: y[7-i] = x%2;, statt die Schleife rückwärts laufen zu lassen.

MUSTERLÖSUNG gesamte Aufgabe:
#include <iostream>
using namespace std;
int main(void)
{
    int x;
    cout<<"Welche Zahl soll in Binär umgewandelt werden?"<<endl;
    cin>>x;
    int y[8];
    if(x >= 0 && x <= 127)
    {
        for(int i = 0; i<=7; i++)
        {
            y[7-i] = x%2; // 7-i liefert: 7,6,5,4,3,2,1,0
            x=x/2;
        }
        for(int i = 0; i<=7; i++)
        {
            cout<<y[i];
        }
    }
    else if(x >= -128 && x <= -1)
    {
        x = -x; //Betrag nehmen        
        int z=0;
        for(int i = 0; i<=7; i++)
        {
            y[7-i] = 1 - x%2; // Einerkomplement direkt
            x=x/2;
        }
        for(int i = 0; i<=7; i++)
        {
            z=z*2;
            z=z+y[i];
        }
        z++; //Zweierkomplement
        for(int i = 0; i<=7; i++) //Muster des Zweierkomplements bilden.
        {
            y[7-i] = z%2; 
            z=z/2;
        }        

        for(int i = 0; i<=7; i++)
        {
            cout<<y[i];
        }
    }
    else
    {
        cout<<"Zahl ist nicht zwischen -128 und 127."<<endl<<"Das Programm wird beendet."<<endl;
    }
    return 0;
}

Code 0-11: ...auch negative Zahlen berücksichtigen.

5 Übung

  • Siehe auf Moodle: Uebung_29_10_2024.zip
Programmablaufplan PAP, siehe auch: https://de.wikipedia.org/wiki/Programmablaufplan
  • Tool unter Linux, um Flussdiagramme zu zeichnen: dia
  • In Terminal dia eingeben.
  • Falls nicht vorhanden, nachinstallieren mit: sudo apt install dia
Mit dia erstelltes Flussdiagramm.

Bild 0-1: Mit dia erstelltes Flussdiagramm.

Lösungen zu den Aufgaben der Übung
#include <iostream>
using namespace std;
int main(void)
{
    double a[20];   
    for(int i=0;i<20;i++)
    {
        a[i]=(double)(rand()%100)/10.0;
        cout<<a[i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<20;i++)
    {
        a[i] = a[i]*2.0;
        cout<<a[i]<<" ";
    }
    cout<<endl;
   
    return 0;
}

Code 0-12: Studentische Lösung zu Aufgabe 1 (vergl. Moodle Uebung_29_10_2024).

Übung am 07.11.2024

  1. Präsentation zu Algorithmen: Algorithmen, die aus mathematischen Formeln resultieren, Beispiel Mittelwert
  2. Aufgabe 1: Streuung berechnen.
  3. Aufgabe 2: Gausssche Summenformel.
  4. Fertigstellen und besprechen der Aufgabe 2 von letzter Woche (Zweierpotenzen von 2^0 bis 2^7 berechnen und ausgeben)

1 Präsentation zu Algorithmen: Algorithmen, die aus mathematischen Formeln resultieren, Beispiel Mittelwert

  • Mathematische Formeln können als Handlungsanweisungen verstanden werden.
  • Im fdolgenden werden einige dieser Formeln in Programme übersetzt werden.

$ m= \frac { \sum _i x_i}{N} $

Formel 0-1: Formel für Mittelwert.


#include <iostream>
#include <math.h>
using namespace std;
int main(void)
{
    double x[] = {0.1,7.5,4.3,6.5,9.5};
    int N=5;
    double sum = 0.0;

    for(int i=0;i<N;i++)
    {
        sum = sum + x[i];
    }

    sum = sum / (double)N; // mit Cast / Typumwandlung

    cout<<"Mittelwert = "<<sum<<endl;

    cout<<"Wurzel aus 2 = "<<sqrt(2.0)<<endl;

    return 0;
}

Code 0-13: Mittelwertbildung als C-Programm.

$ \sum 1..n= \frac {n \cdot \left(n+1\right)}{2} $

Formel 0-2: Gausssche Summenformel.


2 Aufgabe 1: Streuung berechnen.

  • Nutzen Sie die vorgestellte Umsetzung zur Berechnung des Mittelwertes aus, um ein Programm zur Bestimmung der Streuung zu entwickeln.

$ s= \sqrt \left( \frac { \sum _i \left(x_i-m\right)^2}{N}\right) $

Formel 0-3: Formel für Streuung s.


#include <iostream>
#include <math.h>
using namespace std;
int main(void)
{
    double x[] = {0.1,7.5,4.3,6.5,9.5};
    int N=5;
    double sum = 0.0;

    for(int i=0;i<N;i++)
    {
        sum = sum + x[i];
    }

    sum = sum / (double)N; // mit Cast / Typumwandlung

    //------------------------------------------------------

    double s = 0.0;

    for(int i=0;i<N;i++)
    {
         s = s + (x[i]-sum)*(x[i]-sum);
    }
    s = sqrt(s/(double)N);

    cout<<"Streuung s = "<<s<<endl;
    return 0;
}

Code 0-14: Studentische Lösung zur Streuung.

3 Aufgabe 2: Gausssche Summenformel.

  • Schreiben Sie ein Programm, dass stichprobenartig überprüft, ob die Gausssche Formel funktioniert.
  • D.h. Es soll n vorgegeben werden und dann sowohl mittels einer Schleife, als auch nach der Formel die Summe aus 1...n gebildet werden.

$ \sum 1..n= \frac {n \cdot \left(n+1\right)}{2} $

Formel 0-4: Gausssche Summenformel.



Code 0-15: Studentische Lösung zu Gauss.

4 Fertigstellen und besprechen der Aufgabe 2 von letzter Woche (Zweierpotenzen von 2^0 bis 2^7 berechnen und ausgeben)


Code 0-16: Studentische Lösung zu Aufgabe 2 (vergl. Moodle Uebung_29_10_2024).