# Zahlen einlesen



## Kitty (24. Nov 2011)

Hallo!

Ich habe ein Programm geschrieben, welches 10 beliebige Zahlen einliest und diese dann mit einem vorhandenen Array vergleichen soll! Weiterhin soll mir dann das Programm sagen, ob die Zahl im Array 1 ist und ob welche in der richtige Rangfolge stehn!

Jetzt komm ich leider nicht mehr weiter! Hoffe mir kann jemand helfen!



import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Aufgabe_3 {
public static void main(String[] args) {
 int [] numbers = {10, 20, 2, 4, 5, 2, 30, 12, 18, 35};

 int [] numbers2 = new int [10];
 BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
 int i = 0;
 while (i<numbers2.length){
     try{
         System.out.print("Geben Sie die " + (i + 1) + ". Nummer ein: ");

        String inputValue = in.readLine();
        int Value=Integer.parseInt(inputValue); 

        ++i;

     } catch (Exception e) {
     System.out.println("Eingabe ist keine Nummer!");
 } 
     i = 0;
     int j = 0;
     while (i<10){
         while(j<numbers.length){
if(numbers2_ == numbers[j]);
                 System.out.println("Die Nummer" + numbers2 + "existiert im ersten Array!");
             }
             if(numbers2 == numbers[j] && numbers2 == numbers){
                 System.out.println("Nummer: " + numbers2 + " sind auf gleicher Position");{
                 }
                 ++j;
             }
             j=0;
             ++i; 
 }
 }
}
}_


----------



## Xeonkryptos (24. Nov 2011)

Wie wäre es mal, wenn du beim Posten den roten Text über dem Eingabefeld liest und das auch ausführst? Das erleichtert für jeden die Hilfe!!! :rtfm:


----------



## Camill (24. Nov 2011)

```
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Aufgabe_3 {

	public static void main(String[] args) {

		int[] numbers = { 10, 20, 2, 4, 5, 2, 30, 12, 18, 35 };

		int[] numbers2 = new int[10];
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		int i = 0;
		while(i < numbers2.length) {
			
			try {
				System.out.print("Geben Sie die " + (i + 1) + ". Nummer ein: ");

				String inputValue = in.readLine();
				int Value = Integer.parseInt(inputValue);
				++i;
			} catch(Exception e) {
				System.out.println("Eingabe ist keine Nummer!");
			}
			
			i = 0;
			int j = 0;
			
			while(i < 10) {
				
				while(j < numbers.length) {
					if(numbers2[i] == numbers[j]);
					System.out.println("Die Nummer" + numbers2[i] + "existiert im ersten Array!");
				}
				if(numbers2[i] == numbers[j] && numbers2[i] == numbers[i]) {
					System.out.println("Nummer: " + numbers2[i] + " sind auf gleicher Position");
					{
					}
					++j;
				}
				j = 0;
				++i;
			}
		}
	}
}
```

