# Anzahl von Zahlen bei eingabe begrenzen



## DerMaschbaustudent (4. Nov 2016)

Guten Tag,

ich programmiere momentan einen Schaltjahrrechner. 
Die Berechnung des Schaltjahres ist schon geschrieben und funktioniert ohne Probleme.

Mein Problem ist, dass ich mein Programm dazubringen muss nur vierstellige Zahlen akzeptiert; 
also die Zahl 8 n. Chr. nur akzeptiert und weiterverarbeitet, wenn man die Zahl als 0008 eingibt.

Mein bisheriger Code sieht so aus:

package schaltjahrrechner;
import java.util.Scanner;
public class Schaltjahrrechner {
  public static void main(String[] args) {
  try{

Scanner keyboard=new Scanner(System.in);
int Jahr;
System.out.println("Geben Sie eine vierstellige Jahreszahl.");
System.out.println("Please enter a number of a year, the number has to have four digits.");
System.out.println("Bedingung: Die Zahl muss >= 0000 sein");
System.out.println("Condition: The number have to be >= 0000");
System.out.println("Bedingung: Die Zahl muss <= 2100 sein.");
System.out.println("Condition: The number has to be <=2100.");
Jahr=keyboard.nextInt();
if (Jahr<0) {System.out.println("Diese Zahl ist außerhalb des berechenbaren Zahlenraums.");
System.out.println("The number is not computable.");
}
else if (Jahr>=2101) {System.out.println("Diese Zahl ist außerhalb des berechenbaren Zahlenraums. ");
System.out.println("The number is not computalbe.");
}
else if (Jahr % 100 == 0) {System.out.print("Das Jahr " + Jahr + " ist kein ein Schaltjahr");
System.out.println("The year " + Jahr + " is not a leap-year.");
}
else if ((Jahr % 400 == 0)) {System.out.print("Das Jahr " + Jahr + " ist ein Schaltjahr");
System.out.println("The year " + Jahr+ " is a leap-year.");
}
else if (Jahr % 4==0) {System.out.print("Das Jahr " + Jahr + " ist ein Schaltjahr");
System.out.println("The year "+Jahr+ "is a leap-year.");
}
else {System.out.println("Das Jahr " + Jahr + " ist kein Schaltjahr");
System.out.println("The year" +Jahr+ "is not a leap-year.");
}
keyboard.close();
}catch (Exception e) {System.out.println("Bitte geben Sie eine Zahl ein, wie oben beschrieben");
System.out.println("Please enter a number with the conditions above.");
}}

}
Wie kann ich mein Code bearbeiten um eine Begrenzung der Zahlenanzahl auf nur 4 Ziffern zu erreichen. Alo dass mein Programm nur Zahlen akzeptiert, welche 4 Ziffernhat und sonst eine Fehlermeldung ausspuckt.

Vielen Dank und schönen Abend noch,
Der Maschbaustudent


----------



## tommysenf (4. Nov 2016)

if(String.valueOf(Jahr).length() == 4) ...


----------



## DerMaschbaustudent (4. Nov 2016)

Muss ich dafür ein java import.util.String haben?

Wenn ich die 
If String Schleife habe muss ich dann die restlichen Vedingungen als else if Schleife Schreiben?

Kann ich dann einfach ans ende ein
else
{System.out.println ("Bitte geben sie eine vierstellige Zahl ein");}

anhängen um meine Schleife kontrolliert abzubrechen bei falscheingabe?


----------



## JStein52 (4. Nov 2016)

DerMaschbaustudent hat gesagt.:


> um meine Schleife kontrolliert abzubrechen bei falscheingabe?


In deinem Code ist weit und breit keine Schleife. Welche willst du denn kontrolliert abbrechen ?


----------



## DerMaschbaustudent (4. Nov 2016)

Ich meinte meine if Bedingung.

Wie kann ich die String aktivieren?
Und wie kann ichdas Abbrechen als "else" programmieren, sobald die Bedingungen (weniger/mehr als 4 Ziffern) nicht erfüllt wird?


----------



## JStein52 (4. Nov 2016)

Mir ist noch nicht ganz klar was du willst aber einfach so wie es oben schon mal stand:


```
if(String.valueOf(Jahr).length() != 4) {
   System.out.println("Sie muessen eine vierstellige Zahl eingeben");
   // und dann geht es hier irgendwie weiter
}
else {
   // es war alles in Ordnung, jetzt geht es hier weiter
}
```

