erstes kleines Programm

Thomas1981

Mitglied
Hallo liebes Forum !

Ich quäle mich nun schon 2 Tage mit meinem Programm herum 🙂

Bin in Java totaler Anfänger. Hab vom Buch Java ist eine Insel bereits ca. 300 Seiten studiert.
Jetzt versuch ich mich nebenbei um ein paar Praxisbeispiele in Eclipse.

Jetzt hab ich ein kleines Programm geschrieben, welche mir das Geburtsjahr ausrechnen soll.
Zuerst kommt eine Abfrage in der Console die besagt, dass man sein Alter in Jahren eingeben soll. Dann übergebe ich den eingegebenen Wert in eine Methode namens "möglicheFalscheingabe", welche prüfen soll ob die Eingabe <= 0 ist oder >120 ist. Denn diese Werte dürfen ja nicht sein. Mann kann nicht jünger als 1 Jahr sein oder eben nicht älter als 120 Jahre sein. Zumindestens nehmen wir das mal an. Wenn nun jemand z.B.: -2 eingibt, dann soll eine Meldung kommen, dass man nicht jünger als 1 Jahr sein kann. Wenn jemand z.B.: 121 eingibt, kommt eine Meldung dass man nicht älter als 120 Jahre sein kann.

Soweit funktioniert das auch nur wenn diese beiden if Anweisungen abgearbeitet sind und diese Zutreffen, dann soll das Programm wieder um eine erneute Eingabe fragen.

Das bekomm ich nicht hin. Kann mir da bitte jemand weiterhelfen welchen Befehl ich da brauch ? Google und das Buch bringen mich schon zum Verzweifeln 🙂

Danke ! Danke ! Danke !
Lg Tom

hier der Programmcode welchen ich bis jetzt erstellt habe:
Java:
import java.util.Scanner;

public class geburtsjahrAusrechnen {

    public static void main(String[] args) {
        eingabe();
       
    }

    public static void eingabe(){
        Scanner s = new Scanner(System.in);
        System.out.print("Gib bitte dein Alter in Jahren ein: ");
        int alter = s.nextInt();
        möglicheFalscheingabe(alter);
       
        int erg = (2015-alter);
        System.out.println("Dein Geburtsjahr ist: " + erg);
       
    }
   
    public static void möglicheFalscheingabe(int alter){
        int c = alter;
       
            if (c<=0)
            {           
                System.out.println("Du kannst nicht jünger als 1 Jahr sein!! ");
            }
            if (c>120)
            {
                System.out.println("Du kannst nicht älter als 120 Jahr sein!! ");   
            }
           
    }
           
}
 
Soweit ich es richtig verstanden habe hier die Lösung:


Java:
    import java.util.Scanner;
   
   
public class geburtstagsscanner {

        public static void main(String[] args) {
            eingabe();
          
        }

        public static void eingabe(){
            Scanner s = new Scanner(System.in);
            System.out.print("Gib bitte dein Alter in Jahren ein: ");
            int alter = s.nextInt();
            möglicheFalscheingabe(alter);
          
            int erg = (2015-alter);
            System.out.println("Dein Geburtsjahr ist: " + erg);
           
            System.out.println("Das ist die nächste Abfrage: ");
            int wert = s.nextInt();
          
        }
      
        public static void möglicheFalscheingabe(int alter){
            int c = alter;
          
                if (c<=0)
                {         
                    System.out.println("Du kannst nicht jünger als 1 Jahr sein!! ");
                    System.exit(0);
                }
                if (c>120)
                {
                    System.out.println("Du kannst nicht älter als 120 Jahr sein!! "); 
                    System.exit(0);
                }
              
        }
              
   
}
 
Ist auch oft bei mir so =)
Wenn man ein Befehl nicht kennt/weiß das er existiert,
kann man auch nicht drauf kommen.

LG

Sin

PS was du in den If-Abfragen noch machen kannst:
Das Alter muss du nicht extra in einer Variablen speichern.
Du kannst auch gleich sagen:

if(alter<=0)

so spart man sich variabeln und wenn die Programme größer werden
auch Rechenleistung.
 
Soweit funktioniert das auch nur wenn diese beiden if Anweisungen abgearbeitet sind und diese Zutreffen, dann soll das Programm wieder um eine erneute Eingabe fragen.

Soweit ich deine Fehlerbeschreibung verstanden habe willst du bei der Eingabe eines falschen Alters den User erneut um die Eingabe eines Alters bitten?
Oder willst du wirklich das Programm beenden?

Soweit ich es richtig verstanden habe hier die Lösung:
Java:
System.exit(0);

Mit diesem Befehl von Sin137, beendest du einfach dein Programm fragst aber nicht erneut nach dem Alter. Habe ich deine Fehlerbeschreibung einfach falsch verstanden?


Anmerkung zum Code:
Klassennamen werden in UpperCamelCase geschrieben
Vermeide Umlaute -> egal ob bei Klassen-, Methodennamen oder Attributen.
In der Methode "möglicheFalscheingabe" könntest du die beiden if-Bedingungen zu einem if-elseif verbinden. Grund: wenn das Alter < 1 ist dann kann es sowieso nie > 120 sein. Daher wird die 2.if-Abfrage unnötiger Weise ausgeführt.
 
