Duplikatvermeidung

Heike_89

Mitglied
Hallo! Ich habe folgende Aufgabe zu lösen:

Aufgabe 1: Duplikatvermeidung (8 Punkte)
Schreiben Sie ein Java-Programm, welches

-solange Werte einliest, bis eine negative Zahl eingegeben wird,

-diese (nicht-negativen) Werte dabei in ein Feld der Größe 20 speichert, falls diese noch nicht vorkommen,

-eine Fehlermeldung ausgibt (das Programm aber nicht beendet!), wenn versucht wird mehr als
20 verschiedene Werte einzugeben und

-am Ende die im Feld gespeicherten Zahlen (und nur diese) kommagetrennt hintereinander
ausgibt.

Es dürfen somit in dem Feld keine Duplikate gespeichert werden und es können (müssen aber nicht!)
bis zu 20 Werte abgespeichert werden. Gehen Sie davon aus, dass der Benutzer nur ganze Zahlen
eingibt (aber möglicherweise auch mehr als 20).

Habe jetzt schon einiges dazu programmiert und wollte zwischendurch mal testen, ob es bis dahin funktioniert. Ich bekomme aber immer die Fehlermeldung zu "System.out.println" -> unreachable statement.
Was bedeutet das und wie kann ich das Problem lösen? :bahnhof:

Das ist mein Programm bisher:

Java:
import java.util.Scanner;

class Duplikatvermeidung
{
	public static void main(String[] args)
	{
			Scanner input = new Scanner(System.in);
			int eingaben [] = new int [20];
			int i;
			
			for(i=0; i<=20; i++)
				{
				System.out.print("Nächste Eingabe bitte: ");
				int eingabe = input.nextInt();
				
				if(eingabe >= 0)
					{
					eingaben [i] = eingabe;
					}
				else
					{
					break;
					System.out.println("Die Eingabe wurde abgebrochen.");
					}
				}
			
			System.out.print(eingaben[i]+",");
				
	}
}

Danke schonmal!
 

HarleyDavidson

Bekanntes Mitglied
Die Sachen, die mir aufgefallen sind:

Java:
else
{
    break;
    System.out.println("Die Eingabe wurde abgebrochen.");
}

Klar kommt hier ein unreachable Statement - Fehler: Eine Zeile davor verlässt du die Schleife mit break. Wie sollte man jemals zu der Konsolenausgabe kommen?

Java:
System.out.print(eingaben[i]+",");

Hier wird immer "0," erscheinen, da die Variable i aus Zeile 9 eine andere ist als die Variable in der for-Schleife.

Um das komplette Array auszugeben, musst du über das Array iterieren und dann Wert für Wert ausgeben.

Noch hast du wohl keine Duplikate-Prüfung eingebaut oder?

Du bist aber auf dem richtigen Weg! :toll:
 

stg

Top Contributor
Die Zeile 23 wirst du aufgrund des breaks vorher nie erreichen. Da meckert der Compiler einfach, weil er das erkennt.

Deine for-Schleife ist mMn nicht im Sinne der Aufgabenstellung. Es soll auch möglich sein mehr als 20 Zahlen einzugeben, steht doch ganz klar im Aufgabentext!
Außerdem hat dein Array nur 20 Einträge, wenn du also versuchst auf eingaben[20] zuzugreifen fliegt dir einen ArrayIndexOutOfBoundException um die Ohren!

Bei der Ausgabe greifst du ganz am Ende nur auf einziges Element des Arrays zu, du willst aber doch alle ausgeben!

Ich würde außerdem das Array vorher z.B. überall mit -1 initialisieren. Sonst stehen dort überall 0en drin und du weißt anschließend nicht, ob die 0 eine Benutzereingabe war, die du mit ausgeben musst, oder dort die 0 steht, weil der Benutzer keine 20 Zahlen eingegeben hat. Bei der -1 hast du dieses Problem nicht..
 

Heike_89

Mitglied
Ok, danke erstmal! Musste ja nur break und println tauschen und schon ist dieses Problem gelöst :bloed:

Deine for-Schleife ist mMn nicht im Sinne der Aufgabenstellung. Es soll auch möglich sein mehr als 20 Zahlen einzugeben, steht doch ganz klar im Aufgabentext!
Außerdem hat dein Array nur 20 Einträge, wenn du also versuchst auf eingaben[20] zuzugreifen fliegt dir einen ArrayIndexOutOfBoundException um die Ohren!

Was gebe ich dann in der for-Schleife für einen Wert ein? Einen beliebigen >20?
Ich verstehe was du meinst, aber in der Aufgabenstellung steht ja auch, das Feld soll die Größe 20 haben. Widerspricht sich das nicht irgendwie?

Und dann weiß ich ehrlichgesagt gerade auch nicht, wie ich jetzt die restlichen Bedingungen noch unterbringe. Brauche ich dafür eine neue Schleife?

Ich weiß, ich bin eigentlich zu doof fürs Programmieren :autsch:
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,
Was gebe ich dann in der for-Schleife für einen Wert ein? Einen beliebigen >20?
Ich verstehe was du meinst, aber in der Aufgabenstellung steht ja auch, das Feld soll die Größe 20 haben. Widerspricht sich das nicht irgendwie?
nein, tut es nicht ;)

Du sollst zwar im Feld nur 20 Werte speichern, aber ja davon ausgehen, dass auch mehr als 20 Zahlen eingegeben werden und dann "eine Fehlermeldung ausgeben" ...

Von der Aufgabenstellung her soll die Schleife solange laufen, bis eine negative Zahl eingegeben wird!
Schau' die hierfür mal eine WHILE-Schleife an :)

Gruß
Klaus
 

HarleyDavidson

Bekanntes Mitglied
Nimm statt einer for - Schleife eine do - while Schleife...

So könnte man es lösen (ohne zu spoilern ;) )

Java:
public static void main( String[] args )
{
    Scanner input = new Scanner( System.in );
    int eingaben[] = new int[20];
    //Initialisierung des Arrays mit -1
    for ( int i = 0; i < eingaben.length; i++ )
    {
        eingaben[i] = -1;
    }
    //Anzahl Zahlen im Array
    int i = 0;
    //Initialisierung Eingabevariable
    int eingabe;

    do  //so lange, wie eine positive Zahl eingegeben wurde
    {
        //Eingabe
        //Wurden schon 20 Zahlen eingegeben? (Anzahl Zahlen im Array prüfen)
        //Nein
        if ( ---- )
        {
            //War die Eingabe eine positive Zahl?
            //Kommt die Zahl noch nicht im Array vor?
            if ( ---- )
            {
                //Wenn ja -> Ins Array einfügen und Zähler (Anzahl Zahlen im Array) erhöhen
            }
        }
        //Ja
        else
        {
            //Fehlermeldung
        }
    }
    while ( eingabe >= 0 );

    //Ausgabe des Arrays
    for ( int current : eingaben )
    {
        //Nur die positiven Zahlen ausgeben
        if ( current != -1 )
        {
            System.out.print( current + ", " );
        }
    }
}
 

VfL_Freak

Top Contributor
Moin,

do-while ist hier eine schlechte Idee :autsch:
Was ist denn, wenn die erste Zahl schon negativ ist ???:L

Wie gesagt, besser eine normale WHILE-Schleife
Java:
while( eingabe >= 0 )
{
//...
}

Gruß
Klaus
 

stg

Top Contributor
Moin,

do-while ist hier eine schlechte Idee :autsch:
Was ist denn, wenn die erste Zahl schon negativ ist ???:L

Wie gesagt, besser eine normale WHILE-Schleife
Java:
while( eingabe >= 0 )
{
//...
}

Gruß
Klaus

Damit hast du zwangsläufig an ZWEI Stellen eine Eingabe, das ist ja auch blöd :)
 

Heike_89

Mitglied
So, ich habe nun das versucht, die Hilfestellung von HarleyDavidson umzusetzen (DANKE DAFÜR:))

Ich wusste aber leider immer noch nicht alles :eek:ops

Das Programm läuft, es fehlt mir aber noch folgendes:

- wenn mehr als 20 Zahlen eingegeben werden, kommt Fehlermeldung ArrayIndexOutOfBoundException wegen der Arraygröße nehme ich an. Wie ändere ich das denn nun, dass es der Aufgabenstellung noch entspricht?

- es erkennt noch keine Duplikate, mir fehlt der Ausdruck dafür. Dachte eigentlich irgendwas wie if(eingabe == eingaben[]), aber das geht nicht.

Java:
import java.util.Scanner;

class Duplikatvermeidung
{
	public static void main(String[] args)
	{
			Scanner input = new Scanner(System.in);
			int eingaben [] = new int [20];
			int eingabe;
			int i = 0;
			
			do
				{
				System.out.print("Naechste Eingabe bitte: ");
				eingabe = input.nextInt();
				i++;
				
				if(i <= 20)
					{
					eingaben [i] = eingabe;
					}
				else
					{
					System.out.println("Die Eingabe von mehr als 20 Zahlen ist nicht möglich.");
					}
				}
				
			while(eingabe >= 0);
			
			for(int current : eingaben)
				{
				if(current != -1)
					{
					System.out.print(current +", ");
					}
				}			
	}
}
 

rme

Top Contributor
Hallo :)

zum ersten Problem: Du fügst die Zahl noch ein, wenn i <= 20 ist. Damit hast du also Array-Indizes von 0 bis einschließlich 20, wie viele mögliche Indizes ergibst das? ;)

zum zweiten Problem: Um zu prüfen, ob die Zahl schon im Array vorhanden ist, könntest du eine Schleife erstellen, die das Array durchgeht und prüft, ob sie schon vorhanden ist.
 

Heike_89

Mitglied
Eure Tipps sind super! Ich freu mich über jeden einzelnen und ich versuche es ja wirklich, aber ich komme hier jetzt wirklich nicht weiter :noe: Ich weiß einfach nicht, wie ich das nun noch einbauen soll.
Und dann ist mir noch aufgefallen, dass, wenn weniger als 20 Zahlen eingegeben werden, noch ein Haufen Nullen ausgegeben werden. Das dürfte auch nicht sein. Wie bekomme ich das weg?
Danke, dass ihr so viel Geduld mit mir habt! :oops:
 

HarleyDavidson

Bekanntes Mitglied
Zu den Nullen:
Schau noch mal in meinen geposteten Code (Post #6). In Zeile 6 wird das komplette Array, nachdem es initialisiert wurde, mit -1 aufgefüllt.

Dann schaust du dir Zeile 41 an. Wenn der aktuelle Wert des Arrays NICHT -1 ist, dann wird er auf der Konsole ausgegeben.

Das kannst du ja mal genau so in deinen Code übernehmen.


Schau dir nochmal den Rest meines Codes an. Wenn du genau das implementierst, was ich als Kommentar eingefügt habe, dann hast du es schon geschafft!
 

Heike_89

Mitglied
Gut, ich habe noch einmal mein Bestes versucht, konnte aber immernoch nicht folgendes einbauen:
- Duplikatvermeidung
- dass bei Eingabe von mehr als 20 Zahlen meine Fehlermeldung kommt (da kommt immernoch ArrayIndexOutOfBoundsException)

Java:
import java.util.Scanner;

class Duplikatvermeidung
{
	public static void main(String[] args)
	{
			Scanner input = new Scanner(System.in);
			int eingaben [] = new int [20];
			
			for(int i = 0; i < eingaben.length; i++)
				{
				eingaben [i] = -1;
				}
				
			int i = 0;
			int eingabe;
			
			do
				{
				System.out.print("Naechste Eingabe bitte: ");
				eingabe = input.nextInt();
				
				if(i <= 20)
					{
					if(eingabe >= 0)
						{
						eingaben [i] = eingabe;
						i++;
						}
					}
				else
					{
					System.out.println("Die Eingabe von mehr als 20 Zahlen ist nicht möglich.");
					}
				}
				
			while(eingabe >= 0);
			
			for(int current : eingaben)
				{
				if(current != -1)
					{
					System.out.print(current +", ");
					}
				}			
	}
}

Gibt es noch eine Möglichkeit, dass nach der letzten ausgegebenen Zahl kein Komma angezeigt wird?
 

HarleyDavidson

Bekanntes Mitglied
Zeile 23:
Java:
if (i < 20)

Der Index bei einem Array beginnt bei 0 . ;)

Jetzt nicht aufgeben, du hast es fast geschafft!

Prüfe doch einfach gleich nach der Eingabe der Zahl, ob sich diese schon im Array befindet... (Noch ein Tipp: Du hast doch schon zwei so hübsche for-Schleifen, die eignen sich hervorragend dafür ;) )
 
Zuletzt bearbeitet:

Heike_89

