An alle Schüler und Studenten mit Informatikproblemen

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.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

lunar hat geschrieben: Aus meiner persönlichen Erfahrung heraus erachte ich es sogar für sinnvoll, an Schulen anfangs völlig auf "echte" Programmiersprachen zu verzichten, und lieber mit etwas wie "Robot Karol" zu beginnen. Denn meist muss man erstmal "Problem lösen" unterrichten, bevor man sich dem "Programmieren" widmen kann.
Dem stimme ich voll und ganz zu. Diese Problemlösungskompetenz zu entwickeln ist das, was ich am Informatik-Unterricht als am Wertvollsten ansehen. Und es ist auch das, woran die meisten zu meiner Zeit scheiterten. Tiefe Einblicke in die Informatik oder auch nur eine bestimmte Sprache lassen sich in der eher knappen Zeit ohnehin nicht vermitteln.

Was ich noch wichtig finde: Ein BWLer, der in der Schule mal Informatik hatte, hat zumindest ne dumpfe Ahnung, wovon ich als Informatiker spreche und vor welchen Problemen ich stehe. Er muß es gar nicht beherrschen, aber es zumindest mal versucht zu haben erweitert den Horizont beträchtlich. Die Wahl der Programmiersprache ist in diesem Zusammenhang irrelevant. Zumal in jeder Nische der Informatik andere Sprachen bevorzugt werden. Aber wer weiß in Schulzeiten schon, in welcher Nische er landen wird?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Pekh hat geschrieben:Die Wahl der Programmiersprache ist in diesem Zusammenhang irrelevant.
Nein, ist sie nicht. Weil es Sprachen gibt, die einem den Einstieg in das problemlösende, algorithmische Denken durch völlig unnötigen und für Einsteiger gänzlich unverständlichen Ballast erschweren. Python hilft hingegen, sich auf das Wesentliche zu konzentrieren.
lunar

@numerix: Das sehe ich ganz genauso, auch wenn ich abhängig von Niveau der Schüler noch weiter reduzieren würde. In der Oberstufe oder im Programmierkurs für Informatik-Erstsemester ist Python eine gute Wahl (und um Welten besser als Java), für Schüler der Mittelstufe aber oder bei absolut blutigen Anfängern halte ich "Spielzeug"-Sprachen bzw. -Umgebungen für noch besser. Wenn man keine Ahnung von nichts hat, ist Python schon kompliziert genug ;)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich denke es hängt und scheitert am Lehrer. Ein guter Lehrer kann auch schwierigere Sachverhalte einfach und anschaulich erklären. Nichts destotrotz mag ich Python lieber als Java oder C++.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

jbs hat geschrieben:Ich denke es hängt und scheitert am Lehrer. Ein guter Lehrer kann auch schwierigere Sachverhalte einfach und anschaulich erklären.
Das koennen die Schueler aber nur dann verarbeiten, wenn sie nicht mit der Sprache kaempfen.
lunar

@jbs: Problematisch an Java ist, dass einfache Dinge schnell in für Anfänger sehr komplexe Themen führen. Drei Beispiele, die ich aus Erfahrung als problematisch ansehe:
  • Die Verwendung von Listen setzt generische Typen voraus, was wiederum zum Unterschied zwischen Werttyp und Objekttyp führt, weil es den Typ "ArrayList<int>" nicht gibt.
  • Die Verwendung von Zeichenketten führt ebenfalls zum Unterschied zwischen Werttyp und Objekttyp bzw. zum Unterschied zwischen Referenz und Objektwert, da man Zeichenketten nicht mit == auf Wertgleichheit prüfen kann.
  • Die Verwendung von Zeichenketten führt irgendwann auch zur Thematik impliziter Typkonvertierungen, weil einzelne Zeichen in Java implizit in "int" umgewandelt werden, weswegen man einzelne Zeichen anders behandeln muss als Zeichenketten, vgl:

    Code: Alles auswählen

    Integer.valueOf("10".charAt(0)) * 10;
    Integer.valueOf("10".substring(0,1)) * 10;
Mag der Lehrer noch so gut sein, die nötigen Erklärung übersteigen die Fähigkeiten eines Programmieranfängers, sei er Informatikstudent oder noch Schüler.

