fb18.de
/ Bachelorstudieng
/ PM Praktische Informatik
Fehlerhafte Frage in SE1 Klausur?
Sinngemäß wurde dort folgende Frage gestellt, wobei nur eine Antwort richtig ist:
Welche Aussagen sind zu folgendem Java-Code richtig:
a = 42 + a;
a) : a kann nicht vom Typ 'String' sein
b) : a könnte vom Typ float sein
c) : a könnte vom Typ boolean sein
d) : a könnte vom Typ int sein
Meiner Ansicht nach sind Antwort 'b' UND 'd' korrekt, aber das überschneidet sich mit der Bedingung, dass nur eine Antwort richtig sei :)
float a = 1.1f;
int a = 1;
(String a = "abc"; geht natürlich auch)
sicher, dass "nur eine antwort ist richtig" angegeben war?
ich hab da alles angekreuzt was ich für richtig gehalten habe.
unsicher war ich mir allerdings bei dem ersten. weil wenn 42 + a von links nach rechts ausgewertet wird kommt erst die 42, dann das plus - was folgerichtig als additions-plus interpretiert werden könnte.
es kam in den übungen jedenfalls hin- und wieder vor, dass man wenn man sowas machen wollte
a = "" + 42 + a
angeben musste
für mich ist da nur d richtig. denn wenn die Addition vollzogen werden will, müssen beide Typen doch übereinstimmen?! also kann man da doch keinen Float drauf addieren ?
"The operator + is undefined for the argument type(s) int, boolean"
aber ansonsten:
public class TestClass {
public static void main(String[] args) {
String a1 = "";
a1 = 42 + a1;
System.out.println(a1);
float a2 = 0;
a2 = 42 + a2;
System.out.println(a2);
int a4 = 0;
a4 = 42 + a4;
System.out.println(a4);
}
}
gibt
42
42.0
42
edit: du schreibst ja selbst
"Welche Aussagen sind zu folgendem Java-Code richtig: "
Oder war das nur grob erinnert und kein Zitat? ;)
Bin mir sicher, dass nur eine Antwort richtig war.
Ein Plus Zeichen kann Strings konkatieren.
"a = "" + 42 + a" ist zwar am logischsten, aber unnötig.
für mich ist da nur d richtig. denn wenn die Addition vollzogen werden will, müssen beide Typen doch übereinstimmen?! also kann man da doch keinen Float drauf addieren ?
Müssen sie nicht. In diesem Fall würde eine implizite Umwandlung nach float vollzogen werden.
"Welche Aussagen sind zu folgendem Java-Code richtig: "
Oder war das nur grob erinnert und kein Zitat? ;)
Genau weiß ich es nicht mehr, aber ich bin mir relativ sicher, dass es Sinngemäß stimmt.
für mich ist da nur d richtig. denn wenn die Addition vollzogen werden will, müssen beide Typen doch übereinstimmen?! also kann man da doch keinen Float drauf addieren ?
Da verwechselst Du OCaml (oder andere streng typisierte Sprachen) mit Java. :)
Roland
meines erachtens ist ausschließlich antwort d richtig.
antwort b ist falsch, da - (keine gewähr):
prozessoren meist keine funktion haben, die mit verschiedenen datentypen rechnen können. will man zwei verschiedene werte verschiedener datentypen miteinander verrechnen, müssen beide datentypen in einen gemeinsamen datentyp konvertiert werden. danach kann man damit rechnen.
hat man also einen int und einen float-wert, dann sollte man wegen der richtigkeit/genauigkeit des ergebnissen den integer-wert in einen wert vom typ float umwandeln….
und da ein "="-zeichen ja nicht ungefähr oder in etwa bedeutet…
In
C (Programmiersprache) sieht das noch schlimmer aus. Da geht es für folgende Typen:
* _Bool
* {unsigned, signed, } {char, short, int, long, long long}
* float, double, long double
* Alle Zeiger auf Objekttypen
* Alle Zeiger auf Funktionstypen
* insbesondere const char *.
Es geht
nicht für folgende Typen:
* void
* [const] [volatile] void *
* Funktionstypen
Die Ergebnisse sind nicht minder verwunderlich:
const char *hello = "hello, world, here I am again, bye, world.";
hello = 42 + hello; /* hello zeigt jetzt auf das Nullbyte am Ende des Strings */
Roland
meines erachtens ist ausschließlich antwort d richtig.
antwort b ist falsch, da - (keine gewähr):
prozessoren meist keine funktion haben, die mit verschiedenen datentypen rechnen können. will man zwei verschiedene werte verschiedener datentypen miteinander verrechnen, müssen beide datentypen in einen gemeinsamen datentyp konvertiert werden. danach kann man damit rechnen.
hat man also einen int und einen float-wert, dann sollte man wegen der richtigkeit/genauigkeit des ergebnissen den integer-wert in einen wert vom typ float umwandeln….
und da ein "="-zeichen ja nicht ungefähr oder in etwa bedeutet…
Wir sind nicht mehr in den 60er-Jahren, wo Programmiersprachen mit dem Befehlssatz eines Rechners identisch sind. Es gibt mittlerweile Programmiersprachen, die dem Programmierer sehr viel Arbeit abnehmen, indem sie höhere Programmiersprachenkonstrukte (Schleifen, Prozeduren, Methoden, Operatoren, und eben automatische Typumwandlung) anbieten.
In Java bedeutet ein "="-Zeichen eine Zuweisung. Und wie das im Einzelnen funktioniert, kann man hier nachlesen:
*
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5295*
http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#184225
Wir sind nicht mehr in den 60er-Jahren, wo Programmiersprachen mit dem Befehlssatz eines Rechners identisch sind. Es gibt mittlerweile Programmiersprachen, die dem Programmierer sehr viel Arbeit abnehmen, indem sie höhere Programmiersprachenkonstrukte (Schleifen, Prozeduren, Methoden, Operatoren, und eben automatische Typumwandlung) anbieten.
In Java bedeutet ein "="-Zeichen eine Zuweisung. Und wie das im Einzelnen funktioniert, kann man hier nachlesen:
* http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5295
* http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#184225
da sollte ich mich wohl mal ins 21. jahrhundert lesen… [img]
http://www.fb18.de/gfx/seufz.gif[/img]
a) : a kann nicht vom Typ 'String' sein
b) : a könnte vom Typ float sein
c) : a könnte vom Typ boolean sein
d) : a könnte vom Typ int sein
Meiner Ansicht nach sind Antwort 'b' UND 'd' korrekt, aber das überschneidet sich mit der Bedingung, dass nur eine Antwort richtig sei :)
Du hast Recht, das ist ein Fehler in der Klausur. Dieser Fehler ging folgendermassen in die Bewertung rein:
b und d angekreuzt: 2 Punkte
nur b angekreuzt: 2 Punkte
nur d angekreuzt: 2 Punkte
b und d und 1 falscher angekreuzt: 1 Punkt
b und 1 falscher angekreuzt: 0 Punkte
d und 1 falscher angekreuzt: 0 Punkte
Ich habe auch zwei bekloppte Fehler … Irgendwo kam vor "int len = irgendwas.length" - also nicht etwa "irgendwas.length()". Hielt ich dann für falsch und habe es nicht angekreuzt, obwohl es rechnerisch richtig gewesen wäre. Wenn ich mich nun richtig erinnere, kam in keiner Übung und ebenfalls nicht im Skript eine derartige Notation vor. Dementsprechend konnte ich damit nichts anfangen. Mittlerweile brachte mir BlueJ die Erleuchtung, aber dennoch sollte man in Klausuren darauf achten, dass sowas nicht vorkommt. Ärgerliche 2 Punkte weniger nun :(
da gings um arrays, oder? das kam so dann garantiert in den übungen dran.
Auf Folie 16 von SE1 Skriptteil 4 steht:
Typischerweise werden For-Schleifen eingesetzt, um alle Elemente eines Arrays zu bearbeiten. Dabei wird die öffentliche Exemplarkonstante length benutzt.
for (int i = 0; i < intArray.length; i++)
Auf den Folien 18 und 22 befinden sich ähnliche Programme, die auf length zugreifen.
Im Protokollauswerter vom Aufgabenblatt gibt es folgendes Codefragment:
public void stundendatenAusgeben()
{
System.out.println("Stunde: Zugriffe");
for(int stunde = 0; stunde < _zugriffeInStunde.length; stunde++) {
System.out.println(stunde + ": " + _zugriffeInStunde[stunde]);
}
}
Im selben Projekt gibt es in den weiteren Klassen noch mehr Zugriffe auf length, etwa in LogdateiLeser:
int einheitenProZeile = minimum.length;
In der Klasse SWBild vom gleichen Aufgabenblatt findet sich folgender Code:
_hoehe = bilddaten.length;
if(_hoehe == 0)
{
_breite = 0;
}
else
{
_breite = bilddaten[0 ].length;
Ausserdem habe ich gerne in der Übungsgruppe die Studenten gefragt, ob ".length" der Aufruf einer Operation ist oder nicht. Da wurde immer über die fehlenden Klammern diskutiert, und warum eine Exemplarkonstante bei einem Array sinnvoll ist.
edit: Das Forum mag keine Array-Zugriffe :)
Dann habe ich das wohl immer übersehen und Klammern gesetzt :( Zur Klausurvorbereitung habe ich mir leider auch nicht die Aufgaben selber durchgelesen, nur die Einleitungen. Böööh. Dann verbleibe ich mit einem "ein dummer Fehler" ;)
Bestimmt eine Art sich einschleichender Legasthenie …
Dann habe ich das wohl immer übersehen und Klammern gesetzt :(
Das ist zwar syntaktisch korrekt, kompiliert aber leider nicht, da Arrays keine Methode length() implementieren.
Naja … wir werden das wohl nirgends selbst geschrieben haben müssen, sonst hätte ich das "Konstrukt" in der Klausur ja erkannt ;) Trotzdem habt ihr mir alle 14 Aufgabenblätter abgenommen und ich habe bis auf eines alle alleine gemacht. [img]
http://www.fb18.de/gfx/24.gif[/img]
Du hast Recht, das ist ein Fehler in der Klausur. Dieser Fehler ging folgendermassen in die Bewertung rein:
b und d angekreuzt: 2 Punkte
nur b angekreuzt: 2 Punkte
nur d angekreuzt: 2 Punkte
b und d und 1 falscher angekreuzt: 1 Punkt
b und 1 falscher angekreuzt: 0 Punkte
d und 1 falscher angekreuzt: 0 Punkte
Sehr schön, jetzt kann ich ruhiger schlafen ;)
Trotzdem habt ihr mir alle 14 Aufgabenblätter abgenommen
Es sind eben nicht alle so penibel wie ich [img]
http://www.fb18.de/gfx/25.gif[/img]
Es gibt noch einen Fehler in der Klausur:
Die Frage lautete Sinngemaess:
Welche der folgenden Aussagen gilt fuer Java?
[…]
* Methoden oder Felder, die als "private" markiert sind, koennen nur von der jeweiligen Klasse aufgerufen oder ausgelesen werden
Diese Antwort war anzukreuzen und aber ist
falsch.
Allerdings weiss ich nicht, ob es sich wegen der paar Punkte lohnt, Stress zu machen. Aber vielleicht ja doch ;-)
MfG
Muelli
mhm jetzt weiss ich gar nicht mehr ob ich das überhaupt angekreuzt habe. Wenn nicht dann würde es sich vielleicht positiv in der note bemerkbar machen, aber wenn nicht… ah, ich bin eigentlich zufrieden. Sollen sie die Bewertung lieber so lassen ;-)
was ist denn daran falsch?
naja man kann mit hilfe der The Reflection API(siehe link) z.b. interne zustände eines objekts zur laufzeit abfragen.
dass das irgendwie geht hat bluej jedem von uns zur genügt gezeigt.
in der frage ging es aber wohl ehr um das "normale" verhalten laut dem klassenmodell. und das sieht ja vor, dass private nur innerhalb des objekt/klasse verfügbar ist.
ganz grundsätzlich betrachtet hat 23C3 aber irgendwie recht. da es tricks gibt die beschränkungen zu umgehen…
Für fast alle Firewalls gab/gibt es Hacks mit denen man sie umgehen kann. Ist deswegen die Aussage falsch, dass eine Firewall den Datenverkehr kontrolliert, weil sich Firewalls i.d.R. so umgehen lassen, dass man einen unkontrollierten Datenverkehr hat?
Die Java-Frage ist ein wenig grenzwertig, denn in einem gewissen Kontext würde ich sie auch mit Nein beantworten, z.B. wenn es um härtere Sicherheitsfragen geht, wo man dann auch über SecurityManager diskutieren muss.
LEIFer
Danke für Deinen Einwand, aber Reflection wurde in SE1 doch überhaupt nicht behandelt. Von daher sind private Eigenschaften wirklich nur in der Klasse zugreifbar.
?
Nur weil es in SE1 nicht gezeigt wurde, heisst das doch noch lange nichts.
Auf private Felder und Methoden einer Klasse zugreifen geht in Java. Punkt. Und das nicht mit schwarzem Voodoo sondern mit dokumentierten Machenschaften aus der offiziellen Sun Java API.
Die Java-Frage ist ein wenig grenzwertig, denn in einem gewissen Kontext würde ich sie auch mit Nein beantworten, z.B. wenn es um härtere Sicherheitsfragen geht, wo man dann auch über SecurityManager diskutieren muss.
Die Frage lautete eben, "welche Aussagen treffen auf *Java* zu" und nicht soetwas wie "welche Aussagen treffen auf unser Wunschmodell von einem Objektorientierten Programmierparadigma zu". Und jemandem den Punkt nicht zu geben, wenn er den Haken an der Stelle nicht gemacht hat, ist schlichtweg falsch.
Fuer alle zum selber machen:
Arghs, das Forum ist doof: ich kann den Java Code nicht vernuenftig posten.
http://www.informatik.uni-hamburg.de/cgi-bin/fsr-wiki.pl/SE1-WiSe06-Klausur-FehlerMfG
Muelli
Es haben sich schon andere darüber
ausgekotzt, dass Java eigentlich eine eigenwillige Verquickung von mindestens Programmiersprache, Klassenbibliothek und virtueller Maschine ist.
In der
Definition der Sprache Java gehört Reflection nicht und wird konsequent auch weitgehend ausgeklammert. Deswegen heißt es
dort auch : "if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor."
Die Bibliothek gibt einem dann aber doch die Möglichkeit dieses Zugriffes. Sie gibt einem aber auch die Möglichkeit, so einen Zugriff über Reflection auf private Felder zu unterbinden.
Die virtuelle Maschine wiederum erlaubt einem - soweit ich weiß - den Zugriff.
Also: Einigen wir uns auf unentschieden und eine mindestens leicht unglückliche Prüfungsaufgabe? (Als Prüfling darf man sich mit den Prüfern streiten, wenn man mag; ich bin zum Glück auf keiner der beiden Seiten).
LEIFer
Nur weil es in SE1 nicht gezeigt wurde, heisst das doch noch lange nichts.
Doch, es ist schliesslich eine SE1 Klausur. In SE1 wurde den Studenten das Schlüsselwort private so beigebracht, dass man das Häckchen in der Klausur setzen muss.
Die Zugriffsmodifikatoren sind ausserdem kein Schutzmechanismus vor Hackern (die ja per Reflection irgendwas böses damit anstellen könnten), sondern dienen lediglich der Abstraktion.
In C++ kannst Du ja auch z.B. auf das erste private Element einer Klasse zugreifen, indem Du die Speicheradresse des Objekts nimmst, das dann statisch auf "Zeiger auf Typ der privaten Variable" castest, und anschliessend den Zeiger dereferenzierst. Ist damit private unwirksam? NEIN! (Genausowenig wie const, welches man ja auch einfach wegcasten kann.)
Nur weil es in SE1 nicht gezeigt wurde, heisst das doch noch lange nichts.
Doch, es ist schliesslich eine SE1 Klausur. In SE1 wurde den Studenten das Schlüsselwort private so beigebracht, dass man das Häckchen in der Klausur setzen muss.
Die Zugriffsmodifikatoren sind ausserdem kein Schutzmechanismus vor Hackern (die ja per Reflection irgendwas böses damit anstellen könnten), sondern dienen lediglich der Abstraktion.
In C++ kannst Du ja auch z.B. auf das erste private Element einer Klasse zugreifen, indem Du die Speicheradresse des Objekts nimmst, das dann statisch auf "Zeiger auf Typ der privaten Variable" castest, und anschliessend den Zeiger dereferenzierst. Ist damit private unwirksam? NEIN! (Genausowenig wie const, welches man ja auch einfach wegcasten kann.)
Das heißt, die Vorlesung definiert was richtig und was falsch ist? Finde ich nicht besonders überzeugen. Schließlich könnte ja jemand zufällig mal etwas von Reflection gehört haben, der dann weniger Punkte bekommt, weil er das nicht rechtzeitig vergessen hat…
Die Frage war nicht, ob private unwirksam ist, sondern ob man darauf zugreifen kann…Das wäre auch in C++ mit ja zu beantworten. IMO.
Was wäre, wenn mir jemand in der Vorlesung beibringt, dass 1*100=100% ist (das machen einige BWLer wirklich so…). Ist das dann für die Klausur auch richtig?
Das heißt, die Vorlesung definiert was richtig und was falsch ist?
Die Klausur basiert auf der Vorlesung. Also sollte man bei der Beantwortung der Frage davon ausgehen, dass die Reflection API irrelevant ist.
Die Frage in der Klausur testet das Verständnis der Studenten bezüglich der Zugriffsmodifikatoren, welche in der Vorlesung und in der Übungs behandelt werden. Die Frage soll klären, ob der Student den Unterschied zwischen private und public kennt. Es geht also um Dinge wie Schnittstelle, Geheimnisprinzip, Kapselung, Abstraktion. Das hat absolut nichts mit Reflection zu tun.
Schließlich könnte ja jemand zufällig mal etwas von Reflection gehört haben, der dann weniger Punkte bekommt, weil er das nicht rechtzeitig vergessen hat…
In dem Fall kann man das ja kurz auf seiner Lösung erwähnen, oder man stellt währen der Klausur eine Frage, die das klärt. Hat aber keiner gemacht, offenbar hat jeder verstanden, worum es in der Aufgabe ging.
Was wäre, wenn mir jemand in der Vorlesung beibringt, dass 1*100=100% ist (das machen einige BWLer wirklich so…). Ist das dann für die Klausur auch richtig?
Hä? 1*100=100%? Versteh ich nicht. 1=100% würde ich sagen.
Dann habe ich das wohl immer übersehen und Klammern gesetzt :(
Das ist zwar syntaktisch korrekt, kompiliert aber leider nicht, da Arrays keine Methode length() implementieren.
das si soweit richtig, alle Subklassen ausm java collection framework haben ne methode size() da sie intern al smenge gesehen werden (incl Array!)
native arrays aka foo[], myClasses[] haben ein attribut length, ich meine die einzige klasse die eine methode length() hat ist string.
grus
cheek
http://www.informatik.uni-hamburg.de/cgi-bin/fsr-wiki.pl/SE1-WiSe06-Klausur-Fehler
public class Hacker
Da haben wir es ja schon. Die Reflection API ist kein Werkzeug für Hacker, um illegal an private Eigenschaften ranzukommen. Reflection benutzt man höchstens mal bei irgendwelchen Entwicklertools und vielleicht noch 1-2 anderen Sachen, von denen ich keine Ahnung habe.
Warum
willst Du überhaupt von aussen auf private Eigenschaften zugreifen? Das spricht doch total gegen das objektorientierte Paradigma. Durch das Schlüsselwort private kann man eine gedankliche Mauer zwischen der Implementation und der Benutzung ziehen. Warum willst Du diese Mauer auf Teufel komm Raus einreissen?
Ich sag es noch einmal: die Zugriffsmodifikatoren unterstützen den Programmierer beim abstrahieren. Sie sind kein Garant dafür, dass man nicht doch irgendwie (Reflection, Casting, was weiss ich…) auf die Felder zugreifen kann. ABER DARUM GING ES NICHT IN DER AUFGABE, und ich denke, das war auch allen Studenten klar.
Hat irgendjemand ernsthaft bei dieser Frage einen Punkt verschenkt, weil er über Reflection Bescheid wusste, sich dann aber nicht gemeldet hat um das zu klären, und dann das Kreuz nicht gesetzt hat? Dann soll er sich bitte melden.
In dem Fall kann man das ja kurz auf seiner Lösung erwähnen, oder man stellt währen der Klausur eine Frage, die das klärt. Hat aber keiner gemacht, offenbar hat jeder verstanden, worum es in der Aufgabe ging.
Dieser Schluss ist zumindest gewagt.
-In Kreuzchen Klausuren kommentiert man seine Loesungen ueblicherweise nicht
-Fragen tut man wenn etwas nicht klar ist, was ja nun nicht zwingend bedeutet, dass einem das in der Klausur sofort in den Sinn kommt
-Der Nutzen/Kosten Aufwand von Fragen ist in der Regel sehr gering, besonders bei Kreuzchen Klausuren mit wenigen Punkten pro Frage.
Der hier drueber war ich
X3K6A2
Was wäre, wenn mir jemand in der Vorlesung beibringt, dass 1*100=100% ist (das machen einige BWLer wirklich so…). Ist das dann für die Klausur auch richtig?
Hä? 1*100=100%? Versteh ich nicht. 1=100% würde ich sagen.
Würde ich auch sagen. Der BWL-Prof sieht das aber anders und hat das auch in seinem Buch so geschrieben.
Und da ist halt die Frage, ob man, weil der Prof das in der Vorlesung so gemacht hat, auch in der Klausur machen muss/kann, weil es sonst falsch ist. Die Klausur bezieht sich ja auf die Vorlesung…
Also worauf ich hinaus will:
Falsche Dinge werden nicht richtiger, nur weil sie falsch gelehrt wurden.