Brauche Hilfe bei einer Aufgabe



  • Ich habe während meines Studiums das Modul Einführung in die Programmierung in dem ich in regelmäßigen Abständen HA abgeben muss nun komme ich aufgrund einer Fehlermeldung bei meinem Programm nich weiter und brauche dringend Hilfe...

    Hier einmal die Aufgabenstellung...

    Bei Bakterienkulturen beobachtet man mitunter linear abnehmende Vermehrungsraten, die zum Beispiel
    durch zeitlich variierende Nahrungsressourcen oder sich allm¨ahlich ver¨andernde Umgebungsbedingungen
    verursacht sein k¨onnen. In einem konkreten Szenario k¨onnte sich eine Anfangspopulation von a Bakterien
    am ersten Tag um 5% gegen¨uber dem Vortag vermehren, am zweiten Tag um 4:8%, am dritten Tag um 4:6%,
    am vierten Tag um 4:4% usw., bis eines Tages keine Vermehrung mehr beobachtet wird (Vermehrungsrate
    0%) und danach sogar eine Reduktion der Bakterienkultur unter ihren Anfangswert a auftritt, erst um 0:2%,
    am darauffolgenden Tag bereits um 0:4%, einen Tag sp¨ater um 0:6% usw. bis die Population nach einer
    gewissen Anzahl von Tagen durch Reduktion um 100% ausgestorben ist. Allgemein formuliert, l¨asst sich
    die Entwicklung einer solchen Bakterienkultur bei anf¨anglicher Vermehrungsrate von p% und t¨aglicher Abnahme
    der Vermehrungsrate um q% durch folgende Rekursionsgleichung beschreiben, wobei das Argument
    i den betrachteten Tag kennzeichnet:
    bac(0) = a
    bac(i + 1) = bac(i) + p􀀀iq
    100  bac(i)
    Ausgehend von der Anfangspopulation a w¨achst die Bakterienkultur erst schnell, dann immer langsamer,
    bis sie ihren Maximalwert max am Tag peak erreicht. Zum Zeitpunkt return to initial ist die Population
    wieder auf ihren Ausgangswert geschrumpft und zum Tag extinction ausgestorben, siehe Grafik.
    Anzahl Bakterien
    max
    a
    peak return to initial
    Zeit (Tage)
    extinction
     (Labor¨ubung) Programmieren Sie eine rekursive Funktion
    double bac(int i, double a, double p, double q),
    die die Anzahl Bakterien nach i Tagen berechnet.
     (Labor¨ubung) Betten Sie Ihre Funktion bac geeignet in eine main-Funktion ein, die zuvor die
    Parameter a, p und q vom Nutzer abfragt und auf Plausibilit¨at testet.
     Geben Sie eine Berechnungsvorschrift f¨ur die Zeitpunkte peak, return to initial und extinction an.
     (Labor¨ubung) Experimentieren Sie mit Ihrem C-Programm und testen Sie es anhand von drei selbstgew
    ¨ahlten Szenarien. Sind die Zeitpunkte peak und extinction von a abh¨angig?
     (Labor¨ubung) Ersetzen Sie in Ihrer Funktion bac die Bildungsvorschrift bac(i + 1) = bac(i) +
    p􀀀iq
    100  bac(i) durch bac(i + 1) =
    
    1 + p􀀀iq
    100
    
     bac(i) und vergleichen Sie die Programmlaufzeiten
    f¨ur beide Varianten anhand mehrerer Testl¨aufe.Was stellen Sie fest? Erkl¨aren Sie Ihre Beobachtungen.
     Erarbeiten Sie L¨osungsvorschl¨age, wie die rekursive Berechnungsvorschrift in eine rein iterative Variante
    transformiert werden kann. Vergleichen Sie beide Varianten hinsichtlich erwarteter Laufzeit,
    Speicherplatzverbrauch und Quelltextl¨ange.

    Mein bisheriger Quelltext...

    #include <stdio.h>
    #include <stdlib.h>
    
    double bac(int i, double a, double p, double q)
    {
        if (i == 0)
        {
            return a;
        }
        if (a == 0)
        {
            return 0;
        }
        if (p == 0);
        {
            return 0;
        }
        if (q == 0)
        {
            return 0;
        }
        else
        {
            return (1+((p-i*q)/100))*bac(i);
        }
    }
    
    int main()
    {
        int i;
        double a,p,q;
    
        printf("\n Geben Sie eine Anfangspopulation ein: ");
        scanf("%lf", &a);
        printf("\n Geben Sie eine Vermehrungsrate ein: ");
        scanf("%lf", &p);
        printf("\n Geben Sie die Abnahme der Vermehrungsrate ein: ");
        scanf("%lf", &q);
        printf("\n Geben Sie den Tag von dem die Population berechnet werden soll ein: ");
        scanf("%d", &i);
    
        if (i < 0)
        {
            return 0;
        }
        else
        {
            printf("\n bac(%d) = %d \n", i, bac(i));
            return 0;
        }
    }
    

    Und nun die Fehlermeldung mit der ich nichts anfangen kann...

    bung 5\Bakteri... In function `double bac(int, double, double, double)`:
    bung 5\Bakteri... 5 error: too few arguments to function double bac(int, double, double, double) bung 5\\Bakteri... 24 error: at this point in file bung 5\\Bakteri... In function ìnt main():
    bung 5\Bakteri... 5 error: too few arguments to function `double bac(int, double, double, double)
    bung 5\Bakteri... 48 error: at this point in file

    ich hoffe mir kann jemand weiterhelfen...



  • Du definierst eine Funktion mit 4 Parametern, willst sie dann aber mit nur einem Parameter aufrufen. Das geht nicht.


  • Mod

    Was ist daran unverständlich? bac erwartet 4 Parameter (int und 3x double), du gibst nur einen an. Welchen Wert sollen die anderen haben?

    P.S.: Die Aufgabe kam mir doch gleich so bekannt vor:
    http://www.google.com/search?hl=en&safe=off&tbo=d&biw=1920&bih=889&q=bac+site%3Awww.c-plusplus.net



  • erstmal danke für deine hilfe...

    wenn ich jetzt alle 4 Parameter bei dem

    printf("\n bac(%d) = %d \n", i, bac(i,a,p,q));
    

    mit aufrufe krieg ich immernoch die Fehlermeldung von Zeile 24 was muss ich da denn ändern???



  • In Zeile 24 machst du den gleichen Fehler. Wieder Funktionsaufruf mit nur einem Parameter.



  • Irgendwo muss aber noch ein i-1 (i minus eins) hin.



  • hab jetzt die Berechnung durch eure hinweise und den link von SeppJ soweit hinbekommen...

    jetzt stellt sich mir noch die Frage wie ich die Berechnungen von peak, return to initial und extinction mit einbauen kann???


Anmelden zum Antworten