Aufgabenstellung von Herren Grams
Ein- und Ausgabe
7.1 Übersetzen Sie das Programm sinus
aus dem Abschnitt 4.1 des Skriptums "Einführung in die Informatik, Teil
2" von Pascal in C.
7.2 Ergänzen Sie das Programm der Aufgabe 6.4 (Serienschwingkreis) um sine
grafische Ausgabe mittels Tabellenkalkulation.
Lösungsansätze:
Aufgaben 7.1
/*sinus von Pascal in c*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926536
double t=0;
FILE *textfile;
void main()
{
if ((textfile=fopen("a:\sinus.dat", "w"))==NULL)
{
printf("Fehler beim Oeffnen zum schreiben");
exit (0);
}
fprintf(textfile, "Geaempfte Sinusschwingung, Zeitformat: t, f(t)\n");
while (t<2.1)
{
fprintf(textfile,"%3.1f %12.9f\n",t,exp(-0.1*t)*cos(2*PI*t));
t=t+.1;
}
fclose(textfile);
}
Aufgaben 7.2
/*Serienschwingkreis*/
#include <stdio.h>
#include <stdlib.h>
#include "KOMPLEX.h"
#define PI 3.1415926536;
FILE *datenfile;
void main()
{
float fu,fo,step,r,l,c,w0,w;
KOMPLEX z;
if ((datenfile=fopen("a:\Serienschwingkreis.dat", "w"))==NULL)
{
printf("Fehler beim Oeffnen zum schreiben");
exit (0);
}
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;
fprintf(datenfile,"Frequenz [Hz], Scheinwiderstand [Ohm]\n");
while (fu<fo)
{
w=fu*2*PI;
z.y=w*l-1/(w*c);
printf("%12.3f %12.3f \n",fu,betrag(&z));
fprintf(datenfile,"%12.3f,%12.3f\n",fu,betrag(&z));
fu=step+fu;
}
fclose(datenfile);
}
/*KOMPLEX.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;
}