Frage zu einer Eingabefolge



  • Hallo.
    Keine Ahnung, ob das jetzt wirklich die richtige Adresse für meine Frage ist, aber ich versuchs einfach mal.
    Ich studiere jetzt im 2. Semester Informatik und wir haben gerade mit C++ angefangen.
    Wir haben auch schon Übungen bekommen, wo ich schon bei der ersten Aufgabe nicht weiterkomme.

    Schreiben und testen Sie ein Programm, das eine Folge von ganzen Zahlen einliest, bis eine 0 eingegeben wird und ausgibt, ob die eingegebene Zahlenfolge monoton steigend, monoton fallend oder ungeordnet war. Dazu genügt es, das Monotonieverhalten der bisher eingegebenen Folge zu speichern und bei Eingabe jeder neuen Zahl zu aktualisieren.. Speichern Sie die eingegebenen Zahlen nicht in einem Array.

    Jetzt mein Problem. Wie kann ich diese Aufgabe ohne Array lösen??
    Auf welche Weise kann ich die eingegebenen Zahlen noch speichern??
    Mit zwei Zahlen ist das ja kein Problem, das krieg ich ja noch hin , aber wie mach ich das dann bei einer Folge??

    Für Tipps und Ratschläe wäre ich sehr dankbar. Würde mich auch noch über leicht verständliche Antworten freuen, da ich erst eine Vorlesung hatte.

    Vielen Dank schonmal.

    Grüße Chiro



  • Du speicherst die Zahlen überhaupt nicht. Du merkst dir nur die letzte Zahl und wie sich die folge bisher verhalten hat.



  • Hi.

    Hmm... genau das ist ja mein Problem.
    Ich mein, ich brauch ja eine Schleife. Muss ich dann in dieser Schleife immer 2 Zahlen miteinander vergleichen oder nur eine?
    Also brauch ich dann 2 Variablen oder nur eine ?
    Das ganze verwirrt mich doch etwas.
    Ich mein, die Aufgabe versteh ich schon, aber ich kanns halt irgendwie nicht in c++ übertragen.



  • chiro schrieb:

    Hi.

    Hmm... genau das ist ja mein Problem.
    Ich mein, ich brauch ja eine Schleife. Muss ich dann in dieser Schleife immer 2 Zahlen miteinander vergleichen oder nur eine?
    Also brauch ich dann 2 Variablen oder nur eine ?
    Das ganze verwirrt mich doch etwas.
    Ich mein, die Aufgabe versteh ich schon, aber ich kanns halt irgendwie nicht in c++ übertragen.

    Kommst du mit nur einer Variable aus? Kann man die Differenz zweier Werte herausfinden, wenn man nur einen kennt?

    Mach dir das an einem Beispiel klar. Wie würdest du die Aufgabe für die Kette
    1 3 4 5 7 2 9 10
    lösen?



  • Gar kein so schlechtes Argument 🙂

    Also, zunächst müsste man 1 und 3 vergleichen. => monoton wachsend.
    Dann kommt die 4. 4>3 => mit dem von vorher auch monoton wachsend.
    Das geht dann so weiter bis man zur 2 kommt.
    2<7=> da die Folge vorher monoton wachsend war, jetzt aber fällt, ist sie ungeordnet.
    Stimmt doch soweit, oder ?
    Falls das jetzt stimmen sollte, fällt mir die Umsetzung dennoch "zu" schwer.

    Danke für deine Geduld.

    Grüße Chiro



  • Das stimmt schon so weit.

    Ich wollte eigentlich keine Lösung geben, aber es geht wohl kaum anders.

    Um zu entscheiden, dass das Beispiel ungeordnet war hast du dir gemerkt, dass es zuerst steigend war und dann an einer Stelle fallend. Das gleiche kannst du in deinem Programm machen. Dazu gibt es viele Möglichkeiten. Hier sind zwei:

    1. Eine Zustandsmaschine. Du bist zuerst im Zustand "egal". Dann liest du die ersten beiden Zahlen ein und gehst entweder in den Zustand "fallend" oder "steigend" oder "egal" je nachdem ob die Zahlen unterschiedlich oder gleich sind. Das machst du mit den weiteren Zahlen ebenso. Je nachdem, in welchem Zustand du bist entscheidest du aber anders: Bist du in "fallend" und du siehst dass die nächste Zahl größer ist, dann weißt du, dass die Folge "ungeordnet ist"

    2. Du zählst einfach, wie oft eine Vorgänger Zahl größer oder kleiner als die Nachfolgerzahl ist. Sind die Summen beide größer 0, hast du eine ungeordnete Folge.



  • Hi Ponto.

    Ich danke dir, dass du dich zunächst bemüht hast, mir keine Lösung zu geben, denn das sollte ja dann letztendlich doch an mir liegen.
    Deine verschiedenen Ansätze versteh ich auch, aber das ändert halt immer nch nix daran, dass ich nicht weiß, wie ich das jetzt Programmieren soll.Denn mein Hauptproblem ist immernoch, wie ich mir im Programm merken kann, dass die Folge vorher eine bestimmte Monotonie hatte.
    Aber ich werde jetzt mal noch ne Weile rumprobieren, vielleicht komm ich ja dann irgendwann auf nen grünen Zweig.

    Also nochmal, Vielen Dank



  • chiro schrieb:

    Hi Ponto.

    Ich danke dir, dass du dich zunächst bemüht hast, mir keine Lösung zu geben, denn das sollte ja dann letztendlich doch an mir liegen.
    Deine verschiedenen Ansätze versteh ich auch, aber das ändert halt immer nch nix daran, dass ich nicht weiß, wie ich das jetzt Programmieren soll.Denn mein Hauptproblem ist immernoch, wie ich mir im Programm merken kann, dass die Folge vorher eine bestimmte Monotonie hatte.
    Aber ich werde jetzt mal noch ne Weile rumprobieren, vielleicht komm ich ja dann irgendwann auf nen grünen Zweig.

    Also nochmal, Vielen Dank

    bool ist_fallend = ( wert1 > wert2);
    bool ist_steigend = (wert1 < wert2);



  • Hi Ponto.
    Es ist mir echt schon peinlich, aber ich habs immer noch nicht geschafft.
    Aber mitlerweile weiß ich ganz genau wo mein Problem liegt.
    Also, ich lese 2 Zahlen ein(Kann ich).Über diese 2 Zahlen treffe ich eine Monotonieentscheidung(kann ich auch).
    So jetzt kommt es.
    Ich hatte mir halt überlegt, dass Programm so ablaufen:

    Bitte geben Sie eine Zahl ein: a
    Bitte geben Sie eine Zahl ein: b
    Bitte geben Sie eine Zahl ein: c
    Bitte geben Sie eine Zahl ein: 0

    Die Folge ist monoton... .

    Wenn ich nun allerdings nach den ersten 2 Zahlen noch eine eingeben will, weiß man Programm halt nicht mehr was vorher war.

    So werden halt nur immer die letzten 2 Zahlen betrachtet und alle Zahlen vorher total "vergessen".

    Vielleicht kann sich mir ja nochmal jemand erbarmen.



  • Dann versuch's ich nochmal 🙂

    @chiro:

    In einem kurzen Schritt (wenn n nicht die zuerst eingegebene zahl):

    Die Zahl n wird eingegeben
    n mit x (Die vorher eingegebene Zahl und in x gespeicherte) vergleichen;
    Anhand dieses Vergleiches das jeweilige Status-Flag (monoton_steigend = true || monoton_fallend = true) setzen;
    x den Wert von n zuweisen. (Um aktuelle Zahl wieder zu speichern)
    ...
    
    Ausgabe:
    Wenn nur eins der Flags true ist, dann ist es entweder monoton_steigend oder monoton_fallend ansonsten ungeordnet.
    Dazu sollten vor der gesamten Eingabe die Status-Flags mit false vorbelegt werden.
    

    Und just by the way: Gehört das nicht besser ins Standard-C++-Forum?

    Caipi



  • Hi Caipi.
    Zunächst mal danke. Das mit dem falschen Forum, ja sorry, aber ich wußte halt nicht wohin sonst.
    Trotz deiner großen Hilfe hab ich es wirklich immernoch nicht geschafft, die Aufgabe zu lösen. *schäm*
    Egal welche Folge ich eingebe, es kommt immer nur monoton steigen raus.
    Deswegen poste ich hier mal meinen Code, vielleicht kannste mir daran ja sagen, wo mein(e) Fehler liegt/liegen.

    #include<iostream>
    using namespace std;

    int main()
    {
    int a;
    int n;
    int x;

    bool monoton_steigend;
    bool monoton_fallend;

    monoton_steigend=false;
    monoton_fallend =false;

    while (x!=0)
    {
    cout<<"Bitte eine Zahl eingeben:";
    cin>> a;
    x=a;
    cout<<"Bitte eine Zahl eingeben:";
    cin>> n;
    if (x>n) monoton_fallend=true;
    else if (x<n) monoton_steigend=true;
    x=n;
    }
    if(monoton_steigend=true) cout<<"Die Folge ist monoton steigend !";
    else if (monoton_fallend=true) cout<<"Die Folge ist monoton fallend !";
    else cout<<"Die Folge ist ungeordnet !";
    }

    Ohjee, jetzt denkste bestimmt, was ist das denn, aber ich bin ganz neu in der C++ Programmierung. Also, das bitte nicht vergessen 🙂

    Grüße Chiro



  • Gar nicht so übel für den Anfang. Aber du solltest pro Schleifendurchlauf nur eine neue Zahl einlesen. Und für das andere Problem formatieren wir die letzte Abfrage mal anders:

    if(monoton_steigend=true) {
       cout<<"Die Folge ist monoton steigend !";
    } else {
       if (monoton_fallend=true) {
          cout<<"Die Folge ist monoton fallend !"; 
       } else {
          cout<<"Die Folge ist ungeordnet !"; 
       }
    }
    

    Das entspricht dem, was du gemacht hast. Bist du sicher, dass du das so machen wolltest? Zum Beispiel ist eine Folge nicht monoton_steigend, wenn beide Variablen auf true gesetzt sind.



  • Hallo Ponto, mal wieder 🙂

    Meinst du mit, pro Schleifendurchlauf nur eine Zahl einlesen, das ich 2 Schleifen machen soll, wo in der ersten die erste und in der zweiten die zweite Zahl eingelesen wird ?

    Also ich hab mir das dann so vorgestellt. Da ja zunächst beide bool werte auf false gesetzt wurden, wird doch nach dem Schleifendurchlauf doch nur eine der beiden werte auf true gesetzt.(Also, das dachte ich zumindest bis jetzt).
    Somit dürften doch eigentlich bei der Ausgabe, also bei der If - Anweisung, keine Probleme auftreten, da ja entweder nur monoton_seigend oder monoton_fallend auf true gesetzt ist.



  • Was machst du wenn du zur Zeit nur 3 Zahlen eingeben willst?
    Und vergleichst du auch die zweite mit der dritten?

    Ich würde es so machen:

    Erste Zahl einlesen
    Schleife beginnt
    Zweite Zahl einlesen
    Vergleichen und Steigung merken
    Die zweite Zahl wird zur neuen ersten
    Schleife endet
    Auswertung



  • chiro schrieb:

    if(monoton_steigend=true) cout<<"Die Folge ist monoton steigend !";
     else if (monoton_fallend=true) cout<<"Die Folge ist monoton fallend !";
    

    Da liegt ein Fehler.
    Kennst Du den Unterschied zwischen dem Operator = und dem Operator ==?

    = weist zu,
    == vergleicht.

    Was Du hier machen willst, ist vergleichen, und nicht zuweisen!



  • Hi.
    @ Tomas : Danke, das hilft mir schonmal weiter.

    @Ponto : Ja eben, die 2. und die 3. Zahl vergleiche ich eben nicht miteinander, denn ich hab Probleme damit, die zeite Zahl zur neuen Ersten zu machen.
    Aber ich werd noch ein wenig weiter knobeln.



  • chiro schrieb:

    Hi.
    @ Tomas : Danke, das hilft mir schonmal weiter.

    @Ponto : Ja eben, die 2. und die 3. Zahl vergleiche ich eben nicht miteinander, denn ich hab Probleme damit, die zeite Zahl zur neuen Ersten zu machen.
    Aber ich werd noch ein wenig weiter knobeln.

    Wie wäre es wenn du deine Variablen so nennst:

    alte_zahl
    neue_zahl

    Was musst du machen, damit alte_zahl den Wert von neue_zahl hat?



  • Ich bekomm hier echt gleich Knoten ins Gehirn.
    Ich weiß nicht, warum ich mich so dämlich dran stelle. Es tut mir echt Leid.
    Naja, ich muss halt der neuen Zahl den Wert der alten Zahl zuweisen.
    Aber dafür war ja mein x ursprünglich da, wobei das so wohl offensichtlich falsch ist.
    Allerdings komm ich jetzt so langsam, mit meinen Variablen durcheinander.
    Brauch ich das x eigentlich?
    Also:
    Zahl eingeben, sagen wir a.
    Schleife beginnt.while(x!=0) ???????
    Zweite Zahl einlesen, was ja jetzt die alte_Zahl wäre.
    Jetzt alte_zahl mit a vergleichen und steigung merken.
    neue_Zahl(=mein x ??) = alte_Zahl
    Schleifenende

    Dann die Auswertung.

    ????????



  • Machen wir es mal mit Code:

    bool monoton_steigend = false;
    bool monoton_steigend = true;
    
    int alte_zahl;
    int neue_zahl;
    std::cin >> alte_zahl;
    while (alte_zahl != 0) {
       std::cin >> neue_zahl;
       if (neue_zahl < alte_zahl) monoton_fallend = true;
       if (neue_zahl > alte_zahl) monoton_steigend = true;
       alte_zahl = neue_zahl;
    }
    if (monoton_fallend and monoton_steigend) {
       std::cout << "Folge ist ungeordnet" << std::endl;
       return 0;
    }
    if (monoton_fallend) {
       std::cout << "Folge ist monoton fallend" << std::endl;
       return 0;
    }
    if (monoton_steigend) {
       std::cout << "Folge ist monoton steigend" << std::endl;
       return 0;
    }
    std::cout << "Folge ist sowohl monoton fallend als auch steigend" << std::endl;
    


  • Hi Ponto.
    So, noch einmal.

    Du hast angefangen mit

    bool monoton_steigend = false;
    bool monoton_steigend = true ; war das so geplant ?

    müsste es nicht so heißen ?

    bool monoton_steigend = false;
    bool monoton_fallend = false;

    das andere geht auch gar nicht durch meinen Compiler.

    Aber selbst wenn ich alles zu Beginn auf false setze, läuft ds Programm nicht richtig. Mit fallend und ungeordnet geht alles wunderbar, nur wenn ich eine steigende Folge eingebe, gibt er immer ungeordnet aus.

    Wenn du mir das noch erklären könntest, wäre ich dir unendlich dankbar und würde dich nie wieder belästigen 🙂

    Grüße Chiro


Anmelden zum Antworten