C_testat_6
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

Funktionen und Dateien

6.1 Lagern Sie den Datentypen complex und die Funktion berag aus dem Hauptprogramm CompList.c aus und definieren Sie ein Modul complex.h und complex.c dafür. Gestallten Sie das Hauptprogramm entsprechend um, so dass es diese Module benutzt und funktionsgleich zum ursprünglichen Programm ist.

6.2 Ergänzen Sie das Modul complex.h und complex.c um eine Funktion sort für das topologische Sortieren. Zu diesem Zweck ist für die Elemente eine partielle Ordnung mittels des Kriteriums less (für <) definiert. Die Funktion less wird in der Header-Datei deklariert

    extern int less(struct complex*, struct complex*);

und im Hauptprogramm definiert. Es soll less(a,b) genau dann ungleich null sein, wenn a südwestlich von b liegt, also genau dann wenn a.x<b.x und a.y<b.y gilt. (Zeigen Sie, dassdadurch tatsächlich eine partielle Ordnung definiert wird.) Das Programm soll eine Folge von komplexen Zahlen entgegennehmen und dann topologisch sortiert wieder ausgeben. Die Hauptfunktion (main) des Programms CompList.c ist also um einen Verarbeitungsteil zu ergänzen, der nur aus dem Aufruf der Sortierfunktion sort besteht. Die Funktion für das Sortieren könnte beispielsweise so aussehen:

struct complex* sort(struct complex* p){
    if(p){
        struct complex *q=p->next; p->next=0;
        while (q) {
            struct complex *h=q; q=q->next;
            if (less(h, p)) {h->next=p; p=h;} else {
                struct complex *cur=p;
                while (cur->next&&!less(h, cur->next)) cur=cur->next;
                h->next=cur->next;
                cur->next=h;
            } /*EndIf*/
        }/*EndWhile
    } else /*NULL*/
    return p;
}

6.3 Ergänzen Sie das Modul um die Funktion für die Wichtigsten arithmetischen Operationen für komplexe Zahlen sowie die Funktion für Betrag und Argument einer komplexen Zahl.

6.4 Schreiben Sie ein Programm für die Berechnung des Betrages des Scheinwiderstands eines Serienschwingkreises mit tabellarischer Ausgabe. Einzugenen sind die Parameterwerte der Bauelemente R, L und C sowie Unter- und Obergrenze des Frequenzbereichs und die Frequenz-Schrittweite. Benutzen Sie für die Berechnung die komplexe Darstellung der elementaren Impedanz und verwenden Sie möglichst weitgehend die Funktionen des Moduls complex. Ziel ist eine möglichst gut lesbarer Programmtext.

Lösungsansätze:

Aufgaben 6.1 bis 6.3

/*CompList.c*/

#include <stdio.h>
#include <stdlib.h>
#include "komplex.h"

/*Function in()*/
/*Speicher reservieren*/
KOMPLEX* in( KOMPLEX* p) 

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

/*Function out()*/
void out(KOMPLEX *h) 

    printf("\n! Die Zahlen: %.1e j%.1e",h->x,h->y);
    printf("! Betrag: %.1e ",betrag(h));
    printf("Phase: %.3e",phase(h));
}

/*Funktion less()*/
int less(KOMPLEX* z1,KOMPLEX* z2)
{
    return (z1->x)<(z2->x)&&(z1->y)<(z2->y);
}

/*Hauptprogramm main()*/
void main () 


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

        y=add(h,h->next);
        printf("Addition: %.1e j%.1e\n",y.x,y.y);
        y=sub(h,h->next);
        printf("Subtraktion: %.1e j%.1e\n",y.x,y.y);
        y=multi(h,h->next);
        printf("Multiplikation: %.1e j%.1e\n",y.x,y.y);
        y=div(h,h->next);
        printf("Division: %.1e j%.1e\n",y.x,y.y);
        h=h->next->next;
    }
    
    /*Fpeicherplatz Freigeben*/
    h=p;
    while (h) 
    {
        p=h;
        h=h->next;
        free (p);
    }
    printf("\n");
    // free (pointer);
}

