zurückspringen



  • hi leute komm nicht weiter:/

    #include <iostream> 
    
    using namespace std;
    
    struct messung
    {
        float mes;
        int tag;
        char mon;
        char jahr;
        char std;
        char min;
    };
    
    int main()
    { 
    
        messung wert[50];
        char a=248;
        char b;
        int anz=1;
        int i;
        int tagzeit;
        int tag1;
        int uhr;
        int uhr2;
        float durch;
    
        int tmp;
    
        for (i=0;i<anz;i++)
    
        { 
            cout << ""<<i+1<<". Messung! ";
            cout << "Eingabe mit 0 beenden!""\n";
            cout << "Geben Sie die Temperatur an! ";
            cin  >> wert[i].mes;
            if (wert[i].mes==0)
            break;
            while(wert[i].tag>31||isalpha(wert[i].tag))
            {
            cout << "Geben Sie den Tag an! ";
            cin  >> wert[i].tag;
            }
    
            cout << "Geben Sie den Monat an! ";
            cin  >> wert[i].mon;
            cout << "Geben Sie das Jahr an! ";
            cin >> wert[i].jahr;
            cout << "Geben Sie die Stunde an! ";
            cin >> wert[i].std;
            cout << "Geben Sie die Minuten an! ";
            cin >> wert[i].min;
            anz+=1;
        }
        cout <<"\n";
        cout << "Sortiere Messwerte nach Tag=1 nach Zeit=2 ";
        cin >> tagzeit;
    
        if (tagzeit==1)
        {
           cout << "Nach welchen Tag sollen die Messwerte sortiert werden? ";
           cin >> tag1;
    
           for (i=0;i<anz-1;i++)
           {
    
               if (wert[i].tag==tag1)
               cout <<"Temperatur "<<wert[i].mes<<a<<"   Am "<<wert[i].tag<<"."<<wert[i].mon<<"."<<wert[i].jahr<<"    Uhrzeit "<<wert[i].std<<":"<<wert[i].min<<"\n";
           }
        }
    
        else
        {
    
            cout << "Nach welcher Uhrzeit sollen die Messwerte sortiert werden? ";
            cin >> uhr;
            cout <<"\n";
            for (i=0;i<anz-1;i++)
               {
                   if (wert[i].std==uhr)
                   cout <<"Temperatur "<<wert[i].mes<<a<<"   Am "<<wert[i].tag<<"."<<wert[i].mon<<"."<<wert[i].jahr<<"    Uhrzeit "<<wert[i].std<<":"<<wert[i].min<<"\n";
                   else
                   cout <<"Es wurden keine Messwerte an diesem Tag gemessen!";
                   break;
                }
        cout <<"Durchschnitt der Messwerte einer bestimmten Uhrzeit? Ja=j Nein=n? ";
        cin >> b;
        if (b=='j'||b=='J')
        {
                    cout <<"Von welcher Stunde soll der Durchschnitt der Messwerte ausgegeben werden? ";
                    cin >>uhr2;
                    for (i=0;i<anz-1;i++)
                    {
                        if (wert[i].std==uhr2)
                        durch+=wert[i].mes;
                        else
                        cout <<"Es wurden keine Messwerte an dieser Stunde gemessen!";
                        break;
                    }
        durch/=(anz-1);
        cout <<"\n";
        cout <<"Um "<<uhr2<<" Uhr betreagt der Durchschnitt aller Messwerte! "<<durch;
        }
        }
    
        cin >> tmp;
        return 0;
    }
    

    ab dieser stelle

    while(wert[i].tag>31||isalpha(wert[i].tag))
    {
    cout << "Geben Sie den Tag an! ";
    cin >> wert[i].tag;
    }
    also ich will die frage solange widerholen bis sie wahr ist also alles unter 30. er soll die frage wieder holen wenn man drüber ist oder bustaben eingibt. doch wenn man einen bustaben eingibt wiederholt er die frage unendlich mal.

    jemand ne lösung?


  • Mod

    do
    {
     cout << "Geben Sie den Tag an! ";
     cin.clear();
     cin.ignore(999999, '\n');
    }while ((not (cin >> wert[i].tag)) or (wert[i].tag>31))
    

    Ungetestet und mit viel zu vielen Klammern, aber ungefähr so.



  • Guten Abend,
    wenn bei der Eingabe eine Zahl erwartet wird, du aber ein Zeichen eingibst, dann befindet sich das cin-Objekt in einem Fehlerzustand (cin.fail() == true) und das eingegebene Zeichen bleibt im Puffer stecken. Darum musst du in diesem Fall, für eine erneute Eingabe, zuerst das cin-Objekt in seinen gültigen Zustand zurückführen (cin.clear()), und dann das/die noch im Puffer stehenden Zeichen verwerfen (cin.ignore()).

    lg



  • also müsste ich quasi die beiden einfügen?

    cin.clear();
    cin.ignore(999999, '\n');

    while(wert[i].tag>31||isalpha(wert[i].tag))
    {
    cin.clear();
    cin.ignore(999999, '\n');
    cout << "Geben Sie den Tag an! ";
    cin >> wert[i].tag;
    }



  • sooo..
    Danke was sehr hilfreich! nun hab ich das problem, dass wenn die eingabe stimmt also sagen wa 20 ist, muss ich nocheine zahl eingeben damit er weiter macht?


  • Mod

    Acidcool schrieb:

    sooo..
    Danke was sehr hilfreich! nun hab ich das problem, dass wenn die eingabe stimmt also sagen wa 20 ist, muss ich nocheine zahl eingeben damit er weiter macht?

    Das wird wohl daran liegen, dass deine Abbruchbedingung Unsinn ist. Eine richtige wurde dir gezeigt.



  • do
            {
               cin.clear();
               cin.ignore(999999, '\n'); 
               cout << "Geben Sie den Tag an! ";
               cin  >> wert[i].tag;
    
               if (wert[i].tag==0||wert[i].tag>31||isalpha(wert[i].tag))
               cout << "Falsche Eingabe! ";
    
            }
            while (wert[i].tag>31)
    
            do
            {
               cin.clear();
               cin.ignore(999999, '\n'); 
               cout << "Geben Sie den Monat an! ";
               cin  >> wert[i].mon;
    
               if (wert[i].mon==0||wert[i].mon>12||isalpha(wert[i].mon))
               cout << "Falsche Eingabe! ";
            }
            while(wert[i].mon>12);
    

    hab jetzt so gemacht wie ich es verstanden hab. doch leider geht es immer noch nicht. und zwar egal was ich eingebe ist der tag richtig bei dem monat geht es jedoch perfect. er gibt fehler aus und mach die schleife wieder von vorn.
    wieso geht jetzt der tag nicht aber der monat? es kann jetzt du mit der while bedingung was nicht stimmen aber was?


  • Mod

    isalpha(wert[i].tag)
    

    Was soll das machen? Das macht überhaupt keinen Sinn! wert[i].tag ist bei dir ein int, wie soll der etwas anderes als eine Zahl beinhalten?



  • also soll ich die integer werte in char wechseln? ich bin ein einfänger hab erst ein jahr info also wenn die frage zu blöd ist dann einfach bescheid sagen.



  • okey hab grad rumgetestet und festgestellt das ich mit char garnicht rechnen kann:/

    meine frage ist jetzt diese:

    wie kan ich das so machen dass,ich eine frage (dort kommen nur zahlen rein) stelle. die frage dann, nach bustaben abgefragt wird und ob die zahl z.b großer ist als 10. kommt dann sowas wie falsch und wiederholt die frage solange bist eine zahl einkommt die stimmt.

    wert eingebn
    qw
    falsche eingabe
    wert eingeben
    11
    wert2 eingeben



  • okey

    int main()
    {

    int i;
    int tmp;

    do
    {
    cout << "Geben Sie den Tag an! ";
    cin.clear();
    cin.ignore(999999, '\n');
    if ((!(isdigit(i)))
    cout << "error1! ";
    }
    while ((! (cin >> i)) || (i>31));

    das hat jetzt funktioniert aber ich verstehe die abbruch bedingung nicht wenn nicht eingabe oder i > 31 ???



  • Guten Abend,

    do
    {
    }
    /*
            1. (!(cin >> i)
                --> (cin >> i)
                    --> Die die Methode operator>> wird aufgerufen, sodass du etwas eingeben kannst. Diese Methode liefert dann das cin-Objekt wieder zurück...dann hast du da praktisch so etwas stehen: !(cin)
                --> !(cin), damit prüfst du, ob sich das cin-Objekt in einem Fehlerzustand befindet, oder gültig ist.
                    --> Wenn keine Zahl eingegeben wurde --> Fehlerzustand
                    --> Wurde eine Zahl eingegeben --> Kein Fehlerzustand
    
            2. (i>31)
                --> Wenn du eine Zahl eingibst, die aber zu groß ist... dann ist das ja genauso falsch.
    
            Erkenntnisse:
                --> In 1 prüfst du, ob überhaupt eine Zahl eingegeben wurde.
                --> in 2 prüfst du, ob die Zahl zu groß ist.     
    */
    while ((!(cin >> i)) || (i>31));
    

    PS: Wenn du ein Zeichen statt einer Zahl eingibst (Fehler), bleibt die Variable unverändert, d.h. sie behält ihren alten Wert bei.

    int i = 123;
    cin >> i; // Du gibst keine Zahl ein. --> cin ist im Fehlerzustand
    cout << i; // 123
    

    PSS: Benutze bitte C/C++ Tags --> Befindet sich unter den Lach-Smileys.

    lg



  • danke habs jetzt soweit verstanden jetzt ist folgendes

    cout << ""<<i+1<<". Messung! ";
            do
            {
               cin.clear();
               cin.ignore(999999, '\n'); 
               cout << "Eingabe mit 0 beenden!""\n";
               cout << "Geben Sie die Temperatur an! ";
               cin  >> wert[i].mes;
               if (!(isdigit(wert[i].mes)))
               cout << "Falsche Eingabe! ";
            }
            while (!(cin >> wert[i].mes));
    
            if (wert[i].mes==0)
            break;
    

    jetzt macht er das so wenn ich die falsche eingabe mache sagt er Falsche Eingabe und fängt wieder von vorne an. wenn ich jetzt die richtige eingebe kommt dann nur falsche eingabe und ich muss nocheinmal etwas eingeben damit er mit der zweiten frage anfängt.

    was mach ich da falsch kann mir jemand den oben angegeben code so umschreiben möglischt nicht zu viel verändern das es geht?


  • Mod

    Was willst du die ganze Zeit mit dem isdigit? Lies den Wert doch einfach ein! Eine halbwegs funktionierende Lösung an der nur kleine Änderungen nötig waren und die dir alle wichtigen Teile vorführte wurde dir doch auch schon gleich in der ersten Antwort gegeben.
    Hier noch etwas ausgefeilter:

    do
    {
      if (!cin)
        {
          cout<<"Fehler!\n";
          cin.clear();
          cin.ignore(999999, '\n');
        }
      cout << "Geben Sie den Tag an! ";
     }
     while (not (cin >> tag) or tag>31);
    

    Beschäftige dich dringend mit den Grundlagen der Ein- und Ausgabe in C++, du hast da ganz viel nicht verstanden. Darf ich fragen, wie du C++ gelernt hast? Das ganze Rumgefusche mit chars, isalpha und isdigit lassen nichts gutes vermuten.

    P.S.: Übrigens kann man mit chars ganz wunderbar rechnen, aber das ist eine andere Geschichte...



  • meinst du das so?

    #include <iostream>
    using namespace std;
    
    struct messung
    {
        float mes;
        int tag;
        char mon;
        char jahr;
        char std;
        char min;
    }; 
    
    int main()
    {
        messung wert[2];
    
        for(int i=0; i<2; ++i)
        {
                cout << ""<<i+1<<". Messung! ";
                cout << "Eingabe mit 0 beenden!""\n";
                cout << "Geben Sie die Temperatur an! ";
    
                while( !(cin>>wert[i].mes) )
                {
                    cin.clear();
                    cin.ignore(999999, '\n');
                    cout << "Falsche Eingabe! Geben Sie die Temperatur nochmals an!";
                }
    
            /*
                PS: Dass diese if immer so funktioniert, wie du es denkst, ist nicht gesagt,
                    weil 0 nicht unbedingt 0 ist. (bei Fließkommazahlen)
            */
            if(wert[i].mes==0)
                break;
        }
        return 0;
    }
    

    Edit: Obwohl bei 0.0 ... 0.0 ist wirklich immer 0.0. 😕



  • es geht dank dir 100000 mal.
    ich verstehe schon etwas nur mit so eine abfrage hatten wir noch nie und das isdigit, isapha kommt davon weil ich nach eine abfrage in google gesucht hab und er mir das ausgespukt hat.

    naja ich bedanke mich nochmal dafür das du so viel geduld hattest!

    LG


Anmelden zum Antworten