Komischer Fehler mit einer if-Bedingung

Triphos

Neues Mitglied
In der Schule haben wir als Übung zu Arrays die Aufgabe bekommen folgendes Programm zu schreiben: in einem Verein gibt es Wahlen, wobei 40 Mitglieder zur Wahl stehen, jedem wird eine Nummer von 1-40 zugeordnet. Ein Mitglied des Vereins soll die Stimmzettel auszählen und gibt die Nummer der Person ein die auf dem Wahlzettel steht. Ausgegeben werden sollen am ende die Nummern der Personen die gewählt wurden, mit der Anzahl der Stimmen die sie bekommen haben. Ungültig sind alle Zettel, die keine Zahl von 1-40 enthalten. Die Anzahl der gültigen und ungültigen Stimmen soll auch gezählt werden. Die Eingabe wird bei mir mit Text beendet, welcher auch als ungültig zählt.
Dort liegt in meinem Programm auch der Fehler. Wenn ich zuerst eine ungültige Zahl eingebe, also z.b 42 und dann 40 und andere Zahlen eingebe, wird die Eingabe zum beenden immer als gültig gezählt, wenn ich anders anfange oder das Programm direkt mit Text beende, wird alles richtig gezählt.

(Die einzelnen Ausgaben in den if-Anweisungen sollen zeigen, wie das Programm abläuft):

Code:
import java.util.*;

public class Waehlen{
 
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        int gueltigeStimmen = 0;
        int ungueltigeStimmen = 0;
        int [] wahlliste = new int[40];
        int gewaehlterKandidat = 0;
        String istFertig = "";
   
        while(!(istFertig.equals("Ergebnis") || istFertig.equals("ergebnis"))){
            System.out.println("Geben Sie die Nummer des gewaehlten Kandidaten ein. Wenn Sie fertig sind schreiben Sie \"Ergebnis\"");
            if(!sc.hasNextInt()){
                istFertig = sc.next();
                System.out.println("istFertig");
                ungueltigeStimmen --;
            }
            else{
                gewaehlterKandidat = sc.nextInt();
                System.out.println("gewaehlterKandidat" + gewaehlterKandidat);
            }
       
            if(gewaehlterKandidat > 0 && gewaehlterKandidat < 41){
                gueltigeStimmen++;
                wahlliste[gewaehlterKandidat-1] = wahlliste[gewaehlterKandidat-1] + 1;
                System.out.println("gueltig");
            }
            else{
                ungueltigeStimmen++;
                System.out.println("ungueltig");
            }
        }
   
        System.out.println("-------------- Ergebnis --------------");
   
        for(int i = 0; i < wahlliste.length; i++){
            if(!(wahlliste == 0)){
                if(i<9){
                    System.out.println("Kandidat 0" +  (i+1) + " hat " + wahlliste + " Stimme(n) erhalten");
                }
                else{
                    System.out.println("Kandidat " +  (i+1) + " hat " + wahlliste + " Stimme(n) erhalten");
                }
            }
        }
        System.out.println("  Gueltige Stimmen: " + gueltigeStimmen + "\nUngueltige Stimmen: " + ungueltigeStimmen);
    }
}

Mit diesem Quelltext tritt der Fehler auf, wenn ich es anders programmiere und die Texteingabe explizit als ungültig erkläre funktioniert es:

Code:
import java.util.*;

public class Wahlen{
 
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        int gueltigeStimmen = 0;
        int ungueltigeStimmen = -1;
        int [] wahlliste = new int[40];
        int gewaehlterKandidat = 0;
        String istFertig = "";
     
        while(!(istFertig.equalsIgnoreCase("Ergebnis"))){ 
            System.out.println("Geben Sie die Nummer des gewaehlten Kandidaten ein. Wenn Sie fertig sind schreiben Sie \"Ergebnis\"");
            if(sc.hasNextInt()){
                gewaehlterKandidat = sc.nextInt();
                System.out.println("gewaehlterKandidat" + gewaehlterKandidat);
            }
            else{
                istFertig = sc.next();
                System.out.println("istFertig");
            }
         
            if(gewaehlterKandidat < 1 || gewaehlterKandidat > 40 || !istFertig.equals("")){
                ungueltigeStimmen++;
             
                System.out.println("ungueltig");
            }
            else{
                wahlliste[gewaehlterKandidat-1] = wahlliste[gewaehlterKandidat-1] + 1;
                gueltigeStimmen++;
                System.out.println("gueltig");
            }
        }
     
        System.out.println("-------------- Ergebnis --------------");
     
        for(int i = 0; i < wahlliste.length; i++){
            if(!(wahlliste == 0)){
                if(i<9){
                    System.out.println("Kandidat 0" +  (i+1) + " hat " + wahlliste + " Stimme(n) erhalten"); 
                }
                else{
                    System.out.println("Kandidat " +  (i+1) + " hat " + wahlliste + " Stimme(n) erhalten");
                }
            }
        }
        System.out.println("  Gueltige Stimmen: " + gueltigeStimmen + "\nUngueltige Stimmen: " + ungueltigeStimmen);
    }
}
 
Hallo Triphos!
Da waren noch ein paar Fehlerchen drin, insbesondere, dass Du stellenweise den Index "i" beim Array "wahlliste" nicht angibst, was dann nur eine kryptische Objekt-ID ausgibt, anstatt der Anzahl der Stimmen des jeweiligen Kanditaten.
Ansonsten habe ich nur die Entscheidungen Deines Programms über gültig und ungültig etwas anders positioniert, so dass es funktionieren sollte. Geh noch mal Schritt für Schritt Dein Programm durch - kannst Du debuggen? Wenn nein, mach's mit Stift und Papier. Überlege Dir, was Zeile für Zeile Deines Codes passiert, wenn Du zunächst 42 und dann meinetwegen 3 eingibst. Vergleiche das mal mit meinen Anpassungen, dann sollte alles klar sein:
Java:
import java.util.*;

