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.
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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Meine 5 €ent: Java ist gut, um die Konzepte der Objektorientierung und strikten Typisierung zu lehren. Außerdem ist Java sinnvoll, weil es in der Industrie und Wissenschaft sehr große Verbreitung gefunden hat. Des weiteren ist Java verwandt mit vielen anderen sehr verbreiteten Sprachen (C, C++, C#) aber einfacher zu handhaben und für Universitäten leichter zugänglich, da mit Eclipse eine kostenlose und brauchbare IDE zur Verfügung steht und keine Lizenzen gekauft werden müssen. Daher kann ich gut verstehen, warum sie in Schulen und Universitäten zu Lehrzwecken eingesetzt wird. Aber freiwillig würde ich nie ein Projekt in Java beginnen, weil die Sprache einfach furchtbar umständlich und hässlich ist.

Der besagte Fallstrick ist eigentlich keiner, da das Verhalten von charAt() und char Datentypen wohl definiert ist. Es ist nicht intuitiv aber Java hat nie den Anspruch erhoben, intuitiv zu sein. Ohne Debugger und API-Docs ist Java nicht zu gebrauchen. Das war schon immer so. Hier ist Python eine (positive) Ausnahme, aber zur Softwareentwicklung gehört nunmal auch der Umgang mit eher umständlichen Sprachen, wenn es die Aufgabenstellung verlangt. Was bringt es, Studenten in einem Rolls-Royce mit Automatik Getriebe im Kreis fahren zu lassen, wenn sie später im Job einen 25 Jahre alten Traktor durch den Schlamm fahren müssen?

Python als Lehr-Sprache ist gefährlich, da es viele Konzepte enthält, die einzigartig für Python sind. Das gilt eigentlich für alle Script-Sprachen. C und Java sind und bleiben Marktführer. Wer sich auf eine berufliche Laufbahn als Software Entwickler vorbereiten will, kommt da nun mal nicht drum rum.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Defnull hat geschrieben:Python als Lehr-Sprache ist gefährlich, da es viele Konzepte enthält, die einzigartig für Python sind. Das gilt eigentlich für alle Script-Sprachen. C und Java sind und bleiben Marktführer. Wer sich auf eine berufliche Laufbahn als Software Entwickler vorbereiten will, kommt da nun mal nicht drum rum.
Bitte an die angegebene Zielgruppe denken. Von beruflichen Softwareentwicklern war nicht die Rede. Es geht darum, Schülern und Studenten grundlegende Konzepte des Programmierens beizubringen. Und da ist so wenig Ablenkung vom Kern des Geschehens wie möglich äußerst hilfreich.
lunar

@Darii: Mit Verlaub, aber eine implizite Umwandlung von Zeichen in Zahlen gibt es beileibe nicht in allen Programmiersprachen. In Python ist eine explizite Umwandlung mit "ord" erforderlich, in OCaml gibt es ebenfalls keine implizite Konvertierung, und in Javascript auch nicht.

Sicher kann man diese Umwandlung durch "ord()" oder das entsprechende Pendant einer anderen Sprache erreichen, nur ist das dann explizit und hat denn auch gar nichts mehr mit der Ausgangssituation zu tun. Deswegen ist das Smalltalk-Beispiel unpassend: Der Punkt ist nicht, dass man Zeichen in Zahlen konvertieren kann, sondern dass dies bei Java implizit geschieht.

Sicher, dass kann man einem Studenten/Schüler auch erklären, aber schau Anfängern mal beim Programmieren einfachster Aufgaben zu: Da treten so völlig grundsätzliche Probleme auf, dass für solche Kleinigkeiten schlicht kein Platz ist.

@Defnull: Ich erkläre auch Dir gerne, was ich sma bereits geantwortet habe: Es geht um Studenten im ersten Semester und Schüler, die meilenweit von ernstzunehmenden Jobs entfernt sind, und erstmal die absoluten Grundlagen lernen müssen.

Wer da meint, es wäre sinnvoll, sich im Kleinkrieg mit impliziten Konvertierungen und dergleichen zu begeben, dem wünsche ich ernsthaft, dass er besagte Zielgruppe mal in Java unterrichten muss.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

lunar hat geschrieben:@Darii: Mit Verlaub, aber eine implizite Umwandlung von Zeichen in Zahlen gibt es beileibe nicht in allen Programmiersprachen. In Python ist eine explizite Umwandlung mit "ord" erforderlich, in OCaml gibt es ebenfalls keine implizite Konvertierung, und in Javascript auch nicht.
Was ist denn jetzt eigentlich dein Kritikpunkt? In deinem letzten Post war es noch die Tatsache, dass es unintuitiv ist, dass ASCII-Codes rauskommen, wenn man Zeichen in Zahlen umwandelt. Dafür ist es doch völlig egal ob das implizit oder explizit erfolgt.
Der Punkt ist nicht, dass man Zeichen in Zahlen konvertieren kann, sondern dass dies bei Java implizit geschieht.
Nein, der Punkt ist, dass Zeichen in Java Zahlen sind und Zahlentypen unter gewissen Umständen implizit ineinander umgewandelt werden können.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Darii hat geschrieben:In deinem letzten Post war es noch die Tatsache, dass es unintuitiv ist, dass ASCII-Codes rauskommen, wenn man Zeichen in Zahlen umwandelt. Dafür ist es doch völlig egal ob das implizit oder explizit erfolgt.
Sorry, aber da herrscht ein gewaltiger Unterschied. Während du einmal explizit sagst, dass du das Zeichen als Zahl haben willst bekommst du beim anderen mal implizit eine Zahl, ohne dass du das erwartet hast (und bei einem Schüler und Studenten ist es unerwartet).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten