Baktereinzähler - brauche dringend hilfe



  • Ich sollte für das Fach Biologie ein Programm schreiben, der die population von Bakterien nach einem Jahr berechnt.

    Jeden Tag verdoppeln sich die Bakterien. Es wird mir 1 begonnen, also 1, 2, 4, 8, 16, 23 usw.

    Hier mal mein code:

    #include <iostream.h>
    
    int main() {
    int x;
    long double zahl=1;
    cout <<"Bitte geben Sie die anzahl der Tage ein mit der gemessen werden soll\n";
    cin >> x;
    while (1<=x) {
    zahl=zahl*2; //Kann man das noch einbisscehn kürzen? 
                 //Würde das nicht auch so gehen: zahl+=zahl ?
    cout <<"Nach "<< x <<" Tagen sind "<<zahl<<" Bakterien eintstanden\n";
    x--;
    }
    }
    

    Hiermit habe ich jetzt 2 probleme, wo ich es nicht geschaft habe sie zu lösen:
    1. Die Tage (x) werden falschrum dargestellt, nämlich steht oben der höchste wert und unten der kleinste. Ausserdem steht bei der gleinsten Tagesanzahl (natürlich immer 1) die größte bakterienanzahl ... das muss natürlich anders rum sein.
    2. Die gleine Bakterienanzahl ist noch richtig, aber später kommen zahlen wie

    > 4.29497e+009
    oder
    > #INF
    das soll auch nicht sein. Ich brauche die Zahlen ausgeschrieben. Extra habe ich long double genommen, aber trotzdem scheint es nicht zu reichen.

    Ich verlange nicht von euch mir die HA zu machen, aber wenn ihr mir helfen könntet wäre es nett ...



  • oh .. ich sehe grade ganz oben ein fehler 😃 ... 1, 2, 4, 8, 16, 32 (nicht 23)



  • #include <iostream>
    #include <cmath>
    #include <iomanip>
    
    int main ()
    {
        unsigned int x;
        std::cout <<"Bitte geben Sie die anzahl der Tage ein mit der gemessen werden soll\n";
        cin >> x;
        long long = std::pow (2, x); // long long ist KEIN Standard C++
        std::cout << "Nach " << x << " Tagen sind " << std::fixed << zahl << " Bakterien eintstanden" << std::endl;
        return 0;
    }
    

    Was hast du gegen die scientific Darstellung?



  • wie wärs mit

    //uint_64 ist vielleicht in <stdint.h> definiert, bei gcc z.B. unsigned long long
    uint_64 anzahl = 1 << x;
    

    ? Tage beginnen mit Tag 0! Ab Tag 63 ist leider Schicht im Schacht.
    geloescht :xmas1:



  • Danke .filmor, nur wenn ich ehrlich bin, verstehe ich kaum was. Is wohl zuviel für ein 15 jährigen lol

    Die headerdateien cmath und iomanip kenn ich garnicht.

    unsigned int x; ist galube ich unnötig, da signed int völlig ausreicht, auch obwohl die hälte negativ ist.

    std::cout und std::pow verstehe ich nicht. Zwar weiß ich, dass die :: dafür da sind um die begriffe zu trennen, aber dieses Thema habe ich noch nicht ausführlich durchgenommen.

    Ich glaube, dass war ein fehler in c++-forum zu schreiben, den eigentlich lerne ich C, nur war die Text ein- und ausgabe einfacher als mit C.

    long long?? Heißt das nicht long double?

    Wenn ich ehrlich bin, hast du mein interesse geweckt. Ich will jetzt wissen, was die ganzen std::cout´s etc. machen 😃



  • std::pow (2, x);
    

    das sieht mir sehr nach einer Funktionsüberlagerung aus, obwohl hier keine funktion ist 🙂

    Achja, jetzt weiß ich woher ich die :: kenne. Nämlich aus dem Thema klassen. Nur ist hier auch keine classe ( das ist doch auch C++ kein C. Bei C wird ja struct verwendet.



  • Bzgl. std:: -> http://tutorial.schornboeck.net/namespace.htm

    Das iostreams System ist relativ kompliziert und benutzt einige C++-eigene Tricks (Vor allem Operator-Überladung).

    <iomanip> -> enthält die sogenannten Manipulatoren für iostreams (hier fixed), die das Ein-/Ausgabeverhalten verändern
    <cmath> -> die C++ Variante von <math.h> (für std::pow)
    std::pow (x, n) -> xnx^n.

    Habt ihr noch keine Exponentialfunktionen gemacht?

    (Wo du schon mal hier bist, bleib bei C++ 😉 -> http://tutorial.schornboeck.net/inhalt.htm)



  • poroblem schrieb:

    std::cout und std::pow verstehe ich nicht. Zwar weiß ich, dass die :: dafür da sind um die begriffe zu trennen, aber dieses Thema habe ich noch nicht ausführlich durchgenommen.

    ...

    Wenn ich ehrlich bin, hast du mein interesse geweckt. Ich will jetzt wissen, was die ganzen std::cout´s etc. machen 😃

    std::cout entspricht cout. Nur du hast noch den alten Header iostream.h benutzt. Der neue ist iostream. Dort sind aller Befehler im namespace std, den du entweder mit einem
    using namespace std;
    ansprichst, oder for jeden Befehl ein std:: setzt.

    zahl=zahl*2; //Kann man das noch einbisscehn kürzen?
                 //Würde das nicht auch so gehen: zahl+=zahl ?
    

    Ja das geht sogar:

    zahl *= 2;
    

    mfg.



  • Such mal in google nach Namespaces bzw. Namensbereichen oder schau dazu in deiner bevorzugten C++-Referenz nach. Mit :: gibt man an, in welchem Namespace der Compiler nach etwas suchen soll. Meine Variante ist übrigens schneller als pow(2, x). Irgendwer hatte hier eine Signatur zu diesem Thema 😉
    geloescht



  • Gut, ich bleibe hier. Anmelden werde ich mich auch, wenn ich ein tollen Namen gefunden habe.
    zurzeit habe ich das Buch "C- Programmieren von Anfang an". Ich werde mir wohl "C++ objektorientiertes Programmieren von Anfang an" und "C++ Objektorientiertes Programmieren für Windows" kaufen. Alle Bücher sind von Helmut Erlenkötter. Das tutorial werde ich auch durchlesen.

    Zwar habe ich immernoch nicht verstanden was die ganzen sachen machen, aber das war bei meinem ersten Textausgabeprogramm(als ich zum ersten mal programmiert habe) auch so.

    Findet ihr es nicht einbisschen früh, mit 15 C++ zu lernen?? Wie alt wart ihr als ihr angefangen seit?



  • poroblem schrieb:

    Gut, ich bleibe hier. Anmelden werde ich mich auch, wenn ich ein tollen Namen gefunden habe.
    zurzeit habe ich das Buch "C- Programmieren von Anfang an". Ich werde mir wohl "C++ objektorientiertes Programmieren von Anfang an" und "C++ Objektorientiertes Programmieren für Windows" kaufen. Alle Bücher sind von Helmut Erlenkötter. Das tutorial werde ich auch durchlesen.

    Zwar habe ich immernoch nicht verstanden was die ganzen sachen machen, aber das war bei meinem ersten Textausgabeprogramm(als ich zum ersten mal programmiert habe) auch so.

    Findet ihr es nicht einbisschen früh, mit 15 C++ zu lernen?? Wie alt wart ihr als ihr angefangen seit?

    Ich bin 15 und hab mit 13 angefangen. Allerdings hatte ich vorher schon einbisschen PHP und JavaScript programmiert. Hast du schon allgemeine Programmiererfahrungen?

    mfg.



  • Ja ich habe schon programmiert, nur waren es immer internetprogrammiersprachen.
    Da mache ich eigentlich viel css und php kann ich sehr gut. Da kommen noch ein paar andere Sprachen, die es aber nicht wert sind erwähnt zu werden.



  • ich sehe grade, dass du auch css programmierst. Wenigstens einer, der weiß wie man <div> anstadt <td> benutzt



  • Nuja, eigentlich hat CSS nichts von programmieren. Dennoch ist es mit 15 bestimmt nicht zu früh (ich weiß nicht mehr genau wann ich angefangen hab, aber ich glaub es war um 12 rum, direkt nach Basic ;)). Lass auf jeden Fall die Finger von Windows-Programmierung. Bleib bei Standard-C++, ohne irgendwelche Libs, das ist für den Anfang am Besten.



  • Jetzt nochmal zurück zu eigentlichen Programm:
    Der code sieht jetzt zwar schöner aus, funktioniert aber trotzdem nicht richtig.
    Ich kopiere einfach mal :

    Hiermit habe ich jetzt 2 probleme, wo ich es nicht geschaft habe sie zu lösen:
    1. Die Tage (x) werden falschrum dargestellt, nämlich steht oben der höchste wert und unten der kleinste. Ausserdem steht bei der gleinsten Tagesanzahl (natürlich immer 1) die größte bakterienanzahl ... das muss natürlich anders rum sein.
    2. Die gleine Bakterienanzahl ist noch richtig, aber später kommen zahlen wie

    > 4.29497e+009
    oder
    > #INF
    das soll auch nicht sein. Ich brauche die Zahlen ausgeschrieben. Extra habe ich long double genommen, aber trotzdem scheint es nicht zu reichen.



  • printf und nimm ne andere loopvariable



  • #include <iostream>
    #include <iomanip>
    
    int main ()
    {
        int x;
        std::cin >> x;
        long double res = 1;
        for (int i = 1 /* statt 0 */; i <= x; ++i)
            std::cout << "2^" << i << " = " << std::setprecision (0) << std::fixed
                      << (res *= 2) << std::endl;
        return 0;
    }
    

    // edit 🙄 ich schäme mich 😉



  • Ähm rackwitz ... du hast mir jetzt überhaupt nicht geholfen 👎

    Warum soll ich das mit printf machen, wenn cout doch viel besser und eifacher ist. Das so verfältschte ergebnisse rauskommen hat auch nichts mit der while-schleife zu tun. Wichtig ist mir in erster linie, dass stat de, 4.492245e+091 eine normale zahl rauskommt.



  • Ah danke .filmor ...



  • Ich habe immernoch die gleichen fehler Die zahlen werden nicht deximal ausgegeben!!!
    Villeicht sollte man aufhören den code zu verbessern und lieber gucken wo der fehler liegt ??!!! 😞


Anmelden zum Antworten