ubuntuusers.de

Basic 256

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

theCed

(Themenstarter)

Anmeldungsdatum:
21. Oktober 2011

Beiträge: 226

Ich glaub ich stehe gerade etwas auf dem Schlauch, ich möchte ein Bytes-Umrechnungsprogramm machen, aber python verwendet mein input nicht als Ziffer, also zum Beispiel:

1
2
3
userinput = input()
5
print (userinput * 2)

Ergibt nicht 10 sondern 55^^. Mach ich nen Denkfehler?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Verwendest Du Python3. Wenn ja, probiere mal das in einer Shell aus:

1
"a" * 5

Sollte es Dir dann immer noch nicht klar sein, dann noch:

1
type(userinput)

Solltest Du Python2 verwenden, dann lass die Finger von input und verwende stattdessen raw_input.

theCed

(Themenstarter)

Anmeldungsdatum:
21. Oktober 2011

Beiträge: 226

Lysander schrieb:

Verwendest Du Python3. Wenn ja, probiere mal das in einer Shell aus:

1
"a" * 5

Sollte es Dir dann immer noch nicht klar sein, dann noch:

1
type(userinput)

Mh. Jetzt mal ganz banal: Im Prinzip schreib ich ja im input keine (Hoch)kommata, warum wird dann die Zahl trotzdem nicht als solche erkannt?

Und wie genau klappt das mit dem Input und der Zahl? Mit for will es auch nicht...

MarkusH.

Ehemalige, BOFH
Avatar von MarkusH.

Anmeldungsdatum:
19. Juni 2010

Beiträge: 888

Wohnort: Berlin

theCed schrieb:

Mh. Jetzt mal ganz banal: Im Prinzip schreib ich ja im input keine (Hoch)kommata, warum wird dann die Zahl trotzdem nicht als solche erkannt?

Weil die Eingabe als String gelesen wird. Mit int() kannst du die Eingabe dann in eine Ganzzahl umwandeln

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

theCed schrieb:

Mh. Jetzt mal ganz banal: Im Prinzip schreib ich ja im input keine (Hoch)kommata, warum wird dann die Zahl trotzdem nicht als solche erkannt?

Was hat denn die Syntax von Pythons String-Literalen mit der Eingabe zu tun? Du kommst auf seltsame Ideen 😉 Zudem habe ich Dir ja didaktisch wertvoll auf die Sprünge geholfen - was war jetzt daran zu schwer, das mal auszuprobieren?

theCed

(Themenstarter)

Anmeldungsdatum:
21. Oktober 2011

Beiträge: 226

Lysander schrieb:

theCed schrieb:

Mh. Jetzt mal ganz banal: Im Prinzip schreib ich ja im input keine (Hoch)kommata, warum wird dann die Zahl trotzdem nicht als solche erkannt?

Was hat denn die Syntax von Pythons String-Literalen mit der Eingabe zu tun? Du kommst auf seltsame Ideen 😉 Zudem habe ich Dir ja didaktisch wertvoll auf die Sprünge geholfen - was war jetzt daran zu schwer, das mal auszuprobieren?

Ich habs ja ausprobiert, und auch verstanden, dass Python das nicht direkt als Zahl behandelt, nur konnte ich mir das int nicht erschließen 😉

Ich bin bis jetzt soweit, aber ich bin mir nicht sicher, ob das wirklich so gut ist. Knapp 50 Zeilen für einen Umrechner erscheinen mir zu viel 😈. Das einzige, was mir jetzt noch Funktionstechnisch einfallen würde, wäre dass die Einheit hinter der Ausgabe stehen würde, aber das nimmt er nicht an...

 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
#!/usr/bin/env python3.2

for x in range(10): 
    einheit = input ("Welche Maßeinheit? [tb,gb,mb,kb]? ")
 

# Terrabyte:
    if einheit in ["tb"]:
        userinput = input("Wie viel Terrabyte?: ")
        print (userinput) #Tb
        print (int(userinput) * 1024) #Gb
        print (int(userinput) * 1024 * 1024) #Mb
        print (int(userinput) * 1024 * 1024 * 1024) #Kb
    
    
# Gibabyte:
    elif einheit in ["gb"]:
        userinput = input("Wie viel Gigabyte?: ")
        print ( int(userinput) / 1024) #Tb
        print ( userinput) #Gb
        print ( int(userinput) * 1024 ) #Mb
        print ( int(userinput) * 1024 * 1024) #Kb
    
    
# Megabyte:    
    elif einheit in ["mb"]:
        userinput = input("Wie viel Megabyte?: ")
        print ( int(userinput) / 1024 / 1024) #Tb
        print ( int(userinput) / 1024) #Gb
        print ( userinput) #Mb
        print ( int(userinput) * 1024) #Kb 
    

# Kilobyte:
    elif einheit in ["kb"]:
        userinput = input("Wie viel Kilobyte?: ")
        print ( int(userinput) / 1024 / 1024 / 1024) #Tb
        print ( int(userinput) / 1024 / 1024) #Gb
        print ( int(userinput) / 1024) #Mb
        print ( userinput) #Kb
        

    abbruch = input("Noch etwas berechnen?: ")
    if abbruch in ["j"]:
        continue
    else:
        break