Und was heisst wie kann ich String aktivieren ? Schreibe es mal in deinem Code einfach an der gewünschten Stelle so hin. Du musst da nix aktivieren


----------



## DerMaschbaustudent (4. Nov 2016)

Im Endeffekt möchte ich das mein Programm nur die Berechnung ausführt, wenn ich vier Stellen eingeben. Also sofort abbricht wenn ich weniger oder mehr als 4 Ziffern eingebe.


----------



## DerMaschbaustudent (5. Nov 2016)

Also sozusagen eine verschaltelte if-clause

Berechnung nur wenn Bedingung 1 (Anzahl der Ziffern) und Bedingung 2 (ob Schaltjahr oder nicht) erfüllt sind dann Ausgabe (....ist/ist kein Schaltjahr)

Sobald Bedingung 1 oder 2 nicht erfüllt sind möchte ich einen Abbruch:
"Diese Zahl kann nicht berechnet werden...."


----------



## JStein52 (5. Nov 2016)

DerMaschbaustudent hat gesagt.:


> eine Begrenzung der Zahlenanzahl auf nur 4 Ziffern zu erreichen


Doofe Frage: warum willst du das denn ?


----------



## DerMaschbaustudent (5. Nov 2016)

Weil es von der Aufgabe so vorgegeben ist....
Sonst würde ich nicht um Mitternacht noch an Informatik sitzen


----------



## JStein52 (5. Nov 2016)

"Jahr" ist ja vom Typ int und du liest sie via Scanner und nextInt() ein. Und dann rechnest du damit weiter. Und ich behaupte mal wenn du dort 0008 eingibst ist das Ergebnis das gleiche als wenn du 8 eingibst.
Gib dir doch "Jahr" einfach mal nach dem einlesen wieder aus.


----------



## DerMaschbaustudent (5. Nov 2016)

Neues Problem bei deinem Code:

Der Radiert einfach die Nullen weg; d.h. jede Zahl unter 1000 führt automatisch zu einem Abbruch.


----------



## JStein52 (5. Nov 2016)

Oder willst du dass die Zahl zwischen 1000 und 9999 liegt ?


----------



## JStein52 (5. Nov 2016)

DerMaschbaustudent hat gesagt.:


> Der Radiert einfach die Nullen weg; d.h. jede Zahl unter 1000 führt automatisch zu einem Abbruch


Sag ich doch !


----------



## DerMaschbaustudent (5. Nov 2016)

Wie kann man das beheben?

Die Zahlen die eingebbar (schlimmes Wort) sein müssen gehen von 0000 bis 2100.


----------



## JStein52 (5. Nov 2016)

Wie lautet die Aufgabe denn genau ?


----------



## DerMaschbaustudent (5. Nov 2016)

"Entwerfen sie einen Schaltjahrrechner welcher die Schaltjahre von 0000 bis 2100 ausgibt.
Bedingungen:
Das Programm muss abbrechen, wenn die eingegebene Zahl keine 4 Stellen hat."


----------



## JStein52 (5. Nov 2016)

Ich halte diese Bedingung zwar für absoluten Schwachsinn aber wenn es sein muss:


```
Scanner keyboard=new Scanner(System.in);
int Jahr;
System.out.println("Geben Sie eine vierstellige Jahreszahl.");
System.out.println("Please enter a number of a year, the number has to have four digits.");
System.out.println("Bedingung: Die Zahl muss >= 0000 sein");
System.out.println("Condition: The number have to be >= 0000");
System.out.println("Bedingung: Die Zahl muss <= 2100 sein.");
System.out.println("Condition: The number has to be <=2100.");
String line = keyboard.nextLine();
if (line.length() < 4) {
   // Fehler ausgeben und return
}
else {
  Jahr=line.parseInt();
}
```


----------



## JStein52 (5. Nov 2016)

JStein52 hat gesagt.:


> Ich halte diese Bedingung zwar für absoluten Schwachsinn


Jahresangaben macht man ja sonst auch nicht mit führenden Nullen. Kein Mensch sagt im Jahr 0155 n.Chr. wurde Karthago erobert oder im Jahr 0999 wurde Karl der Grosse zum Kaiser gekrönt.


----------



## DerMaschbaustudent (5. Nov 2016)

Funktioniert damit nicht.

