Promillemesser überarbeitet und neue features - bitte weiterhin Tipps :)



  • So, ich hab mich mal an die Arbeit gemacht, das ganze zu verbessern...
    Nun können auch Profile gespeichert und ausgelesen werden.
    erstmal der Code

    runden.h

    double runden(double rundungs_wert, int genauigkeit){
     double tempWert = pow(10.0, genauigkeit);
     rundungs_wert *= tempWert;
    
     if(rundungs_wert>0)
     {
        rundungs_wert += 0.5;
     }
     else
     {
        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"
    #include <fstream>
    
    using namespace std;
    
    /*
    Promillerechner - wann wieder nüchtern?
    */
    
    int main(){
    
     int exit = 1;
     while(exit != 0){
        float menge = 0; // in l
        float prozent = 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;
        double gesamt_alk_gramm = 0;
        double alk_gramm;
        char profil_gespeichert;
        char profil_speichern;
        string gefunden;
        string s_name;
    
        //Copyright
        cout << endl << endl << "\t \t ~~~ ~~~ ~~~ ~~~ (c) R. Hillers ~~~ ~~~ ~~~ ~~~" << endl << endl << endl;
    
        //Besteht Profil schon?
        cout << "Ist dein Profil schon gespeichert? ( j oder n)" << endl;
        cin >> profil_gespeichert;
    
        if(profil_gespeichert == 'j')
        {
    
            cout << "Dein Name?" << endl;
            cin >> s_name;
    
            ifstream r_file;
            string s;
            r_file.open("bak_profile.txt", ios::in);    // Öffne Datei
            while (!r_file.eof())           // Solange noch Daten vorhanden
            {
    
                getline(r_file, s);         // Zeile lesen
                string suche(s_name);
                if(s.find(suche) == 0)      // "Profilname" in der Zeile?
                {
                gefunden = s;               // wenn gefunden, dann Daten der Variablen "gefunden" zuordnen
                }
            }
            r_file.close();                 // Datei schließen
            string auslesen[5];
    
            char * cstr, *p;
    
            string str (gefunden);
    
            cstr = new char [str.size()+1];
            strcpy (cstr, str.c_str());
    
            int i_ausl=0;
            p=strtok (cstr,".");
            while (p!=NULL)
            {
                auslesen[i_ausl]=p;
                p=strtok(NULL,".");
                i_ausl++;
            }
    
            delete[] cstr;
    
            //Ausgabe der Profildaten
            cout << "Name: " << auslesen[0] << endl;
            cout << "Geschlecht: "<< auslesen[1] << endl;
            cout << "Alter: " << auslesen[2] << endl;
            cout << "Groesse: " << auslesen[3] << endl;
            cout << "Gewicht: " << auslesen[4] << endl;
    
            //Zuordnen der Profildaten
            geschlecht=auslesen[1];
            alter = atoi(auslesen[2].c_str());
            groesse=atol(auslesen[3].c_str());
            kg=atol(auslesen[4].c_str());
    
        }
        else // Wenn Profil nicht angelegt, Profildaten manuell eingeben
        {
    
            //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;
            cout << "Profil speichern? (j oder n)" << endl;
            cin >> profil_speichern;
    
            if(profil_speichern == 'j')
            {
                string name;
                cout << "Dann bräuchten wir noch deinen Namen (kein \".\" und keine Sonderzeichen verwenden!" << endl;
                cin >> name;
                ofstream file("bak_profile.txt", ios::app);
                file << name << "." << geschlecht << "." << alter << "." << groesse << "." << kg << endl;
                file.close();
                cout << "Daten gespichert" << endl << endl;
            }
        }
    
        //Alkohol
        cout << "Nun zu den Getraenken" << endl;
        cout <<  "Wie viele verschiedene Getraenke hast du getrunken?" << endl;
        cin >> anzahl_getraenke;
    
        int i;
        for(i=1;i<=anzahl_getraenke;i++)
        {
            cout << "Wie viel Prozent hatte das " << i << ". Getraenk? (komma mit . darstellen)" << endl;
            cin >> prozent;
            cout << "Wie viel hast du davon getrunken? (in Liter, komma mit . darstellen)" << endl;
            cin >> menge;
            alk_gramm = menge*1000*(prozent/100);
            gesamt_alk_gramm += alk_gramm;
        }
    
        cout << "In welchem Zeitraum wurde dieser Verzehrt? (eingabe in Std., komma mit . darstellen )" << endl;
        cin >> zeitraum;
        cout << endl;
    
        // 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);
    
        //Ausgabe Ergebnis
        cout << "getrunkener Alkohol: " << runden(gesamt_alk_gramm , 2) << " g" << endl;
        cout << "Dein Promillewert: " << runden(promille_wat_wid , 3) << endl;
        cout << "Dein Promillewert nach " << zeitraum << " Std.: " <<  runden(promille_ergebnis , 3) << endl;
    
        // Ausgabe resultat
        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 nach weiteren x std.
        double fahrtuechtig = (promille_ergebnis/0.1)-3;
    
        if(fahrtuechtig < 0)
        {
            cout << "Du bist Fahrtuechtig! (Angaben ohne Gewaehr ;))" << endl;
        }
        else
        {
            cout << "Fahrtuechtig in " << runden(fahrtuechtig , 3) << " Stunden (Angabe ohne Gewaehr ;))" <<endl;
        }
    
        //nuechtern nach x std.
        double nuechtern = promille_ergebnis/0.1;
    
        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;
    }
    

    Nun meine Fragen/Probleme *g
    1. wie kann ich das lesen/speichern auslagern? (als header wills irgendwie nicht klappen...)
    2. um speichern/lesen auszulagern muss ich die Datein sicherlich linken - ähm wie, bzw. wo kann man sich belesen :)?
    3. Was sagt ihr dazu?

    ThX & MfG Reen



  • ReenBeam schrieb:

    1. wie kann ich das lesen/speichern auslagern? (als header wills irgendwie nicht klappen...)

    Was will nicht klappen? Natürlich kannst du es als Header auslagern, du musst die Headerdatei dann aber einbinden.

    ReenBeam schrieb:

    2. um speichern/lesen auszulagern muss ich die Datein sicherlich linken - ähm wie, bzw. wo kann man sich belesen :)?

    Nein, Auslagern und Einbinden per #include reicht. Du musst nichts zusätzlich linken.

    ReenBeam schrieb:

    3. Was sagt ihr dazu?

    Ich weiss jetzt nicht, wie es den anderen geht, aber ich hab ehrlich gesagt keine Lust, 300 Zeilen Code durchzulesen...
    Nur was ich grad gesehen habe: Nimm statt <math.h> den C++-Standardheader <cmath>. Eventuell wäre es auch ratsam, einige Variablen in Klassern auszulagern (auch für Profile geeignet).



  • Du baust jetzt drum herum eine schöne Klasse, mit einem Struct, dass alle Informationen enthält. Dieses Struct kannst du dann später leichter abspeichern (wie das geht steht bei "Streams" im C++-FAQ).

    struct Ttest
    {
       // Hier die ganzen Daten rein (Gewicht Größe Promille etc..)
    };
    
    class Saufpegel
    {
       // Konstruktor
       // Destruktor
       void ReadGewicht(); // Liest das Gewicht ein
       void ReadAnzahlBierchen(); // Liest die Menge des Alkohols ein
       .
       .
       .
       void SaveToFile( std::string filename); // speichert das Struct in 
                                               // einer Datei
    };
    

    usw. usf.

    deiner Phantasie sind hier keine Grenzen gesetzt 🙂

    Die grundlagen für dieses Projekt findest du alle hier in den entsprechenden FAQs.



  • das wäre dann u.a. eines der nächsten schritte uach wenn ich die klamotte mit den structs und klassen noch net 1000%ig versteh


Anmelden zum Antworten