Anzeige

Funktion f(x) graphisch darstellen in C


Gerowia

Grünschnabel
#1
Hallo,
ich lerne gerade in der Uni in C zu programmieren. Nun soll ich ein Programm schreiben, welches die Funktion f(x) = −sin(5x)· e ^(− 1/ 2 x ) graphisch darstellt für x aus [0;pi]. Ich rätsel jetzt seit 2 Tagen wie ich es anstelle das graphisch auszugeben... Vorgabe ist des Weiteren, dass die x-Achse vertikal und die y-Achse horizontal verlaufen, die x-Achse durch | und die Punkte durch * dargestellt werden und man in Schritten von pi/60 vorgeht.
Ich verstehe nun nicht wie ich dem Programm sagen kann, wo welches * bzw welcher | gezeichnet werden soll...Müsste jeder Punkt, der gezeichnet wird, nicht theoretisch ein Array mit 2 Koordinaten sein? und bei einer for-Schleife müsste man ja einen int als Zähler verwenden, wie soll das mit Schritten von pi/60 gehen?

Ich hoffe, dass jemand erfahreneres als ich mir helfen kann, danke schon mal, hier noch mein "Anfang"(ja ich weiß, ist noch gar nichts leider):
C++:
#include<stdio.h>
#include<math.h>

int main(void){
    double x,y,e,sin;
    int i,z;
    
    e=2,71828;
    
    for(i=0;i<M_Pi,i=i+M_pi/60){
    y=-sin(5*x)*e^((1/2)*x);
       }
}
[\code]
 

cwriter

Erfahrenes Mitglied
#2
und bei einer for-Schleife müsste man ja einen int als Zähler verwenden, wie soll das mit Schritten von pi/60 gehen?
Bei einer for-Schleife musst du doch keinen int verwenden?
C:
for(double x = 0.0; x < PI; x += PI/60.0)
{
    // ...
}
Geht doch auch?

Das Programm besteht aus 2 Teilen:
1) Werte berechnen
2) Ausgabe

Die Ausgabe ist hier wesentlich schwieriger; die Funktion berechnen kannst du ja schon (auch wenn ich eher double als int verwenden würde ;)

Allerdings wurde euch ja geholfen, indem die Achsen verdreht wurden.

Müsste jeder Punkt, der gezeichnet wird, nicht theoretisch ein Array mit 2 Koordinaten sein?
Doch, allerdings ist ja die eine Achse implizit (die vertikale, hier also x) gegeben durch die Anzahl Newlines ('\n'). Also brauchst du nur noch den Wert.

Es gibt nun 2 Möglichkeiten:
Analytisch: Finde Minimum und Maximum der Funktion (ableiten -> Minimum finden)
Programmier-"isch": Lasse alle Werte durchlaufen und finde davon das Minimum

Für den 2. Ansatz:
Dafür brauchst du einen Array, der alle y-Werte halten kann ( double values[61], warum wohl 61?)
Dann rechnest du in einer for-Schleife alle Werte durch und platzierst sie im Array. Somit kannst du Min/Max bestimmen (entweder online, noch während des Rechnens, oder offline, also in einem 2. loop). Mit min/max weisst du, wo du die y-Achse (deren 0-Wert) mit '|' ziehen musst.

Mit diesem Wissen ist es dann recht einfach:
Das '*' muss an die (gerundete, siehe round()) Stelle (val - min) (val normalisiert auf min).
D.h. als Beispiel mit der Funktion y = x, x in [-1, 1] mit Schritten 0.5:

Min = -1
Code:
* |
 *|
  *
  |*
  | *
Wenn du also einen Wert hast, musst du ihn nur noch durch die Schrittgrösse teilen und dann quotient - min - 1 Leerzeichen gefolgt von einem '*' ausgeben. Die Null-Linie überlasse ich dir, funktioniert aber ganz ähnlich.

Ich hoffe, das erklärt es einigermassen. Aber wenn etwas nicht klar ist, einfach ungeniert nachhaken :)

Gruss
cwriter
 

Gerowia

Grünschnabel
#3
Es steht in der Aufgabe , dass man int als Zählervariablen verwenden soll, warum ist mir auch nicht ganz klar ..In den Unterlagen steht etwas von der Gefahr des Überlaufs?!
(Ich muss dazu sagen, dass ich es leider nicht zur Vorlesung schaffe, da diese außerhalb der Kitazeiten meiner Tochter ist und versuche es mir selbst beizubringen, so langsam sollte ich mir ein Buch anschaffen..).

danke schonmal für die Hilfe, ich werde es gleich mal probieren ;)
Ach und btw gibt es für e eine vorgegebene Konstante in der math.h Bibliothek wie für pi?
 

cwriter

Erfahrenes Mitglied
#4
Es steht in der Aufgabe , dass man int als Zählervariablen verwenden soll, warum ist mir auch nicht ganz klar ..In den Unterlagen steht etwas von der Gefahr des Überlaufs?!
Naja, selbst double hat Rundungsfehler (aber ganz sicher keinen Überlauf bei diesen Grössen). Du kannst aber natürlich auch int verwenden und dann mit der Schrittgrösse multiplizieren.

Ach und btw gibt es für e eine vorgegebene Konstante in der math.h Bibliothek wie für pi?
Unter Windows zumindest gibt es M_PI:
https://docs.microsoft.com/de-de/cpp/c-runtime-library/math-constants

Bei GCC (den ihr vermutlich verwendet) kannst du beim Kompilieren ein "-std=gnu99" (oder -std=gnu11) angeben, also z.B.
Code:
gcc main.c -std=gnu99
Dann geht auch M_PI. Ansonsten kannst du dir das aber auch selbst angeben (nach den includes einfügen):
C:
#define M_PI 3.14159265358979323846
(Hintergrund: Es wurde versäumt, diese Konstanten im Standard zu definieren. Nachträglich konnte das nicht eingeführt werden, da sonst alte Programme, die eigene (andere) M_PI/Konstanten definierten, möglicherweise nicht mehr funktionieren könnten. Daher ist M_PI und Co. nicht standardkonform und bracht spezielle Methoden, um aktiviert zu werden)

Gruss
cwriter
 
Anzeige

Neue Beiträge

Anzeige