Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo,

Wir sollen in der Schule mit einem Näherungsalgorithmus die 3. Wurzel bestimmen.

Ich kann nun mit meinem Quellcode die 3. Wurzel für Zahlen größer 1 und kleiner -1 bestimmen.

Bei Zahlen zwischen -1 und 1 klappt es leider noch nicht, deswegen hab ich die auch mit meiner ersten Abfrage raus genommen.

Hat jemand eine Idee wie ich das auch noch realisieren kann?

#include <stdio.h>

#include <stdlib.h>


float A = 0;

float xneu = 0;

float xalt = 0;

float vergleich = 0;


main()

{

 // Eingabe des Startwertes durch den Benutzer fuer die Variable A, Eingabe muss größer als 1 sein


 printf("************************************\n\n\n");

 printf("Programm zum Berechnen der 3. Wurzel\n\n\n");

 printf("************************************\n\n\n\n");

 printf("Bitte geben Sie die Zahl ein fuer die die 3. Wurzel berechnet werden soll:\n\n\n");

 scanf("%f",& A);

 if ((A>-1&&A<1) || A==0) 

 {

 printf("\n\n\nZahlen zwischen Null und Eins sind nicht erlaubt, bitte versuchen Sie es mit einer zulaessigen Zahl erneut\n\n");

//irgendwie funktioniert das aber net wenn ich 0 eingebe bei Zahlen zwischen 0 und 1 kommt die Ausgabe bei genau 0 aber nicht!?!

 }

 else if (A > 1)

   {

   // Definition der Variablen xalt und xneu

   xneu = A;

   xalt = A;

   // Schleife für Berechnung der 3. Wurzel

   do

   {

   A = ((2*xalt+(xneu/(xalt*xalt)))/3);

   vergleich = (xalt-A);

   xalt = A;      

   }   

   while (vergleich > 0.00000001);

   // Ausgabe des Startwertes A und der 3. Wurzel xneu

   printf("\n\nDie 3. Wurzel Ihrer Zahl %.0f ist: %f\n\n",xneu, A);

   printf("\n\n\n\n");

   }

 else if (A<0) //Abfangen von negativen Zahlen

   {

   // Definition der Variablen xalt und xneu

   xneu = A*(-1);

   xalt = A*(-1);

   // Schleife für Berechnung der 3. Wurzel von negativen Zahlen 

   do

   {

   A = ((2*xalt+(xneu/(xalt*xalt)))/3);

   vergleich = (xalt-A);

   xalt = A;      

   }   

   while (vergleich > 0.00000001);

   // Ausgabe des Startwertes A und der 3. Wurzel xneu

   A=A*(-1);

   xneu=xneu*(-1);

   printf("\n\nDie 3. Wurzel Ihrer Zahl %.0f ist: %f\n\n",xneu, A);

   printf("\n\n\n\n");

   }

 system("PAUSE");  

}

Geschrieben

Bei Zahlen zwischen 1 und -1 werden bei deiner Näherung die Absolutwerte größer, nicht kleiner. Damit wird (xalt-A) negativ. Du musst also den Absolutwert dieses Ausdrucks prüfen.

Es muss im Übrigen auch "int main" heißen ;)

Geschrieben
Es muss im Übrigen auch "int main" heißen ;)

In C kann der Rückgabetyp auch weggelassen, dann wird int automatisch verwendet.

Nur in ANSI-C++ ist das nicht erlaubt.

Konventionssache...

Geschrieben

Hallo,

Also von mir aus schrieb ich im Code auch "int main" ;-)

Aber nun wieder zum eigentlichen Thema:

Bei Zahlen zwischen 1 und -1 werden bei deiner Näherung die Absolutwerte größer, nicht kleiner. Damit wird (xalt-A) negativ. Du musst also den Absolutwert dieses Ausdrucks prüfen.

Wie mache ich das? Könntest du das evtl. auch in Code ausdrücken?

mfg

Geschrieben

Also fabs macht aus negativen Werten einen positiven und belässt positive Werte als positive wenn ich das richtig verstanden habe.

Soweit so gut....

Ich habe meinen Code nun wie folgt umgeschrieben allerdings liefert er mir für Werte zwischen -1 und 1 immernoch die falschen Ergebnisse!?!

#include <stdio.h>

#include <stdlib.h>

#include <math.h>


float A,a = 0;

float xneu = 0;

float xalt = 0;

float vergleich = 0;


main()

{

 // Eingabe des Startwertes durch den Benutzer fuer die Variable A, Eingabe muss größer als 1 sein


 printf("************************************\n\n\n");

 printf("Programm zum Berechnen der 3. Wurzel\n\n\n");

 printf("************************************\n\n\n\n");

 printf("Bitte geben Sie die Zahl ein fuer die die 3. Wurzel berechnet werden soll:\n\n\n");

 scanf("%f",& A);


  if ((A>0&&A<1) || A==0) 

  {

   // Definition der Variablen xalt und xneu a wird der absolute Wert von A zugeordnet

   a= fabs (A);;

   xneu = a;

   xalt = a;

   // Schleife für Berechnung der 3. Wurzel

   do

   {

   a = ((2*xalt+(xneu/(xalt*xalt)))/3);

   vergleich = (xalt-a);

   xalt = a;      

   }   

   while (vergleich > 0.00000001);

   // Ausgabe des Startwertes A und der 3. Wurzel xneu

   printf("\n\nDie 3. Wurzel Ihrer Zahl %.0f ist: %f\n\n",xneu, a);

   printf("\n\n\n\n");

   }

   else if (A > 1)

   {

   // Definition der Variablen xalt und xneu

   xneu = A;

   xalt = A;

   // Schleife für Berechnung der 3. Wurzel

   do

   {

   A = ((2*xalt+(xneu/(xalt*xalt)))/3);

   vergleich = (xalt-A);

   xalt = A;      

   }   

   while (vergleich > 0.00000001);

   // Ausgabe des Startwertes A und der 3. Wurzel xneu

   printf("\n\nDie 3. Wurzel Ihrer Zahl %.0f ist: %f\n\n",xneu, A);

   printf("\n\n\n\n");

   }

 else if (A<0) //Abfangen von negativen Zahlen

   {

   // Definition der Variablen xalt und xneu

   xneu = A*(-1);

   xalt = A*(-1);

   // Schleife für Berechnung der 3. Wurzel von negativen Zahlen 

   do

   {

   A = ((2*xalt+(xneu/(xalt*xalt)))/3);

   vergleich = (xalt-A);

   xalt = A;      

   }   

   while (vergleich > 0.00000001);

   // Ausgabe des Startwertes A und der 3. Wurzel xneu

   A=A*(-1);

   xneu=xneu*(-1);

   printf("\n\nDie 3. Wurzel Ihrer Zahl %.0f ist: %f\n\n",xneu, A);

   printf("\n\n\n\n");

   } 




 system("PAUSE");  

}

Geschrieben
Ich habe meinen Code nun wie folgt umgeschrieben allerdings liefert er mir für Werte zwischen -1 und 1 immernoch die falschen Ergebnisse!?!
Ich sehe nur, dass du eine zusätzliche Variable eingefügt und die Eintrittsbedingung für den ersten Block geändert hast. Sonst machst du immer noch alles genau so wie vorher.

Du sollst fabs bei der Berechnung von vergleich benutzen. Dann brauchst du übrigens auch negative Zahlen nicht mehr "abzufangen". Der Algorithmus funktioniert dann mit allen Zahlen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...