DD1986 Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 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"); } Zitieren
Klotzkopp Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 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 Zitieren
TDM Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 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... Zitieren
Klotzkopp Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 In C kann der Rückgabetyp auch weggelassen, dann wird int automatisch verwendet.Nicht nach dem aktuellen Standard (C99). Zitieren
DD1986 Geschrieben 9. Juni 2008 Autor Geschrieben 9. Juni 2008 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 Zitieren
Klotzkopp Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 Wie mache ich das?In C mit der Funktion fabs. Könntest du das evtl. auch in Code ausdrücken?Die Umsetzung überlasse ich Dir als leichte Übung Zitieren
DD1986 Geschrieben 9. Juni 2008 Autor Geschrieben 9. Juni 2008 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"); } Zitieren
Klotzkopp Geschrieben 10. Juni 2008 Geschrieben 10. Juni 2008 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. Zitieren
Empfohlene Beiträge
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.