Problem mit Schleife fur Dualberechnung

New C´ler

Cadet 2nd Year
Registriert
Apr. 2006
Beiträge
29
Guten abend allerseits...

bin neu hier und auch neu im programmier"business"...

haeng an ne kleine aufgabe. ich will ne Dualzahl eingeben und die dann in ne Dezimal umwandeln lassen...

ich haeng nur noch an der schleife, die will einfach net funzen :(...

ps: koennte sein, dass der code etwas umstaendlich is ^.^

also kompilieren geht, wenn ich mir in der forschleife b,d ausgeben lasse, dann stimmt das auch mit der eingabe der dualzahl ueberein, der fehler liegt meiner meinung nach in der "pow()" funktion. ?!?!

PHP:
#include <stdio.h>

main()
{
char x[80],d;
int  i;
double zahl, b, e=0;

    printf (" Dualzahl in Dezimalzahl umwandeln\n\n");

    printf ("\n Bitte eine Dualzahl eingeben: ");

    gets(x);
    
    for (i=0;i<3;i++)
    {    
          d=(x[i]-48);
          b=d;
          zahl = pow(b,e);    //b= basis und e =exponent, zur berechnung 1*2^0, 1*2^1,1*2^2 usw.
          e++;
          printf(" %g",zahl);
    }
}
 
Zuletzt bearbeitet:
oben fehlt noch

#include <math.h>

hab ich grad bemerkt!


probier ichs mit

printf("%g", pow(b , e));


wirfts mir nen fehler aus :(
 
Zuletzt bearbeitet:
ich hab das ganze mal genommen und auf c++ umgeschrieben ... und noch ein wenig geaendert :P

ist nicht schoen aber selten ...

Code:
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int main() 
{ 
string sInput; 
int zahl = 0;

    //Ausgabe
    cout << "Dualzahl in Dezimalzahl umwandeln" << endl << endl; 

    cout << "Bitte eine Dualzahl eingeben:"; 
    //Eingabe
    cin >> sInput;

    //Pruefen auf richtige Werte
    for (int i=0;i<sInput.length();++i) 
    {
        //Gibt es einen fehler wird abgebrochen
        if (sInput[i] != '1' && sInput[i] != '0') return 1;
    }
    //Berechnung, fast so wie deine ... 
    for (i=0;i<sInput.length();++i) 
    {     
          int d =(sInput[i]-48); 
          zahl += d^i;          
    } 
    //Ausgabe
    cout << zahl;

    return 0;
}


An der fehlerbehandlung sollte man noch ein wenig arbeiten, aber nunja du willst es ja denke ich auch nur ein wenig zum testen haben ...
 
Die pow Funktion brauchst Du nicht :-):
Code:
	char x[80],d = 0; 
	int  i, e, len; 
	long zahl = 0;

    printf (" Dualzahl in Dezimalzahl umwandeln\n\n"); 

    printf ("\n Bitte eine Dualzahl eingeben: "); 

    gets(x); 
    
	len = strlen( x ) - 1;
    for (i=len;i>=0;i--) 
    {     
        d=(x[len - i]-'0'); 
		zahl |= (d << i);
    } 
    printf(" %d",zahl);
 
also braeuchte des dann schon in C =)

oki, danke fuer diese variante aber koennte mir vlt noch jmd sagn, wo bei meiner version der Fehler liegt...???

um so jetz nen programm zu schreibn, wie das von Arndt, fehlen mir noch bissl skills :D...das glaubt mir ja keiner... *schmunzel*

trotzdem danke!!!
 
okey, ich hab das problem jetz fast geloest!...

PHP:
#include <stdio.h>
#include <math.h>
#include <string.h>

main()
{
char x[32],d;
int i,len;
double zahl,z=2,e=0;

    printf (" Dualzahl in Dezimalzahl umwandeln \n\n");

    printf ("\n Bitte eine Dualzahl eingeben: ");

    gets(x);
    
    len = strlen(x) ;
    
    for (i=0;i<=len;i++)
    {    
          d=(x[i]-'0');
          zahl = d * pow(z,e);
          e++;
          
          printf(" %g ",zahl);
          
    }
    scanf("%d");
}

bei eingabe von 111 folgt die ausgabe 1 0 4 -384

weiß nich nich so richtig wo die -384 herkommt aber das bekomm ich auch noch :D
 
Zuletzt bearbeitet:
New C´ler schrieb:
weiß nich nich so richtig wo die -384 herkommt aber das bekomm ich auch noch :D
Dann ein kleiner Hinweis:
Schau dir mal an, wie oft du die Schleife durchläufst ;).
 
soooo, hab jetz die zeile

PHP:
len = strlen(x) ;

durch die ersetzt

PHP:
len = strlen(x) - 1 ;