stfischr Team-Icon

Avatar von stfischr

Anmeldungsdatum:
1. März 2007

Beiträge: 19197

1
print(variable, "Text")

Immer mal bei solchen Fällen in einem Tutorial nach print suchen, da ist bestimmt ein Beispiel für Textanhängen bei.

Allgemein könntest du das Programm flexibler machen, indem es die eingelesene Zahl (die ja eigentlich ein String ist) anschaut und dann automatisch am Ende guggt, ob da K, M, T, ... steht. Dann kannst du noch abfragen, welche Einheit ausgegeben werden soll, statt alle auszugeben.

Bastel dir am besten ein Dictionary, in dem du einfach

einheiten = {'kb': 1024, 'mb': 1048576, 'gb': 1073741824, ...}

die Größen mapst, dann kannst du das sehr einfach benutzen und auch auf weitere Größen ausweiten.

  • du musst also erkennen, was der Nutzer eingibt (was steht hinten dran kb? mb? ...)

  • wenn du die Größenangabe von der Zahl isoliert hast brauchst du sie nur in dein dictionary stecken und mit der zurückkommenden entsprechenden Zahl multiplizieren

  • jetzt hast du Bytes. Je nachdem, was der User sehen will, packst du das wieder ins dictionary und dividierst dur die herauskommende Zahl ...

So jetzt mach dich mal mit dictionarys vertraut, ist glaube der wichtigste und meistgenutzte Datentyp in Python.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Da ich kein Python spreche mische ich mich in Pseudocode ein:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
unifiedAusgabe (kb) 
        print (kb / 1024 / 1024 / 1024) "Tib"
        print (kb / 1024 / 1024)"Gib"
        print (kb / 1024)"Mib"
        print (kb)"Kib"

for x in range(10): 
    einheit = input ("Welche Maßeinheit? [tb,gb,mb,kb]? ")
 
    if einheit in ["tb"]:
        userinput = input("Wie viel Terrabyte?: ")
        unifiedAusgabe (int(userinput) * 1024 * 1024 * 1024)
    elif einheit in ["gb"]:
        userinput = input("Wie viel Gigabyte?: ")
        unifiedAusgabe ( int(userinput) * 1024 * 1024)
    elif einheit in ["mb"]:
#...
        unifiedAusgabe ( int(userinput) * 1024)
    elif einheit in ["kb"]:
#...        
        unifiedAusgabe ( int(userinput))

Und die Einheiten heißen, wenn man mit 1024 rechnet, Kibibyte, Mebibyte usw., denn Kilobyte kommt von Kilo, und Kilo bedeutet 1000 - das ist eine SI-Einheit, wenn ich mich nicht täusche. Und die Großen Einheiten werden mit großen Buchstaben (T/G/M) abekürzt, nicht mit (t/g/m) - insbesondere steht m für Milli~, also Tausendstel. Eine Ausnahme bildet das Kilo, welches tatsächlich uneinheitlich mit Klein-k abgekürzt wird.

Und zur Abgrenzung von diesen wird beim Rechnen mit 1024 ein 'i' eingeschleust "MiB", "GiB", "TiB"..., siehe auch: http://de.wikipedia.org/wiki/Bin%C3%A4rpr%C3%A4fix

MarkusH.

Ehemalige, BOFH
Avatar von MarkusH.

Anmeldungsdatum:
19. Juni 2010

Beiträge: 888

Wohnort: Berlin

So, hier noch meine Variante:

x**y ist die Schreibweise für x^y, also x hoch y.

An dieser Stelle möchte ich dich noch auf die Python 3k Dokumentation hinweisen. Das ist eine der besten Dokumentationen die ich kenne.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python3

UMRECHNUNG = {'kiB': 1024,    'MiB': 1024**2,
              'GiB': 1024**3, 'TiB': 1024**4,
              'kB':  1000,    'MB':  1000**2, 
              'GB':  1000**3, 'TB':  1000**4}
                
def ausgabe(anzahl):
    print('%d Bytes sind:' % anzahl)
    for k, v in UMRECHNUNG.items():
        print("  %f %s" % (anzahl/v, k))

if __name__ == '__main__':
    mehr = True
    while mehr:
        einheit = input('Welche Einheit? ')
        if einheit not in UMRECHNUNG.keys():
            print('Die Einheit gibt es nicht!')
            continue
        anzahl = input("Wie viel %s? " % einheit)
        anzahl = int(anzahl) * UMRECHNUNG[einheit]
        ausgabe(anzahl)
        mehr = input('Mehr? ').lower() in ['y', 'j']

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

@MarkusH.: Sicherlich die schönste Lösung bisher, aber eines sieht man doch recht häufig und ich kapiere nicht, wieso?

1
2
3
4
flag = True
while flag:
    # if-Konstrukt oder User-Input
         flag = False # oder True

Das ist doch einfach umständlich! break existiert.

1
2
3
while True:
    # Abbruch feststellten:
        break

