Klausurvorbereitung



  • Hallo,

    wir schreiben bald Klausuren und ich bereite mich darauf vor. Allerdings komme ich mit ein Paar Aufgaben aus den alten Klausuren nicht klar und deswegen wollte ich euch um Hilfe bitten. Es ist alles C - Programmierung. Immer wenn ich mit einer Klausur durch bin, poste ich dann weitere Aufgaben aus anderen Klausuren.

    KLAUSUR SS 2007

    Aufgabe 2 (Zeiger)
    Im folgenden Programm soll das Feld ar mit fortlaufenden Integerzahlen 0, 1, 2, ... gefüllt werden. Der Code enthält einige Fehler

    int i = 0;
    int *ar = (char*)malloc(5*sizeof(int));
    do ar[k] = k; while (k<4);
    

    a) Beschreiben Sie die Fehler und ihre Auswirkungen beim Programmlauf!
    b) Schreiben Sie den korriegierten Code neu!

    Aufgabe 4 (Funktion, Strings)
    a) Schreiben Sie eine Funktion void verschluesseln(char *s, int n), mit der eine Zeichenfolge s buchstabenweise verschlüsselt werden soll. Dazu soll der ASCII-Wert aller Zeichen im String um n erhöht werden.
    b) Schreiben Sie ein Hauptprogramm, mit dem Sie eine Zeile des zu verschlüsselnden Textes mit der Tastatur eingeben, zeichenweise verschlüsseln und auf dem Bildschirm ausgeben.

    Aufgabe 5 (Strukturen)
    Für die Struktur Student sei folgende Deklaration gegeben:

    struct Student {
    int matnr;
    char* name;
    };
    typedef struct Student StudiTyp
    

    a) Schreiben Sie eine Funktion void student_eingeben(), mit dem Sie die Matrikelnummer und den Namen eines Studenten mit der Tastatur eingeben können.
    b) Schreiben Sie die Struktur in eine Klasse um und ergänzen Sie diese mit der Funktion student_eingeben().



  • xX Dany Xx schrieb:

    Aufgabe 2 (Zeiger)
    Im folgenden Programm soll das Feld ar mit fortlaufenden Integerzahlen 0, 1, 2, ... gefüllt werden. Der Code enthält einige Fehler

    int i = 0;
    int *ar = (char*)malloc(5*sizeof(int));
    do ar[k] = k; while (k<4);
    

    a) Beschreiben Sie die Fehler und ihre Auswirkungen beim Programmlauf!

    fehler #1 --> der cast vor'm malloc muss wech.
    🙂



  • aufgabe 2:
    wann terminiert die schleife?
    und für was ist i?



  • ich weiß nicht, ob dir hier jemand alle fragen einfach beantwortet. Präsentier lieber deine Antworten zu den Fragen, und wo deine Probleme liegen. So lernst du auch mehr



  • aufgabe 2:
    wann terminiert die schleife?
    und für was ist i?

    Ich denk mal das bleibt uns überlassen wann die Schleife terminiert wird.
    Das i steht schätzungweise für die Integerzahlen mit denen das Feld gefüllt wird.

    Präsentier lieber deine Antworten zu den Fragen

    Wenn ich die Antworten zu den fragen hätte, dann würde ich doch nicht fragen, oder? 🙂

    Ich meine, ich kann in den Aufgaben ja auch nicht mehr lesen als ihr.. Ich habe sie 1:1 abgeschrieben.



  • stoppen mußt sie schon und solang sich die variable nicht ändert, läuft das ewig, denk doch mal darüber nach;)

    wo wird eigentlich k deklariert oder soll aus k i werden oder i zu k?



  • @ ;fricky

    kannst du mal pls den code nochmal neu schreiben? Wenn ich char* wegmache dann kommt Syntaxfehler ')' wenn ich (char*) wegmache, kommt 'void *' kann nicht in 'int *' kkonvertiert werden.

    Außerdem ist k nichtdeklarierter Bezeichner.



  • hab iwi das gefühl du weißt weniger als vor nem monat 😕



  • @ noobLolo

    ja schon klar der Code ist ja auch fehlerhaft. Ich denk mal das Feld soll max 4 Zeichen einlesen (wegen while(k<4)). Und in diesem Feld muss dann logischwerweise drin stehen 0123.



  • xX Dany Xx schrieb:

    Wenn ich char* wegmache dann kommt Syntaxfehler ')' wenn ich (char*) wegmache, kommt 'void *' kann nicht in 'int *' kkonvertiert werden.

    Versuch's mal mit einem C-Compiler.
    🙂



  • µngbd schrieb:

    xX Dany Xx schrieb:

    Wenn ich char* wegmache dann kommt Syntaxfehler ')' wenn ich (char*) wegmache, kommt 'void *' kann nicht in 'int *' kkonvertiert werden.

    Versuch's mal mit einem C-Compiler.
    🙂

    Das versteht er nicht. Er ist im C++- Modus unterwegs. Vielleicht hilft das.



  • xX Dany Xx schrieb:

    Ich denk mal das Feld soll max 4 Zeichen einlesen (wegen while(k<4)). Und in diesem Feld muss dann logischwerweise drin stehen 0123.

    Damit sollte man's eigentlich korrigieren können.

    int i;   // wir nehmen i anstelle von k
    int arr[5];   // malloc() mit konstanten Werten füttern ist ein richtiger Fehler
                  // statt 5 würden auch 4 reichen, aber vielleicht soll am Ende
                  // noch Platz für einen Terminator sein
    for (i = 0; (arr[i] = i) < 4; i++)
        ;
    // oder mit do-while
    i = 0;
    do arr[i] = i++; while (i < 4);
    

    Danach steht in dem Array {0,1,2,3,undefiniert}. Aber vielleicht soll doch am Ende in dem Array stehen: {0,1,2,3,4}? Das ist sehr schwer zu sagen, lernt ihr dort Psychologie?
    🙂



  • pointercrash() schrieb:

    µngbd schrieb:

    Versuch's mal mit einem C-Compiler.
    🙂

    Das versteht er nicht. Er ist im C++- Modus unterwegs. Vielleicht hilft das.

    Ob daran wohl der Lehrer schuld ist?
    🙂



  • Meinst du dass der Befehl

    int *ar = (char*)malloc(5*sizeof(int));
    

    definitiv falsch ist und stattdessen nur int arr[5]; reinsoll? Oder ist das kein Fehler, sondern es gefällt dir einfach nur nicht...



  • Jetzt hab ichs durch den compiler gejagt:

    int main (void)
    {
    int k = 0;
    int ar[5];
    do{ ar[k] = k++; printf("%f", ar[k]);} while (k<4);
    getch();
    }
    

    Weißt du was er ausgibt?



  • xX Dany Xx schrieb:

    Meinst du dass der Befehl

    Besser: die Zeile.

    xX Dany Xx schrieb:

    int *ar = (char*)malloc(5*sizeof(int));
    

    definitiv falsch ist und stattdessen nur int arr[5]; reinsoll? Oder ist das kein Fehler, sondern es gefällt dir einfach nur nicht...

    Naja, definitiv falsch kann's nicht sein, weil es ja läuft. Aber mit malloc() einen Bereich holen, dessen Grösse schon zur Compilezeit bekannt ist, ist völlig unnötig. Man kann sich nun esoterische Ausnahmen ausdenken, zB dass man den Speicher unbedingt schon vor dem Ende des Blocks zurückgeben muss, aber -- naja, sowas fällt normalerweise nur nwp2 ein.

    Schwieriger ist aber die Frage, ob dein Lehrer das auch erkannt hat.
    🙂



  • xX Dany Xx schrieb:

    Jetzt hab ichs durch den compiler gejagt:

    int main (void)
    {
    int k = 0;
    int ar[5];
    do{ ar[k] = k++; printf("%f", ar[k]);} while (k<4);
    getch();
    }
    

    Weißt du was er ausgibt?

    Versuch mal das:

    int main (void)
    {
      int k = 0;
      int ar[5];
      do{ ar[k] = k++; printf("%d", ar[k-1]);} while (k<4);
    }
    

    Oder schreib das ++ erst in die while-Klammern. Oder (noch besser): nimm die for-Schleife, da wird man am wenigsten mit den Erhöhungen verwirrt.
    🙂



  • 1. Es ist kein Lehrer sondern Prof. Dr.
    2. Die Aufgabe heißt >>Aufgabe 2 (ZEIGER)<< sind in deinem Code Zeiger? Nein..
    3. Hast dus durch den Compiler gejagt? Die fortlaufenden Integerzahlen fehlen (0, 1, 2, ...)

    EDIT: Okay zu 3. das funktioniert... ich nehm die do schleife, weil sie in der aufgabe steht, aber dennoch sind eben keine Zeiger drin, deswegen schätze ich, dass deine Lösung falsch ist.. bzw. nicht relevant..



  • xX Dany Xx schrieb:

    1. Es ist kein Lehrer sondern Prof. Dr.

    Hihi, wenn einer ein guter Lehrer ist, hat er dann nicht mehr Achtung verdient als einer, der Titel sammelt?

    xX Dany Xx schrieb:

    2. Die Aufgabe heißt >>Aufgabe 2 (ZEIGER)<< sind in deinem Code Zeiger? Nein..

    Dann mach halt noch ein int *pointer = ar; .

    xX Dany Xx schrieb:

    3. Hast dus durch den Compiler gejagt? Die fortlaufenden Integerzahlen fehlen (0, 1, 2, ...)

    Erst nachdem du dich beschwert hast. Aber zum Glück war's richtig.
    🙂



  • xX Dany Xx schrieb:

    Jetzt hab ichs durch den compiler gejagt:

    int main (void)
    {
    int k = 0;
    int ar[5];
    do{ ar[k] = k++; printf("%f", ar[k]);} while (k<4);
    getch();
    }
    

    Weißt du was er ausgibt?

    Ja, Schrott. Wieso wohl? ( Es gibt 2 Anworten und es liegt nicht an der Art der Allokation. )


Anmelden zum Antworten