Also was ich auf den ersten Blick schon mal sagen kann ist das du eine schöne Endlosschleife gebaut hast:
[JAVA=14]while(i < numbers2.length) {[/code]
[JAVA=26]i = 0;[/code]

Desweiteren liest du zwar eine Zahl ein, speicherst diese aber nicht in dem dafür vorgesehenen Array ab.


Wie genau lautet denn die Aufgabe?


Kitty hat gesagt.:


> Ich habe ein Programm geschrieben, welches 10 beliebige Zahlen einliest und diese dann mit einem vorhandenen Array vergleichen soll! Weiterhin soll mir dann das Programm sagen, ob die Zahl im Array 1 ist und ob welche in der richtige Rangfolge stehn!


Bei dem Rot Markierten verstehe ich nicht was genau du meinst.


----------



## Kitty (24. Nov 2011)

sorry


```
import java.io.BufferedReader;
import java.io.InputStreamReader;



public class Aufgabe_3 {
public static void main(String[] args) {
 int [] numbers = {10, 20, 2, 4, 5, 2, 30, 12, 18, 35};
 
 int [] numbers2 = new int [10];
 BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
 int i = 0;
 while (i<numbers2.length){
     try{
         System.out.print("Geben Sie die " + (i + 1) + ". Nummer ein: ");

        String inputValue = in.readLine();
        int Value=Integer.parseInt(inputValue); 
       
        ++i;
         
     } catch (Exception e) {
     System.out.println("Eingabe ist keine Nummer!");
 } 
     i = 0;
     int j = 0;
     while (i<10){
         while(j<numbers.length){
if(numbers2[i] == numbers[j]);
                 System.out.println("Die Nummer" + numbers2[i] + "existiert im ersten Array!");
             }
             if(numbers2[i] == numbers[j] && numbers2[i] == numbers[i]){
                 System.out.println("Nummer: " + numbers2[i] + " sind auf gleicher Position");{
                 }
                 ++j;
             }
             j=0;
             ++i; 
 }
 }
}
}
```


----------



## Xeonkryptos (24. Nov 2011)

Ich kann Camill nur zustimmen. Du hast in deinem Code 2 Endlosschleifen eingebaut. Entferne mal aus deinem Code:

```
i = 0;
j = 0;
```

Damit hast du schon einmal keine Endlosschleife. Wenn du jetzt die erste Stelle von den Arrays vergleichen willst, dann nutze lieber eine andere Variable und wenn du den Wert von i und/oder j brauchen solltest, empfehle ich dir zu einer weiteren lokalen Variable zu raten, aber auf keinen Fall die beiden Variablen i und j auf 0 zu setzen, da es sonst zu einer Endlosschleife kommt!


----------



## Xeonkryptos (24. Nov 2011)

Camill hat gesagt.:


> Wie genau lautet denn die Aufgabe?



Kitty meint damit, dass sie erstmal schauen will, ob die neu eingegebene Zahl, die noch abgespeichert werden müsste, schon im ersten Array numbers1 vorhanden ist und dann soll das Programm noch überprüfen, ob die Zahl auch noch an der selben Stelle/Index in beiden Arrays zu finden ist.


----------



## Kitty (24. Nov 2011)

Ok schon mal Dankeschön!

Das war die Aufgabenstellung!

Schreiben Sie ein Java-Programm, welches 10 ganze Zahlen vom Benutzer einliest und in einem Array speichert. Danach soll der Inhalt des Arrays mit dem Inhalt des nachfolgenden Arrays (numbers) verglichen werden. 
Dem Benutzer soll mitgeteilt werden wieviele Zahlen bereits im internen Array vorkommen und ob die Reihenfolge aller Zahlen dieselbe ist.


```
public static void main ( St ing [] args ) {
int [] numbers = {10 , 20 , 2 , 4 , 5 , 2 , 30 , 12 , 18 , 35};
...\\ Hier folgt Ihr Programm!
}
```


----------



## Xeonkryptos (24. Nov 2011)

```
import java.util.Scanner;

public class Aufgabe_3 {
	public static void main(String[] args) {
		int[] numbers = { 10, 20, 2, 4, 5, 2, 30, 12, 18, 35 };
		int[] numbers2 = new int[10];

		/*
		 * Ein Scanner reicht hier vollkommen aus und ermöglicht ein
		 * vereinfachtes Lesen von int-Werten
		 */
		Scanner in = new Scanner(System.in);
		/*
		 * Trennen der for-Schleifen, da erstmal das Array befüllt werden muss,
		 * um dann jede Stelle prüfen zu können!
		 */
		for (int i = 0; i < numbers2.length; i++) {
			try {
				System.out.print("Geben Sie die " + (i + 1) + ". Nummer ein: ");
				numbers2[i] = in.nextInt(); // Speichern in das Array.
			} catch (Exception e) {
				System.out.println("Eingabe ist keine Nummer!");
			}
		}

		/*
		 * Beide Schleifen zusammen ermöglichen das Prüfen jeder Stelle
		 * miteinander, denn zuerst wird die Variable i auf 0 gesetzt und dann
		 * der Inhalt aus dem Array von numbers2 an der Stelle i mit allen
		 * Werten des Arrays numbers verglichen und das solange bis i die
		 * Array-Größe erreicht hat
		 */
		for (int i = 0; i < numbers2.length; i++) {
			for (int j = 0; j < numbers.length; j++) {
				if (numbers2[i] == numbers[j]) {
					System.out.println("Die Nummer" + numbers2[i]
							+ "existiert im ersten Array!");
					if (numbers2[i] == numbers[i]) {
						System.out.println("Nummer: " + numbers2[i]
								+ " sind auf gleicher Position");
					}
				}
			}
		}
	}
}
```

Das sollte so funktionieren. Hab es nicht getestet. Hab es etwas dokumentiert und erklärt.


----------



## Kitty (24. Nov 2011)

super Dankeschön!
:toll:


----------



## Camill (24. Nov 2011)

Die erste for-Schleife ist so nicht ganz richtig, bei falschen Eingaben darf der Zähler nicht Inkrementiert werden.


----------



## Xeonkryptos (24. Nov 2011)

Mal davon abgesehen, dass ich das nicht bedacht habe  hier die Schleife, die auch das beachtet! 


```
for (int i = 0; i < numbers2.length; i++) {
			int zwischenSpeicher = i;
            try {
                System.out.print("Geben Sie die " + (i + 1) + ". Nummer ein: ");
                numbers2[i] = in.nextInt(); // Speichern in das Array.
            } catch (Exception e) {
                System.out.println("Eingabe ist keine Nummer!");
                i = zwischenSpeicher - 1;
                continue;
            }
        }
```


----------



## Camill (24. Nov 2011)

So wird i immernoch Inkrementiert, ein 
	
	
	
	





```
i--;
```
 im catch-Block genügt. Jedoch bleibt er dann in der for-Schleife hängen - bin noch am ausprobieren :bahnhof:


----------



## Xeonkryptos (24. Nov 2011)

Hab es nochmal geändert. Wenn ich ehrlich bin, reicht wirklich ein i--, aber eine Endlosschleife hast du dann auch nur, wenn du einfach keine Zahl sondern irgendetwas anderes eingibst oder zumindest etwas, wo eine Exception fliegt!


----------



## Camill (24. Nov 2011)

Ja - genau das meinte ich mit dem "hängen" bleiben. Verstehe gerade aber auch nicht weswegen das so ist..
Sollte der Scanner nicht erst auf eine neue Eingabe warten, habe damit noch nie gearbeitet?


----------



## Xeonkryptos (24. Nov 2011)

Es liegt wohl daran, dass wenn eine Exception fliegt, das Programm oft hängen bleibt. Was ich in meinem Code auch nicht gemacht habe, im Catch-Block am Ende noch ein continue hinzufügen, damit er die Schleife weiter fortführt. Nach der Exception ist halt Schluss.

Hängt man ein continue dran, macht das Programm problemlos weiter.


----------



## Camill (24. Nov 2011)

Also bei mir bleibt er immernoch hängen:

```
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!
Geben Sie die 1. Nummer ein: Eingabe ist keine Nummer!

[...]
```


Habe nun mal folgendes gemacht:
[JAVA=12]Scanner in = new Scanner(System.in);[/code]
ersetzt durch 
	
	
	
	





```
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
```
[JAVA=20]numbers2_ = in.nextInt(); // Speichern in das Array.[/code]
ersetzt durch 
	
	
	
	






		Java:In die Zwischenablage kopieren


numbers2[i] = Integer.parseInt(reader.readLine());


Funktioniert jetzt, liegt somit wohl wircklich am Scanner._


----------



## Xeonkryptos (24. Nov 2011)

Es liegt wohl am Scanner, dass er einfach nicht mehr auf etwas wartet, weil die Eingabe falsch war. Irgendwie hat der da ein Problem. Man kann es aber auch anderster lösen!


```
for (int i = 0; i < numbers2.length; i++) {
			int value = 0;
			try {
				System.out.print("Geben Sie die " + (i + 1) + ". Nummer ein: ");
				value = in.nextInt();
			} catch (InputMismatchException e) {
				System.out.println("Eingabe ist keine Nummer!");
				i--;
				in = new Scanner(System.in);
				continue;
			}
			numbers2[i] = value; // Speichern in das Array.
		}
```

So fängt man auch nicht irgendeine Exception ab, sondern die InputMismatchException, die auch bei einer fehlerhaften Eingabe fliegt und durch die neue Zuweisung eines neuen Objektes läuft das ohne Probleme.


----------



## Camill (24. Nov 2011)

So geht das natürlich auch, ob es jedoch sinnvoll ist jedesmal ein neues Object zu erstellen sei mal dahingestellt - eine andere Lösung für den Scanner wüsste ich auch nicht.


----------



## Xeonkryptos (24. Nov 2011)

Ob es sinnvoll ist, ist wirklich fraglich, aber man erstellt bestimmt nicht so viele Objekte so schnell, dass es zu einem StackOverflow kommen sollte. Wenn man das Programm verwendet, gehe ich nicht davon aus, dass man so oft so viel falsch schreibt. 

Außerdem spart man sich dann die Arbeit mit den direkten Streams.  Für einen Anfänger finde ich den Scanner besser zu bedienen, als die Streams, aber das ist wohl geschmackssache. =)


----------

