Dzimal zu Dualzahlenberechnung

Usarian

Mitglied
Hallo. Da hab ich eine Aufgabe bekommen und zwar :
Schreiben Sie eine rekursive und eine iterative Methode, die eine ¨ubergebene ganze Zahl vom Typ int als
Dualzahl ausgeben! Sie d¨urfen hier keine Arrays oder Strings verwenden. Sie brauchen nur positive ganze
Zahlen zu ber¨ucksichtigen! Verwenden Sie diese Funktionen in einem Hauptprogramm, um vom Nutzer
einzugebende Zahlen als Dualzahl auszugeben!

Naja mit nen String oder Array koennte ich das vielleicht leicht erledigen, aber ohne kann ich es nicht schaffen :S Da hab ich was geschrieben und probier, was aber totaler schwachsinn ist. Hier ist das, was ich bischer gemacht hab und ich weiss es ist total falsch:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Dualzahl {

	public static int umrechnungIterativ(int dezimal)
	{
		if(dezimal<1024 && dezimal >= 0)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=1024)
		{
			System.out.print("1 ");
			dezimal=dezimal-1024;
		}
		if(dezimal<512)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=512)
		{
			System.out.print("1 ");
			dezimal=dezimal-512;
		}
		if(dezimal<256)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=256)
		{
			System.out.print("1 ");
			dezimal=dezimal-256;
		}
		if(dezimal<128)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=128)
		{
			System.out.print("1 ");
			dezimal=dezimal-128;
		}
		if(dezimal<64)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=64)
		{
			System.out.print("1 ");
			dezimal=dezimal-64;
		}
		if(dezimal<32)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=32)
		{
			System.out.print("1 ");
			dezimal=dezimal-32;
		}
		
		if(dezimal<16)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=16)
		{
			System.out.print("1 ");
			dezimal=dezimal-16;
		}
		
		if(dezimal<8)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=8)
		{
			System.out.print("1 ");
			dezimal=dezimal-8;
		}
		if(dezimal<4)
		{
			System.out.print("0 ");
		}
		else if(dezimal>=4)
		{
			System.out.print("1 ");
			dezimal=dezimal-4;
		}
		if(dezimal<2)
		{
			System.out.print("0 ");
		}
		return dezimal;
	}
		
		
	public static void main(String[] args) throws IOException  {
        int dezimal;
        InputStreamReader eingabestrom = new InputStreamReader (System.in);
        BufferedReader puffer = new BufferedReader (eingabestrom);
        System.out.print("Gib eine Dezimalzahl ein: ");
        dezimal = Integer.parseInt(puffer.readLine());

        System.out.println("Die Dezimalzahl " +dezimal+ " entspricht der Dualzahl " +umrechnungIterativ(dezimal)+ ".");
    }


}

Das ist mir zu hoch :/ Ich komm einfach nicht weiter.
Als Ausgabe bekomme ich daraus folgendes :
Java:
Gib eine Dezimalzahl ein: 10
0 0 0 0 0 0 0 1 0 Die Dezimalzahl 10 entspricht der Dualzahl 2.
 

Usarian

Mitglied
Das ist aber nur rein zufaellig weil z.B. bei 167 bekomme ich folgendes raus:

Java:
Gib eine Dezimalzahl ein: 167
0 0 0 1 0 1 0 0 1 Die Dezimalzahl 167 entspricht der Dualzahl 3.

und 3 ist auf keinen Fall 101001
 

nrg

Top Contributor
das ist allerdings echt schwachsinn... und ist weder iterativ noch rekursiv ;). bemühe dich erstmal um eine iterative lösung
Iterative Programmierung ? Wikipedia

edit:

vllt noch eine kleine Hilfe: (Source: Dualsystem ? Wikipedia)
c1c6f725e216b29741f35c83d2eb7f25.png


arbeite mit dem modulo operator!
 
Zuletzt bearbeitet:

Usarian

Mitglied
Hmmm meinst du irgendsowas?
Java:
public static int umrechnungIterativ(int dez)
	{
		int dualzahl = 0; int rest = 0;
		while (dez>=0) {
			dualzahl = dez % 2;
			        if (dez % 2 == 1) {
		        	dualzahl = dez / 2;
		        	rest = 1;
		        }
		        else  {
		        	dualzahl = dez / 2;
		        	rest = 0;
		        	}
		
			}
		return dez;
		}

Ich meine ich verstehe die Iterative und Rekursive Methoden immer noch nicht so richtig. Und wenn ich es trotzdem schafe eine iterative methode zu schreiben, dann ist es wohl eher zufaellig :) Kannst du mir vielleicht ein paar andere beispiele fuer Iterativ und Rekursivheit geben?

Herzlichen Dank im voraus.
 

Lirave

Aktives Mitglied
naja iterativ bedeutet, das Programm geht den code schritt für schritt durch
und rekursiv bedeutet, dass sich das Programm selbst aufruft um das Problem zu lösen
 

nrg

Top Contributor
also rekursiv ist es ein 3-zeiler. iterativ ists ohne arrays bzw Strings etwas blöd, weil du das Ergebnis (die reihe von den divisionsresten) von unten liest. Darfst du überhaupt keine Strings/Arrays nehmen? Weil dann funktioniert mein o.g. Tipp mit variable%2 imho nicht.

probiers mal direkt in der Methode auszugeben und mach den return void.
", die eine ubergebene ganze Zahl vom Typ int als Dualzahl ausgeben! "

grüße
nrg
 

Lirave

Aktives Mitglied
so zum Beispiel iterativ
Java:
        int dez = 12, dual = 0, pow = 0;
        while (dez > 0){
        	dual = (int)Math.pow(10, pow)*(dez % 2)+ dual;
        	pow++;
        	dez = dez / 2;
        }
       System.out.println(dual);
 

nrg

Top Contributor
ah ok. mit Math.pow ist es machbar :). naja dann brauchste nurnoch rekursiv und das ist, wie gesagt, kein großes hexenwerk ;)
 

Usarian

Mitglied
Hmm ich danke dir, aber jetzt eine verstehnsfrage - was macht das Alogirthm zu diesem Zeitpunkt:
Java:
dual = (int)Math.pow(10, rest)*(dez % 2)+ dual;

ich verstehe das Ding hier leider nicht :
Java:
(int)Math.pow(10, rest)
 

Usarian

Mitglied
Ooops stimmt! Hab ich nicht gemerkt dass man auf Math.pow clicken kann :oops: Jetzt verstehe ich es. Vielen Dank. Da fange ich dann mit der Rekursion an :) Und das
Java:
(int)
da vorne zeigt einfach, dass das Ding vom Typ int ist oder?
 

nrg

Top Contributor
prinzipiell bei solchen Sachen hilft es, sich jeden schritt ausgeben zu lassen:
Java:
	    pow = 0;
	    while (dec > 0){
	        System.out.println((int)Math.pow(10, pow)*(dec % 2));
	        pow++;
	        dec = dec / 2;
	    }
 

Lirave

Aktives Mitglied
Math.pow gibt ein double Wert zurück, dual soll aber ein int Wert sein, und mit (int) wandle ich den double Wert in einen int Wert um
 

nrg

Top Contributor
das ist ein cast. dabei wird einfach alles "abgeschnitten", was der Datentyp in den Klammern nicht darstellen kann.
zur Verdeutlichung:
Java:
		double d = 2.99999;
		System.out.println((int)d);
Ausgabe ist 2.

edit: wichtig ist auch zu wissen, dass absolut keine mathematische Rundung o.ä. stattfindet.

grüße
nrg
 

nrg

Top Contributor
und ich würde bei deiner bzw Lirave's iterativen Lösung noch was an den Datentypen ändern, sonst wirst du sehr schnell an deine Grenzen stoßen (zb für 1500 reicht es schon nicht mehr).

grüße
 

Usarian

Mitglied
Hmm bei der Rekursion klappt immer noch irgendwas nicht...

Java:
public static int umrechnenRekursiv (int dez)
	{		
			int zeichen; int ganz; int rest;
			ganz = dez / 2;   // Division ohne Rest  
			rest = dez % 2;   // Rest der Division  
			if (rest == 0) {  // Test auf Gleichheit 
			  zeichen = 0;
			}
			else {
			  zeichen = 1;
			}
			if (ganz == 0) { 
			 return zeichen;
			}
			else {
			  return umrechnenRekursiv(zeichen) + dez;
			}
					
	}

Davon bekomme ich als ausgabe folgendes:

Java:
Gib eine Dezimalzahl ein: 7
Die Dezimalzahl 7 entspricht der Dualzahl 111 (Iterativ)
Die Dezimalzahl 7 entspricht der Dualzahl 8 (Rekursiv)
 

Michael...

Top Contributor
1. ändere den return Wert von int auf String, sonst wird alles auf summiert
2. schau Dir die zweite return Anweisung mal ganz genau (welche Variablen müssen da denn tatsächlich verwendet werden!!)
3. das erste if Konstrukt kannst man sich völlig schenken denn x Mod 2 ergibt entweder 1 oder 0 und somit kann man sich eigentlich auch die Variable zeichen sparen.
 

Usarian

Mitglied
1. Wir duerfen laut der Aufgabestellung kein String/Array benutzen :/ Wie mach ich das sonst?
2. Stimmt das schon:?
Java:
return umrechnenRekursiv(ganz) + zeichen;
3. Wie kann ich das auch tun? Wenn ich
Java:
if (rest == 0) {  // Test auf Gleichheit 
              zeichen = 0;
            }
            else {
              zeichen = 1;
            }
etnferne, da bekomm ich ein fehler, dass die variable zeichen nicht intializiert ist.
 

nrg

Top Contributor
Java:
	public static void rekursivPrint(int dec)
	{
		if (dec/2 != 0) rekursivPrint(dec/2);
		System.out.print(dec%2);
	}
 
Zuletzt bearbeitet:

Oben