Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Umrechnungen in andere Zahlensysteme

Diskussion: Umrechnungen in andere Zahlensysteme im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige hier eine einfache Aufgabe von elite-noob: Aufgabenstellung: Ein Programm schreiben welches Dezimahlzahlen in Hexadezimalzahlen, oktalzahlen, und dualzahlen umrechnet. Erweiterungen ...

Antwort
Alt 21.09.06, 00:07   #1 (permalink)
Member of Honour
 
Benutzerbild von ivegotmail
 
Registriert seit: 28.05.03
ivegotmail Leistung: Z3
Likes: 1
Standard Umrechnungen in andere Zahlensysteme

Anzeige

hier eine einfache Aufgabe von elite-noob:

Aufgabenstellung:

Ein Programm schreiben welches Dezimahlzahlen in Hexadezimalzahlen, oktalzahlen, und dualzahlen umrechnet.

Erweiterungen
- das ganze in jede richtung ermöglichen also dual in dezimal oder dezimal in dualzahlen
- evtl. auch noch in andere zahlenformate
- die möglichkeit selber die basis anzugeben (bei dualzahlen ist das 2 bei hexadeziamalzahlen 16 etc.

viel spass

__________________
http://livehabo.hackerboard.de | http://livebb.sourceforge.net
ivegotmail ist offline   Mit Zitat antworten
Alt 21.09.06, 00:33   #2 (permalink)
 
Registriert seit: 20.07.05
CPU8080 Leistung: Facit NTK
CPU8080 eine Nachricht über ICQ schicken
Likes: 0
Standard

Mmmmh das hab ich mal vor längerer Zeit gemacht musste für einen Bruteforcer in PHP sein müsste eigentlich noch so funtzen:

PHP   

PHP-Code:
function resystem ($Wert,$system)
{
$zeichen = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z');
while (
$Wert>=1)
 {
 
$Rest $Wert%$system;
 if (
$Rest>=10)
  {
  
$Rest $zeichen[$Rest-10];
  }
 
$Rückgabe[] = $Rest;
 
$Wert floor($Wert/$system);
 }
$Rückgabe array_reverse ($Rückgabe,TRUE);
$Rückgabe implode ('',$Rückgabe);
return 
$Rückgabe;
}
echo 
resystem(234,16); 


Für den Rest bin ich heut zu müde vll mach ich morgen ne Erweiterung.
CPU8080 ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 21.09.06, 11:54   #3 (permalink)
 
Registriert seit: 16.07.05
benwilliam Leistung: Facit NTK
benwilliam eine Nachricht über ICQ schicken
Likes: 0
Standard

hab ich doch schon was früher gemacht

nur wollte das irgendwie keiner :-(
benwilliam ist offline   Mit Zitat antworten
Alt 21.09.06, 19:43   #4 (permalink)
 
Registriert seit: 02.08.06
Jon2 Leistung: Facit NTK
Likes: 0
Standard

@CPU8080 :

Ich hab dein Programm mal getestet und was ich persoenlich schlecht finde das der 0 und negative zahlen nicht umrechnen konnte.

Also hab ich dein programm noch was ergeanzt:

programm   
PHP-Code:
<?php 
function resystem ($Wert,$system) {
  
$zeichen = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z');
    
$minus 0;
    if (
$Wert 1) {
      
$Wert $Wert*-1;
        
$minus 1;
    }
    if (
$Wert != 0) {
    while (
$Wert>=1) {
      
$Rest $Wert%$system;
      if (
$Rest>=10) {
        
$Rest $zeichen[$Rest-10];
      }
      
$Rückgabe[] = $Rest;
      
$Wert floor($Wert/$system);
    }
    
$Rückgabe array_reverse ($Rückgabe,TRUE);
    
$Rückgabe implode ('',$Rückgabe);
      if (
$minus == 1) {
        
$Rückgabe "-".$Rückgabe;
      }
    } else {
      
$Rückgabe 0;
    }
  return 
$Rückgabe;
}
echo 
resystem(200,16);
?>


Jon2
Jon2 ist offline   Mit Zitat antworten
Alt 21.09.06, 21:14   #5 (permalink)
 
Registriert seit: 20.07.05
CPU8080 Leistung: Facit NTK
CPU8080 eine Nachricht über ICQ schicken
Likes: 0
Standard

@Jon2 jo so ist es auf jedenfall besser, aber müsste man es wenn mans genau nimmt net so machen das man das mit nem signed byte oder wie das heiß machen muss. Also bei ner negativen Zahl erst eine not operation durchführen muss und dann 1 addieren muss.
Beispiel:
Dez:-5
Hex: FFFFFFFFFFFFFFFB
So sagt mir der WinRechner das auch
CPU8080 ist offline   Mit Zitat antworten
Alt 22.09.06, 01:19   #6 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

16bit DOSencode   

Code:
;also: in cx die basis
;in SI der Wert,in BX die Adresse der Zeichen-Tabelle, in DI die Adresse des Outputbuffers
WORD2x_LOOP:
   xor dx,dx
   mov ax,si
   div cx
   mov si,ax ;neuer Wert   
   
   ;Rest ausgeben
    push bx
    add bx,dx                               ; Tabellenindex+rest =ASCII-Wert Position für den Wert
    mov dl,byte ptr [bx]                ;ASCII Zeichen aus  Tabelle[Restindex] lesen
    dec di                                       ;Output wird "verkehrt herum" beschrieben
    mov byte ptr [di],dl                  ;ASCII Zeichen schreiben 
    pop bx   
   test ax,ax                     ;wenn 0 dann sind wir fertig
   je ende_ 
jmp WORD2x_LOOP
ende_:


komplette Anwendung samt ASCII2DWORD Routine: Dezimal_To_X_Basis Konverter   

Code:
CSEG segment
org 100h
MAX_INPUT equ 10
Begin:
 
call einlesen ;basis
push si
call einlesen ;zahl
;in si wert

;in cx ist die Basis
pop cx
mov di,offset output
add di,100
mov byte ptr [di],'$'
mov bx,offset tabelle

;also: in cx die basis
;in SI der Wert,in BX die Zeichen-Tabelle, in DI der Outputbuffer
WORD2x_LOOP:
   xor dx,dx
   mov ax,si
   div cx
   mov si,ax ;neuer Wert   
   
   ;ausgeben
    push bx
    add bx,dx ;Zeichen aus  Tabelle[Rest] lesen
    mov dl,byte ptr [bx]
    dec di    
    mov byte ptr [di],dl    
    pop bx   
   test ax,ax
   je ende_ 
jmp WORD2x_LOOP

ende_: 
    ;ergebnis ausgeben
    mov ah,9
    mov dx,di
    int 21h
    mov ah,1
    int 21h  
    int 20h



einlesen:
;//Einlesen
    mov bx,offset input
    
    mov ah,0ah
    mov dx,bx
    int 21h
    ;gleich einen Zeilenumbruch nachschieben
     mov ah,06
     mov dl,10
     int 21h

    ;umrechenen Ascii2Number, in BX ist input_offset
    
     xor cx,cx
     mov cl,byte ptr[bx+1] ;wieviele Zeichen eingelesen
    
     add bx,1 ;offset in position bringen
     add bx,cx

     xor ax,ax
     mov di,1
     xor si,si
     
     ASCII2WORD_LOOP:
        xor ax,ax
        mov al,byte ptr [bx]
        sub al,'0' 
        mul di
        add si,ax
        mov ax,di
        mov di,10
        mul di
        mov di,ax      
        dec bx
        dec cx       
      jnz ASCII2WORD_LOOP
;in SI ist jetzt die umgerechnete Eingabe
retn

tabelle db "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input db MAX_INPUT
output db ?

CSEG ends
end Begin
wobei ich jetzt nicht der DOSe-Pro-grammierer bin ;) und deswegen auch nicht immer die eleganteste Lösung gewählt habe.

Konvertiert in diesem Beispiel vorzeichenlose Dezimalzahlen in Darstellung zur Basis X, wobei die Basis X aufgrund von Zeichenmangel auf 36 beschränkt ist (0-9,A-Z) . Programmbedienung:
zuerst die Basis angeben und in der nächsten Zeile eine Zahl < 2^16.
Angehängte Dateien
Dateityp: txt dec2x.com.txt (150 Bytes, 72x aufgerufen)
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 02.01.07, 16:30   #7 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Mein C++-Programm ist zwar nicht besonders schön oder schnell (ich bin Anfänger, vielleicht könnt ihr mir ein bisschen helfen), aber es beherrscht die Umformung von allen positiven natürlichen Zahlen und 0 von einem beliebigen Zahlensystem in ein anderes beliebiges Zahlensystem.
Beispiel: ./convert 8 2 10 wandelt 10 vom Oktal- ins Binärsystem.
C++-System-Converter   
Code:
#include <iostream>

using namespace std;

int potenz(int x, int n)
{
    int potenz = 1;
    for(int k=1; k<n; k++)
    {
        potenz *= x;
    }

    return potenz;
}

int sys2dez(char* value, int sys)
{
    string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int val_len = strlen(value);
    int out = 0;

    for(int i=0; i<val_len; i++)
    {
        short j = 0;
        while(value[i] != digits[j])
        {
            j++;
            if(j > 36)
            {
                cerr << "ERROR: input value is incorrect" << endl;
                return -1;
            }
        }

        out += j * potenz(sys, val_len-i);
    }

    return out;
}

string dez2sys(int value, int sys)
{
    string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string out = "";
    while(value != 0) {
        out = digits[value % sys] + out;
        value /= sys;
    }

    return out;
}

int main(int argc, char* argv[])
{
    if(argc < 4)
    {
        cerr << "Usage: " << argv[0] << " input output value" << endl
             << "\texample: " << argv[0] << " 16 10 FF (returns 255)" << endl;
        return -1;
    }

    // Arguments
    bool verbose = true;

    char* value = argv[3];
    int input = atoi((char *)argv[1]);
    int output = atoi((char *)argv[2]);

    int dez = sys2dez(value, input);
    string out = dez2sys(dez, output);

    if(verbose)
    {
        cout << "Berechne " << value << " vom " << input << "er-System ins " << output << "er-System..." << endl
             << input << "er-System:\t" << value << endl;

        if(input != 10)
            cout << "10er-System:\t" << dez << endl;

        if(output != 10)
            cout<< output << "er-System:\t" << out << endl;
    }
    else
    {
        cout << out << endl;
    }
}
Eydeet ist offline   Mit Zitat antworten
Alt 04.06.07, 14:07   #8 (permalink)
 
Registriert seit: 30.05.07
J.U.B. Leistung: Facit NTK
J.U.B. eine Nachricht über ICQ schicken
Likes: 0
Standard

naja, ich hab gerade etwas anderes in PVX gemacht, undzwar muss man hier ein ASCII zeichen eingeben, dann nimmt das Programm davon die Hexadezimalzahl, rechnet diese um ins Dezimalsystem und vom Dezimalsystem ins Binär-, Oktal-, und Duodezimalsystem.

Hier der Code:
Code:
Anfang:
INPUT "Geben Sie bitte ein beliebiges ASCII Zeichen ein: ",A$

BINA$="00000000"
OKTA$="000"
HEXA$=HTA(A$)
DUOD$="000"
Lob=LEN(HEXA$)
Eki=1
DEZI=0
IF LEN(A$)>1 THEN {
	PRINT 'CS',
	PRINT "Sie haben eine falsche eingabe get",CHR(228),"tigt, bitte wiederholen Sie ihre eingabe!"
	GOTO Anfang
} ELSE {
FOR I=Lob TO 1 STEP -1
IF HEXA$(I,1)>STR(9) THEN {
	SWITCH (HEXA$(I,1))
	CASE "A"
	Funor=10
	BREAK
	CASE "B"
	Funor=11
	BREAK
	CASE "C"
	Funor=12
	BREAK
	CASE "D"
	Funor=13
	BREAK
	CASE "E"
	Funor=14
	BREAK
	Case "F"
	Funor=15
	END SWITCH
} ELSE {
Funor=NUM(HEXA$(I,1))
}
Funor=Funor*Eki
Eki=Eki*16
DEZI=DEZI+Funor
NEXT

DEZR=DEZI

FOR I=8 TO 1 STEP -1
BINA$(I,1)=STR(MOD(DEZR,2))
IF DEZR<>0 THEN DEZR=DEZR/2
NEXT

DEZR=DEZI

FOR I=3 TO 1 STEP -1
OKTA$(I,1)=STR(MOD(DEZR,8))
IF DEZR<>0 THEN DEZR=DEZR/8
NEXT

DEZR=DEZI

FOR I=3 TO 1 STEP -1
D=INT(MOD(DEZR,12))
IF D=10 THEN {
	DUOD$(I,1)="A"
} 
IF D=11 THEN {
	DUOD$(I,1)="B"
} 
IF D<>10 AND D<>11 THEN {
	DUOD$(I,1)=STR(INT(MOD(DEZR,12)))
}
IF DEZR<>0 THEN DEZR=INT(DEZR/12)
NEXT


IF OKTA$(1,1)="0" THEN {
	OKTA$(1,1)=OKTA$(2,1)
	OKTA$(2,1)=OKTA$(3,1)
	OKTA$(3,1)=""
	IF OKTA$(1,1)="0" THEN {
		OKTA$(1,1)=OKTA$(2,1)
		OKTA$(2,1)=""
	}
}

IF DUOD$(1,1)="0" THEN {
	DUOD$(1,1)=DUOD$(2,1)
	DUOD$(2,1)=DUOD$(3,1)
	DUOD$(3,1)=""
	IF DUOD$(1,1)="0" THEN {
		DUOD$(1,1)=DUOD$(2,1)
		DUOD$(2,1)=""
	}
}

IF BINA$(1,1)="0" THEN {
	BINA$(1,1)=BINA$(2,1)
	BINA$(2,1)=BINA$(3,1)
	BINA$(3,1)=BINA$(4,1)
	BINA$(4,1)=BINA$(5,1)
	BINA$(6,1)=BINA$(7,1)
	BINA$(7,1)=BINA$(8,1)
	BINA$(8,1)=""
	IF BINA$(1,1)="0" THEN {
		BINA$(1,1)=BINA$(2,1)
		BINA$(2,1)=BINA$(3,1)
		BINA$(3,1)=BINA$(4,1)
		BINA$(4,1)=BINA$(5,1)
		BINA$(6,1)=BINA$(7,1)
		BINA$(7,1)=""
			IF BINA$(1,1)="0" THEN {
			BINA$(1,1)=BINA$(2,1)
			BINA$(2,1)=BINA$(3,1)
			BINA$(3,1)=BINA$(4,1)
			BINA$(4,1)=""
				IF BINA$(1,1)="0" THEN {
				BINA$(1,1)=BINA$(2,1)
				BINA$(2,1)=BINA$(3,1)
				BINA$(3,1)=""
					IF BINA$(1,1)="0" THEN {
					BINA$(1,1)=BINA$(2,1)
					BINA$(2,1)=""
				}
			}
		}
	}
}

PRINT 'CS',
PRINT "Sie haben das ASCII Zeichen ",A$," eingegeben!"
PRINT "Hier nun die Ergebnisse der Umrechnung:"
PRINT "Bin",CHR(228),"r:       ",BINA$
PRINT "Oktal:       ",OKTA$
PRINT "Dezimal:    ",DEZI
PRINT "Duodezimal:  ",DUOD$
PRINT "Hexadezimal: ",HEXA$
}
J.U.B. ist offline   Mit Zitat antworten
Alt 04.06.07, 14:45   #9 (permalink)
 
Registriert seit: 08.04.07
thyrael.lu Leistung: Facit NTK
thyrael.lu eine Nachricht über ICQ schicken
Likes: 1
Standard

Code:
#include <stdio.h>

int
main (int argc, char *argv[])
{
        int base = 0, num = 0, n;
        if (argc < 3) {
                printf("Zwei Argumente benötigt:\n<Zahl> <Basis>\n\n");
                return -1;
        }
        num  = atoi(argv[1]);
        base = atoi(argv[2]);
        if (!num || (base < 2)) {
                printf("Zahl > 0, Basis > 1.\n\n");
                return -2;
        }
        for (n=0; n<40; n++) printf(" ");
        while (num > 0) {
                n = num % base;
                if (n > 10) printf("%c\b\b", n+55); else printf("%i\b\b", n);
                num = (int) num/base;
        }
        printf("\n");
        return 0;
}
thyrael.lu ist offline   Mit Zitat antworten
Alt 05.06.07, 16:14   #10 (permalink)
 
Registriert seit: 05.06.07
phry Leistung: Facit NTK
Likes: 0
Standard

Ist jetzt Bloss Dez->Hex, für mehr bin ich zu träge.

Java.
Code:
public static String dez2hex(int i){
	int mod;
	return i<=0?"":dez2hex((i-(mod=i%16))/16)+(mod<10?mod:(char)('a'+mod-10)+"");
}
phry ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Umrechnungen in andere Zahlensysteme
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
zahlensysteme bikmaek Code Kitchen 4 10.10.05 22:00
Andere Sprache Valentin Windows 3 06.12.04 17:05


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61