Skip to content
Harry Broeders edited this page Jan 2, 2023 · 4 revisions

Boxed

Hier vind je verschillende uitwerkingen van opdracht 1.2.20 van EMS10.

Daarin wordt je gevraagd om een functie genaamd boxed met een parameter genaamd s te schrijven in Python. Als deze functie wordt aangeroepen met een string als argument dan moet deze string met een rechthoek eromheen worden afgedrukt.

Als deze functie als volgt aangeroepen wordt:

boxed('Hallo Python')

dan is de gewenste output als volgt:

De uitvoer van de functie-aanroep boxed('Hallo Python').

Oplossing 1

Als eerste regel moet eerst een +-teken, dan een aantal --tekens en tot slot weer een +-teken worden geprint. Er moeten 2 spaties voor en na de af te drukken string s geprint worden. Dit betekent dat het aantal --tekens dat geprint moet worden gelijk is aan het aantal karakters in de af te drukken string s plus vier. Het aantal karakters in de af te drukken string s kun je opvragen met de standaard functie len(s). Als tweede regel moet eerst een |-teken, dan twee spaties, vervolgens de af te drukken string s, weer twee spatie en tot slot nog een |-teken worden afgedrukt. De derde regel die moet worden afgedrukt is gelijk aan de eerste regel.

De Python-functie die dit doet is:

def boxed(s):
    print('+' + '-'*(len(s) + 4) + '+')
    print('|  ' + s + '  |')
    print('+' + '-'*(len(s) + 4) + '+')

Dit is op zich een werkende oplossing. Maar de oplossing heeft wel een nadeel. De functie is namelijk niet eenvoudig om aan te passen. Als je op de hoekpunten van de rechthoek bijvoorbeeld *-tekens in plaats van +-tekens wilt gebruiken, dan moet je de code van de eerste en laatste regel van de functie aanpassen.

def boxed(s):
    print('*' + '-'*(len(s) + 4) + '*')
    print('|  ' + s + '  |')
    print('*' + '-'*(len(s) + 4) + '*')

Oplossing 2

Dit kun je eenvoudig verbeteren door de eerste af te drukken regel in een aparte variabele op te slaan.

def boxed(s):
    first_and_last_line = '+' + '-'*(len(s) + 4) + '+'
    print(first_and_last_line);
    print('|  ' + s + '  |')
    print(first_and_last_line);

Als je nu op de hoekpunten van de rechthoek bijvoorbeeld *-tekens in plaats van +-tekens wilt gebruiken, dan moet er nog maar één regel code aangepast te worden.

def boxed(s):
    first_and_last_line = '*' + '-'*(len(s) + 4) + '*'
    print(first_and_last_line);
    print('|  ' + s + '  |')
    print(first_and_last_line);

Oplossing 3

Je zou de aanpasbaarheid ook kunnen verbeteren door in plaats van de eerste (en laatste) regel op te slaan in een variabele first_and_last_line een extra functie toe te voegen die deze regels afdrukt.

def line(width):
    print('+' + '-'*width + '+')

def boxed(s):
    w = len(s) + 4
    line(w)
    print('|  ' + s + '  |')
    line(w)

De variabele w is toegevoegd om te voorkomen dat je het aantal --tekens dat geprint moet worden twee keer moet berekenen.

Als je nu op de hoekpunten van de rechthoek bijvoorbeeld *-tekens in plaats van +-tekens wilt gebruiken, dan moet er ook nog maar één regel code aangepast te worden.

def line(width):
    print('*' + '-'*width + '*')

def boxed(s):
    w = len(s) + 4
    line(w)
    print('|  ' + s + '  |')
    line(w)

Oplossing 4

Oplossing 2 en 3 zijn nog steeds lastig aan te passen als je bijvoorbeeld één spatie voor en na de string wilt afdrukken in plaats van twee. Je moet er dan aan denken dat je ook het aantal --tekens dat afgedrukt wordt op de eerste en laatste regel aan moet passen.

def boxed(s):
    first_and_last_line = '+' + '-'*(len(s) + 2) + '+'
    print(first_and_last_line);
    print('| ' + s + ' |')
    print(first_and_last_line);

Dit kun je eenvoudig verbeteren door het aantal spaties dat voor en na de string s afgedrukt moet worden in een aparte variabele op te slaan.

def boxed(s):
    spaces_before_and_after = 2
    first_and_last_line = '+' + '-'*(len(s) + 2 * spaces_before_and_after) + '+'
    print(first_and_last_line);
    print('|' + ' '*spaces_before_and_after + s + ' '*spaces_before_and_after + '|')
    print(first_and_last_line);

Je kunt er nu eenvoudig voor zorgen dat er slechts één spatie voor en achter de string s wordt afgedrukt door de variabele spaces_before_and_after een andere waarde te geven.

def boxed(s):
    spaces_before_and_after = 1
    first_and_last_line = '+' + '-'*(len(s) + 2 * spaces_before_and_after) + '+'
    print(first_and_last_line);
    print('|' + ' '*spaces_before_and_after + s + ' '*spaces_before_and_after + '|')
    print(first_and_last_line);

Oplossing 5

Je zou ook de gebruiker van de functie boxed zelf kunnen laten kiezen hoeveel spaties er voor en achter de string s afgedrukt moeten worden. De functie boxed krijgt dan twee parameters.

def boxed(s, spaces_before_and_after):
    first_and_last_line = '+' + '-'*(len(s) + 2 * spaces_before_and_after) + '+'
    print(first_and_last_line);
    print('|' + ' '*spaces_before_and_after + s + ' '*spaces_before_and_after + '|')
    print(first_and_last_line);

Maar nu moet je bij het aanroepen van de functie boxed een tweede argument meegeven.

boxed('Hallo Python', 2)

Je voldoet nu niet meer aan de opdracht. Het is mogelijk om een zogenoemde default waarde mee te geven aan een parameter. Als de gebruiker van de functie, geen argument meegeeft aan deze parameter, dan krijgt deze de default waarde.

def boxed(s, spaces_before_and_after = 2):
    first_and_last_line = '+' + '-'*(len(s) + 2 * spaces_before_and_after) + '+'
    print(first_and_last_line);
    print('|' + ' '*spaces_before_and_after + s + ' '*spaces_before_and_after + '|')
    print(first_and_last_line);

De aanroep:

boxed('Hallo Python')

geeft de volgende uitvoer:

+----------------+
|  Hallo Python  |
+----------------+

Maar het is nu ook mogelijk om de functie aan te roepen met een extra argument. De aanroep:

boxed('Hallo Python', 13)

geeft de volgende uitvoer:

+--------------------------------------+
|             Hallo Python             |
+--------------------------------------+

Clone this wiki locally