Dezimal in Binär in C - brauche Hilfe

M

m0erk

Grünschnabel
#include <stdio.h>


int dezbin(int, int B[9]);
int lese_f(void);


main()
{
while(1)
{
int d,B[8],i;
B[0]=0;
printf("\nProgramm zum umwandeln von dezimalen in binaere Zahlen.\n");


do{
printf("Bitte posivite Dezimalzahl eingeben. Max 1E30!\n-> ");
d = lese_f();

}while( (d <= 0) || (d >= 640000 ) ) ;

dezbin(d,B);

}
}

int dezbin( int d , int B[9])
{
int h=0,h2=0,n=9,i;
for(i=0;i<n;i++)
{
if( d%2 == 1 )
{
B=1;
}
else
{
B=0;
}
d=d/2;
}

for(i=1;i<n;)
{
h = B;
h2 = B[n-i];
B = h2;
B[n-i] = h;
i++;
// printf(" i= %d / h= %d / b(i) = %d / b(n-i ) = %d\n",i,h,B,B[n-i]);
}
printf("\nDie entsprechende Dualzahl ist: ");
getchar();
for(i=0;i<9;i++)
{
printf("%d",B);
}
getchar();
}


int lese_f( void )
{
int zahl;
char zeile[80];

gets( zeile );
sscanf( zeile, "%d", & zahl );
return zahl;
}


kann mir jemand sagen warum er das array nicht dreht? er stellt die dezimalzahl immer falsch herum dar.. versuchts z.b. mit 255 müsste 01111111 sein... aber scheinbar dreht er das array nicht oder falsch oder keine ahnung.. wenn ich die schleife ganz raus lasse, dann steht die selbe zahl also schätz ich da passt was beim drehen nicht...

wäre nett wenn jemand nen tipp hat.. thx m0erk
 
Prinzip:

Zahl 137 als Binären String ausgeben.

137 div 128 = 1 Rest 9
9 div 64 = 0 Rest 9
9 div 32 = 0 Rest 9
9 div 16 = 0 Rest 9
9 div 8 = 1 Rest 1
1 div 4 = 0 Rest 1
1 div 2 = 0 Rest 1
1 div 1 = 1 Rest 0

Binär: 10001001

--

Schreib am besten eine do .. while (Rest != 0) Schleife dafür und am Ende wird immer das Ergebnis in ein Array geschrieben
 
mh.. das leuchtet mich ehrlich gesagt nicht so ein..

dein berechnungsweg bringt zwar auch das richtige ergebnis, ich habe die berechnung aber schon in meinem programm integriert. das was jetzt nicht klappt, ist die drehung des arrays..

mein system funktioniert so:

137 / 2 = 68 Rest 1
68 / 2 = 34 Rest 0
34 / 2 = 17 Rest 0
17 / 2 = 8 Rest 1
8 / 2 = 4 Rest 0
4 / 2 = 2 Rest 0
2 / 2 = 1 Rest 0
1 / 2 = 0 Rest 1

Die Binärzahl steht also falschrum im Array.. jetzt möchte ich sie tauschen und das klappt bei mir nicht.. könnt ihr mir sagen wieso?
ich würde das berechnungsprinzip gerne beibehalten...
 
Hi,

nachdem du ja ein Array hast. Wäre evtl. das Füllen bzw. das Ausgeben des Arrays von hinten nach vorne eine Möglichkeit?Die vorderen Elemente könntest du ja mit 0 Initialisieren.

Gruß!
 
Sieht für mich so aus, als ob du deinen Array zunächst, wie gewünscht, umdrehst, dann aber nicht aufhörst, wenn du ihn halb durchlaufen hast, sondern bis zum Schluss weitermachst, und damit die Austauscherei wieder rückgängig machst.

Du könntest natürlich auch gleich den Array B von hinten her befüllen, dann sparst du dir das ganze Drehen ...

;-)
 
Wenn du nur das Array umdrehen willst..

1234567

tausche "erstes +0" mit "letztes -0"

7234561

tausche "erstes +1" mit "letztes -1"

7634521

tausche "erstes +2" mit "letztes -2"

7654321

until "erstes +x" == "letztes -x"

Edit:
Ok das mit dieser until Bedingung gilt nur für eine ungerade Zahl von Stellen..
 
Mahltid,


wie wär es denn damit:

Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <errno.h>


/* prototypes */


void PushBinAsArray(int iInputVAL);

/* functions */

void PushBinAsArray(int iInputVAL)
{

	int iCount = 0, iRest = 0, iTempVAL = iInputVAL;
	int iBitDepth = 0; /* feldbreite */

	if(iInputVAL<=255)
			iBitDepth = 8; /* 1 Byte */
	
	if( (iInputVAL<=65535) && (iInputVAL>255))
			iBitDepth = 16; /* 2 Byte */
	
	if( (iInputVAL<=4294967295) && (iInputVAL>65535))
			iBitDepth = 32; /* 4 Byte */

	if(iInputVAL>4294967295) /* 4 Byte Feldgrenze ohne bin. Konjugation*/
	{
		printf("\n\nerror: cannot assign long int (greater than 4 billion)\n");
		exit(1);
	}


	int *aiReturnVAL = new int[iBitDepth];
	for(iCount =0; iCount<iBitDepth; iCount++)
		aiReturnVAL[iCount] = 0; /* feld mit nullen auffüllen */

	iCount = iBitDepth-1; /* endkriterium für elemtentausch in den feldern*/

	while(iTempVAL >0) /* ist eingangswert größer NULL ?? dann mach folgendes */
	{
		iRest = iTempVAL %2; /* modulo z. Basis 2 entweder 0 o. 1*/
		aiReturnVAL[iCount] = iRest;
		iTempVAL /= 2;
		iCount--;
	}

	printf("\nDEC: String = %i\nDUAL: String: = ", iInputVAL); 

	for(iCount = 0; iCount < iBitDepth; iCount++) /* dualzahl von 'hinten nach vorn' zeichenweise ausgeben*/
		printf("%i", aiReturnVAL[iCount]);

	printf("\n\nquitting\n");
}


int main(int argc, char** argv)
{
	PushBinAsArray(atoi(argv[1]));
	return 0;
}

Ist zwar ein C++ Schnippslet aber Du kannst ja die 'new' gegen 'malloc'-Statements austauschen.
Aber probier es ruhig mal mit Klarnamen für Deine VARs und den Code hin und wieder mal einrücken erhöht die Lesbarkeit drastisch :D

just my 2cents ...

MfG
 
Zuletzt bearbeitet:
erstmal danke für die ganzen antworten, ich habs jez soweit am laufen.

@x0r, deinen code verstehe ich leider nur zur hälfte. hab erst vor einiger zeit mit C angefangen für die uni, aber gundsetzlich hab ich die lösung auch verstanden denke ich. mein code is nachm copy eingefügt aber nachm posten nichtmehr.. und tab funktioniert nich ^^

ich habs jetz einfach falschrum ausgegeben..

mfg m0erk
 
Zuletzt bearbeitet:

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Keine grafische Oberfläche (Debian Installation)

Unix Webserver mit HTML Seite erstellen

Port generieren, wenn nicht dann

Prozesskommunikation mit PIPES - wie funktioniert das?

Zurück
Oben