/*Complex.h*/

#define KOMPLEX struct complex


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

extern float betrag(KOMPLEX*);
extern KOMPLEX* sort (KOMPLEX*);
extern KOMPLEX add (KOMPLEX* ,KOMPLEX*);
extern KOMPLEX sub (KOMPLEX* ,KOMPLEX*);
extern KOMPLEX multi (KOMPLEX* ,KOMPLEX*);
extern KOMPLEX div (KOMPLEX* ,KOMPLEX*);
extern float phase (KOMPLEX*);

/*komplex.c*/

#include <math.h>
#include "komplex.h"

/*Function betrag()*/
float betrag (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));
}

/*Funktion less()
int less(KOMPLEX* z1,KOMPLEX* z2)
{
    return (z1->x)<(z2->x)&&(z1->y)<(z2->y);
}*/

/*Funktion sort()*/
KOMPLEX* sort(KOMPLEX* p)
{
    if(p)
    {
        KOMPLEX* q=p->next;
        p->next=0;
        while (q) 
        {
            KOMPLEX *h=q; 
            q=q->next;
            if (less(h, p)) 
            {
                h->next=p;
                p=h;
            }
            else 
            {
                KOMPLEX *cur=p;
                while (cur->next&&!less(h, cur->next)) cur=cur->next;
                h->next=cur->next;
                cur->next=h;
            }
        }
    }
    /*else;*/
    return p;
}

/*Addition*/
KOMPLEX add (KOMPLEX* z1,KOMPLEX* z2) 
{
    KOMPLEX c;
    c.x=z1->x+z2->x;
    c.y=z1->y+z2->y;
    return c;
}

/*Subtraktion*/
KOMPLEX sub (KOMPLEX* z1,KOMPLEX* z2) 
{
    KOMPLEX c;
    c.x=z1->x-z2->x;
    c.y=z1->y-z2->y;
    return c;
}

/*Multiplikation*/
KOMPLEX multi (KOMPLEX* z1,KOMPLEX* z2) 
{
    KOMPLEX c;
    c.x=z1->x*z2->x-z1->y*z2->y;
    c.y=z1->x*z2->y+z1->y*z2->x;
    return c;
}

/*Division*/
KOMPLEX div (KOMPLEX* z1,KOMPLEX* z2) 
{
    KOMPLEX c;
    c.x=(z1->x*z2->x+z1->y*z2->y)/pow(betrag(z2),2);
    c.y=(z1->y*z2->x-z1->x*z2->y)/pow(betrag(z2),2);
    return c;
}

/*phase ()*/
float phase (KOMPLEX* z) 
{
    return z->y!=0? atan(z->x/z->y):z->x>0? 90:270;
}

Aufgabe 6.4

/*Serienschwingkreis*/
#include <stdio.h>
#include "komplex.h"
#define PI 3.1415926536;

void main() 
{
    float fu,fo,step,r,l,c,w0,w;
    KOMPLEX z;
    printf("Serienschwingkreis vom Rainer M., Daniel G. & Guido M.\n\n");
    printf("Die physikalischen Werte fuer die folgende Werte muessen einzugeben werden:\n");
    printf("R = Widerstand [Ohm]\n");
    printf("C = Kapazitaet [F]\n");
    printf("L = Induktivitaet [H]\n");
    printf("fu = Startfrequenz [Hz]\n");
    printf("fo = Endfrequenz [Hz]\n");
    printf("s = Schrittweite [Hz]\n");
    printf("?R = ");scanf("%f",&r);
    printf("?C = ");scanf("%f",&c);
    printf("?L = ");scanf("%f",&l);
    printf("?fu = ");scanf("%f",&fu);
    printf("?fo = ");scanf("%f",&fo);
    printf("?s = ");scanf("%f",&step);
    w0=1/sqrt(l*c);
    z.x=r;
    while (fu<fo) 
    {
        w=fu*2*PI;
        z.y=w*l-1/(w*c);
        printf("%12.3f %12.3f \n",fu,betrag(&z));
        fu=step+fu;
    }
}