Dem Scanner fehlt durch das "String line=...." die eigentliche Variable Jahr, die er eigentlich als eingabe annehmen soll.
Auch meint Netbeans, dass die else-Anweisung "Jahr=line.parseInt ();" nicht als Symbol oder Methode gefunden werden kann.


----------



## Meniskusschaden (5. Nov 2016)

JStein52 hat gesagt.:


> Ich halte diese Bedingung zwar für absoluten Schwachsinn aber wenn es sein muss:


Es ist sowieso Schwachsinn, mit den hier benutzten Regeln so alte Schaltjahre zu ermitteln. Das funktioniert so doch frühestens seit der Umstellung auf den gregorianischen Kalender im 16. Jahrhundert und da war es ja ohnehin schon vierstellig.


----------



## Meniskusschaden (5. Nov 2016)

DerMaschbaustudent hat gesagt.:


> Auch meint Netbeans, dass die else-Anweisung "Jahr=line.parseInt ();" nicht als Symbol oder Methode gefunden werden kann.


Wahrscheinlich hat er `Jahr = Integer.parseInt(line);`gemeint.


----------



## DerMaschbaustudent (5. Nov 2016)

@Meniskusschaden 
Danke sehr. War richtig.

Wie kann ich bei  "if (line.length () <4)....." mein Variable "Jahr" initialisieren?


----------



## Meniskusschaden (5. Nov 2016)

DerMaschbaustudent hat gesagt.:


> Wie kann ich bei "if (line.length () <4)....." mein Variable "Jahr" initialisieren?


Ich verstehe nicht, warum du das machen möchtest, denn in dem Zweig der Bedingung benötigst du die Variable doch eigentlich nicht. Du kannst ihr einfach mit `Jahr = GewünschterWert;` den gewünschten Wert zuweisen.


----------



## DerMaschbaustudent (5. Nov 2016)

Aber ich habe ja oben meine Variabel Jahr. 
Ich möchte ja meinen gewünschten Wert erst über den Scanner eingeben.


----------



## Meniskusschaden (5. Nov 2016)

Der wurde doch schon in die Variable line eingelesen und im else-Zweig der Variablen Jahr zugewiesen.


----------



## DerMaschbaustudent (5. Nov 2016)

Hab meinen Fehler gefunden.

Ich habe alle Variablen von Jahr zu Line geändert.
Z. Bsp. Von
( " Das Jahr" +Jahr+ "ist ein Schaltjahr.")
Zu
("Das Jahr" +line+ "ist ein Schaltjahr")


----------



## DerMaschbaustudent (5. Nov 2016)

Danke an alle für die schnelle und super kompetente Hilfe.

Zum Schluss:
@JStein52: zum Thema warum die Nullen davor bleiben müssen, sag ich nur: Wat mut, dat mut. Besser ich kann es jetzt merke es mir und kann es dann in der nächsten Klausur und auch danach weiterhin anwenden.


----------



## JStein52 (5. Nov 2016)

DerMaschbaustudent hat gesagt.:


> Ich habe alle Variablen von Jahr zu Line geändert.


Alle ?  Und wie rechnest du dann ? Deine Modulo-Operation ?


----------



## Meniskusschaden (5. Nov 2016)

JStein52 hat gesagt.:


> DerMaschbaustudent hat gesagt.:
> 
> 
> > Ich habe alle Variablen von Jahr zu Line geändert.
> ...


Ich glaube er wollte damit sagen, dass das undifferenzierte Ändern zu line sein Fehler war und nicht die Lösung.


----------



## DerMaschbaustudent (7. Nov 2016)

Ich habe  nur die System.out.print mit line vergeben.

Die if Bedingung(Jahr....) bleibt witerhin gleich.

Nur hat sich en neues Problem aufgetan.
Trotz der If-bedingung der line.length gibt er auch alles aus, wenn es weniger als vier Ziffern hat.

Den Code stelle ich rein.


----------



## DerMaschbaustudent (7. Nov 2016)

mein Modulo habe ich verwirklicht durch z. Bsp. if(Jahr%4!=0)........

Das ist mein jetziger Code. Wo liegt mein Fehler? trotz der line.length nimmt das Programm auch eingaben, welche merh oder weniger als 4 Ziffern haben.

