JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael Wand
Christian Ali Mehmeti-Göpel
Wintersemester 2020/21DIGITAL

Blatt 04

Aufgabe 01
Einführung in die Softwareentwicklung



Aufgabe Zeiger, Referenzen oder Kopie?

Letzte Änderung: 30. November 2020, 15:32 Uhr
11 Punkteim Detail
Ansicht:   |  

  1. Erinnern Sie sich an den Bubblesort-Algorithmus aus der Einführung in die Programmierung?

    void bubblesort(double* buf, uint32_t size) {
        for (uint32_t i = 0; i < size; ++i) {
            for (uint32_t j = 0; j < size - i - 1; ++j) {
                if (buf[j] > buf[j + 1])
                    swap(buf[j], buf[j + 1]);
            }
        }
    }
    


    Für den Algorithmus fehlt nur noch die Implementierung von swap. Nur eine der folgenden drei Implementierungen produziert einen funktionierenden Sortieralgorithmus.

    Welche ist es und warum funktionieren die anderen Implementierungen nicht?


    void swap(double x, double y) {
        double tmp = x;
        x = y;
        y = tmp;
    }
    
    void swap(double &x, double &y) {
        double tmp = x;
        x = y;
        y = tmp;
    }
    
    void swap(double &x, double &y) {
        x = y;
        y = x;
    }
    
  2. Verändern Sie bubblesort und swap derartig, dass Pointer verwendet werden, d.h. swap hat danach die Signatur void swap(double *x, double *y).
    In C++ sollten Sie immer Referenzen bevorzugen, wo es möglich ist, aber es ist dennoch wichtig, die korrekte Syntax für Pointer zu kennen.
  3. Der folgende Code lässt sich unter GCC 8.4.0 kompilieren, stürzt aber mit der Meldung Segmentation fault (core dumped) ab. Erklären Sie, woran das Problem liegt und reparieren Sie den Code.

    #include <cstdint>
    #include <iostream>
    #include <string>
    
    std::string& as_binary_string(uint64_t num) {
        std::string s;
        for (int32_t i = 0; i < 64; ++i) {
            char digit = (num & (1ull << (63 - i))) == 0 ? '0' : '1';
            s.push_back(digit);
        }
        return s;
    }
    
    int main() {
        std::string bin = as_binary_string(420);
        std::cout << bin << "\n";
    }
    
  4. Der folgende Code ist dem obigen sehr ähnlich, funktioniert aber einwandfrei.
    Wieso hat dieser Code nicht dasselbe Problem wie der andere?

    #include <iostream>
    #include <string>
    
    char& central_character(std::string &s) {
        return s[s.size() / 2];
    }
    
    int main() {
        std::string text = "HelloWorld!";
        central_character(text) = 'X';
        std::cout << text << "\n";
    }
    
  5. Der folgende Code lässt sich unter GCC 8.4.0 nicht kompilieren. Erklären Sie, wo das Problem liegt.

    #include <cstdint>
    int main() {
        int32_t k = 5;
        int32_t& i = k * 20;
    }
    


    #include <cstdint>
    #include <string>
    
    void print_multiple_times(std::string &str, int32_t times) {
        for (int32_t i = 0; i < times; ++i) {
            std::cout << str;
        }
    }
    int main() {
        print_multiple_times(std::string("bla"), 20);
    }