Kontrollstruktur erstellen

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.
Antworten
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

Hi,
ich starte gerade mit Python und habe jetzt wohl nach und nach ein paar, für euch, einfache Fragen.

Hier meine ersten:
1) Ich soll ein Programm schreiben das zunächst den Namen abfragt und diesen dann ausgbit.
2) Dann soll ich auch den Geburtsort und das Alter abfragen und alle Angaben zusammen in einem Satz ausgeben.
3) Zuletzt soll ich z.B. "Geburtsort ist nicht bekannt" falls der Geburtsort nicht eingegeben wurde.

Zunächst stelle ich mal meinen Quelltext für 1) und 2) ein.

Code: Alles auswählen

# Namensabfrage & Ausgabe
name = input("Wie lautet ihr Name: ")
print("Hallo", name)

Code: Alles auswählen

# Abfrage des Geburtsortes & des Alters & eine komplette Ausgabe
ort = input("Wo sind Sie geboren: ")
alter = input("Wie alt sind Sie: ")
print("Hallo", name+". Sie sind", alter,"Jahre alt und Sie wurden in", ort,"geboren.")
Zunächst eine Frage zu der print Funktion. Wenn ich Variablen ausgeben will kommt bei einem Komma immer ein Leerzeichen und nie mehr, egal wieviel ich nach dem Komma eintippe. Wenn ich ein Plus statt einem Komma verwende folgt nie ein Leerzeichen, egal wieviele ich eintippe.
Alles innerhalb der Anführungszeichen ist mir klar.
Ist das soweit richtig?

Nun zu den Kontrollstrukturen:
Soll ich nun if Funktion nach jeden input einfügen um bei einem nicht eingetippten Angabe ich den Anwender erneut dazu auffordere?
Wie sieht denn dann mein If aus?
Wenn der Name nicht eingegeben wurde muss ich dann
if name =
Nur was gebe ich dann wenn er nur bei nichts etwas tun soll?


Danke schonmal für die Hilfe im voraus
Bindl
Zuletzt geändert von Anonymous am Dienstag 15. November 2016, 16:30, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Bindl: Der Benutzer kann ja nicht wirklich *nichts* eingeben. Auch wenn er ”nichts” eingibt, bekommst Du von der `input()`-Funktion ein Ergebnis geliefert. Und auf dieses Ergebnis kannst Du prüfen. Schau Dir einfach mal an welchen Wert Du da bekommst. `print()`, `type()`, und `repr()` sind bei so solchen Nachforschungen immer recht hilfreich.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bindl: wenn Du nochmal nach dem Namen fragen willst, wenn nichts eingegeben wurde, solang bis einer eingegeben wurde, brauchst Du eine while-Schleife.

Wenn Du mehrere durch Komma getrennte Argumente bei print angibst, wird dazwischen das ausgegeben, was als sep-Argument angegeben worden ist (ein Leerzeichen falls sep nicht angegeben wurde). + dagegen erzeugt einen neuen String aus den beiden "Summanden", der dann ausgegeben wird. Will man einen Satz ausgeben, nimmt man aber .format:

Code: Alles auswählen

print("Hallo {}. Sie sind {} Jahre alt und Sie wurden in {} geboren.".format(name, alter, ort))
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

BlackJack hat geschrieben:@Bindl: Der Benutzer kann ja nicht wirklich *nichts* eingeben. Auch wenn er ”nichts” eingibt, bekommst Du von der `input()`-Funktion ein Ergebnis geliefert. Und auf dieses Ergebnis kannst Du prüfen. Schau Dir einfach mal an welchen Wert Du da bekommst. `print()`, `type()`, und `repr()` sind bei so solchen Nachforschungen immer recht hilfreich.
Hi, wenn ich nun
print(type(name))
z.B. nach der Namensabfrage einfüge und einfach Enter drücke gibt er mir aus das es sich um einen String handelt.

Für mich wäre jedoch wichtig wie ich erkenne das der Benutzer einfach nur Enter drückt anstatt eine Angabe zu machen.
Wie kann ich sowas machen?
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

Sirius3 hat geschrieben:@Bindl: wenn Du nochmal nach dem Namen fragen willst, wenn nichts eingegeben wurde, solang bis einer eingegeben wurde, brauchst Du eine while-Schleife.

Wenn Du mehrere durch Komma getrennte Argumente bei print angibst, wird dazwischen das ausgegeben, was als sep-Argument angegeben worden ist (ein Leerzeichen falls sep nicht angegeben wurde). + dagegen erzeugt einen neuen String aus den beiden "Summanden", der dann ausgegeben wird. Will man einen Satz ausgeben, nimmt man aber .format:

Code: Alles auswählen

print("Hallo {}. Sie sind {} Jahre alt und Sie wurden in {} geboren.".format(name, alter, ort))
Hi danke für den Hinweis mit dem .format.
In meiner HS wird alles nicht so im Detail erklärt, schade wie ich finde.

Wenn ich nun die geschweiften Klammern {} einfüge und die definierten Begriffe oder Argumente zum Schluss einfüge, wird dann name als 1 gesetzt und ich könnte auch {1} schreiben? Wenn ich das nicht schreibe, nimmt Python dann automatisch die erste geschweifte Klammer als 1 an?

WIe kann ich denn die von euch verwendete Codebox auswählen?
Oben in der Leiste finde ich nur "Code".
BlackJack

@Bindl: Der Benutzer hat ja nicht nichts eingegeben wenn er nur die Eingabetaste betätigt sondern eine Zeichenkette die genau das enthält was er vor dieser Taste eingegeben hat. Und mit diesem Wert kannst Du die Eingabe des Benutzers vergleichen.

Die Zählung fängt bei Rechnern üblicherweise bei 0 an und nicht bei 1, so auch bei den Platzhaltern für `format()`.

Für die codebox ist das Auswahlfeld wo „Code auswählen“ drin steht, zuständig.
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

Hi,

ich habe das ganze jetzt soweit gelöst. Zumindest funktioniert es mal und ich hoffe das es nicht ganz so umständlich von mir umgesetzt wurde.
Ich habe das ganze über das checken der Länge der Eingabe gemacht.
Die Ausgabe zum Schluss habe ich nur doppelt gemacht um das ganze mit .format mal auszuprobieren.

Danke euch für die Hilfen

Code: Alles auswählen

# Namensabfrage & Ausgabe
name = input("Wie lautet ihr Name: ")
while len(name) <= 0:
    name = input("Bitte geben Sie erneut Ihren Namen ein: ")
else:
    print("Hallo", name)

# Abfrage des Geburtsortes & des Alters & eine komplette Ausgabe
ort = input("Wo sind Sie geboren: ")
alter = input("Wie alt sind Sie: ")

#Abfragen von Ort und Alter
while len(ort) <= 0:
    ort = input("Bitte geben Sie erneut Ihren Geburtsort ein: ")
while len(alter) <= 0:
    alter = input("Bitte geben Sie erneut Ihr Alter ein: ")



print("Hallo", name+". Sie sind", alter,"Jahre alt und Sie wurden in", ort,"geboren.")

print("Hallo {0}. Sie sind {1} Jahre alt und Sie wurden in {2} geboren.".format(name, alter, ort))


Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bindl: ein else bei while ohne break macht nicht wirklich Sinn. Die Länge eines Strings kann nie kleiner als Null sein. Leere Strings ergeben den Wahrheitswert "falsch", so dass man auch schreiben kann "while not name:" Kommentare sollten einen Mehrwert bieten, also nicht nur beschreiben, was sowieso schon im Code steht, sondern warum etwas gemacht wird. Wenn man ein Konstrukt mehrmals braucht (Eingeben eines nicht leeren Strings), bietet es sich an, dafür eine Funktion zu schreiben.

Code: Alles auswählen

def input_non_empty_string(prompt, alternative):
    result = input(prompt)
    while not result:
        result = input(alternative)
    return result
    
name = input_non_empty_string("Wie lautet ihr Name: ",
    "Bitte geben Sie erneut Ihren Namen ein: ")
print("Hallo", name)
 
ort = input_non_empty_string("Wo sind Sie geboren: ",
    "Bitte geben Sie erneut Ihren Geburtsort ein: ")
alter = input_non_empty_string("Wie alt sind Sie: ",
    "Bitte geben Sie erneut Ihr Alter ein: ")
print("Hallo {0}. Sie sind {1} Jahre alt und Sie wurden in {2} geboren.".format(name, alter, ort))
Zuletzt geändert von Sirius3 am Donnerstag 17. November 2016, 10:08, insgesamt 2-mal geändert.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Sieht doch schon gut aus.
Die Länge eines Strings kann nie einen negativen Wert annehmen.
Du könntest die Prüfung also auf sowas ändern:

Code: Alles auswählen

	while len(name) == 0:
		pass
Da du ja drei mal das Gleiche in deinem Code machst,
könnte man auch eine Funktion dafür schreiben.
Zum Beispiel:

Code: Alles auswählen

def abfrage(text):
	output = ''
	while not output:
		output = input(text)
	return output

name = abfrage("Wie lautet Ihr Name? ")
alter = abfrage("Wie alt sind Sie? ")
...
Jetzt musst du noch Aufgabe 3 erledigen.
Dann bist du fertig.
Bindl
User
Beiträge: 70
Registriert: Donnerstag 27. Oktober 2016, 11:48

Hi,

@sebastian0202,

Aufgabe 3) habe ich oben nicht so ganz richtig dargestellt.
Falls eine Eingabe nicht gemacht wurde, soll ich den Anwender erneut nach der Angabe fragen bis er Sie macht.
Ich denke das habe ich damit gemacht.

Eine Funktion einfügen kann ich leider noch nicht. Das kommt erst im der kommenden Woche dran.
Heute gehe den Python 3 Kurs von Video2Brain durch, zumindest einen großen Teil und dann kann ich vielleicht auch schon mit Funktionen umgehen.
Aber danke für den Hinweis.

@Sirius3,

auch du scheinst eine Funktion zu definieren die angibt was passiert wenn der Input nicht oder gemacht wurde.
Ich denke ich kann dem ganzen folgen, jedoch möchte ich nicht damit rumspielen ohne die Vorlesung dazu gehört zu haben.

Die Aufgabe 3) haben wir im Tutorium nicht gemacht weil gesagt wurde das wir dazu noch nicht weit genug sind. Wllte mich einfach mal daran ausprobieren. Nächste Woche werde ich sicherlich eine solche Aufgabe besser lösen können.
Auch dir ein Danke.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


Aufgabe 3 besteht daraus den Geburtsort als "Geburtsort unbekannt" anzuzeigen, wenn der Nutzer keinen angibt.
Die Lösung dafür hast du doch noch nicht implementiert!?
Du musst dem Nutzer schon die Möglichkeit einräumen keinen Ort angeben zu können.
So nervst du ihn doch solange mit der Frage bis er aufgibt und einen angibt. :mrgreen:
Gelöst ist die Aufgabe damit nicht!?

Vielleicht ist das für dich eine schöne Herausforderung?
Antworten