Die Qualität des Unterrichts hängt ohne Zweifel sehr an den Fähigkeiten des Lehrers, doch nicht minder hängt sie auch an der Angemessenheit des Stoffs. Es ist meines Erachtens nicht angemessen, Anfängern Fehler erklären zu müssen, die aus den oben beschriebenen Eigenheiten der Sprache resultieren.

In anderen Fächern zäumt man den Gaul ja auch nicht von hinten auf. In Mathematik sind Vektoren am Anfang nur Koordinaten aus dem zweidimensionalen kartesischen Koordinatensystem, und keine speziellen Matrizen in n-dimensionalen Vektorräumen. In Biologie sind Gene auch erstmal nur "Merkmale" und keine Codon-Sequenzen zur Proteinbiosynthese. Da sollten Zeichenketten im Informatik auch erstmal nur "Werte" sein, und Listen erstmal einfach nur Objekte, in denen man andere Objekte ablegen kann. Java macht diese künstliche, aber notwendige Vereinfachung mehr als schwer.
cos4
User
Beiträge: 23
Registriert: Freitag 30. November 2007, 21:17

Ich hab in der Schule Delphi gehabt und lebe auch noch. Aber im ernst, in def Schule geht es darum in kurzer Zeit übersichtlich Dinge zu schreiben und dafür ist python ideal, fehlt nur noch die Anbindung an ne IDE mit simplem GUI-Designer.
Alternativ zu python finde ich smalltalk interessant, die Sprache macht oop sehr anschaulich.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

lunar hat geschrieben:Die Verwendung von Zeichenketten führt irgendwann auch zur Thematik impliziter Typkonvertierungen, weil einzelne Zeichen in Java implizit in "int" umgewandelt werden, weswegen man einzelne Zeichen anders behandeln muss als Zeichenketten, vgl:

Code: Alles auswählen

Integer.valueOf("10".charAt(0)) * 10;
Integer.valueOf("10".substring(0,1)) * 10;
Das ist ja eigentlich überall so. Viel interessanter finde ich, dass der * Operator offenbar bei Integer überladen ist.
lunar

Darii hat geschrieben:
lunar hat geschrieben:Die Verwendung von Zeichenketten führt irgendwann auch zur Thematik impliziter Typkonvertierungen, weil einzelne Zeichen in Java implizit in "int" umgewandelt werden, weswegen man einzelne Zeichen anders behandeln muss als Zeichenketten, vgl:

Code: Alles auswählen

Integer.valueOf("10".charAt(0)) * 10;
Integer.valueOf("10".substring(0,1)) * 10;
Das ist ja eigentlich überall so.
Überall? Ich kenne das nur von Java, C#, C und C++, alles verwandte Sprachen.
Viel interessanter finde ich, dass der * Operator offenbar bei Integer überladen ist.
Der Operator ist nicht überladen, es findet Auto(un-)boxing statt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

lunar hat geschrieben:Überall? Ich kenne das nur von Java, C#, C und C++, alles verwandte Sprachen.
Jetzt hat du das kleine Wörtchen fast unterschlagen, das steht da nicht ohne Grund. Ich habe nichtbehaupt, alle Sprachen zu kennen, aber Python, Ruby, Javascript und Smalltalk handhaben es genauso. Einzelne Zeichen sind nunmal etwas anderes als Zeichenketten.
Viel interessanter finde ich, dass der * Operator offenbar bei Integer überladen ist.
Der Operator ist nicht überladen, es findet Auto(un-)boxing statt.[/quote]Was es im Endeffekt auch nicht besser macht, bzw. aufs Selbe hinausläuft. Was das angeht, kenne ich keine Sprache die noch inkonsistenter ist.
lunar

Darii hat geschrieben:aber Python, Ruby, Javascript und Smalltalk handhaben es genauso.
Python und Javascript haben gar keinen Typ für ein einzelnes Zeichen, und es gibt daher auch keine implizite Konvertierung zwischen einem einzelnen Zeichen und einer Ganzzahl. Bei Python sind beide Ausdrücke äquivalent, es ist egal, ob ich ein einzelnes Zeichen entnehme, oder eine einelementen Teilzeichenkette (weil beides Zeichenketten sind):

Code: Alles auswählen

int("10"[0])*10 == int("10"[0:1])*10
Bei Python wird ein einzelnes Zeichen nirgends implizit in seine Ordinal-Zahl bzw. seinen Codepoint umgewandelt.