un schau da, es funkt...jetz muss nur noch die addition realisiert werdn :freak:
 
Soooo laeuft nun alles....

denke is ne gute hilfe fuer leute wie mich, die noch nich lang dabei sind...

vlt eben etwas umstaendlich aber sonst :D

PHP:
#include <stdio.h>
#include <math.h>
#include <string.h>

main()
{
char x[80],d;
int i,len;
double zahl,z=2,e=0, dezi=0;

    printf (" Dualzahl in Dezimalzahl umwandeln \n\n");
    printf ("\n Bitte eine Dualzahl eingeben: ");
    
    gets(x);
    len = strlen(x)-1 ;
   
    for (i=0;i<=len;i++)
    {    
          d=(x[i]-'0');
          zahl = d * pow(z,e);
          e++;
          printf("\n %g ",zahl);
          dezi += zahl;
    }
     printf("\n______________\n");
     printf("\n %g", dezi);
     scanf("%d");   // das steht hier, weil mein compiler sonst das dosfenster schliesst ^.^
}

also ausgabe fuer 111 folgt:

Code:
1
2
4
______
7
 
Warum hat deine main keinen Rückgabewert?
int main()
...

Warum rechnest du mit double-Zahlen, wo doch nur Ganzzahlen vorkommen?
int zahl, z=2 ,e=0, dezi=0;

Warum durchläufst du die Schleife vier mal, wo dein String doch nur drei Zeichen lang ist
len = strlen(x); /* Jetzt ist leng == 3 */
for( i=0; i<len; i++) /* Für i von 0 bis 2, also 0, 1 und 2, also drie mal */
...
 
Boron schrieb:
Warum hat deine main keinen Rückgabewert?
int main()
Mal abgesehen davon, dass sowas unschön ist, ist das in C legal. Wird kein Returnwert für eine Funktion angegeben, wird automatisch int angenommen. Diese Unart wurde in C++ beseitigt.

Ansonsten erhöhen die doubles den Wertebereich, versagen aber in der Genauigkeit, wenn man wirklich so große Zahlen verwendet. Und pow benutzt ja auch nur doubles. Trotzdem wären ints hier "richtiger", wie Boron schon sagte.

@New C´ler: Du solltest zumindest die Eingabe abprüfen und nicht einfach char - '0' machen.
 
@ Boron ich durchlaufe die Schleife nicht 4mal sonder 3 mal

len = strlen(x)-1 ; //bei eingabe von 111, ist strlen 3 , das dann -1 hab ich 2...also laeuft mein schleife von 0-2 ! aber deine variante is glaub ich ma logischer, weiss auch nich was ich mir da gedacht hab :D

und eben, pow funzt nur mit double werten, ansonsten isses mir immer ausgestiegen!

und jahh, hab da nix returned, weil eben automatisch int angenommen wird...sagte ja bereits, dass ich hier C verwende...naja, bei mir aufa muehle hab ich nen rueckgabewert ja drinne :freaky:

ach die schleife musst ich eh nochma veraender, da die zahlen falschrum herausgegeben wurden...dadurch, dass das ganze noch mit einer umrechnung entgegengesetzter richtung un auch noch mit einer verschiebefunktion gekoppelt werden sollte, lief das so nich ganz...habs nu so?

hmm eingabe pruefen, saß ich eben schomma dran...wollte das mit ne if schleife noch machn aber hat als nich funktioniert. ei ich sitz seit 2 1/2 wochen an C...erwartet ma bitte nich soo viel! in meinem studium eher so nebensache ^.^

was is hier jetz noch zu verbessern?....

PHP:
#include <stdio.h>
#include <math.h>
#include <string.h>

int main()
{
char x[80], d;
int i, len;
double zahl, z=2, e=0, dezi=0;

    printf (" Dualzahl in Dezimalzahl umwandeln \n\n");
    printf ("\n Bitte eine Dualzahl eingeben: ");

    gets(x);
    len = strlen(x)-1 ;
     
    for (i=len;i>=0;i--)
    {    
          d=(x[i]-'0');
          zahl = d * pow(z,e);
          e++;
          
          printf("\n %g ",zahl);
           
          dezi += zahl;
    }
     printf("\n______________\n");

     printf("\n %g", dezi);

}
 
Zuletzt bearbeitet:
/EDIT

vergessen nen Text zu schreiben ...

Zu deiner Fehlerbehandlung bei Eingaben ...

PHP:
for (int i = 0 ; i < len = strlen(x)-1; ++i)
{
    if (x[i] != '1' && x[i] != '0')
    {
        //DEINE FEHLERBEHANDLUNG



        //Nicht Beachten
        i = i;
        //Let the Compiler be happy ;-)
    }
}


Das ding sollte auch unter C laufen ...
 
Zuletzt bearbeitet:
Zurück
Oben