rausfinden ob gerade oder ungerade Zahl



  • ~fricky schrieb:

    Belli schrieb:

    Wieso kann der Computer dann:
    int a = 2;
    int b = -2;
    int c = a + b;

    mein c-compiler (der von vs 2005, nein nicht der GCC) kann sogar:

    int a = 3, b = 1;
      int c = a + - + + + - b;
    

    dabei kommt 4 raus, aber was das soll, weiss ich auch nicht.
    🙂

    Ist doch nachvollziehbar; die Plusse neutralisieren sich weg, übrig bleibt 3 - (-1) = 4 :p



  • Big Brother schrieb:

    ~fricky schrieb:

    Belli schrieb:

    Wieso kann der Computer dann:
    int a = 2;
    int b = -2;
    int c = a + b;

    mein c-compiler (der von vs 2005, nein nicht der GCC) kann sogar:

    int a = 3, b = 1;
      int c = a + - + + + - b;
    

    dabei kommt 4 raus, aber was das soll, weiss ich auch nicht.
    🙂

    Ist doch nachvollziehbar; die Plusse neutralisieren sich weg, übrig bleibt 3 - (-1) = 4 :p

    genauso könntest du sagen, dass jeweils ein + und ein - sich aufheben. übrig bleibt dann 3 + (+1). irgendwie ist doch beides blöd.
    🙂



  • ~fricky schrieb:

    Big Brother schrieb:

    ~fricky schrieb:

    Belli schrieb:

    Wieso kann der Computer dann:
    int a = 2;
    int b = -2;
    int c = a + b;

    mein c-compiler (der von vs 2005, nein nicht der GCC) kann sogar:

    int a = 3, b = 1;
      int c = a + - + + + - b;
    

    dabei kommt 4 raus, aber was das soll, weiss ich auch nicht.
    🙂

    Ist doch nachvollziehbar; die Plusse neutralisieren sich weg, übrig bleibt 3 - (-1) = 4 :p

    genauso könntest du sagen, dass jeweils ein + und ein - sich aufheben. übrig bleibt dann 3 + (+1). irgendwie ist doch beides blöd.
    🙂

    Bei den handelsüblichen Rechenregeln, zieht doch das Plus auch den kürzeren:
    3+ -1 = 2
    Aber egaaaal 🙂



  • Der erste ist ein Operand, alle weiteren sind Vorzeichen.



  • Ich versteh immer noch nur Bahnhof 😃

    nunja ich setze jetzt einfach um das bei ungeraden - ein - "entsteht" und bei gerader anzahl - ein +

    ist glaube das einfachste für mich und reicht völlig aus für die Aufgabe die ich zu lösen habe ^^ auch wenn es für manche von euch dann Mathematisch unkorrekt ist 😛

    Dann werden die Leute mein Fertigen Rechner nicht nutzen wollen 😃 😃

    gruß



  • Virokams schrieb:

    nunja ich setze jetzt einfach um das bei ungeraden - ein - "entsteht" und bei gerader anzahl - ein +

    naja, dann bau wenigstens noch ein, dass aus einer ungeraden anzahl von '/' ein '*' wird.
    🙂



  • ~fricky schrieb:

    Virokams schrieb:

    nunja ich setze jetzt einfach um das bei ungeraden - ein - "entsteht" und bei gerader anzahl - ein +

    naja, dann bau wenigstens noch ein, dass aus einer ungeraden anzahl von '/' ein '*' wird.
    🙂

    muss das so? XD damit hab ich mich noch garnicht auseinander gesetzt



  • Virokams schrieb:

    muss das so?

    nein, natürlich nicht. das war nur ein blöder scherz.

    Virokams schrieb:

    damit hab ich mich noch garnicht auseinander gesetzt

    na, dann mach das doch mal. was soll dein programm denn mit 2/*/7 anstellen?
    🙂



  • nunja bei sowas hab ich einfach nen Fehler eingebaut XD also eine Fehlermeldung...

    bei dem +-+- dings problem soll ich aber eine Lösung geben -.- da darf ich keine Fehlermeldung ausgeben (was natürlich das einfachste wäre ... und sogar noch Math. richtig -.- )

    nunja...



  • Virokams schrieb:

    bei dem +-+- dings problem soll ich aber eine Lösung geben -.- da darf ich keine Fehlermeldung ausgeben

    eine fehlermeldung ist doch auch eine lösung (wahrscheinlich die einzig richtige bei sowas wie +--++--+--). aber du könntest es ja benutzerfreundlich gestalten, indem der cursor auf die stelle springt, mit der dein parser nicht mehr klar kommt und den user zum ausbessern auffordern. dann muss er nicht den ganzen ausdruck nochmal reinhacken.
    🙂



  • ~fricky schrieb:

    eine fehlermeldung ist doch auch eine lösung (wahrscheinlich die einzig richtige bei sowas wie +--++--+--). aber du könntest es ja benutzerfreundlich gestalten, indem der cursor auf die stelle springt, mit der dein parser nicht mehr klar kommt und den user zum ausbessern auffordern. dann muss er nicht den ganzen ausdruck nochmal reinhacken.
    🙂

    klingt gut nur glaube ich schaffe ich das von meinem Wissensstand nicht XD

    naja hier ist meine Lösung wie es jetzt inplementiert ist und sogar "funktioniert"...

    char * my_zeichenstrcpy2(char* dest, const char * source)
    {
    	int j = 0;
    	int minus = 0;
    	int i=0;
    	int einmalnur = 0;
    	int zeichen = -1;
    	int operatorenbegin = -1;
    	int nureinmal = 0;
    	int k;
    
    	for (int i=0; source[i] != '\0'; i++)
    	{
    		if (isdigit(source[i]))//source[i] != '+' || source[i] != '-')
    		{
    			dest[j] = source[i];
    			j++;
    		}
    		else if (source[i] == '+' || source[i] == '-')
    		{
    			for(int k = i; ispunct(source[k]) ; k++)
    			{
    				if (source[k] == '-')
    				{
    					minus = minus + 1;
    					zeichen = zeichen + 1;
    				}
    				i = k;
    			}
    			double unodergerade = minus % 2;
    
    			if ( unodergerade != 0 )
    				dest[j++] = '-';
    			else
    				dest[j++] = '+';
    		}
    	}
    	dest [j] = '\0';
    	return dest;
    }
    

    gruß

    Edit:

    zeichen = zeichen + 1; kann natürlich weg
    und das kommentar in Zeile 14 ebenso.



  • Virokams schrieb:

    Dann werden die Leute mein Fertigen Rechner nicht nutzen wollen 😃 😃

    Leute, die "+-+-" eingeben gehören geschlagen.

    Taschenrechner, die sowas zulassen, würde ich nie verwenden.

    Wieso gibst du nicht eine Fehlermeldung aus und zeigst an, an welcher Stelle, der Parser nicht klarkommt (wie fricky es meinte)? Ein Compiler versucht z.B. auch nicht den Blödsinn der Menschen zu interpretieren, wenn er nicht klar kommt. Fehler sind nun mal Fehler.

    Was deinem Code anbetrifft:

    double unodergerade = minus % 2;
    

    da reicht auch ein int . Du mietest dir auch nicht eine Lagerhalle, wenn du eine Nadel aufbewahren willst, oder?



  • recht hast du...



  • supertux schrieb:

    Taschenrechner, die sowas zulassen, würde ich nie verwenden.

    naja, aber viele taschenrechner lassen sowas zu. wahrscheinlich ignoriert der eine überflüssige operatoren, während ein anderer die plusse und minusse gegeneinander aufrechnet. der windoofs-taschenrechner macht z.b. aus:
    -> 5////6 = 0.83333, also 5/6
    -> 5 /-+ 6 = 11*
    scheinbar nimmt er nur die letzte operation, alles andere wird missachtet.
    🙂



  • 5/*/*//6 und 5+-+-6 sind ein himmelweiter Unterschied, / und * sind wohl keine gültigen prä-unäre Operatoren.



  • Badestrand schrieb:

    5/*/*//6 und 5+-+-6 sind ein himmelweiter Unterschied,

    der einzige unterschied ist die ursache der zuckungen im finger des taschenrechner-benutzers.

    Badestrand schrieb:

    / und * sind wohl keine gültigen prä-unäre Operatoren.

    um diese inkrement/dekrement anhängsel (a++, --a, usw.) geht's doch nicht.
    🙂



  • ~fricky schrieb:

    der windoofs-taschenrechner macht z.b. aus:
    -> 5////6 = 0.83333, also 5/6

    so ein Müll Taschenrecher. Sage ich doch, ich würde niemals so einen Taschenrechner benutzen, der sowas zulässt. gnome-calculator streikt da. Ich muss aber zugeben, 3+++-+++3 hat er akzeptiert und eine 0 daraus gemacht! Traurige Welt, ich weiß, warum ich nur den gnu-bc Calculator nehme.



  • supertux schrieb:

    Leute, die "+-+-" eingeben gehören geschlagen.

    Taschenrechner, die sowas zulassen, würde ich nie verwenden.

    Na zum Glück ist C kein Taschenrechner :p



  • Wenn ich je wieder in die Verlegenheit käme, nochmal einen Taschenrechner basteln zu müssen, würde ich den wieder auf UPN/Stack- Basis erstellen. Die Eingaberegeln sind durch das Postfix- Format so eng gesteckt, daß der ganze komplizierte Parser- Kram wegfällt, Vorzeichenwechsel und Substraktion sind zudem getrennte Operationen und Fehlerrückgaben sind ganz leicht aussagekräftig gestaltbar.
    Bestes Beispiel sind die HP- Taschenrechner, deren Nutzer mehrheitlich als ersten Bedienschritt die Werkseinstellung CAS (Computer Algebra System) auf UPN umstellen. 😃



  • pointercrash() schrieb:

    Bestes Beispiel sind die HP- Taschenrechner, deren Nutzer mehrheitlich als ersten Bedienschritt die Werkseinstellung CAS (Computer Algebra System) auf UPN umstellen.

    klar, man will ja l33t sein. dazu gehört auch 'ne armbanduhr, die die zeit binär anzeigt, sowie ein notebook mit beschleunigungssensor und programmiert wird sowieso nur in scheme oder lisp.
    🙂


Anmelden zum Antworten