Soweit funktioniert das auch nur wenn diese beiden if Anweisungen abgearbeitet sind und diese Zutreffen, dann soll das Programm wieder um eine erneute Eingabe fragen.

darin steht wenn die if-Anweisungen abgearbeitet sind und diese Zutreffen.
Daher der Befehl System.exit(0);
So beendet er wie du schon gesagt hast das Programm wie er auch will.

Die if-Abfragen würde ich so lassen, in dem Fall, dass er sein Programm erweitern will und auf grund dessen mehr Abfragen bennötigt, wird es schnell unübersichtlich.
Bei einer aufgeteilten If-Abfrage kann man im nachhinein besser erkennen was die Abfrage genau macht.
Bei einem einfache else muss man sich erst in den Codeteil reinarbeiten.
 
Hallo Joose,

ja du hast recht mit dem System.exit(0); beende ich das Programm.
Diesen Befehl hab ich vorerst einmal gesucht 🙂 und auch nicht gekannt (Erfolgserlebnis pur 🙂 )

eine erneute Abfrage ruf ich ja dann mit

Java:
 System.out.println("Das ist die nächste Abfrage: ");
            int wert = s.nextInt();

auf. Dann kann ich entscheiden was ich weiterhin machen will.

Wie würde das Programm aussehen, wenn er bei einer Eingabe von z.B.: -2 eine Fehlermeldung ( z.B.: du kannst ja nicht jünger als 1 Jahr sein) aufruft. Dann einfach alle Zeilen löscht und wieder eine neue Abfrage startet , also nicht das Programm beendet ?

Java ist echt interessant.. Im Moment raucht mir der Kopf 🙂

Danke für die Info wegen Umlauten und einer if-else if Methode. Werde ich als nächstes versuchen.

Danke !!
Lg Tom
 
Das ist zwar noch nicht OO aber ich habe mal das Programm in deinem Stiel geschrieben, dammit du nicht durcheinander kommst =).

Hier die Lösung falls du solang das Alter abfragen willlst, bis eine anständige Aussage kommt.

Java:
    import java.util.Scanner;
   
   
public class Geburtstagsscanner {
   
        static Scanner s;
        static int alter;
        static int erg;

        public static void main(String[] args) {
  
            s = new Scanner(System.in);
            abfrageGeburtsjahr();
            erg = (2015-alter);
            System.out.println("Dein Geburtsjahr ist: " + erg);
        }

        public static void abfrageGeburtsjahr(){
               System.out.print("Gib bitte dein Alter in Jahren ein: ");
                int alter = s.nextInt();
                möglicheFalscheingabe(alter);
        }
       
        public static void nächsteAbfrage(){
            System.out.println("Das ist die nächste Abfrage: ");
            int wert = s.nextInt();
        }
      
        public static void möglicheFalscheingabe(int alter){
            int c = alter;
          
                if (c<=0)
                {         
                    System.out.println("Du kannst nicht jünger als 1 Jahr sein!! ");
                    abfrageGeburtsjahr();
                }
                if (c>120)
                {
                    System.out.println("Du kannst nicht älter als 120 Jahr sein!! "); 
                    abfrageGeburtsjahr();
                }
              
        }
              
   
}
 
ja du hast recht mit dem System.exit(0); beende ich das Programm.
Diesen Befehl hab ich vorerst einmal gesucht 🙂 und auch nicht gekannt (Erfolgserlebnis pur 🙂 )

eine erneute Abfrage ruf ich ja dann mit

Java:
 System.out.println("Das ist die nächste Abfrage: ");
            int wert = s.nextInt();

Gut dann habe ich dich falsch verstanden.
Dachte du wolltest bei einer Falsch Eingabe vom Alter, eben das Alter nochmal abfragen (-> erneute Abfrage).
Dein Code wäre ja die nächste Abfrage 😉

Wie würde das Programm aussehen, wenn er bei einer Eingabe von z.B.: -2 eine Fehlermeldung ( z.B.: du kannst ja nicht jünger als 1 Jahr sein) aufruft. Dann einfach alle Zeilen löscht und wieder eine neue Abfrage startet , also nicht das Programm beendet ?

Sin137 hat dir gerade eine Möglichkeit gezeigt. Wobei es keine saubere Lösung ist.
Einerseits kann ich das Programm nie beenden (z.B.: wenn der User "ende" eingibt wäre es schön wenn es sich beendet und nicht ewig nach dem alter fragt).
Wenn du bei diesem Program theoretisch sehr sehr (sehr, sehr, ....) oft eine Falscheingabe machst fliegt dein Programm mit einer StackOverflowException 😉
Aber das sind alles Sachen auf die wirst du früher oder später selber noch stoßen.

Ein alternative Möglichkeit wäre mit Hilfe von Schleifen.
 
