# Aufgabe --> bedingte Anweisung



## ZenToR (31. Mrz 2004)

Also das ist der Quelltext auf dem sich meine Frage bezieht :  (es geht um bedingte anweisungen)


________________________________________________________________________



```
/**
 * Diese Klasse definiert Studenten in einem Uni-Verwaltungssystem.
 * Sie beschreibt die Details von Studenten, die für unseren Kontext 
 * relevant sind.
 * 
 * @author  Michael Kölling und David J. Barnes
 * @version 1.0  (3. Januar 2003)
 */
public class Student
{
    // der volle Name des Studierenden
    private String name;
    // seine Matrikelnummer
    private String matrikelnummer;
    // die Anzahl der bereits erworbenen Scheine
    private int scheine;

    /**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        name = vollerName;
        matrikelnummer = matrNr;
        scheine = 0;
    }

    /**
     * Liefere den vollen Namen dieses Studenten.
     */
    public String gibName()
    {
        return name;
    }

    /**
     * Trage einen neuen Namen ein.
     */
    public void nameAendern(String neuerName)
    {
        name = neuerName;
    }

    /**
     * Liefere die Matrikelnummer dieses Studenten.
     */
    public String gibMatrikelnummer()
    {
        return matrikelnummer;
    }

    /**
     * Erhöhe die Anzahl der erworbenen Scheine.
     */
    public void erhoeheScheinanzahl(int weitereScheine)
    {
        scheine += weitereScheine;
    }

    /**
     * Liefere die Anzahl der bereits erworbenen Scheine.
     */
    public int gibScheinanzahl()
    {
        return scheine;
    }

    /**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        return name.substring(0,4) + matrikelnummer.substring(0,3);
    }
    
    /**
     * Gib Name und Matrikelnummer auf der Konsole aus.
     */
    public void ausgeben()
    {
        System.out.println(name + " (" + matrikelnummer + ")");
    }
}
```

______________________________________________________________________________



Und dazu versuche ich schon ganze zeit die folgende Aufgabe zu lösen:

*Die Klasse String definiert eine sondierende Operationlength,die die Länge einer Zeichenkette zurückliefert.
Sie hat folgende Signatur:*

```
/**
 * Return the number of characters in this string.
 */
public int length()
```

*Fügen Sie bedingte Anweisungen in den Konstruktor von "Student"  ein, die eine Fehlermeldung ausgeben,
wenn der Parameter "vollerName" weniger als vier Zeichen hat oder wenn "matrNr" weniger als 3 Zeichen hat.
In jedem Fall soll der Konstrukor die übergebenen Werte benutzen, um die Datenfelder zu initialisieren, auch wenn eine Fehlermeldung ausgegeben wird. 
Hinweis:
Benutzen sie eine if-Anweisung der folgenden Form (also ohne einen else-Teil), um die
Fehlermeldung auszugeben:*

```
if (führe eine Prüfung an einem der Parameter aus) {
   Fehlermeldung ausgeben, wenn die Prüfung true geliefert hat
}
```

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

soo das also zur aufgabe.
Ich hab lange versucht sie zu lösen aber bin auf kein ergebnis gekommen.
Ich versteh auch nicht wie ich eine bedingte Anweisung in ein Konstruktor einfügen kann,
da kommt immer ein Fehler wenn ichs versuche...

wär nett wenn mir mal einer helfen könnte [da muss man ja eigentlich nicht viel machen ]
also wenn einer weiss wie die bedingte anweisung aussehen soll dann antwortet mir pls !! 

cya ZenToR


----------



## Tobias (31. Mrz 2004)

Ich mags zwar nicht, wenn ich hier die Hausaufgaben von anderen machen soll, aberweils ja mitten in der Nacht ist...


```
public Student(String vollerName, String matrNr) {
    if(vollerName.length() < 4) {
        System.out.println("Name zu kurz!");
    }
    if(matrNr.length() < 3) {
        System.out.println("Matrikel-Nummer ungültig!");
    }

    this.vollerName = vollerName;
    this.matrNr = matrNr;
}
```

mpG
Tobias


----------



## ZenToR (1. Apr 2004)

thx für die antwort!

(würde nur noch gern wissen was der befehl _this_ macht??  den braucht man doch gar nicht oder???)

also cya  :wink:


----------



## P3AC3MAK3R (1. Apr 2004)

"this" ist kein Befehl sondern eine Referenz auf das aktuelle Objekt einer Klasse.


----------



## citizen_erased (1. Apr 2004)

ZenToR hat gesagt.:
			
		

> thx für die antwort!
> 
> (würde nur noch gern wissen was der befehl _this_ macht??  den braucht man doch gar nicht oder???)
> 
> also cya  :wink:



dem konstrukur wird eine variable mit dem namen matrNr übergeben. diese ist sichtbar/ gültig im konstruktor. die klasse hat allerdings auch eine variable matrNr. diese ist sichtbar/ gültig in der ganzen klassen, solange sie nicht in einem kleineren "sichtbarkeitsbereich/scope" überdeckt wird. im konstruktor ist das der fall. mit "this" kannst du darauf aufmerksam machen, dass der wert der übergebenen variable dafür benutzt wird, um damit die klassen-weiten variable zu dingsbumsen


----------



## Guest (1. Apr 2004)

jetzt wo ich es so nachvollziehen kann kommt mir die aufgabe sehr leicht vor   

aber ich brauche ja eigentlich nicht kein "this". Das geht auch ohne diesen befehl !


----------



## citizen_erased (1. Apr 2004)

man sollte es so machen, sieht besser aus.

man muss es machen, wenn der name der variablen auch dem namen der instanzvariable entspricht.
für den fall, dass es so ist:



