2017-11-13 1 views
0
print ("This program reads an unsigned binary number of arbitrary length 
\nand tries to compute the decimal equivalent. The program reports an error 
\nif the input number contains characters other than 0 and 1.") 
dec = 0 
bin = 0 
factor = 1 

print ("Enter the binary number: ") 
bin = int(input()) 

while(bin > 0): 

    if((bin % 10) == True): 
     dec += factor 
     bin //= 10 
     factor = factor * 2 


    else: 
     print("unrecognized bit:") 


print ("I think your binary number in decimal form is: " ,dec) 

Dies ist mein Code für ein Programm, das eine Binärzahl vom Benutzer in eine Dezimalzahl konvertieren soll. Es funktioniert gut, aber ich versuche, eine "else" -Anweisung hinzufügen, die "unerkanntes Bit" drucken wird, wenn der Benutzer eine andere Zahl als 0 oder 1 eingibt. Es funktioniert, aber das Programm druckt "Unbekanntes Bit", auch wenn Benutzer hat nur 0 und 1 eingegeben. Dies sollte nicht passieren. Siehe auch Bild bezogen. Ich habe 12343 eingegeben, um das Programm zu testen, und es sagt Unerkanntes Bit, das gut ist, aber es nimmt auch die "1" in dieser Zahl und konvertiert es in 16, was nicht passieren sollte, sollte es einfach unerkanntes Bit sagen. Ich denke, diese beiden Probleme sind einfach zu beheben, aber ich bin mir nicht sicher. Vielen Dank!Einfache Python: über Struktur des Codes

picture

+0

Der Einzug des Codes in Ihrer Frage ist vermasselt-bitte [bearbeiten] Sie Ihre Frage und beheben Sie es. – martineau

Antwort

0

Zwei Probleme:

  1. Die Bedingung wird nur erfüllt, wenn Ihre Binäreingabe einen Rest von 1 hat, da 0 == False zu True ausgewertet wird. Das heißt, wenn Ihre Nummer mit einer Null endet (oder enthält eine Null), wird (bin%10) == True zu False ausgewertet (Nebenstelle: Es gibt eigentlich keine Notwendigkeit, die == True auf der rechten Seite hinzuzufügen).

  2. Du fügst factor-dec unabhängig davon, ob die Ziffer, die Sie bei gesuchte ist ein 1 oder 0; Sie sollten nicht hinzufügen, wenn Sie auf eine Null stoßen.

So sollte der Code wie folgt aussehen:

while(bin > 0): 
    remainder = (bin % 10) 
    if remainder in (0,1): 
     dec += factor * remainder 
     bin //= 10 
     factor = factor * 2 

    else: 
     print("unrecognized bit:") 
     break 
+0

Danke Mann, du hast es repariert! Ein weiteres Problem allerdings ... wenn ich etwas wie 12345 eintrage, das die "Unerkanntes Bit" -Anweisung auslösen würde, wird "Unerkanntes Bit" ungefähr ein Bazillion Mal ausgegeben, wenn ich das Programm aus irgendeinem Grund ausführe. Weißt du, warum das sein könnte? Soll ich irgendwo eine Pause machen? – user8930130

+0

Ja, fügen Sie eine Pause hinzu. Die Schleife wird fortgesetzt, da Sie den Wert von bin nicht ändern, wenn Ihre Bedingung falsch ist. –

+0

Sorry für so viele Fragen, aber ich habe die break-Anweisung nach der if-Anweisung hinzugefügt und sagt jetzt, dass die else-Anweisung eine ungültige Syntax ist ... – user8930130

0

Es ist eine Frage der Vertiefung. Ihre letzte Zeile wird gedruckt, egal was die if else-Anweisungen sagen. Sie möchten auch die while-Schleife verlassen, wenn Sie ein nicht erkanntes Symbol erreichen. Momentan wird die else-Anweisung ausgegeben, aber die Schleife wird fortgesetzt.

Dies ist eine Lösung ist, wo ich eine Pause Bedingung hinzugefügt, um die andere zu verlassen, fügte dann ein Booleschen wir zu sehen, ob ausgeben können die letzten print-Anweisung:

print ("This program reads an unsigned binary number of arbitrary length tries to compute the decimal equivalent. The program reports an error if the input number contains characters other than 0 and 1.") 
dec = 0 
bin = 0 
factor = 1 
success = 1 

print ("Enter the binary number: ") 
bin = int(input()) 

while(bin > 0): 

    if((bin % 10) == True): 
     dec += factor 
     bin //= 10 
     factor = factor * 2 


    else: 
     print("unrecognized bit:") 
     success = 0 
     break 

if(success): 
    print ("I think your binary number in decimal form is: " ,dec) 
0

Sie benötigen eine Eingabe testen sicherzustellen, dass es legal ist. Sie können dies mit regulären Ausdrücken tun. Ersetzen bin = int(input()) mit:

import re  
inp = input() 
if re.match('.*[^01]+.*', inp) is not None: 
    print("illegal character in input, must be ones and/or zeros") 
    exit() 

bin = int(inp) 

Dies wird die ungültige Zeichen Meldung aus, wenn die Eingabe enthält alles anderes als Einsen oder Nullen.