Wie sieht das struktoramm zur pq Formel aus?
Ich soll ein Struktogramm entwickeln das eine Gleichung mit der pq Formel löst. Die Anforderungen sind: p und q eingeben. Berechnen , ausgeben der ergebnisse und anzahl der Lösungen
, Abfrage ob weitere Gleichung gelöst werden soll ansonsten Programm Ende. Ich hab mal einen entwurf von mir beigefügt.
Kann das so funktionieren? Gibt es verbesserungs Vorschläge?
Y ist die Hilfsvariable für einen weiteren Durchlauf und n gibt die Anzahl der Lösungen an.
Danke für die Hilfe
2 Antworten
Sieht alles richtig aus :)
Nur hast du links vergessen im Fall von a<0 hinzuschreiben, dass n in diesem Fall 0 ist.
Und wenn du ganz genau sein möchtest, dann kannst du noch korrigieren, dass es im dem gleichen Fall nicht keine Lösungen, sondern keine reelle Lösungen gibt. Komplexe Lösungen gibt es hingegen nämlich. Sagt dir vermutlich aber auch gar nichts, also kannst du das auch weglassen.
Hier meine Rückmeldung. Ich habe das Programm mal in C++ versucht. Esläuft auch soweit und liefert die Korrekten Ergebnisse. Jetzt hast du mir den Tip gegeben die Fallunterscheidung weniger zu verschachteln.
Ist das mit meinem Programm erfüllt? Danke für deine Mühen
float p, q, x, x1, x2, a;
int y, n;
int main()
{
y = 1; //Hilfsvariable Schleifenwiederholung
printf("Dieses Tool errechnet durch die eingabe von p und q die Nullstellen \n");
while(y==1){ //Schleife der Funktion
printf("Bitte p und q eingeben \n");
scanf_s("%f", &p);
scanf_s("%f", &q);
printf("\np ist %.2f\n", p);
printf("q ist %.2f\n\n", q);
a = p * p / 4 - q; //Berechnung
if (a < 0) //Bei negativen Ergebnis unter der Wurzel
{
printf("keine reelle Loesung\n");
n = 0;
}
else {
if (a > 0) //Bei positiven Ergebnis unter der Wurzel
{
x1 = (-p / 2) - sqrt(a);
x2 = (-p / 2) + sqrt(a);
n = 2;
printf("x1 ist %.3f\n", x1);
printf("x2 ist %.3f\n", x2);
}
else //Ergebnis unter der Wurzel gleich 0
{
x = -p / 2;
n = 1;
printf("x ist %.3f\n", x);
}
}
printf("die Anzahl der Loesungen betraegt %d\n",n);
printf("Weitere Gleichung loesen?\n1 = Ja, 0 = Nein \n");
scanf_s("%d", &y);
}
return (0);
Ich kenne hierbei nur die O-Notation (Landau-Symbole). Diese kannst du wie folgt angeben:
Ordnung: O(n)
Dein Algorithmus stellt eine lineare Ordnung dar. Es gibt keine verschachtelten Schleifen, die ihn z.B. quadratisch machen könnten.
Ich weiß nicht ob du genau das nun hören wolltest, ansonsten kann ich dir dabei leider nicht weiterhelfen.
Ich habe Probleme n für O(n) zu bestimmen. Welche Operationen fallen in die Anzahl n hinnein?Wirklich vielen dank für deine Mühen
Ich schau mir das später gerne nochmal an. Muss aber erstmal selbst eine Klausur schreiben und arbeiten. Bis frühstens heute Nachmittag/Abend ;)
Danke für den Hinweis. Ist mir eben entfallen. Gibt es verbesserungsvorschläge?
Hab noch einen hinzugefügt, ansonsten sieht alles gut aus. Könntest evtl. direkt eine Fallunterscheidung mit a<0, a=0 und a>0 machen. Oder hast du das so gemacht, weil das Struktogramm das so fordert (ist bei mir schon paar Jahre her, dass ich das anwenden musste).
Das ist der erste Ansatz von mir gewesen. Soweit hab ich vermutlich nicht gedacht. Werde mich dann wohl an die Optimierung begeben
Dann mach es lieber so wie ich sagte. Weniger verschachtelt ist besser :)
Danke für den Input. Ich werde mich nach der Arbeit nochmal dran geben und das Ergebniss nochmal reinstellen..
Ich bin mir nicht sicher ob die vorherigen Kommentare dich erreicht haben . <sicherheitshalber antworte ich nochmal direkt auf deinen Kommentar.
Ich habe das Programm mal in C++ versucht. Es läuft auch soweit und liefert die Korrekten Ergebnisse. Jetzt hast du mir den Tipp gegeben die Fallunterscheidung weniger zu verschachteln.
Ist das mit meinem Programm erfüllt? Danke für deine Mühen
float p, q, x, x1, x2, a;
int y, n;
int main()
{
y = 1; //Hilfsvariable Schleifenwiederholung
printf("Dieses Tool errechnet durch die eingabe von p und q die Nullstellen \n");
while(y==1){ //Schleife der Funktion
printf("Bitte p und q eingeben \n");
scanf_s("%f", &p);
scanf_s("%f", &q);
printf("\np ist %.2f\n", p);
printf("q ist %.2f\n\n", q);
a = p * p / 4 - q; //Berechnung
if (a < 0) //Bei negativen Ergebnis unter der Wurzel
{
printf("keine reelle Loesung\n");
n = 0;
}
else {
if (a > 0) //Bei positiven Ergebnis unter der Wurzel
{
x1 = (-p / 2) - sqrt(a);
x2 = (-p / 2) + sqrt(a);
n = 2;
printf("x1 ist %.3f\n", x1);
printf("x2 ist %.3f\n", x2);
}
else //Ergebnis unter der Wurzel gleich 0
{
x = -p / 2;
n = 1;
printf("x ist %.3f\n", x);
}
}
printf("die Anzahl der Loesungen betraegt %d\n",n);
printf("Weitere Gleichung loesen?\n1 = Ja, 0 = Nein \n");
scanf_s("%d", &y);
}
return (0);
Die anderen Kommentare haben mich in der Tat nicht erreicht.
Dein Code sieht an sich gut aus. Du hast aber immer noch die verschachtelte Fallunterscheidung. Richtig wäre das wie folgt:
//...
a = p * p / 4 - q;
if (a < 0)
{
//do
}
else if(a > 0)
{
//do
}
else //if a==0
{
//do
}
//...
Zuerst wird also geprüft, ob a<0 ist. Ist das nicht der Fall, wird der Block übersprungen bzw. nicht ausgeführt und die nächste Abfrage ist dann, ob stattdessen a>0 zutrifft. Ist das auch nicht der Fall, wird der else Block ausgeführt. Sollte bereits der Fall if(a<0) oder else if(a>0) eintreten, wird der else Block nicht mehr ausgeführt. Theoretisch
Hinweis: Falls Du noch Anregungen brauchen kannst, sind vielleicht diese Beispiele interessant. (In Programmcode in verschiedenen Programmiersprachen ausgedrückt. Statt der p-q-Form ist die Gleichung hier in der a-b-c-Form gegeben.)
Ich bin in meinem Studium noch nicht an dem Punkt angekommen an dem das in Code umgesetzt wird. Wird aber bald kommen. Ich soll nun aber den Algorithmus in seiner Komplexität mit einem Landau Symbol beschreiben. Ich kenne das ungefähre Prinzip, allerdings bin ich noch nicht soweit das ich das selbstständig ableiten könnte. Kannst du mir da weiter helfen?
Tut mir leid, mit den Landau-Symbolen kenne ich mich nicht aus. Wenn ich mir etwas beibringen will, schaue ich immer auch nach englischsprachige Quellen. In diesem Fall zum Thema "Big O notation", z.B. würde ich bei den hier angegebenen "External links" schauen: https://en.wikipedia.org/wiki/Big_O_notation
Noch eine ergänze Frage. Wie kann ich die Komplexität des Algorithmus mit einem Landau Symbol angeben? Ich versteh ungefähr das Prinzip der Komplexität aber ich bin nicht soweit das ich das jetzt eigenständig aus dem Struktogramm ableiten könnte. Wäre Klasse wenn du mir da weiterhelfen könntest.