```
package schaltjahrrechner;
import java.util.Scanner;
public class Schaltjahrrechner {
 public static void main(String[] args) {
  Scanner keyboard = new Scanner(System.in);
  int Jahr;
  System.out.println("Geben Sie eine vierstellige Jahreszahl.");
  System.out.println("Please enter a number of a year, the number has to have four digits.");
  System.out.println("Bedingung: Die Zahl muss >= 0000 sein");
  System.out.println("Condition: The number have to be >= 0000");
  System.out.println("Bedingung: Die Zahl muss <= 2100 sein.");
  System.out.println("Condition: The number has to be <=2100.");
  String line = keyboard.nextLine();
  if ((line.length() < 4) || (line.length() > 4)) {
   System.out.print("Das Jahr " + line + " kann nicht berechnet werden. Sie müssen vier Ziffern eingeben.");
   System.out.println("The year " + line + " is not computable. The number has to have four digits.");
  } else {
   Jahr = Integer.parseInt(line);
   if (Jahr == 0000) {
    System.out.println("Das Jahr 0000 ist ein Schaltjahr");
    System.out.println("The year 0000 is a leap-year.");
   } else if (Jahr < 0) {
    System.out.println("Diese Zahl ist außerhalb des berechenbaren Zahlenraums.");
    System.out.println("The number is not computable.");
   } else if (Jahr >= 2101) {
    System.out.println("Diese Zahl ist außerhalb des berechenbaren Zahlenraums. ");
    System.out.println("The number is not computalbe.");
   } else if (Jahr % 100 == 0) {
    System.out.println("Das Jahr " + line + " ist kein  Schaltjahr");
    System.out.println("The year " + line + " is not a leap-year.");
   } else if ((Jahr % 400 == 0)) {
    System.out.println("Das Jahr " + line + " ist ein Schaltjahr");
    System.out.println("The year " + line + " is a leap-year.");
   } else if (Jahr % 4 == 0) {
    System.out.println("Das Jahr " + line + " ist ein Schaltjahr");
    System.out.println("The year " + line + " is a leap-year.");
   } else if ((Jahr % 4 != 0) && (Jahr % 400 != 0)) {
    System.out.println("Das Jahr " + line + " ist kein Schaltjahr");
    System.out.println("The year " + line + " is not a leap-year.");
   }
  }
 }
}
```


----------



## Flown (7. Nov 2016)

Bitte deinen Code nächstes mal in Code-Tags setzen: [code=java]//JAVA CODE HERE[/code]


----------



## Meniskusschaden (7. Nov 2016)

DerMaschbaustudent hat gesagt.:


> Das ist mein jetziger Code. Wo liegt mein Fehler? trotz der line.length nimmt das Programm auch eingaben, welche merh oder weniger als 4 Ziffern haben.


Kann ich nicht reproduzieren. Beispiel:

```
Geben Sie eine vierstellige Jahreszahl.
Please enter a number of a year, the number has to have four digits.
Bedingung: Die Zahl muss >= 0000 sein
Condition: The number have to be >= 0000
Bedingung: Die Zahl muss <= 2100 sein.
Condition: The number has to be <=2100.
150
Das Jahr 150 kann nicht berechnet werden. Sie müssen vier Ziffern eingeben.The year 150 is not computable. The number has to have four digits.
```


----------



## DerMaschbaustudent (7. Nov 2016)

@Flown 
Mache ich natürlich. Danke dass Sie Ihn umgesetzt haben.


----------



## JStein52 (7. Nov 2016)

Bei mir funktioniert dein Programm

run:
Geben Sie eine vierstellige Jahreszahl.
Please enter a number of a year, the number has to have four digits.
Bedingung: Die Zahl muss >= 0000 sein
Condition: The number have to be >= 0000
Bedingung: Die Zahl muss <= 2100 sein.
Condition: The number has to be <=2100.
12345
Das Jahr 12345 kann nicht berechnet werden. Sie müssen vier Ziffern eingeben.The year 12345 is not computable. The number has to have four digits.

Edit: ein bisschen zu spät


----------



## DerMaschbaustudent (7. Nov 2016)

Hatte die if Bedingung der line.length erst als 2 IF Bedingungen stehen. Dadurch hat er nur für die eine If Bedingung die dazugehörige Else-Bedingung ausgeführt.

Jetzt habe ich es aber geschrieben als:


```
if ((line.length <4) || line.length>4))
```


----------



## DerMaschbaustudent (7. Nov 2016)

An alle win riesiges Danke für die phänomenale Hilfe.
Danke für die guten Hilfestellungen und die hilfreichen Tipps.


----------

