C_testat_5
Home Nach oben

 

Home
Nach oben
C_testat_1
C_testat_2
C_testat_3
C_testat_4
C_testat_5
C_testat_6
C_testat_7
C_testat_8

Aufgabenstellung von Herren Grams

Benutzerdefinierte Datentypen

5.1 Zeichen Sie das Syntaxdiagramm zur Deklaration:
    
    char z[2][3] = {{'a','b','c'},{'0','1','2'}};

5.2 Tippen Sie das Folgende C-Programm in einer Zeile ein und lassen Sie es laufen. Was passiert? Erläutern Sie die Wirkung des Programms.
    
    main(){char* c="main() {char* c=%c%s%c; printf (c, 34, c, 34, 10);}%c"; 
    printf (c, 34, c, 34, 10);}

5.3 Fügen Sie in das Programm btrg.c den Datentypen compex ein und schreiben Sie die Funktion entsprechend um. Nennen Sie die Datei der neuen Version btrg1.c.

5.4 Was leistet der Ausdruck (*value(buf)++ im obigen Beispielprogramm? Warum darf man die äußeren Klammern nicht weglassen? Was passiert bei der Speicherreservierung mittels malloc?

5.5 Schreiben Sie ein C-Programm CompList.c, dass einen Datentyp complex für komplexe Zahlen mit den Feldern x und y enthält, die miteinander zu einer linearen Liste verknüpft werden können. Die Deklaration von complex.c sieht so aus:
    
    struct compex {float x,y;struct compex *next;};

Schreiben Sie eine Funktion betrag, die als Eingabeparameter eine komplexe Zahl entgegennimmt und als Ergebniswert den Betrag liefert. Schreiben Sie ein Hauptprogramm, das folgendes Leistet: Es nimmt von der Tastatur eine Folge komplexer Zahlen entgegen. Vor jeder Eingabe steht eine Abfrage, ob mit der Eingabe fortgefahren werden soll. Die Punktfolge ist in einer linearen Liste abzulegen. Nach Beendigung der Eingabe soll die Folge der Punkte zusammen mit ihrem Betrag auf dem Bildschirm erscheinen. Das folgende Hauptprogramm ist also um geeignete Funktionen zu ergänzen:
    
    void main () {
        
        /*Initialisierung und Titel*/
        struct complex *p=0, *h; 
        unsigned char c='j';
        printf("Demo: Lineare Liste komplexer Zahlen");
        
        /*Eingabe*/
        while(c=='j') {
            h=in(p);p=h;
            gets(&w);
            printf("? Weiter mit \"j\": ");
            scanf("%1s", &c);
        }
        printf("c= %c",c);
        
        /*Verarbeitung: entfällt*/
        
        /*Ausgabe*/
        printf("\nAusgabe");
        h=p;
        while(h){out(h); h=h->next;}
        return 0;
    }

Der Funktionsaufruf in(p) soll folgendes leisten: Es wird ein neues Objekt vom Typ complex erzeugt, die x und y-Koordinate der Zahl werden abgefragt und sind vom Anwender einzugeben. Außerdem wird dieses Objekt mit dem Objekt p verkettet, so dass next auf p zeigt. Der Rückgabewert der Funktion ist ein Zeiger auf das neue erzeugte Objekt. Die Funktion out hat zur Aufgabe, eine komplexe Zahl zusammen mit ihrem Betrag auf den Bildschirm zu bringen.

Lösungsansätze:

Aufgabe 5.1

Diese Aufgabe ist auf ein Blatt Papier zu zeichnen

Aufgabe 5.2

/* Erklärung */

#include <stdio.h>

main() {char* c="main() {char* c=%c%s%c; printf (c, 34, c, 34, 10);}%c"; 
printf (c, 34, c, 34, 10);}

Aufgabe 5.3

/* btrg1.c */

#include <stdio.h>
#include <math.h>

struct komplex {float x, y;} c;

float betrag (struct komplex z)
{
    return fabs(z.x)<fabs(z.y)? fabs(z.y)*sqrt(1+(z.x/z.y)*(z.x/z.y)) : 
    z.x==0? 0: fabs(z.x)*sqrt(1+(z.y/z.x)*(z.y/z.x));
};

void main() 
{
    printf("? Realteil (x-Wert), Imaginaerteil (y-Wert) = ");
    scanf("%f,%f", &c.x, &c.y);
    printf("! Betragsquadrat von x,y ist: %.2e \n",betrag(c));
}

Aufgabe 5.4

Diese Aufgabe ist entfallen gewesen

Aufgabe 5.5

/*CompList*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#define KOMPLEX struct complex;

/*Struktur festlegen*/
KOMPLEX {float x,y; KOMPLEX *next;};

float betrag(float x, float y)  /*Function betrag()*/

    return fabs(x)<fabs(y)? fabs(y)*sqrt(1+(x/y)*(x/y))
    : x==0? 0: fabs(x)*sqrt(1+(y/x)*(y/x));
}

KOMPLEX* in(KOMPLEX* p)  /*Function in()*/
{
    KOMPLEX m;
    /*Speicher reservieren*/
    m=(KOMPLEX*) malloc(sizeof(KOMPLEX));
    printf("? Zahlen eingeben (Re,Im): ");
    scanf("%e,%e", &m->x,&(m->y));
    m->next=p;
    return m;
}

KOMPLEX* out(struct KOMPLEX* h)  /*Function out()*/
{
    printf("\n! Die Zahlen: %e %e",h->x,(*h).y);
    printf("\n! Betrag: %e",betrag((*h).x,h->y));
    return 0;
}

void main ()  /*Hauptprogramm main()*/
{
    /*Initialisierung und Titel*/
    KOMPLEX *p=0, *h; 
    unsigned char c='j';
    char w;
    clrscr();
    printf("Demo: Lineare Liste komplexer Zahlen\n");
    
    /*Eingabe*/
    while(c=='j') 
    {
        p=in(p);
        gets(&w);
        printf("? Weiter mit \"j\": ");
        scanf("%c", &c);
        gets(&w);
    }
    
    /*Verarbeitung: entfällt*/
    
    /*Ausgabe*/
    printf("\nAusgabe");
    h=p;
    while (h) { out(h); h=h->next; }
}