rausfinden ob gerade oder ungerade Zahl



  • Hallo mal wieder 🙂

    hab da ma ne Frage:

    undzwar geht es darum das der User eine Rechnung eingibt zB: 2-+-+-2 also (2-2) ... ich gehe den term durch zähle wie oft ein - vorhanden ist ist es eine gerade zahl wirds + ist es ungerade wirds - (wissen wir alle aus der Mathematik) ... Meine Frage ist ob es eine Fertige funktion gibt die guckt ob gerade oder ungerade oder ob ich mir sowas selber schreiben muss?

    Danke 🙂

    Gruß 👍



  • Mußt Du selbst schreiben, zum Beispiel:

    bool ungerade;

    ungerade = anzahl % 2;



  • also 2+2 ist gerade, 2-2 ist auch gerade (0 ist durch 2 teilbar). ist demnach wumpe, wie viele plusse und minusse du da einbaust.
    🙂



  • Er will die Anzahl der '-' in dem Term haben, um zu ermitteln, ob Addition oder Subtraktion durchzuführen ist.



  • Belli schrieb:

    Er will die Anzahl der '-' in dem Term haben, um zu ermitteln, ob Addition oder Subtraktion durchzuführen ist.

    ok, aber mehr als zwei mal '-' zwischen 2 operanden werden ja wohl nicht auftauchen. rechnungen mit 'ner ganzen latte an '+' und '-' hintereinander, hab' ich jedenfalls noch nie gesehen.
    🙂



  • Die geht ein bisserl zügiger zu Werke: 😉

    int gerade(int zahl)
    		{
    			return ( ((zahl >> 1)<<1) == zahl );
    		}
    


  • pointercrash() schrieb:

    Die geht ein bisserl zügiger zu Werke

    zahl & 1 hätte auch gereicht.
    🙂



  • pointercrash() schrieb:

    Die geht ein bisserl zügiger zu Werke: 😉

    int gerade(int zahl)
    		{
    			return ( ((zahl >> 1)<<1) == zahl );
    		}
    

    lol 👍



  • ~fricky schrieb:

    zahl & 1 hätte auch gereicht.
    🙂

    Ja, aber damit wäre zum ersten das höchste Ziel in C verfehlt, nämlich möglichst viele kryptische Zeichen in die Source reinzupacken.
    Zum zweiten ist die Version auf 'nem 8- Bitter etwa 40 mal schneller als die Moduloversion, das widerspricht dem Paradigma, eine Version alle 18 Monate auf die halbe Geschwindigkeit 'runterzuziehen.

    Nee, aber stimmt schon, mir ist im Moment des "Absenden"- Drückens aufgefallen, daß es besser geht, mußte aber dann dringend woanders hin. 😃



  • pointercrash() schrieb:

    Zum zweiten ist die Version auf 'nem 8- Bitter etwa 40 mal schneller als die Moduloversion...

    viele compiler erkennen ein x mod zweierpotenz und machen bitoperationen daraus. aber wenn geschwindigkeit 'ne rolle spielt, würde ich mich auch nicht darauf verlassen.
    🙂



  • ~fricky schrieb:

    pointercrash() schrieb:

    Zum zweiten ist die Version auf 'nem 8- Bitter etwa 40 mal schneller als die Moduloversion...

    viele compiler erkennen ein x mod zweierpotenz und machen bitoperationen daraus. aber wenn geschwindigkeit 'ne rolle spielt, würde ich mich auch nicht darauf verlassen.
    🙂

    Der Compiler der das nicht erkennt gehört in seine einzelnen Bits zerlegt.



  • Beim gcc geht das wahrscheinlich so:

    gcc -O37 -Wevenmore -pedantic-optimizations --optimize-modulos --please --i-know-what-i-do --rms-is-cool
    

    😡 🙂



  • ~fricky schrieb:

    Belli schrieb:

    Er will die Anzahl der '-' in dem Term haben, um zu ermitteln, ob Addition oder Subtraktion durchzuführen ist.

    ok, aber mehr als zwei mal '-' zwischen 2 operanden werden ja wohl nicht auftauchen. rechnungen mit 'ner ganzen latte an '+' und '-' hintereinander, hab' ich jedenfalls noch nie gesehen.
    🙂

    Ich habe sowas auch noch nie gesehen aber um solchen Fehlerquellen vorzubeugen muss eine "Sicherung" rein das wenn ein User nen Krampf im Arm kriegt und plötzlich doch 2+-+-+-+-+---+++-+--++2 eingibt das Programm nicht abstürzt denn Mathematisch gesehen ergibt die Eingabe auch ein Ergebnis und so soll es dann auch zurückgegeben werden 🙂

    so ganz hab ich jetzt aber noch nicht verstanden wie ich das Programmieren kann das ich überprüfe ob gerade oder ungerade Zahl mhh... kann mich momentan auch nicht mehr daran erinnern wie ich das mal unter VB gelöst habe 😞 ... mh

    EDIT:

    Ok Ich hab das Wort wieder... ich muss mit Modulo Arbeiten.

    Ist der Modulo von Anzahlminus = 0 ist es eine gerade Zahl ansonsten ungerade Anzahl an - die eingegeben wurden...

    PS: Danke Belli... er hats ja schon geschrieben...

    Danke



  • Virokams schrieb:

    wenn ein User nen Krampf im Arm kriegt und plötzlich doch 2+-+-+-+-+---+++-+--++2 eingibt das Programm nicht abstürzt denn Mathematisch gesehen ergibt die Eingabe auch ein Ergebnis und so soll es dann auch zurückgegeben werden 🙂

    ich würde sagen, mathematisch gesehen ist das kein gültiger Ausdruck (und demnach soll das Programm ruhig sagen können 'ne, da mach ich nicht mit'). Mit keiner Sequenz (des arithmetischen Kalküls) kannst du dieses Wort erzeugen.



  • ich würde sagen, mathematisch gesehen ist das kein gültiger Ausdruck (und demnach soll das Programm ruhig sagen können 'ne, da mach ich nicht mit'). Mit keiner Sequenz (des arithmetischen Kalküls) kannst du dieses Wort erzeugen.

    also würdest du sagen das maximal 3 Operatoren hintereinander noch zulässig sind mehr als 3 jedoch Mathematisch gesehen ganich mehr zugelassen sind?



  • Virokams schrieb:

    ich würde sagen, mathematisch gesehen ist das kein gültiger Ausdruck (und demnach soll das Programm ruhig sagen können 'ne, da mach ich nicht mit'). Mit keiner Sequenz (des arithmetischen Kalküls) kannst du dieses Wort erzeugen.

    also würdest du sagen das maximal 3 Operatoren hintereinander noch zulässig sind mehr als 3 jedoch Mathematisch gesehen ganich mehr zugelassen sind?

    hä? Wenn ich den Ausruck 3++3 schreibe (deiner Meinung nach zulässig), dann sag es mir, was er heißt: "3 plus +3" oder etwa "3+ plus 3" oder "3 plus plus 3"? Nur einer der Möglichkeiten ist tatsächlich wohldefiniert. Woher willst du wissen, was der User gemeint hat? Und selbst, wenn der User einen Armkrampf hatte, dann kann das Programm trotzdem ruhig darauf hinweisen, dass der Ausdruck ungültig ist. Gib mal "3++3" in Maple, Scilab oder was weiß ich, und siehe, was die meinen. Mein Scilab meint

    -->3++3
       !--error 2 
    invalid factor
    

    und nichts anders hätte ich erwartet.



  • supertux schrieb:

    Virokams schrieb:

    ich würde sagen, mathematisch gesehen ist das kein gültiger Ausdruck (und demnach soll das Programm ruhig sagen können 'ne, da mach ich nicht mit'). Mit keiner Sequenz (des arithmetischen Kalküls) kannst du dieses Wort erzeugen.

    also würdest du sagen das maximal 3 Operatoren hintereinander noch zulässig sind mehr als 3 jedoch Mathematisch gesehen ganich mehr zugelassen sind?

    hä? Unfug, wenn ich den Ausruck 3++3 schreibe (deiner Meinung nach zulässig), dann sag es mir, was er heißt: "3 plus +3" oder etwa "3+ plus 3" oder "3 plus plus 3"? Nur einer der Möglichkeiten ist tatsächlich wohldefiniert. Woher willst du wissen, was der User gemeint hat? Und selbst, wenn der User einen Armkrampf hatte, dann kann das Programm trotzdem ruhig darauf hinweisen, dass der Ausdruck ungültig ist. Gib mal "3++3" in Maple, Scilab oder was weiß ich, und siehe, was die meinen. Mein Scilab meint

    -->3++3
       !--error 2 
    invalid factor
    

    und nichts anders hätte ich erwartet.

    mh ja... irgendwie überzeugst du mich ... eigentlich war ich auch erst der Meinung das ich jede Doppeloperatoreingabe mit einer Fehlermeldung ausgebe. Mein Cheffe sagt das manche VOrzeichenkombinationen jedoch zulässig sind ( +- -- und -+ ) obwohl wie du ja sagst man nicht weiß was der User wirklich meinte. Ich glaueb ich werde das Thema nochmal anschneiden klar er will warscheinlich darauf hinaus das ich eine Funktion mehr in meinen Rechenapparat einbaue und mal mit Modulo arbeite andererseits ist das ganze Mathematischgesehen unfug wie du schon sagst.

    hm...



  • supertux schrieb:

    Wenn ich den Ausruck 3++3 schreibe (deiner Meinung nach zulässig), dann sag es mir, was er heißt: "3 plus +3" oder etwa "3+ plus 3" oder "3 plus plus 3"? Nur einer der Möglichkeiten ist tatsächlich wohldefiniert.

    ist das nicht egal? das erste plus ist operator und das zweite ist vorzeichen (könnte auch ein minus-zeichen sein), von dem, was danach kommt. erst ab drei solcher zeichen in folge, würde ich, als programm, streiken.
    🙂



  • Virokams schrieb:

    Mein Cheffe sagt das manche VOrzeichenkombinationen jedoch zulässig sind ( +- -- und -+ ) obwohl wie du ja sagst man nicht weiß was der User wirklich meinte.

    mathematisch (logisch) gesehen, nein. Wie ich schon sagte, mit dem Kalkül wirst du einen Ausdruck der Form "2+-2" nicht finden. Das ist nur rein formell (siehe mathematische Logik, Aufbau der Sprache(n) der 0. bzw. 1. Stufe).

    Menschen sind aber keine Maschinen, somit arbeiten wir in einer höhren Ebene mit einer anderen Abstraktion. Wenn wir "2+-2" auf dem Papier schreiben, werden 99% der Menschen sagen, es handelt sich um "2 plus die Zahl -2". D.h. dadruch, dass wir in einer "Metasprache" den Ausdruck "2+-2" geschrieben habe, interpretieren wir den Ausdruck anders, als was er wirklich aussagt. [1]

    Ein Computer kann das aber nicht, ein Computer kann nur den Ausdruck nach festen Regeln interpretieren, nämlich jene, die durch den Kalkül vorgegeben sind. Deswegen wird der Computer (bzw. Programm) "2+-2" nicht auswerten können, weil diese Regel gar nicht existiert. Der Computer kann nicht herausfinden, was der User vielleicht gemeint haben soll. Wären wir so weit, dann würde der Computer sicher den Turing Test bestehen. Da man mit einer formalen Programmiersprache so etwas nicht realisieren kann, müssen sich letztendlich die Programmier auf die mathematische korrekte Eingaben verlassen und eben "2+-2" ablehnen. Du kannst natürlich sagen "wenn ich A+-B sehe, dann ist es so, als hätte der User A+(-B)" eingebenen, aber selbst das wäre nicht eindeutig genug. Aus diesem Grund finde ich, dass das einzige Korrekte ist, solche mehrdeutige (und mathematisch logisch gesehen ungültige) Ausdrücke von Anfang an zu verbieten.

    //edit:

    ~fricky schrieb:

    ist das nicht egal?

    siehe oben, sehr formal gesehen ist 3++3 kein Ausdruck, den man sinvoll interpretieren kann . Siehe Kapitel über Interpretation von Ausdrücken (der 1. Stufe) in der mathematischen Logik.

    //edit2
    [1] um diesen Absatz genau zu verstehen, weise ich auf
    Einführung in die mathematische Logik | ISBN: 3827416914
    hin (ich hab bei einem der Autoren meine Nebenfach Prüfung gemacht ;))



  • Zum glück Studier ich keine Mathematik oder sowas... alleine das wort Kalkül hört sich schlimmer an als Exorzismus 😉

    😃


Anmelden zum Antworten