Mitglied
Ja ich weiß schon was du meinst, aber ich will da immer sowas machen wie if(eingabe == eingaben) und dann kommt als Meldung, dass ich ja int und Array nicht miteinander vergleichen kann :( Und was anderes fällt mir dazu nicht ein :(
 

VfL_Freak

Top Contributor
Moin,

ich will da immer sowas machen wie if(eingabe == eingaben) und dann kommt als Meldung, dass ich ja int und Array nicht miteinander vergleichen kann

warum sollte das nicht gehen ???:L
Du würdest zwei Integer-Werte vergleichen (den Eingegebenen und den an der i-ten Stelle des Arrays).

Also wie harley schon schrieb: poste den konkreten Code UND die entsprechende Meldung, die dann kommen soll!

Gruß
Klaus
 

Heike_89

Mitglied
Naja ich hatte das mal ausprobiert und jetzt hab ichs grade gar nicht drin, weil ich eben nicht weiß, an welcher Stelle.

Würde mir das in etwa so vorstellen:

Java:
for(int current : eingaben)
				{
				if (eingabe == eingabe [i])
					{
					//Zahl nicht speichern
					}
				if(current != -1)
					{
					System.out.print(current +", ");
					}
				}

Weiß aber nicht, was bei //Zahl nicht speichern eingeben soll. Und überhaupt habe ich irgendwie nicht das Gefühl das es richtig ist.
 

HarleyDavidson

Bekanntes Mitglied
Naja ich hatte das mal ausprobiert und jetzt hab ichs grade gar nicht drin, weil ich eben nicht weiß, an welcher Stelle.

Würde mir das in etwa so vorstellen:

Java:
for(int current : eingaben)
				{
				if (eingabe == eingabe [i])
					{
					//Zahl nicht speichern
					}
				if(current != -1)
					{
					System.out.print(current +", ");
					}
				}

Weiß aber nicht, was bei //Zahl nicht speichern eingeben soll. Und überhaupt habe ich irgendwie nicht das Gefühl das es richtig ist.

Na am einfachsten ist es, du setzt eine Boolean (ich habe mal die Fehlerlein korrigiert ;) )

Java:
boolean zahlEnthalten = false;
for(int current : eingaben)
				{
				if (eingabe = current)
					{
					zahlEnthalten = true;
					}
				}

Und vor der Eingabe fragst du ab ob die Zahl nun schon gefunden wurde oder nicht
 
Zuletzt bearbeitet:

Heike_89

Mitglied
Habe es jetzt so eingefügt:

Java:
boolean zahlEnthalten = false;
			for(int current : eingaben)
                {
                if (eingabe == current)
                    {
                    zahlEnthalten = true;
                    }
				if(current != -1)
					{
					System.out.print(current +", ");
					}
				}

Es gibt mir dann aber trotzdem noch Zahlen doppelt aus ???:L
 

HarleyDavidson

Bekanntes Mitglied
Na klar, da du sie ja dennoch in das Array einfügst!
Du hast übrigens die Fehler in deinem Code nicht korrigiert (Zeile 4 fliegt dir um die Ohren, vergleiche mit meinem Code)

Mit der Boolean kannst du dann steuern ob die Zahl ins Array eingefügt werden soll:

Java:
            if ( i < 20 )
            {
                //War die Eingabe eine positive Zahl?
                //Kommt die Zahl noch nicht im Array vor?
                if ( eingabe >= 0 )
                {
                    if (!zahlEnthalten)
                    {
                        //Wenn ja -> Ins Array einfügen und Zähler (Anzahl Zahlen im Array) erhöhen
                        eingaben[i] = eingabe;
                        i++;
                    }
                    else
                    {
                        System.out.println( "Die Zahl " + eingabe + " ist schon enthalten!" );
                    }
                }
            }
            //Ja
            else
            {
                //Fehlermeldung
                System.out.println( "Es können keine weiteren zahlen eingegeben werden!" );
            }
 

rme

Top Contributor
Kleiner Tipp: Nimm die for-Schleife aus Zeile 30... ;) :D

Ich habe die Aufgabe so verstanden, dass so lange Zahlen eingelesen werden, bis 20 verschiedene Zahlen eingelesen wurden. Die Schleife, die du meintest, wird aber erst ausgeführt, nachdem 20 beliebige Eingaben gelesen wurden, in denen Duplikate vorhanden sein können. Deshalb war mein Vorschlag, eine weitere Schleife innerhalb der Eingabeschleife einzufügen.

"Es dürfen somit in dem Feld keine Duplikate gespeichert werden"
 
Zuletzt bearbeitet:

Heike_89

Mitglied
PUUH... Das war eine schwere Geburt, aber: Jetzt hab ich´s tatsächlich hinbekommen! 1000 Dank! :applaus::applaus::applaus:

@rme: Da kannst du gut recht haben. Aber ich werde es jetzt dennoch so lassen und dann eben auf diesen einen Punkt verzichten. Mein Kopf platzt gleich :rolleyes:
 
Zuletzt bearbeitet:

Oben