C Programm zum Potenzieren - Fehler

noch eine simple (und nicht immer nutzbare) debugmethode ist das "echo debugging". ich habs in zusammenhang mit php (ausgaben per echo-befehl) kennengelernt. besagt nix anderes, als dass man zur überprüfung der werte zur laufzeit, diese einfach ausgeben lässt ^^ wie gesagt, simpel aber oft dennoch nützlich.
Jepp, typisches printf-debugging. Wird teilweise während der Entwicklung sogar in Embedded Projekten eingesetzt, da ist dann halt die Standardausgabe nicht ein Monitor sondern z.B. eine serielle Schnittstelle. Wenn du also dein Projekt von vorhin hernimmst kannst du folgendes machen:

Code:
[COLOR=black]#include <stdio.h> 
[COLOR=black]#include <stdlib.h> 
[COLOR=black]#include <math.h>  
[COLOR=black]int main()
{   [COLOR=black]double base = 0;   [COLOR=black]double exponent = 0; [COLOR=black]  double result = 0;   [COLOR=black]printf("Geben Sie die Basis ein, zu der potenziert werden soll:\n"); [COLOR=black]
   scanf("%lf", &base);   printf("Debugausgabe Basis: %f/* oder %e*/\n", base);
   [COLOR=black]printf("Geben Sie den Exponenten ein:\n"); 
   [COLOR=black]scanf("%lf", &exponent); 
   printf("Debugausgabe Exponent: %f/* oder %e*/\n", [COLOR=black]exponent); 
   [COLOR=black]result = pow(base,exponent);  
   [COLOR=black]printf("Ergebnis: %.2f\n", result);  
   [COLOR=black]return 0; 
[COLOR=black]}

Interessant wird die Aufgabe jetzt noch wenn du hingehst und nicht die Funktion pow() verwendest sondern versuchst die Funktion selbst zu erstellen.
 
Zuletzt bearbeitet:
Interessant wird die Aufgabe jetzt noch wenn du hingehst und nicht die Funktion pow() verwendest sondern versuchst die Funktion selbst zu erstellen.

:D
Nicht unbedingt die performanteste Lösung, aber funktional (Java/C#-Code):

Code:
            /// Berechnet k  ^ n
            /// Negative Potenzen erlaubt
            public static double exp(double k, int n)
            {
                double erg = 1.0;

                if (n == 1)
                {
                    return k;
                }
                else if (n > 1)
                {
                    while (n-- > 0)
                    {
                        erg *= k;
                    }
                }
                else if (n < 0)
                {
                    erg = 1 / exp(k, -n);
                }

                return erg;
            }
 
Zuletzt bearbeitet:
Wenn ich das richtig verstehe wird bei printf-debugging jeder Schritt durche eine printf() Funktion ausgegeben und es lässt sich so feststellen, bei welchem Schritt es hakt. Oder?

@fadade: Was wäre denn performanter? Schon mit vorberechneten Werten arbeiten und in deinem Fall n ungefähr einordnen?
 
man muss ned überall ne ausgabe bauen, aber man kann es natürlich ^^ am besten schreibt man dann sowas wie "stelle so und so im code, variable bla hat wert blubb". oder man schreibt einfach nur 1 2 3 4 pro print und kann dann sehen, aha, bis zur 3 is er gekommen, die 4 führt er scho ned mehr aus, also muss irgendwo nach dem print(3) befehl was im argen sein ^^

wie gesagt, stell dir darunter nix kompliziertes oder weltbewegendes vor.
 
Wenn ich das richtig verstehe wird bei printf-debugging jeder Schritt durche eine printf() Funktion ausgegeben und es lässt sich so feststellen, bei welchem Schritt es hakt. Oder?

Sinnvollerweise platziert man die Debug-Ausgaben nur an den Stellen, wo "kritische"/wichtige Aktionen passieren. Darüber hinaus kannst du die Ausgaben auch noch etwas tiefergehend modifizieren, sprich wenn sich eine Variable x aus den Werte 325, y, 2*k, ... zusammensetzt kannst du entweder nur das Ergebnis x ausgeben oder sowas wie "x=[wert], zusammengesetzt aus y=[wert], k=[wert] ...". Das macht die Rückverfolgung einfacher. Ich würde mal sagen, dass man aus dieser Form des "Debuggens" keine so große Wissenschaft machen sollte; man gibt halt aus, was halbwegs sinnvoll ist und zur Fehlerfindung beiträgt :D

@fadade: Was wäre denn performanter? Schon mit vorberechneten Werten arbeiten und in deinem Fall n ungefähr einordnen?
Vorberechnete Werte machen wenig Sinn, dazu ist der kombinatorische Wertebereich zu groß. Allerdings kann man hier gut antworten mit "kommt auf die Eingabedaten an" ;)
Es kann ja sein, dass die Methode seeehr oft, mit eher kleinen Potenzen aufgerufen wird, oder nicht so oft, aber dafür mit höheren Potenzen, oder auch immer nur mit negativen Werten oder oder. Da könnten mehrere separate Methoden dann performanter sein - sind aber auch nicht so flexibel. Auf Ebene des Maschinencodes (wie es wohl bei der verfügbaren pow-methode der Fall sein wird) kann man da natürlich auch noch etwas drehen ... mir war einfach eine funktionale Methode wichtig :)
 
Zurück