Ist Dir denn klar, was beim Java-Quelltext für Ergebnisse rauskommen?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

lunar hat geschrieben:Ist Dir denn klar, was beim Java-Quelltext für Ergebnisse rauskommen?
Mir nicht! Ich beherrsche "leider" kein Java. 8)

Edit: Ich habe so ne Ahnung, das es etwas mit ASCI-Zeichen zu tun hat :?
lunar

@gkuhl:

Code: Alles auswählen

Integer.valueOf("10".charAt(0)) * 10 == 490;
Integer.valueOf("10".substring(0,1)) * 10 == 10;
Der implizite Cast von char (Rückgabe von charAt) nach int (erwarteter Parameter für valueOf) ergibt entsprechend dem Code-Point der '1' 49.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

lunar hat geschrieben:Python und Javascript haben gar keinen Typ für ein einzelnes Zeichen, und es gibt daher auch keine implizite Konvertierung zwischen einem einzelnen Zeichen und einer Ganzzahl.
Du vergleichst da Äpfel und Birnen. Du übergibst an valueOf zwei verschiedene Typen und wunderst dich, dass da verschiedene Ergebnisse rauskommen. Wie du selbst sagst, kennt Python keinen Typ für ein einzelnes Zeichen deswegen kannst du "10".charAt(0) nicht mit "10"[0] in Python übersetzen, die Python-Version des Java-Codes wäre ord("10"[0]) wo dann auch 49 rauskommt. Ein einzelnes Zeichen ist nunmal etwas anderes als eine Zeichenkette mit genau einem Element, das gilt auch für Sprachen die keinen „char“-Typ kennen. Und um es nochmal in Smalltalk zu sagen:

Code: Alles auswählen

('10' at: 1) asInteger = 49
Ist also beileibe keine seltsame Java-Eigenheit.
Der implizite Cast von char (Rückgabe von charAt) nach int (erwarteter Parameter für valueOf) ergibt entsprechend dem Code-Point der '1' 49.
Ja was erwartest du denn anderes? char lässt sich nunmal nicht nach String casten. Was ist eher verwirrend finde ist, dass Integer.valueOf(some_integer) überhaupt funktioniert. Eigentlich erwartet die Funktion einen String.
BlackJack

@Darii: Erst sagst Du man kann das Java-Snippet nicht nach Python übersetzen weil es in Python keinen ``char``-Typ gibt, und dann machst Du es doch als ``ord("10"[0]) `` was aber aus Javasicht auch wieder falsch ist, denn in Java ist es eben keine Zahl sondern ein Zeichen, dass nur in bestimmten Fällen zur Zahl gecastet wird. Und genau *das* findet Lunar zu schräg um es Anfängern zuzumuten. Sowohl bei Deinem Python-Snippet als auch beim Smalltalk-Beispiel musst Du *explizit* in eine ganze Zahl umwandeln.

`Integer.valueOf` nimmt Zahlen entgegen, weil die Funktion sowohl für ``int`` als auch ``String`` überladen ist.

Ich denke Lunar hätte an der Stelle entweder einen Fehler zur Übersetzungzeit erwartet, oder dass das Ergebnis dem eines Aufrufs mit einer Zeichenkette mit genau dem Zeichen entspricht.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

BlackJack hat geschrieben:@Darii: Erst sagst Du [...] dann machst Du es doch als ``ord("10"[0]) ``[...]
Genau. Da es kein char gibt muss man in Python halt Integer nehmen. Das wäre zumindest „richtiger“ als einfach ein 1-elementigen Python-String nehmen.
denn in Java ist es eben keine Zahl sondern ein Zeichen, dass nur in bestimmten Fällen zur Zahl gecastet wird. Und genau *das* findet Lunar zu schräg um es Anfängern zuzumuten.
Ich finde es nicht zu viel verlangt, einfach mal zu gucken, was der ominöse Typ char eigentlich ist. Nämlich eine Zahl. Um auf diese „Falle“ zu stoßen, muss man ja schließlich erstmal auf die Idee kommen, mit charAt ein char aus dem String rauszuholen.
`Integer.valueOf` nimmt Zahlen entgegen, weil die Funktion sowohl für ``int`` als auch ``String`` überladen ist.
Ist sie nicht, zumindest nicht laut der API-Dokumentation von Sun.