Da hast du recht, dass es keine saubere Lösung ist.
Ich habe auch lediglich sein Code geändert. Ich hätte wie schon erwähnt mit Objekten gearbeitet.

Die Funktion zum beenden ist nützlich da hsat du recht, wurde aber nicht gefragt.
Da er ja neu im Thema ist, wollte ich ihm nicht alles vorweg nehmen.

Bis er auf eine StackOverflowException via manueller eingabe stößt dürfte doch ein bisschen Zeit vergehen. 😀
 
Hier auch noch eine Variante.

Java:
import java.util.Scanner;

class Rechnen{
    public static int marker=1, alter;
   
             public static void main(String[] args){
                        eingabe();
           
         }
             public static void eingabe(){
                 Scanner s = new Scanner(System.in);
                                              
                 while (marker==1) {
                     System.out.print("Gib bitte dein Alter in Jahren ein: ");
                     alter = s.nextInt();
                     möglicheFalscheingabe(alter);
                }
                          
               
                 int erg = (2015-alter);
                 System.out.println("Dein Geburtsjahr ist: " + erg);
               
             }

            public static void möglicheFalscheingabe(int alter){
                 int c = alter;
                                
                     if (c<=0)
                     {          
                         System.out.println("Du kannst nicht jünger als 1 Jahr sein!! ");
                         return;
                                           }
                     if (c>120)
                     {
                         System.out.println("Du kannst nicht älter als 120 Jahr sein!! ");
                         return;
                                             }
                     marker=0;
                    return;
                   
             }    
            
}
 
So, wenn jetzt hier schon alle fertigen Code posten, wie wär's mit:
Java:
// ...
do {
  System.out.println("Gib bitte dein Alter in Jahren ein: ");
  alter = s.nextInt();
} while(alter < 1 || alter > 120);
// ...
Java:
// ...
do {
  System.out.println("Gib bitte dein Alter in Jahren ein: ");
  alter = s.nextInt();
} while(inputInvalid(alter));
// ...
public static boolean inputInvalid(int input) {
  if(input < 1 || input > 120) {return true;}
  return false;
}
// ...
Die zweite Version entspricht mehr oder weniger der ersten, allerdings ist die Abfrage, ob die Eingabe gültig ist, ausgelagert.

Mit freundlichen Grüßen
Xelsarion

EDIT: Natürlich kann die do-while-Schleife auch durch eine normale while-Schleife ersetzt werden, dann muss allerdings sichergestellt werden, dass alter initialisiert wurde. Zudem ist die do-while-Schleife normalerweise vorzuziehen, sofern der Code auf jeden Fall mindestens einmal ausgeführt werden soll, was hier der Fall ist. Die while-Schleife ist der Standard, wenn vor dem Schleifendurchlauf Bedingungen erfüllt sein müssen.
 
Zuletzt bearbeitet:
Oh, soviele verschiedene Möglichkeiten..
Da habt ihr mir ein bisschen einen Lernstoff aufgegeben 🙂

Ich werde das alles mal genau durchstudieren. Danke Leute für eure Hilfe!!

Beim "Geburtstagsscanner" von Sin137, kommt beim Ergebnis immer
"Dein Geburtsjahr ist: 2015" raus wenn ich es ablaufen lasse und ein Alter in der Konsole eingebe.
Muss erst durchschauen was es da hat.

Die Methode von dongle funktioniert schon mal, hab ich getestet.

Es gibt halt unterschiedliche Wege um zum Erfolg zu kommen.
Das macht richtig Spaß beim Programmieren.

@SiN: die oberen 3 static Befehle in der Klasse Geburtstagsscanner versteh ich noch nicht ganz.
Hoffentlich stolpere ich da in meinem Buch nochmal auf eine Lösung 🙂

Lg Tom
 
Achja ich seh es grad 😀 du musst die Berechnung in die Methode packen =) damit er auch immer schön neu rechnet ^^

also das:
erg = (2015-alter);
 
Ja, genau das wars!! THX jetzt funktioniert es.

Was mich noch interessieren würde, ab wann ist es sinnvoll Objektorientiert zu programmieren und welches Programm nutzt ihr dazu ? Ich hab da nur mal so aus Neugier reingeschaut, aber noch nicht mehr. Im Moment bin ich mit Eclipse schon am Rande eines Kopfplatzers 🙂 aber für die Zukunft unbedingt ein Muß !

Lg Tom 🙂
 
Also OOP ist eigentlich ein muss für Java. Das zeichnet es ja auch aus 😉
Gerade wenn du anfängst mit Grafischen-Oberflächen zu arbeiten, kommst du nicht mehr drum rum.

Eclipse ist sehr gut!
Das wurde auch am Anfang meines Studiums vorgeschlagen. Seidem nutze ich es.
 
Du brauchst grundsätzlich keine Entwicklungsumgebung, allerdings ist es meistens ganz praktisch. Allerdings hat Eclipse eine eigene Konsole, weshalb manche Sachen in Eclipse nicht so funktionieren, wie man es erwarten würde.

Mit freundlichen Grüßen
Xelsarion
 

Zurück
Oben