hex in const Char* wert



  • Die Eingaben sind ASCII-Zeichen und dürften als String vorlegen.

    Dezimal: zahl = atoi( "10");
    Hex: sscanf( "10", "%x", &zahl);

    An der Rechenoperation ändert Hex oder Dec nichts, die bleibt ja.

    Mal als Beispiel: Eingabe ist "10*20".

    Dann wäre es bei Interpretation als Hex-Werte :

    int  a, b, opr;
    
    sscanf( eingabe, "%x%c%x", &a, &opr, &b);
    switch (opr){
      case '*': result = a * b;
      ...
    }
    

    Oder Dezimal-Werte :

    int  a, b, opr;
    
    sscanf( eingabe, "%d%c%d", &a, &opr, &b);
    switch (opr){
      case '*': result = a * b;
      ...
    }
    


  • also seh ich das richtig das ich eigentlich den ausdruck hex wie ienen Operator behandeln muss denn die Zahlen die dann drinne stehen zB. hex(10+20) mit atoi in integer gemacht werden und die Berechnung ist dann die selbe wie ich sonst immer vorgehe mit Rekursivem Lösen und Parsen?!



  • Fast.

    Hex oder Dez bezieht sich nur auf die Art wie die Zahlen an das Programm
    verfüttert werden - intern rechnet der Rechner eh binär. Niemand hindert
    Dich zB daran einen String "10" als dez 10 oder 16 zu behandeln. Ob der
    String eine Hex- oder Dezimalzahl darstellt bestimmt ja Du ....



  • Scheppertreiber schrieb:

    Fast.

    Hex oder Dez bezieht sich nur auf die Art wie die Zahlen an das Programm
    verfüttert werden - intern rechnet der Rechner eh binär. Niemand hindert
    Dich zB daran einen String "10" als dez 10 oder 16 zu behandeln. Ob der
    String eine Hex- oder Dezimalzahl darstellt bestimmt ja Du ....

    Ja ok verstanden denke ich. Ich werde mal was programmieren und wenn ich nicht weiter komme hier wieder reinstellen 😃

    danke fürs erste



  • Oisklaaa ! *prost*



  • SOoo da bin ich wieder nun ist es sooo:

    ich gehe in meinem Program den eingegebenen Term ein: zB. hex(10+10)*2

    ich erkenne hex

    if(term[i] == 'h' && term[i+1] == 'e' && term[i+20] == 'x')
    			return my_hex(hex, term);
    

    gehe also hin und schreibe eine Methode die mir dann die rechnung in der Klammer WENN vorne ein hex steht errechnen soll. und mir dann eine normale Zahl(Das Ergebniss aus 10+10hex also: 32) in den Term kopiert. und als return an meine Funktion zum Berechnen dann sogesehen 32*2 übergeben wird.

    char * my_hex(char* hex, const char * source)
    {
    	int j = 0;
    		for (int i = 0; source[i] != '\0' ;i++)
    		{
    			if(source[i] != ' ')
    			{
    				hex[j] = source[i];
    
    				if(source[i] == 'h' && source[i+1] == 'e' && source[i+2] == 'x' && source[i+3] == '(')
    				{
    					for(int h = 0; source[h] != '\0'; h++)
    
    						//...???
    				}
    			j++;
    			}
    		}
    		hex[j] = '\0';
    		return hex;
    }
    

    nun weiß ich nicht ganz wie ich das realisieren muss 😕 wäre cool wenn jemand hilfe anbietet 🙂

    danke



  • Moin !

    Da hast Du Dir einiges vorgenommen.

    Im Prinzip ist das Vorgehen nicht falsch: Den Ausdruck nach Klammern zerlegen und von innen nach außen durchrechnen.
    Also Klammerpaare suchen, Punkt vor Strichrechnung etc. Trivial ist das nicht.

    Löse so einen Ausdruck mal detailliert auf Papier und versuche das dann nach C oder so
    zu übertragen.

    Viel Spaß !

    (oder Kukkle "Formelparser" etc)



  • Mein Programm ist ja in einem weiten Status. Es ist ein Rechner der schon das prinzip des Parsen und das Rekursive Lösen benutzt um an das Ergebnis zu gelangen.

    Ich kann dir gerne mal den aktuellen Status zuschicken peer Email

    nun ist mein Grundgedanke so:

    er kommt an die stelle wo er hex(...) findet - sprint in die Methode my_hex die dann aus hex(...) eine dez.Zahl ausgibt. in der Methode wird das hex gefunden und dann die Klammer( und ) so das alles was dort zwischen steht irgendwie noch ausgerechnet werden muss. das Ausrechnen tut dann meine Methode Operation :

    double operation (double w1, double w2, const char * o)
    {
    	double erg;
    
    	switch (o[0])
    	{
    		case '+':
    		erg = w1 + w2;
    		break;
    
    		case '-':
    		erg = w1 - w2;
    		break;
    
    		case '^':
    		erg = pow(w1, w2);
    		break;
    
    		case '?':
    		erg = pow(w2, 1/w1);
    		break;
    
    		case '*':
    		erg = w1 * w2;
    		break;
    
    		case '/':
    		erg = w1 / w2;
    		break;
    	}
    	return erg;
    }
    

    nur muss ich aus hex10 erstmal 16 machen wenn dann hex(10+10)steht muss ich erstmal irgendwie noch sagen das in die Methode Operation dann 16 und 16 und + übergebe.

    stehe gerade auf dem schlauch.



  • Die Umwandlung in eine double oder int passiert sobald Du den Teilstring mit der
    Zahl (also noch als String) isoliert hast. Wenn die Hexzahlen mit irgendwas maskiert
    sind (zB "0x10") halt nachschauen ob der String mit "0x" anfängt:

    if ( memcmp( string, "0x", 2) == 0)
      basis = 16;
    else
      basis = 10;
    

    Auf Dein letztes Codebeispiel hat das keinen Einfluß.



  • Scheppertreiber schrieb:

    if ( memcmp( string, "0x", 2) == 0)
      basis = 16;
    else
      basis = 10;
    

    dann überprüfe ich also in meiner methode my_hex() ob basis 10 oder 16 bei bzw normal darf das dann ja nur Basis 16 sein sonst wärs ja kein Hex... wenn also kein hex dann FEHLER... sozusagen.

    richtig verstanden?



  • Nö.

    Eine Hexzahl hat die Basis 16, eine Dezimalzahl die Basis 10.
    http://de.wikipedia.org/wiki/Zahlensystem



  • Scheppertreiber schrieb:

    Nö.

    Eine Hexzahl hat die Basis 16, eine Dezimalzahl die Basis 10.
    http://de.wikipedia.org/wiki/Zahlensystem

    Was Hex ausmacht ist mir als Fachinformatiker geläufig keine Frage.

    die Umsetzung meiner Gedanken/meines Planes ist nur das problem momentan 🙂



  • Virokams schrieb:

    ich gehe in meinem Program den eingegebenen Term ein: zB. hex(10+10)*2

    ich finde, du machst es dir unnötig schwer mit dieser hex-funktion. was ist, wenn innerhalb der klammer plötzlich dezimalzahlen auftauchen? dann bräuchtest du einen stack um die modi zu verwalten usw. mach's einfach so, dass du z.b. einen präfix vor die zahl setzt, also z.b. für 'hex' ein H. dann würde deine rechnung so aussehen: (H10+H10)*2. das hat den vorteil, dass bei jedem token, das eine zahl sein darf, einfach am ersten zeichen erkannt wird, welche basis gemeint ist. dann kannste es auch später leichter erweitern, also z.b. 12+Haf*B1011 würde heissen: 12(dezimal) + af(hex) * 1011(binär).
    🙂



  • ~fricky schrieb:

    Virokams schrieb:

    ich gehe in meinem Program den eingegebenen Term ein: zB. hex(10+10)*2

    ich finde, du machst es dir unnötig schwer mit dieser hex-funktion. was ist, wenn innerhalb der klammer plötzlich dezimalzahlen auftauchen? dann bräuchtest du einen stack um die modi zu verwalten usw. mach's einfach so, dass du z.b. einen präfix vor die zahl setzt, also z.b. für 'hex' ein H. dann würde deine rechnung so aussehen: (H10+H10)*2. das hat den vorteil, dass bei jedem token, das eine zahl sein darf, einfach am ersten zeichen erkannt wird, welche basis gemeint ist. dann kannste es auch später leichter erweitern, also z.b. 12+Haf*B1011 würde heissen: 12(dezimal) + af(hex) * 1011(binär).
    🙂

    Puh ... eigentlich eine viel klügere Lösung werde ich wohl so machen... es versuchen so durch zu setzen 🙂 :xmas1:


Anmelden zum Antworten