Edit: Mea culpa, seit 1.5 nimmt sie wirklich Integer entgegen(kann mir jemand sagen warum google immer noch 1.4 als ersten Treffer liefert?), aber wie gesagt, ein char ist eine Zahl. Und kann immer automatisch zu int gecastet werden. Ein Anfänger Kurs/Buch bei dem das nicht erwähnt wird macht etwas falsch.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Also die Diskussion, die diese beiden so simplen Codezeilen ausgelöst haben, untermauert ja eher Lunars Behauptung, das dieses Verhalten von Java für einen Schüler unnötig kompliziert ist. Was ist ein überladener Operatoren? Was ist Auto(un-)boxing? Was ist eine implizite Cast? Und warum ist das Ergebnis jetzt 49 und nicht 42?

Die Fragen sind rhetorisch. :wink:
Grüße
Gerrit
lunar

@Darii: Du hast mich überhaupt nicht verstanden. Es geht nicht um mich. Ich weiß, was da passiert und warum es passiert, und ich kenne mich in Java und C++ gut genug aus, um nichts anderes zu erwarten, und mich vom Ergebnis nicht überraschen zu lassen. Meines Erachtens ist das Verhalten zwar nicht sinnvoll, sondern nur historisch ererbte Altlast von C, aber darüber lässt sich unter Programmierern sicherlich trefflich streiten.

Hier geht es aber nicht um Programmierer, sondern Schüler bzw. Studenten, die gerade die ersten Schritt auf dem Weg zum Programmierer machen. Da fehlt die Erfahrung, die uns sagt, dass Java Zeichen lieber als Zahlen ansieht. An ihre Stelle tritt die Intuition. Nun, wenn Du ein "a" siehst, dann liest Du in erster Linie erstmal das Zeichen "a", und nicht das erste Zeichen des Alphabets oder das 97. Zeichen der ASCII-Tabelle. Kannst Du Javas Verhalten da mit gutem Gewissen als intuitiv bezeichnen? Zahlen als "richtigeren" Ersatz für Zeichen anzusehen, ist vor diesem Hintergrund dann sehr merkwürdig. Wenn ich Dich nun bitten würde, alle Buchstaben meines Beitrags aufzuzählen, muss ich dann eine Liste mit Zahlenwerten erwarten?

Ebenso befremdlich ist es, ein Anfängerbuch oder ein Kurs als "falsch" hinzustellen, wenn die impliziten Typkonvertierungen nicht erläutert werden. Wenn man anfängt, eine Tabelle mit impliziten Typumwandlungen zu erklären, passiert genau das, über das hier schon lang und breit debattiert wurde: Man verliert über den Besonderheiten einer Sprache das Ziel, nämlich "Programmieren" im Sinne von Problemlösung und Umsetzen vom Probleme in Algorithmen zu lehren. Aber hast Du denn überhaupt je solche Kurse gehalten?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

lunar hat geschrieben:@Darii: Du hast mich überhaupt nicht verstanden.
Natürlich habe ich dich verstanden, bloß du mich nicht. Du kreidest speziell Java irgendetwas an, was in allen Programmiersprachen so funktioniert. Mehr wollte ich nicht sagen. Siehe das Smalltalk-Beispiel das BlackJack also so unpassend bezeichnet hat. Genau das selbe Spielchen, Zeichen -> Integer -> ASCII-Code. Wenn man damit also in Java einmal hinfliegt hat man etwas fürs Leben gelernt.
Ebenso befremdlich ist es, ein Anfängerbuch oder ein Kurs als "falsch" hinzustellen, wenn die impliziten Typkonvertierungen nicht erläutert werden.
Ich erwarte nur einen kleinen Satz, zu jedem Datentyp der gerade verwendet wurde. Wenn ich charAt erwähne, muss ich auch erwähnen das da rauskommt. Und wenn das keine Kleinigkeit sondern ein häufiger Fallstrick, dann muss ich dass erst recht erwähnen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Wenn ich Dich nun bitten würde, alle Buchstaben meines Beitrags aufzuzählen, muss ich dann eine Liste mit Zahlenwerten erwarten?
Wenn du Ruby 1.8 verwendest - ja. Was scheinbar nicht nur mich so dermaßen gewundert hat dass es in Ruby 1.9 an das Python-Verhalten angepasst wurde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten