Wenn man viel mit Copy&Paste programmiert, ist das fast immer schlecht. Das zeigt, dass man sein Problem nicht hinreichend abstrahiert hat.
Jetzt, wo du deine Hausaufgaben gelöst hast, kann ich auch vormachen, wie es besser ginge: Eine Funktion sollte genau eine Sache tun und diese gut. Der Name der Funktion sollte möglichst genau ausdrücken, was sie tut. Besonders schlecht in deinem Programm ist die Funktion berechnen und ausgabe . Die Namen drücken nicht aus, was passiert. ausgabe berechnet etwas. berechnen versucht auf der einen Seite eine allgemeine Integrationsfunktion zu sein, ist aber andererseits merkwürdig beschränkt in der Auswahl der möglichen integrablen Funktionen, da diese fest im Code stehen.
Und globale Variablen gehen mal überhaupt nicht. Todsünde.
Ein kurzes Beispiel, wie es besser ginge:
#include <assert.h>
// Approximates the integral of the function f from a to b to the order of n.
// The valid range for n is 1 to 6.
double integrate(double (*f)(double), double a, double b, int n)
{
static const double coefficients[6][7]={
{1./2, 1./2},
{1./6, 4./6, 1./6},
{1./8, 3./8, 3./8, 1./8},
{7./90, 32./90, 12./90, 32./90, 7./90},
{19./288, 75./288, 50./288, 50./288, 75./288, 19./288},
{41./840, 216./840,27./840, 272./840, 27./840, 216./840, 41./840}};
double step = (b-a)/n;
double sum = 0;
assert(n > 0 && n < 7);
for (int i = 0; i <= n; ++i)
sum += f(a + i * step) * coefficients[n-1][i];
return sum * (b-a);
}
#include <stdio.h>
#include <math.h>
double xtox(double x)
{
return pow(x,x);
}
int main()
{
for (int i = 1; i <=6; ++i)
printf("%d: %f\n", i, integrate(xtox, 4, 7, i));
}
PS: Hier vermisse ich C++ . Funktionsobjekte und Lambdaausdrücke sind doch was Schönes.