Mein erstes Programm (Promillemesser) - lasst es Kritik hageln ^^



  • So, dass ist also mein erstes Programm...Verbesserungsvorschläge sowie Kritik erwünbscht. Es sollen später noch ein paar andere updates hinzukommen, aber dazu hab ich jetzt noch zu wenig know how ^^

    runden.h

    double runden(double rundungs_wert, int genauigkeit){
     double tempWert = pow(10.0, genauigkeit);
     rundungs_wert *= tempWert;
     rundungs_wert += 0.5;
     rundungs_wert = floor(rundungs_wert);
     rundungs_wert /= tempWert;
    return rundungs_wert;
    }
    

    -------------------------------------------------------------------------

    bak.cpp

    #include <iostream>
    #include <math.h>
    #include "runden.h"
    using namespace std;
    
    /*
    Promillerechner - wann wieder nüchtern?
    */
    
    int main(){
    
     int exit = 1;
     while(exit != 0){
     float menge_1 = 0; // in l
     float menge_2 = 0; // in l
     float menge_3 = 0; // in l
     float menge_4 = 0; // in l
     float prozent_1 = 0; // in prozent (x.xx%)
     float prozent_2 = 0; // in prozent (x.xx%)
     float prozent_3 = 0; // in prozent (x.xx%)
     float prozent_4 = 0; // in prozent (x.xx%)
     float alter; // in jahren
     float groesse; // in cm
     float kg; // in kg
     float zeitraum; // in ganzen zahlen
     float magenmenge; // erstmal außer acht
     float verteilungsfaktor; //abhängig von m o w
     string geschlecht; // m oder w
     int anzahl_getraenke;
    
     //Copyright
     cout << endl << endl << "\t \t ~~~ ~~~ ~~~ ~~~ (c) R. Hillers ~~~ ~~~ ~~~ ~~~" << endl << endl << endl;
    
     //Dateneingabe
      //Person
      cout << "Zuerst brauchen wir dein Geschlecht (m oder w)" << endl;
      cin >> geschlecht;
      cout << "alter:" << endl;
      cin >> alter;
      cout << "Groesse (in cm):" << endl;
      cin >> groesse;
      cout << "Gewicht (in kg)" << endl;
      cin >> kg;
      cout << endl;
      //Alkohol
      cout << "Nun zu den Getraenken" << endl;
      cout <<  "Wie viele verschiedene Getraenke hast du getrunken? (max. 4)" << endl;
      cin >> anzahl_getraenke;
      int x_anzahl = 1;
      do{
        switch(x_anzahl){
        case 1:
        cout << "Wie viel Prozent hatte das " << x_anzahl << ". Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_1;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_1;
        break;
        case 2:
        cout << "Wie viel Prozent hatte das 2. Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_2;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_2;
        break;
        case 3:
        cout << "Wie viel Prozent hatte das 3. Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_3;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_3;
        break;
        case 4:
        cout << "Wie viel Prozent hatte das 4. Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_4;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_4;
        break;
        default: cout << "fehler!" << endl;
        }
       x_anzahl++;
      }
      while(x_anzahl <=  anzahl_getraenke);
    
      cout << "In welchem Zeitraum wurde dieser Verzehrt? (eingabe in Std., komma mit . darstellen )" << endl;
      cin >> zeitraum;
      cout << endl;
    
     //  alk in gramm = in cl - 1l = 100cl*0,08*%des getraenkes
     double alk_gramm_1 = menge_1*1000*(prozent_1/100); // *0.8 entf
     double alk_gramm_2 = menge_2*1000*(prozent_2/100);
     double alk_gramm_3 = menge_3*1000*(prozent_3/100);
     double alk_gramm_4 = menge_4*1000*(prozent_4/100);
     double gesamt_alk_gramm = alk_gramm_1+alk_gramm_2+alk_gramm_3+alk_gramm_4;
    
     // promille - watson
     double promille_watson_gkw;
     //vertraeglichkeit maennlich bzw. weiblich
     if(geschlecht == "m"){
      promille_watson_gkw  = 2.447 - 0.09516 * alter + 0.1074 * groesse + 0.3362 * kg; //männlich
     } else {
      promille_watson_gkw  = -2.097 + 0.1069 * groesse + 0.2466 * kg; //weiblich
     }
    
     double promille_watson = (0.8*gesamt_alk_gramm)/(promille_watson_gkw*1.055);
    
     //promille - widmark
     //verträglichkeit maennlich bzw. weiblich
     if(geschlecht == "m"){
      verteilungsfaktor = 0.7;
     } else {
      verteilungsfaktor = 0.6;
     }
     double promille_widmark = gesamt_alk_gramm*0.8/(verteilungsfaktor*kg);
    
     //durchschnitt watson und widmark ermitteln
     double promille_wat_wid = (promille_watson+promille_widmark)/2;
    
     //Zeitraum abbau abziehen
     double promille_ergebnis = promille_wat_wid-(0.1*zeitraum);
    
     //fahrtuechtig nach weiteren x std.
     double fahrtuechtig = (promille_ergebnis/0.1);
     //nuechtern nach x std.
     double nuechtern = promille_ergebnis/0.1;
    
     //Ausgabe Ergebnis
     cout << "getrunkener Alkohol: " << gesamt_alk_gramm << " g" << endl;
     cout << "Dein Promillewert: " << runden(promille_wat_wid , 3) << endl;
     cout << "Dein Promillewert nach " << zeitraum << " Std.: " <<  runden(promille_ergebnis , 3) << endl;
    
     // Ausgabe resultat
     /*
        *  0,3 Promille: man beginnt, die Wirkung des Alkohols zu spueren
        * 0,5 Promille: deutliches Waermegefuehl, Anheiterung
        * 0,8 Promille: deutlich eingeschraenkte Reaktionsfaehigkeit
        * 1,0 Promille: Konzentrations- und Koordinationsschwierigkeiten, Beeintraechtigung der Muskelkontrolle und des Gleichgewichts, erste Sprachstoerungen
        * 1,5 Promille: starke Betrunkenheit
        * 2,0 Promille: unkontrolliertes Torkeln, Vollrausch, Erbrechen
        * 2,5 Promille: ab hier besteht Lebensgefahr
        * 3,0 Promille: man kann sich nicht mehr aufrecht halten, verliert das Bewusstsein
        * 4,0 Promille: toedliche Dosis
    
    */
     cout << endl <<  "Dein Level:" << endl;
     if(promille_ergebnis < 0.3){
      cout << "Nuechtern - hau ma rein!! ^^" << endl;
      }else if(promille_ergebnis < 0.5){
      cout << "die Wirkung des Alkohols ist spuerbar" << endl;
      }else if(promille_ergebnis < 0.8){
      cout << "deutliches Waermegefuehl, Anheiterung" << endl;
      }else if(promille_ergebnis < 1.0){
      cout << "deutlich eingeschraenkte Reaktionsfaehigkeit" << endl;
      }else if(promille_ergebnis < 1.5){
      cout << "Konzentrations- und Koordinationsschwierigkeiten, Beeintraechtigung der Muskelkontrolle und des Gleichgewichts, erste Sprachstoerungen" << endl;
      }else if(promille_ergebnis < 2.0){
      cout << "starke Betrunkenheit" << endl;
      }else if(promille_ergebnis < 2.5){
      cout << "unkontrolliertes Torkeln, Vollrausch, Erbrechen" << endl;
      }else if(promille_ergebnis < 3.0){
      cout << "ab hier besteht Lebensgefahr" << endl;
      }else if(promille_ergebnis < 4.0){
      cout << "man kann sich nicht mehr aufrecht halten, verliert das Bewusstsein" << endl;
      }else{
      cout << "toedliche Dosis" << endl;
     }
    
     cout << endl;
    
     //fahrtuechtig
     fahrtuechtig = runden(fahrtuechtig , 3);
     fahrtuechtig = fahrtuechtig-3;
    if(fahrtuechtig < 0){
        cout << "Du bist Fahrtuechtig! (Angaben ohne Gewaehr ;))" << endl;
    }else{
     cout << "Fahrtuechtig in " << fahrtuechtig << " Stunden" <<endl;
    }
     //nuechtern
     cout << "nuechtern in " << runden(nuechtern , 3) << " Stunden" << endl;
    
     cout << endl << endl << endl << "\t --- --- --- 0 = schliessen ; 1 = neu starten --- --- ---" << endl << endl << endl;
    
     cin >> exit;
    
     }
    
     return 0;
    }
    


  • also ich persönlich rücke immer vier Zeichen ein (Edit: natürlich mit Tabulator). Ein Zeichen einzurücken ist fast so sinnlos wie keins.

    Desweiteren sehen bei mir if else Konstruktionen so aus:

    if (....)
    {
       // Befehl
    }
    else
    {
        if (...)
        {
    
        }
    }
    

    Muss natürlich letztendlich jeder selbst entscheiden. Wichtig ist nur das es gut lesbar ist.

    Zum Code an sich kann man nicht viel sagen, da ja vor allem viel Textausgabe stattfindet. Da kann man ja nicht soooo viel falsch machen, denke ich.



  • "Script"???



  • Ich würde mal sagen dass eine nicht-template Funktionsdeklaration nicht in einen Header gehört. (runden.h) oder? 😋



  • float menge_1 = 0; // in l
    float menge_2 = 0; // in l
    float menge_3 = 0; // in l
    float menge_4 = 0; // in l
    float prozent_1 = 0; // in prozent (x.xx%)
    float prozent_2 = 0; // in prozent (x.xx%)
    float prozent_3 = 0; // in prozent (x.xx%)
    float prozent_4 = 0; // in prozent (x.xx%)

    das schreit nach array



  • Shade Of Mine schrieb:

    float menge_1 = 0; // in l
    float menge_2 = 0; // in l
    float menge_3 = 0; // in l
    float menge_4 = 0; // in l
    float prozent_1 = 0; // in prozent (x.xx%)
    float prozent_2 = 0; // in prozent (x.xx%)
    float prozent_3 = 0; // in prozent (x.xx%)
    float prozent_4 = 0; // in prozent (x.xx%)

    das schreit nach array

    Das hab ich garnicht gesehen 😉 Habe vor lauter "Cout" den Wald nicht gesehen 😉



  • Such mal bei Google nach Vectoren oder Standartcontainer...
    Denn bei deinem Programm kann man nur 4 Getränke trinken 😉
    Was nun wenn man mehr möchte?
    Deswegen würde ich dir dynamische Container empfehlen, da du ja vorher noch nicht weißt, wie viel du trinkst 🙂

    Ansonsten find ich es für den Anfang ganz ordentlich.

    Aber ich glaube das Programm funktioniert nicht so ganz, wie du dir das vorstellst... Nur eine wage Vermutung 😉 Und zwar bei der do-while Schleife.

    Gruß Speedy_92



  • ReenBeam schrieb:

    do{
        switch(x_anzahl){
        case 1:
        cout << "Wie viel Prozent hatte das " << x_anzahl << ". Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_1;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_1;
        break;
        case 2:
        cout << "Wie viel Prozent hatte das 2. Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_2;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_2;
        break;
        case 3:
        cout << "Wie viel Prozent hatte das 3. Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_3;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_3;
        break;
        case 4:
        cout << "Wie viel Prozent hatte das 4. Getraenk? (komma mit . darstellen)" << endl;
        cin >> prozent_4;
        cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
        cin >> menge_4;
        break;
        default: cout << "fehler!" << endl;
        }
       x_anzahl++;
      }
    

    erstmal: kein script (ist ja nicht JavaScribt oder LUA
    dann: positiv: Kommentare
    allerdings den zitierten Teil eher mit Arrays + Forschleife

    for(int i = anzahl_getraenke, i>0, i++)
    {
    cout << "Wie viel Promille hatte das" << i << ". getraenk?"
    cin >> Promille[i]
    //etc....}
    

    Nur mal so als erste idee, habs mir jetzt auch nicht so genau angeguckt,



  • *g entschuldige mich dann erstmal für den Titel des Beitrages ^^

    die Formatierung ist grotte, da geb ich euch recht *g

    @Pigeon
    nicht? wohin gehört die runden.h dann in den mainteil?

    @Speedy_92
    doch ansich läuft alles prikelnd, zwar kein schöner code, das geb ich zu, aber es läuft zunächst

    @all
    Danke soweit ich werde dann mal nach dem LovePArade-We nochmal gezielt eure Vorschläge abarbeiten

    ThX



  • ReenBeam schrieb:

    @Pigeon
    nicht? wohin gehört die runden.h dann in den mainteil?

    sorry, bin nicht pigeon, aber

    runden.h

    double runden(double x);
    

    runden.cpp

    #include "runden.h"
    
    double runden(double x)
    { //runden implementation
    }
    

    main.cpp

    #include "runden.h"
    int main(int, int)
    {
    ...
     runden(10.0);
    ...
    }
    

    natürlich muss dann main.cpp und runden.cpp kompiliert und gelinkt werden damit das funktioniert.

    die vorteile davon wirst du noch lernen 🙂



  • Genau, Projekte sehen einfach scheisse aus im Ordner, wenn sie nur aus einer Cpp Datei bestehen die auch noch main.cpp heisst 😃

    Den echten Profi erkennt man an den 100 Dateien im Projektordner 😃



  • inpimp schrieb:

    ReenBeam schrieb:

    @Pigeon
    nicht? wohin gehört die runden.h dann in den mainteil?

    sorry, bin nicht pigeon, aber

    runden.h

    double runden(double x);
    

    runden.cpp

    #include "runden.h"
    
    double runden(double x)
    { //runden implementation
    }
    

    main.cpp

    #include "runden.h"
    int main(int, int)
    {
    ...
     runden(10.0);
    ...
    }
    

    natürlich muss dann main.cpp und runden.cpp kompiliert und gelinkt werden damit das funktioniert.

    die vorteile davon wirst du noch lernen 🙂

    wollt grad sagen, iwie check ich die logik nicht ^^ aber wenn ichs noch lernen werd ^^



  • ich hab dann nochmal direkt ne frage...
    ich weiß ja nicht wer dieses überaus grafisch und programmiertechnisch perfekte programm ausprobiert hat *ironie ende ^^

    aber es müssen immer daten zur person ausgefüllt werden, was auf dauer evtl. etw. nerven kann - nein es nervt definitiv *g

    jetzt würd ich das gerne handhaben, dass profile gespeichert & ausgelesen werden können...
    es hapert schon beim speichern...

    undzwar wie bekomm ich es hin, dass die neuen datensätze immer in einer neuen Zeile gespeichert werden?
    Zur zeit wird einfach nur immer der datensatz komplett ersetzt.
    wie kann ich auslesen, wann das ende des letzten zeichen erreicht ist um somit eine neue Zeile zu erstellen?

    Ich weiß zwar noch nicht wie ich es später auslesen/einlesen soll...aber ersma Step by Step 😉
    ThX & MfG Reen



  • undzwar wie bekomm ich es hin, dass die neuen datensätze immer in einer neuen Zeile gespeichert werden?
    Zur zeit wird einfach nur immer der datensatz komplett ersetzt.
    wie kann ich auslesen, wann das ende des letzten zeichen erreicht ist um somit eine neue Zeile zu erstellen?

    Beim Stream kannst du doch das Flag std::ios::app angeben. Dadurch wird immer an die Datei drangehängt. Und dann nach jedem Datensatz einfach ein "\n" 😉

    Gruß Speedy_92


Anmelden zum Antworten