Frage von hilfsbedürftigem Studenten



  • Hallo zusammen,

    habe grade im Forum gesehn, dass Ihr einem meiner Leidensgenossen (BWL Student im Informatikpraktikum) mit Erfahrung und Hilfe zur Seite gestanden habt.

    Es wäre echt eine riesige Hilfe für mich, wenn ihr mir da vielleicht auch in ähnlicher Art helfen könntest.

    Anscheinend ist eine Aufgabe der Art ja für Informatiker ein Witz, doch wir beissen uns daran echt die Zähne aus und werden dafür nur sehr unwarscheinlich noch einmal einen Nutzen haben.

    Die Aufgabe lautet wie folgt (ich glaube der größte Teil des Textes ist aber irrelevant):

    Schreiben Sie ein C Programm, das die Exponentialfunktion mit Hilfe einer Reihenentwicklung berechnet, und zwar mit folgender Summen-Formel:

    εx=∑xk/k!=1+x+1/2x2+1/2*3x3+1/2*3*4x^4+....

    Sie sollen die Reihe in jedem Fall ohne die Verwendung von mathematischen Funktionen, also nur mit Hilfe von Addition, Multiplikation und Division, programmieren!

    In einer Programmschleife lässt sich xk einfach durch wiederholtes Multiplizieren von x mit einer Variablen realisieren, die den Anfangswert 1.0 bekommen hat (1.0, 1.0*x, 1.0*x*x,

    1.0*x*x*x, u.s.w.). k! lässt sich ähnlich berechnen: 1.0, 1.0*1, 1.0*1*2, 1.0*1*2*3, u.s.w. Hinweis: Achten Sie darauf, dass die Variablen für das Bilden von xk und k! und die Variable für die Summenbildung alle den Datentyp double haben!

    Wenn die Programmausgabe des Summenwerts "inf" oder "nan" anzeigt liegt ein numerisches Problem vor, das wahrscheinlich durch einen zu hohen Wert in einer Integer-Variablen (Überlauf) entstanden ist.
    Sie sollen die Reihe in jedem Fall ohne die Verwendung von mathematischen Funktionen, also nur mit Hilfe von Addition, Multiplikation und Division, programmieren!
    Ihr Programm soll einen Wert für x als Benutzereingabe einlesen (Datentyp double). Danach soll mit einer for–Schleife die Reihe der Exponentialfunktion von k=0 bis k=Ihre_Matrikel_Nummer%100 (mindestens jedoch bis k=10) berechnet werden. Die Reihe soll also abgebrochen werden, wenn k den Wert erreicht, der sich als Rest der Integer- Division Ihrer Matrikelnummer durch 100 ergibt. Wenn dieser Wert kleiner als 10 ist, soll bis k=10 gelaufen werden (if Anweisung verwenden!). Bei jedem Schleifendurchlauf sollen der Wert für k und der aktuelle Summenwert der Reihe mit printf ausgegeben werden.
    Nach der for–Schleife soll die Reihe noch einmal berechnet werden. Dieses Mal soll dazu eine while–Schleife verwendet werden. Diese Schleife soll nicht eine feste Anzahl von
    Durchläufen ausführen, sondern sie soll die Reihe solange fortsetzen, bis eine vorgegebene Absolut-Differenz zum Wert der Exponentialfunktion aus der C Mathematik-Bibliothek (Funktion exp(), math.h mit #include einfügen!) erreicht wird. Die Mathematik-Funktion exp liefert den Wert der Exponentialfunktion mit der Genauigkeit des Datentyps double. Für die Berechnung der Laufbedingung der while–Schleife müssen Sie das Ergebnis von exp(x) von dem aktuellen Summenwert Ihrer Reihe abziehen und von der Differenz den Absolutbetrag bilden (mit Funktion fabs, siehe Übung 2). Die Schleife soll nur solange laufen wie diese Absolut-Differenz größer als der Wert 100.0/Ihre_Matrikelnummer (Quotient aus 100.0 und Ihrer Matrikelnummer) ist. Bei jedem Schleifendurchlauf sollen die Absolut-Differenz und der aktuelle Summenwert der Reihe ausgegeben werden.
    Bitte beachten Sie, dass beide Schleifen, die for–Schleife und die while–Schleife, im selben Programm hintereinander ausgeführt werden sollen. Mit einer if – Anweisung sollen Sie dafür sorgen, dass die for–Schleife mindestens bis k=10 läuft.

    Über eine Antwort würde ich mich freuen!

    Vielen Dank im Voraus!



  • Ich wuerde zuerst selber zwei Funktionen schrieben umd x^k und k! berechnen zu koennen. Das geht ganz einfach mit einer for-Schleife.
    Die Funktionen koennten in etwa so aussehen:

    double pow(double base, int exponent)
    {
    // Hier mit einer for-Schleife base^exponent berechnen
    }

    long factorial(int n)
    {
    // Hier mit einer for-Schleife n! berechnen
    }

    Und dann musst du bloss noch das ganze in einer Schleife aufsummieren und dabei die Funktionen pow und factorial brauchen.

    Versuche also zuerst einmal pow und factorial zu schreiben.


  • Mod

    icarus2 schrieb:

    Ich wuerde zuerst selber zwei Funktionen schrieben umd x^k und k! berechnen zu koennen. Das geht ganz einfach mit einer for-Schleife.
    Die Funktionen koennten in etwa so aussehen:

    double pow(double base, int exponent)
    {
    // Hier mit einer for-Schleife base^exponent berechnen
    }

    long factorial(int n)
    {
    // Hier mit einer for-Schleife n! berechnen
    }

    Und dann musst du bloss noch das ganze in einer Schleife aufsummieren und dabei die Funktionen pow und factorial brauchen.

    Versuche also zuerst einmal pow und factorial zu schreiben.

    Nein, so machste das nicht. Denn die Fakultät wird schon nach wenigen Schritten riesengroß und du bekommst schon in den niedrigen Ordnungen große Ungenauigkeiten. Da genau diese Aufgabe vor weniger als einer Woche hier im Forum von mir bereits komplett gelöst wurde, mache ich das aber nicht noch einmal vor.



  • SeppJ schrieb:

    icarus2 schrieb:

    Ich wuerde zuerst selber zwei Funktionen schrieben umd x^k und k! berechnen zu koennen. Das geht ganz einfach mit einer for-Schleife.
    Die Funktionen koennten in etwa so aussehen:

    double pow(double base, int exponent)
    {
    // Hier mit einer for-Schleife base^exponent berechnen
    }

    long factorial(int n)
    {
    // Hier mit einer for-Schleife n! berechnen
    }

    Und dann musst du bloss noch das ganze in einer Schleife aufsummieren und dabei die Funktionen pow und factorial brauchen.

    Versuche also zuerst einmal pow und factorial zu schreiben.

    Nein, so machste das nicht. Denn die Fakultät wird schon nach wenigen Schritten riesengroß und du bekommst schon in den niedrigen Ordnungen große Ungenauigkeiten. Da genau diese Aufgabe vor weniger als einer Woche hier im Forum von mir bereits komplett gelöst wurde, mache ich das aber nicht noch einmal vor.

    Jo gut. Das hast du recht. 😞



  • Ernsthaft, der Typ pastet einfach die Originalaufgabenstellung ohne Ansatz oder sonst irgendetwas und ihr antwortet auch noch darauf. Macht den Thread doch einfach dicht, SeppJ hat die Lösung der für drei Wochen angelegten Arbeit doch eh schon im Projekte-Forum gepostet.



  • cooky451 schrieb:

    (...) die Lösung der für drei Wochen angelegten Arbeit (...)

    Das ist ein Scherz, oder?


  • Mod

    seldon schrieb:

    cooky451 schrieb:

    (...) die Lösung der für drei Wochen angelegten Arbeit (...)

    Das ist ein Scherz, oder?

    Leider nein. Das Ding war auf drei Wochen angelegt, unsere drei Freunde haben zwei Wochen nichts gerafft, morgen ist Abgabe. Zeit die ich gebraucht habe: Gut 5 Minuten.



  • Um ehrlich zu sein....SeppJ hat vollkommen recht.
    Haben alle drei zu lange nichts gemacht und jetzt steht die deadline bevor.

    Ich hoffe mal wir haben hier nicht alle verärgert und dürfen in Zukunft mal nach Hilfe und Tipps fragen?!

    Dann auch mit eigenen Ansätzen/ Quelltexten!

    Gibts Morgen direkt ne neue Aufgabe und diesmal mach ich (kann nur für mich sprechen) mich aber mal was eher daran 😃

    So...schönen Sonntag zusammen.



  • mclima schrieb:

    Ich hoffe mal wir haben hier nicht alle verärgert und dürfen in Zukunft mal nach Hilfe und Tipps fragen?!

    Morgen kann sich eh niemand mehr an eure Namen erinnern. Insofern kein Problem. 😉
    Wichtig ist, dass ihr euch Gedanken zum Thema macht, anfangt, die C Grundlagen halbwegs beherrscht und dann möglichst konkrete Fragen formuliert. Denn oft fällt einem die Lösung wie Schuppen von den Augen, wenn man erst mal realisiert hat, woran genau es denn jetzt hackt. Viel Glück jedenfalls.

    (Aber ernsthaft.. 3 Wochen für diese Aufgabe? Oh man^^)



  • Hallo,

    ich habe ebenfalls eine Frage zu genau dieser Aufgabe.
    Ich dachte eigentlich dass meine Lösung in Ordnung wäre, jedoch wird das Ergebnis der while Schleife nicht ausgegeben. Habe es jetzt mit den Lösungen von zwei Kommilitonen verglichen, und finde den Fehler einfach nicht.
    Das Programm möchte ich ungern posten, da hier ja anscheinend noch mehrere Leute auf der Suche sind:) Unser Prof ist da äußerst heftig. Es gibt jeweils 0 Punkte für den jenigen der abgeschrieben hat oder abschrieben hat lassen;)
    Könnte es zb per PN verschicken, wäre sehr sehr dankbar über einen Rat.
    Grüße, pac



  • p-a-c schrieb:

    Unser Prof ist da äußerst heftig. Es gibt jeweils 0 Punkte für den jenigen der abgeschrieben hat oder abschrieben hat lassen;)

    Schade SeppJ, jetzt hast du ausversehen die Noten des ganzen Kurses versaut. :xmas2:

    p-a-c schrieb:

    Könnte es zb per PN verschicken, wäre sehr sehr dankbar über einen Rat.

    Wenn irgendetwas nicht ausgegeben wird, ist das meistens irgendein doofer Flüchtigkeitsfehler. Geh doch einfach mal Schritt für Schritt mit nem Debugger durch und gucke, wo nicht das passiert was du erwartet hast. Wenn du keinen Debugger hast, setze halt überall Testausgaben ein um den Fehler zu finden.



  • Einen debugger habe ich gerade nicht zu Hand, aber vllt hilft das hier weiter.

    while(differenz>=vergl_quotient)

    So sollte es eigentlich da stehen, ohne ; hinter der ). Richtig?
    Wenn ich aber zum testen ein ; einfüge, so wird die erste Zeile angezeigt. Das kann ja eigentlich nicht sein oder?

    Das mit den Ausgaben werde ich mal machen. Danke!



  • Die Guttenberg-support-fraktion ist leider bis Ende Januar 2012 im Weihnachtsurlaub.

    Vielen Dank für ihr Verständnis.



  • ktzg schrieb:

    Die Guttenberg-support-fraktion ist leider bis Ende Januar 2012 im Weihnachtsurlaub.

    Vielen Dank für ihr Verständnis.

    Und dann "anonym". Toll toll 🙂 Wer sagt denn was von kopieren?! Wer lesen kann..



  • Schleifen sind absolute Grundlagen: http://www.tutorials.at/c/08-schleifen.html
    Und dass etwas angezeigt wird, wenn du ein ; dahinter machst, deutet darauf hin, dass schon beim Eintritt in die Schleife (differenz < vergl_quotient) gilt, deswegen wird das was im Schleifenkörper steht nicht ausgeführt.



  • p-a-c schrieb:

    ktzg schrieb:

    Die Guttenberg-support-fraktion ist leider bis Ende Januar 2012 im Weihnachtsurlaub.

    Vielen Dank für ihr Verständnis.

    Und dann "anonym". Toll toll 🙂 Wer sagt denn was von kopieren?! Wer lesen kann..

    GFY!



  • ktzg schrieb:

    p-a-c schrieb:

    ktzg schrieb:

    Die Guttenberg-support-fraktion ist leider bis Ende Januar 2012 im Weihnachtsurlaub.

    Vielen Dank für ihr Verständnis.

    Und dann "anonym". Toll toll 🙂 Wer sagt denn was von kopieren?! Wer lesen kann..

    GFY!

    Eier noch immer nicht gefunden?

    Und danke cooky für den Link


Anmelden zum Antworten