Damit spart man sich den zusätzlichen Namen.

Außerdem missfällt mir das Überschreiben von anzahl. Du kannst den Funktionsaufruf doch auch so formulieren:

1
ausgabe(int(anzahl) * UMRECHNUNG[einheit])

Generell sind deutsche Bezeichner auch meist unschön zu lesen 😉

Als letztes:

1
2
3
4
# Deine Lösung:
if einheit not in UMRECHNUNG.keys():
# einfacher:
if einheit not in UMRECHNUNG:

Der in Operator prüft bei Dictionaries stets auf die Keys.

MarkusH.

Ehemalige, BOFH
Avatar von MarkusH.

Anmeldungsdatum:
19. Juni 2010

Beiträge: 888

Wohnort: Berlin

Lysander schrieb:

@MarkusH.: Sicherlich die schönste Lösung bisher

danke

aber eines sieht man doch recht häufig und ich kapiere nicht, wieso?

1
2
3
4
flag = True
while flag:
    # if-Konstrukt oder User-Input
         flag = False # oder True

Das ist doch einfach umständlich! break existiert.

1
2
3
while True:
    # Abbruch feststellten:
        break

Damit spart man sich den zusätzlichen Namen.

Da hast du recht, aber mir gefällt das besser ☺ und geht wahrscheinlich noch auf meine alten ersten Programmiererfahrungen zurück. Da wurde mir gesagt, "Bedingte Endlosschleifen mit break verlassen ist böse" ^^

Außerdem missfällt mir das Überschreiben von anzahl. Du kannst den Funktionsaufruf doch auch so formulieren:

1
ausgabe(int(anzahl) * UMRECHNUNG[einheit])

Klar, geht das. Ich hab's halt eben so runtergeschrieben 😛

Generell sind deutsche Bezeichner auch meist unschön zu lesen 😉

Ich war mir nicht mehr sicher ob theCed englische oder deutsche Variablennamen verwendet hatte und habe auf Deutsch getippt. 50:50 Chance vertan 😀

Als letztes:

1
2
3
4
# Deine Lösung:
if einheit not in UMRECHNUNG.keys():
# einfacher:
if einheit not in UMRECHNUNG:

Der in Operator prüft bei Dictionaries stets auf die Keys.

Stimmt ^^

theCed

(Themenstarter)

Anmeldungsdatum:
21. Oktober 2011

Beiträge: 226

hi,

so die Lücke zwischen Weihnachten und Neujahr gilt es zu füllen. Aber erstmal nicht mit dem schönen Bites/Bytes-Umrechner, da mach ich evt. mal später weiter, die dictionarys hab ich mir dennoch mal angeschaut ☺

Hab ne bessere Idee, und zwar ein kleiner "Piepser" dieser soll immer alarmschlagen, wenn in einem log-file auf nem FTP-Server eine Zeile hinzukommt. Sollte ja machbar sein, zwei Probleme. A) Wie verbinde ich Python mit dem FTP-Server b) Wie bringe ich dann den Ton zum laufen, wenn ne Zeile hinzukommt?

Ich warne schonmal vor, wird wohl ziemlicher Mist rauskommen, hab nämlich noch nicht so richtig eine Idee, wie ich das hinbekommen soll. 🙄

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Mist kommt vor allem raus, wenn man viele Fragen in einen Thread mengt.

Die Antworten gehen durcheinander, man hat nur einen "gelöst"-Schalter, Leute, die nur an einer Frage interessiert sind, werden über Neuerungen zur anderen benachrichtigt und die Überschrift passt nicht zur Frage.

Also eröffne eine neue Frage, wenn Du eine neue Frage hast.

linuxcub

Avatar von linuxcub

Anmeldungsdatum:
13. März 2007

Beiträge: 1653

Kinch schrieb:

Mit Base256 kann man bestimmt auch Programmieren lernen, aber das ist keine Sprache in der man produktiven Code schreiben wird. Das ist eine Lehrsprache für Kinder, damit die Sequenz, Iteration und Verzweigung kennen lernen.

Für Kinder? Schau dir mal z.B. "Game of Life" in BASIC-256 an http://rosettacode.org/wiki/Conway%27s_Game_of_Life#BASIC256!

Sehr gut gefällt mir die Sprachausgabe mit BASiC-256, z.B.

say 10^10

Gut gefällt mir das auf Swahili; Deutsch, Englisch etc. gibt es natürlich auch.

Ich weiß, der Thread ist alt. Ich schreibe das hier nur, falls jemand doch noch reinschaut und durch Kinschs Bemerkung abgeschreckt wird. Ich mache z.Zt. ein bißchen BASIC-256 zur Erholung von Pascal, Delphi und Python 😉

Gruß, linuxcub

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

linuxcub schrieb:

Ich weiß, der Thread ist alt.

Leichenschänder! ☺

Ich schreibe das hier nur, falls jemand doch noch reinschaut und durch Kinschs Bemerkung abgeschreckt wird. Ich mache z.Zt. ein bißchen BASIC-256 zur Erholung von Pascal, Delphi und Python 😉

Nimm lieber Ruby. 😀