```
matrNr = matrNr // hat keine auswirkung auf instanzvariable. 

this.matrNr = matrNr // instanzvariable wird mit wert des parameters matrNr belegt
```


----------



## ZenToR (1. Apr 2004)

aber es klappt einfach nicht mit _this_ ?!

da kommt so eine fehlermeldung: "cannot resolve symbol"

aber jetzt habe ich noch ne andere aufgabe die ich versucht habe alleine zu schreiben,
aber leider will das irgendwie nicht funktionieren.
also hier die Aufgabe(bezieht sich auf den Quelltext oben)

*Verändern Sie die Methode gibLoginName in der Klasse Student so, dass sie
immer einen Login-Namen zurückliefert, auch wenn name oder martikelnummer nicht ausreichend
lang sind. Für Zeichenketten, die kürzer sind, soll einfach die gesamte Zeichenkette genommen werden.*

Zu dieser Aufgabe habe ich mir folgendes überlegt:


```
public String gibLoginName()
    {
        if (name.length() < 4, martikelnummer.length() < 3) {
        name.substring + martikelnummer.substring;
        }
        return name.substring(0,4) + matrikelnummer.substring(0,3);
```



also ich habe einfach eine bedingte anweisung eingefügt, die (falls name oder martikelnummer zu kurz sind)
einfach den gesamten namen und die gesamte martikelnummer als LoginNamen ausgeben soll...
funktioniert aber nicht. 
 ???:L helft mir  :autsch:


----------



## citizen_erased (1. Apr 2004)

das kannst du sicher selber. schau nochmal auf den code


```
public String gibLoginName()
    {
        if (name.length() < 4, martikelnummer.length() < 3) { // für oder statt dem "," mal ein "||" nehmen
        name.substring + martikelnummer.substring; // A
        }
        return name.substring(0,4) + matrikelnummer.substring(0,3); // B
```

was passiert bei B? soll das hier passieren? wird ein wert zurückgegeben?
was passiert bei A? soll das hier passieren?


----------



## Guest (1. Apr 2004)

hmm also vieleicht so??? 


```
public String gibLoginName()
    {
       if (name.length() < 4 || martikelnummer.length() < 3) { 
         return name.substring() + matrikelnummer.substring();
        } 
        else {
        return name.substring(0,4) + matrikelnummer.substring(0,3);
        }
    }
```


Bluej kann das aber nicht übersetzen da kommt ein fehler, aber ich denke so ähnlich muss das schon stimmen !
(hoffe  ich )[/quote]


----------



## bygones (1. Apr 2004)

die methode substring verlangt mind. 1 parameter !!

aber wenn der String zu kurz ist heißt es doch,es soll alles zurückgegeben werden, also brauchst du kein substring !


----------



## ZenToR (1. Apr 2004)

hmm also ich verstehe das so:


```
public String gibLoginName()
    {
       if (name.length() < 4 || martikelnummer.length() < 3) { 
         return name + matrikelnummer;
        } 
        else {
        return name.substring(0,4) + matrikelnummer.substring(0,3);
    }
    }
```

ein fehler kommt aber trotzdem und zwar bei der bedingten anweisung
if (name.....


----------



## bygones (1. Apr 2004)

Eine kleine Bitte:
Java ist sehr hilfreich mit der Information über den Fehler. Bitte schreibe das nächste Mal was für ein Fehler kommt (NullPointerException oder so). Einfach so "n Fehler" hilft nicht weiter.....

so ins Blaue sach ich mal n NullPointerException, d.h. deine Instanzvariablen wurden nicht initialisiert ! Wie schaut denn nun eigentlich dein Konstruktor aus ?!


----------



## ZenToR (1. Apr 2004)

sorry  :roll: 


das ist die fehlermeldung:
cannot resolve symbol

bluJ meint damit diese Zeile:



```
if (name.length() < 4 || martikelnummer.length() < 3) {
```


----------



## bygones (1. Apr 2004)

Dann scheinst du keine INstanzvariablen namen bzw. matrikelnummer zu haben !!
Post mal deine Klasse so wie sie jetzt ist !


----------



## P3AC3MAK3R (1. Apr 2004)

Gucke ich jetzt falsch oder liegt bei der 2. Variablen ein Buchstabendreher (ma*rt*ikelnummer <=> ma*tr*ikelnummer) vor?


----------



## ZenToR (1. Apr 2004)

lol das wars !!! sorry hatte nen rechtschreibfehler 
muss _matrikelnummer_ heissen und nicht _martikelnummer_ ;D

cool hab die aufgabe danke eurer hilfe "fast" alleine geschaft thx for help !!   :wink:  :toll:


----------



## bygones (1. Apr 2004)

seht ihr genau deshalb will ich ne IDE mit Autovervollständigen !!!  :roll:  :toll:


----------



## P3AC3MAK3R (1. Apr 2004)

Dann hat mein Querlesen also was gebracht. 

Ich hätte noch einen Tip für Dich,  Zentor.

Um deine Instanzvariablen auszulesen bzw. zu ändern, würde ich get- und set-Methoden verwenden.

Beispiel:


```
private String name;

public String getName() { 
    return name; 
}

public void setName(String newName) { 
    name = newName; 
}
```

Wenn Du das tust, können andere Programmierer Deinen Code viel schneller lesen.


----------



## bygones (1. Apr 2004)

P3AC3MAK3R hat gesagt.:
			
		

> Um deine Instanzvariablen auszulesen bzw. zu ändern, würde ich get- und set-Methoden verwenden.


Nicht nur das -  es gehört eigentlich zum Coding Standart alle Instanzvariablen private zu machen !!!


----------



## P3AC3MAK3R (1. Apr 2004)

Das hat er doch getan.


----------



## ZenToR (1. Apr 2004)

jo  :lol:


----------

