Funktionen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

Da in den bisherigen Posts immer von einem Rahmen aus Einzelzeichen ausgegangen war, bin ich auch hier davon ausgegangen. Aber gemäß "Explicit is better than implicit" müsste man eigentlich noch entweder die Eingabe testen und eventuell verkürzen oder (besser) einen Fehler zurückgeben oder aber die Funktionen fürs Zeichnen anpassen.
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@jqz4n: was ich meinte, ist, dass in Deinem Programm immer nur das erste Zeichen von Inhalt in einen Rahmen gepackt wird.
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

Ok, gewonnen ;)

Code: Alles auswählen

#!/usr/bin/python
#-*-coding: utf-8 -*-
def bestimme_laenge(inhalt):
    """
   bestimmt die Breite der längsten Textzeile
   """
    return max(map(len,inhalt))
 
def zeichne_horizontale_linie(rahmen, laenge):
    """
   gibt eine horizontale Linie zurück, die aus dem Zeichen "rahmen" besteht und eine Länge von "laenge" hat
   """
    return rahmen*laenge
   
def zeichne_seitlichen_rahmen(rahmen, inhalt, laenge):
    """
   gibt den Text "inhalt", versehen zu beiden Seiten mit je einer vertikalen Linie aus dem Zeichen "rahmen" zurück
   "laenge" sollte mindestens der Länge der längsten Textzeile entsprechen.
   """
    for zeile in inhalt:
        return '{0}{1}{0}'.format(rahmen,zeile.center(laenge))
 
def zeichne_rahmen(inhalt, rahmen):
    """
   umgibt den Text "inhalt" mit einem Rahmen, der aus dem Zeichen "rahmen" besteht und gibt das Ergebnis zurück
   """
    inhalt = inhalt.split('\n')
    laenge = bestimme_laenge(inhalt)
    linie = zeichne_horizontale_linie(rahmen, laenge+2)
    rahmentext = [
        linie,
        zeichne_seitlichen_rahmen(rahmen,inhalt,laenge),
        linie
    ]
    return '\n'.join(rahmentext)
 
# eine Möglichkeit des Aufrufs, erhält die Inhalte aus der Benutzereingabe
def main(begruessung, menu_inhalttext, menu_rahmentext):
    print begruessung
    inhalt = raw_input(menu_inhalttext)
    rahmen = raw_input(menu_rahmentext)
    return zeichne_rahmen(inhalt, rahmen)
 
if __name__ == '__main__':
    print main(
        'Willkommen zum "Rahmenprogramm"!',
        'Geben sie einen Text ein und wir umrahmen ihn: ',
        'Nun noch den zu verwendenden Rahmen:'
        )
Das sollte jetzt aber endgültig funktionieren. Zumindest werde ich es nicht weiter ausbessern ;)
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@jqz4n: mehr als eine Zeile in einem Rahmen braucht auch kein Mensch! Was ich damit meine, ist, dass in Deinem Programm immer nur die erste Zeile von Inhalt in einen Rahmen gepackt wird. Testest Du eigentlich die Sachen die Du postest auch mal?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sirius3 hat geschrieben:Testest Du eigentlich die Sachen die Du postest auch mal?
Das obige Beispiel-Projekt wäre imho ein guter Einstieg ins Thema Unit Testing :-) Dann wäre der ein oder andere Fehler ggf. nicht passiert...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten