Wie sieht das struktoramm zur pq Formel aus?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Studium / Ausbildung

Diviil1 
Beitragsersteller
 09.09.2020, 11:25

Danke für den Hinweis. Ist mir eben entfallen. Gibt es verbesserungsvorschläge?

0
TechnikSpezi  09.09.2020, 11:26
@Diviil1

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).

2
Diviil1 
Beitragsersteller
 09.09.2020, 11:29
@TechnikSpezi

Das ist der erste Ansatz von mir gewesen. Soweit hab ich vermutlich nicht gedacht. Werde mich dann wohl an die Optimierung begeben

1
TechnikSpezi  09.09.2020, 11:43
@Diviil1

Dann mach es lieber so wie ich sagte. Weniger verschachtelt ist besser :)

0
Diviil1 
Beitragsersteller
 09.09.2020, 11:53
@TechnikSpezi

Danke für den Input. Ich werde mich nach der Arbeit nochmal dran geben und das Ergebniss nochmal reinstellen..

1
Diviil1 
Beitragsersteller
 10.09.2020, 13:47
@Diviil1

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);
1
TechnikSpezi  10.09.2020, 21:42
@Diviil1

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

0
Diviil1 
Beitragsersteller
 09.09.2020, 13:23

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.

0
TechnikSpezi  10.09.2020, 21:50
@Diviil1

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.

0
Diviil1 
Beitragsersteller
 11.09.2020, 06:59
@TechnikSpezi

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

0
TechnikSpezi  11.09.2020, 07:49
@Diviil1

Ich schau mir das später gerne nochmal an. Muss aber erstmal selbst eine Klausur schreiben und arbeiten. Bis frühstens heute Nachmittag/Abend ;)

0
Diviil1 
Beitragsersteller
 10.09.2020, 13:29

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);

0

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.)

http://rosettacode.org/wiki/Roots_of_a_quadratic_function


Diviil1 
Beitragsersteller
 09.09.2020, 13:21

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?

0
Franz1957  10.09.2020, 12:46
@Diviil1

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

0