CKurs - Aufgaben zu C

Google

Strukturen "struct"

Aufgabenstellung:

   Schreiben Sie bitte ein C-Programm zur Berechnung der Grundoperationen (+, -, *, /) 
   von zwei komplexen Zahlen. Dazu definieren Sie folgende Struktur:

CCode:



                 typedef struct {
                      double real;
                       double imag;
                       } complex;
Es sollen fünf Funktionen implementiert werden:

CCode:


           complex add (complex x, complex y); // Addition zweier komplexen Zahlen
           complex sub (complex x, complex y); // Subtraktion zweier komplexen Zahlen
           complex mul (complex x, complex y); // Multiplikation zweier komplexen Zahlen
           complex div (complex x, complex y); // Division zweier komplexen Zahlen
           void print(complex z);  // Ausgabe des Ergebnisses

Das Programm soll auf drei Dateien verteilet werden:
       - Eine Header-Datei "complex.h" zur Deklarationen der Struktur und der Funktionen.
       - Eine Implementierungsdatei "complex.c" und
       - Eine Test-Datei "test.c".

Lösung:

CCode complex.h:

typedef struct {
double real;
double imag;
} complex;

complex add (complex x, complex y);
complex sub (complex x, complex y);
complex mul (complex x, complex y);
complex div (complex x, complex y);
void print(complex z);

CCode complex.c:

#include "complex.h"
complex add (complex x, complex y)
// Addition zweier komplexen Zahlen
{
complex returnvalue;
returnvalue.real=x.real+y.real;
returnvalue.imag=x.imag+y.imag;
return returnvalue;
}
complex sub (complex x, complex y)
// Subtraktion zweier komplexen Zahlen
{
complex returnvalue;
returnvalue.real=x.real-y.real;
returnvalue.imag=x.imag-y.imag;
return returnvalue;
}
complex mul (complex x, complex y)
// Multiplikation zweier komplexen Zahlen
{
complex returnvalue;
returnvalue.real=x.real*y.real-x.imag*y.imag;
returnvalue.imag=x.real*y.imag-x.imag*y.real;
return returnvalue;
}
complex div (complex x, complex y)
// Division zweier komplexen Zahlen
{
complex returnvalue;
if (y.real==0 && y.imag==0)
perror("Divide by Null error!");
else{
returnvalue.real=(x.real*y.real-x.imag*y.imag)/(y.imag*y.imag+x.imag*x.imag);
returnvalue.imag=(x.real*y.imag-x.imag*y.real)/(y.imag*y.imag+x.imag*x.imag);
}
return returnvalue;
}
void print(complex z)
// Ausgabe des Ergebnisses
{
printf("(%.2f%+.2fi)",z.real,z.imag);
}

CCode:

#include <stdio.h>
#include "complex.h"
void test(complex a, complex b, char *desc, complex (*proc)(complex x, complex y))
{
complex c;
c=proc(a,b);
print(a);
printf("%s",desc);
print(b);
printf("=");
print(c);
printf("\n");
}
int main(void) {
complex a,b,cNull;
freopen( "Test.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei Test.txt um
freopen( "Fehler.txt", "w", stderr ); //Leitet die Standardausgabe in die Datei Test.txt um
printf("Testbeginn:\n");
a.real=3.01;
a.imag=2.5;
b.real=7.23;
b.imag=4.56;
cNull.imag=0;
cNull.real=0;
test(a,b," + ",add);
test(a,b," - ",sub);
test(a,b," * ",mul);
test(a,b," / ",div);
test(a,cNull," / ",div);
printf("Test Ende!");
}

Das Testprogramm liefert folgende Ausgabe :

Ausgabe stdout:

Testbeginn:
(3.01+2.50i) + (7.23+4.56i)=(10.24+7.06i)
(3.01+2.50i) - (7.23+4.56i)=(-4.22-2.06i)
(3.01+2.50i) * (7.23+4.56i)=(10.36-4.35i)
(3.01+2.50i) / (7.23+4.56i)=(0.38-0.16i)
(3.01+2.50i) / (0.00+0.00i)=(0.00+0.00i)
Test Ende!

mit den Fehlern

Ausgabe stderr:

Divide by Null error!: No error