// Ok, die Klasse heißt "Aufgabe", aber das ist ja jetzt nicht kriegsentscheidend.
public class Aufgabe {
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        int gueltigeStimmen = 0;
        int ungueltigeStimmen = 0;
        int [] wahlliste = new int[40];
        int gewaehlterKandidat = 0;
        String istFertig = "";
        String eingabe;
  
        while(!istFertig.toLowerCase().contains("ergebnis")) {
            System.out.println("Geben Sie die Nummer des gewaehlten Kandidaten ein. Wenn Sie fertig sind schreiben Sie \"Ergebnis\"");
           
            if(!sc.hasNextInt()){
                istFertig = sc.next();
                System.out.println("istFertig");
                // Kleines Extra: Nachfolgende Bedingung lässt auch Eingaben wie "eRgEbnIs" zu.
                if (!istFertig.toLowerCase().equals("ergebnis")) {
                    ungueltigeStimmen++;
                }
            }
            else{
                gewaehlterKandidat = sc.nextInt();
                System.out.println("gewaehlterKandidat" + gewaehlterKandidat);
               
                if(gewaehlterKandidat > 0 && gewaehlterKandidat < 41){
                gueltigeStimmen++;
                wahlliste[gewaehlterKandidat-1] = wahlliste[gewaehlterKandidat-1] + 1;
                System.out.println("gueltig");
                }
                else{
                    ungueltigeStimmen++;
                    System.out.println("ungueltig");
                }
            }
        }
  
        System.out.println("-------------- Ergebnis --------------");
  
        for(int i = 0; i < wahlliste.length; i++){
            if(!(wahlliste[i] == 0)){
                if(i<9){
                    System.out.println("Kandidat 0" +  (i+1) + " hat " + wahlliste[i] + " Stimme(n) erhalten");
                }
                else{
                    System.out.println("Kandidat " +  (i+1) + " hat " + wahlliste[i] + " Stimme(n) erhalten");
                }
            }
        }
        System.out.println("  Gueltige Stimmen: " + gueltigeStimmen + "\nUngueltige Stimmen: " + ungueltigeStimmen);
       
    }
}
 
PS: Sorry, hab noch was vergessen:
Java:
ungueltigeStimmen --
Wenn die Eingabe keine Integer-Zahl ist (also z. B. "ergebnis" 😉), zählst Du die ungültigen Stimmen wieder um eins runter. Das ergibt keinen Sinn und führt im Ergebnis dann zu einer falschen Zählung. Auch das habe ich in meinen Anpassungen geändert ... schau's Dir einfach mal an.
 
PS: Sorry, hab noch was vergessen:
Java:
ungueltigeStimmen --
Wenn die Eingabe keine Integer-Zahl ist (also z. B. "ergebnis" 😉), zählst Du die ungültigen Stimmen wieder um eins runter. Das ergibt keinen Sinn und führt im Ergebnis dann zu einer falschen Zählung. Auch das habe ich in meinen Anpassungen geändert ... schau's Dir einfach mal an.

Da weiß ich auch nicht was ich mir dabei gedacht habe 😱. Habe das in der ersten Version jetzt auch mal entfernt und noch etwas angepasst. Der Index bei den Arrays war in meinem Code vorhanden, ist beim kopieren aber wohl irgendwie verloren gegangen. Ansonsten hätte ich ja auch noch andere Fehler bekommen, weil "nichts" ja nicht mit 0 Verglichen werden kann 🙂.
Nachdem ich mir deinen Code mal angeguckt habe bzw. deinen Post gelesen habe ist mir bei meiner fehlerhaften Version direkt etwas aufgefallen: ich habe nachdem ich überprüft habe ob die Eingabe eine Zahl ist oder die Abbrucheingabe nur den Wert eingelesen und danach eine neue Abfrage überprüft, ohne ersichtlichen Grund. Dabei macht es ja eigentlich viel mehr Sinn den Wert direkt in der Verzweigung zu verarbeiten. Ich habe das unten mal markiert:
Java:
while(!(istFertig.equals("Ergebnis") || istFertig.equals("ergebnis"))){  
            System.out.println("Geben Sie die Nummer des gewaehlten Kandidaten ein. Wenn Sie fertig sind schreiben Sie \"Ergebnis\"");
            if(!sc.hasNextInt()){
                istFertig = sc.next();
            }
            else{
                gewaehlterKandidat = sc.nextInt();
               
                if(gewaehlterKandidat > 0 && gewaehlterKandidat < 41){
                    gueltigeStimmen++;
                    wahlliste[gewaehlterKandidat-1] = wahlliste[gewaehlterKandidat-1] + 1;
                }
                else{
                ungueltigeStimmen++;
                }
            }
        }

Mit dieser Art zu zählen funktioniert es auch, vor allem nachdem ich das sinnlose -- entfernt habe! Nach ein paar Tests konnte ich auch keinen anderen Fehler mehr finden 🙂.

Vielen Dank, dass du dir die Zeit genommen hast einmal drüber zu gucken und mir zu helfen, hat mir sehr geholfen!
 

Neue Themen


Zurück
Oben