Klassensprecherwahl

Status
Nicht offen für weitere Antworten.
B

Blackpandinus

Gast
Hallo,

ich bin neu hier und absoluter Anfänger :roll:

Ich habe auch noch nie objektorientiert programmiert.

Ich versuche gerade eine Aufgabe zu lösen:

Es soll ein Klassensprecher gewählt werden. Die Anzahl der gültigen Stimmen soll ich über Tastatur eingeben können. Solange noch Stimmen vorhanden sind, soll es möglich sein, wieder über Tastatur einzugeben, wer von 2 Kandidaten gewählt wurde. Und das ganze solange Stimmen vorhanden sind. Am Ende soll ausgegeben werden, wer von beiden mit wie vielen Stimmen gewonnen hat.

Ich finde es hört sich eigentlich ganz leicht an, nur sitze ich da jetzt schon seit Stunden vor und komme nicht weiter. Ich kann mit den Fehlermeldungen nicht viel anfangen und somit stoppe ich.

Ich weiß ja nicht einmal, wann ich die Stimmen herunterzählen muss und wie oft ich da if-Bedingungen reinbauen muss, oder wie es einfacher geht.

Würde mich über Hilfe sehr freuen.

Vielen Dank!

Gruß Blackpandinus
 
G

Guest

Gast
Hallo,

aber bitte nicht lachen :? ... ich habe da eine Menge probiert!

Code:
import java.io.*;
public class Klassensprecherwahl
{
  public static void main(final String[] argv) throws IOException
  {
    double Stimmen, X, Y, Kandidat, Ergebnis; String str;

    BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Die Wahl des neuen Klassensprechers!");
    System.out.println();
    System.out.print("Anzahl der gueltigen Stimmen: ");
    str = eingabe.readLine();
    Stimmen = Double.parseDouble(str);

      while (Stimmen > 0)
      {
          if (Stimmen > 0)
          {
            System.out.print("Wurde Kandidat X oder Y gewaehlt?");
            str = eingabe.readLine();
            X = Double.parseDouble(str);
            Y = Double.parseDouble(str);

              if (X)
              {
              X = X + 1;
              }
              else
              Y = Y + 1;
            
            Stimmen--;
            System.out.println(Stimmen+" ist größer 100");

          }
          else
          {
            System.out.println("Kandidat " +Kandidat+ " hat mit " +Ergebnis+ " Stimmen gewonnen!");
          }
        System.out.println("Kandidat " +Kandidat+ " hat mit " +Ergebnis+ " Stimmen gewonnen!");
      }

  }
}

Danke schön!

Gruß Blackpandinus
 

mic_checker

Top Contributor
Du solltest die Struktur deines Programms nochmal überdenken.

Code:
              if (X)
              {
              X = X + 1;
              }
              else
              Y = Y + 1;
In der Klammer erwartet er einen booleschen Ausdruck, bei dir steht aber eine double Variable drin. Was du sicher meinst ist ob X oder Y eingegeben wurde. Das kannst du so machen:

Code:
          if (str.equals("X"))
              		X = X + 1;
              else
              		Y = Y + 1;

Dann kannst du das parse Zeug oben drüber auch weglassen, allerdings solltest du noch überprüfen ob tatsächlich X oder Y eingegeben wurde und nicht z.B. Z.
 
G

Gast

Gast
machs dir doch nicht so schwer! versuchs mal mit dem grundgerüst
Code:
import java.io.*;
public class Stimmenzaehler {
    public static void main(String args[]) throws IOException {
        int stimmenKandidat1 = 0;
        int stimmenKandidat2 = 0;
        int eingabe = 1;
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader din = new BufferedReader(input);
        while (eingabe !=0) {
            System.out.print("nächste Stimme für Kandidat (1) oder (2)? (0 = Ende) : ");
            eingabe = Integer.parseInt(din.readLine());
            if (eingabe == 1) {
                stimmenKandidat1++;  
            } else if (eingabe == 2) {
                stimmenKandidat2++; 
            }
        }
        System.out.println("abgegebene Stimmen: " + (stimmenKandidat1+stimmenKandidat2));
        System.out.println("Kandidat 1 hat " + stimmenKandidat1 + " Stimmen");
        System.out.println("Kandidat 2 hat " + stimmenKandidat2 + " Stimmen");
    }
}
 

Henrik

Aktives Mitglied
Code:
System.out.print("Wurde Kandidat X oder Y gewaehlt?");
            str = eingabe.readLine();
            X = Double.parseDouble(str);
            Y = Double.parseDouble(str);

              if (X)
              {
              X = X + 1;
              }
              else
              Y = Y + 1;
           
            Stimmen--;
            System.out.println(Stimmen+" ist größer 100");

Was möchtest du in diesem abschnitt machen das habe ich nicht so ganz verstanden, wilst du jetzt testen ob jemand x oder y eingegeben hat oder wilst du die anzahl der stimmen die Kanidat x und Kandidat Y bekommen hat abfragen.
 
B

Blackpandinus

Gast
Hallo an alle,

ich bin ja super begeistert von dem Forum, ihr seit ja total hilfsbereit, danke schön.
Ich versuche der Reihe nach zu antworten:

@mic_checker
vielen Dank für die Hilfe. Du hattest recht, genau das wollte ich damit bewirken, nur mir fiel nichts besseres ein, als für die abgegebene Stimme ein einfaches X in Klammern zu schreiben.

@Gast
vielen Dank für den Quellcode. Er funktioniert auch super, nur leider muss ich noch versuchen eine Schleife einzubauen, die die Gesamtanzahl an Stimmen abzählt, bis das Ergebnis feststeht.

@Henrik
Mit dieser Bedingung wollte ich bewirken, das dem Gewählten 1 Stimme dazugezählt und von der Gesamtanzahl gültiger Stimmen 1 abgezogen wird. Klappt wohl so nicht :oops:

@mic_checker
Was bedeutet NumberFormatException abfangen?

Vielen Dank an alle Helfer!

Lieben Gruss

Blackpandinus
 
G

Gast

Gast
@ mic checker:
danke, das sollte man allerdings tun!

@Blackpandinus: was mic checker damit meint, ist, dass meine Version die Eingabe eines Zeichens, das nicht eine Ziffer ist, mit einer Fehlermeldung beendet, wenn du z.b. also ein 'a' eingibst.
Soll ja auch nur die Grundidee beschreiben!
 
B

Blackpandinus

Gast
@Gast
ok, das habe ich verstanden, nur wie macht man das?

Hat denn sonst noch jemand eine Idee, wie man das ganze, vielleicht ja auch das Programm von Gast so umbaut, das eine vorher eingegebene Stimmenanzahl auf Null herunter gezählt wird?

Danke!

Gruß Blackpandinus
 
G

Gast

Gast
das könnte in etwa so gemacht werden:

Code:
import java.io.*;
public class Stimmenzaehler {
    public static void main(String args[]) throws IOException {
        int stimmenKandidat1 = 0;
        int stimmenKandidat2 = 0;
        int stimmen = 0;
        int eingabe = 0;
        try {
            InputStreamReader input = new InputStreamReader(System.in);
            BufferedReader din = new BufferedReader(input);
            System.out.print("Bitte die Anzahl gültiger Stimmen eingeben: ");
            stimmen = Integer.parseInt(din.readLine());
            while (stimmen > 0) {
                System.out.println("");
                System.out.println("noch zu zählende Stimmen: " + stimmen);
                System.out.print("nächste Stimme für Kandidat (1) oder (2)? (0 = Ende) : ");
                eingabe = Integer.parseInt(din.readLine());
                if (eingabe == 1) {
                    stimmenKandidat1++;
                    stimmen--;
                } else if (eingabe == 2) {
                    stimmenKandidat2++;
                    stimmen--;
                }
            }
        } catch (NumberFormatException e) {
            System.out.println("Es dürfen nur Ziffern eingegeben werden!");
        }
        System.out.println("");
        System.out.println("gezählte Stimmen: " + (stimmenKandidat1+stimmenKandidat2));
        System.out.println("Kandidat 1 hat " + stimmenKandidat1 + " Stimmen");
        System.out.println("Kandidat 2 hat " + stimmenKandidat2 + " Stimmen");
    }
}

das try{ ...} catch sorgt dafür, dass bei einer falschen eingabe eine fehlermeldung ausgegeben wird und das programm mit der aktuell abgezählten anzahl der stimmen beendet wird. ich denke, das sollte so reichen
 
G

Gast

Gast
das (0= Ende) funktioniert natürlich jetzt nicht mehr , das hab ich vergessen rauszulöschen
 

Henrik

Aktives Mitglied
So hier mal dein Lösung überarbeitet jetzt geht sie allerdings ohne Fehlerkontrolle

Code:
import java.io.*;
public class Klassensprecherwahl
{
  public static void main(final String[] argv) throws IOException
  {
    int Stimmen=0, Kandidat1=0, Kandidat2=0; 
	String str;

    BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Die Wahl des neuen Klassensprechers!");
    System.out.println();
    System.out.print("Anzahl der gueltigen Stimmen: ");
    str = eingabe.readLine();
    Stimmen = Integer.parseInt(str);

      while (Stimmen > 0)
      {
         
            System.out.print("Wurde Kandidat 1 oder 2 gewaehlt?");
			//1 oder 2 eingeben
            str = eingabe.readLine();
              if (Integer.parseInt(str)==1 )
              {
				  Kandidat1 = Kandidat1 + 1;
              }
              else
		      Kandidat2 = Kandidat2+ 1;
           
            Stimmen--;
            System.out.println(Stimmen+" ist größer 100");

          }
         
	       if(Kandidat1>Kandidat2)
	         System.out.println("Kandidat 1 hat mit " +Kandidat1+ " Stimmen gewonnen!");
	       else
			 System.out.println("Kandidat 1 hat mit " +Kandidat2+ " Stimmen gewonnen!");
       
      }

  }
 

mic_checker

Top Contributor
Im Falle eines Unentschiedens versagt dein Programm allerdings ;)

Btw. was soll:

Code:
System.out.println(Stimmen+" ist größer 100");

Wozu dient die Ausgabe? Ist imho ja sinnlos...

Btw. das Programm funktioniert so auch noch nicht richtig, die Usereingabe müsste noch überprüft werden (ob wirklich eine 1 oder 2 eingegeben wurde), da sonst einer der Kandidaten stimmen kriegt die ihm nicht zustehen....
Code:
Kandidat1 = Kandidat1 + 1;

Wofür gibts eigentlich den schönen Inkrement Operator ?

Code:
Kandidat1++;

Variablennamen sollten übrigens klein geschrieben werden...
 
B

Blackpandinus

Gast
Hallo @ all,

das ist ja echt der Hammer hier, so viel geballtes Java-Wissen .... vielen Dank!

Also, ich finde beide Lösungen klasse, so weit wäre ich nie gekommen!

Allerdings ist mir genauso wie mic_checker aufgefallen, das vielleicht noch eine falsche Eingabe geändert werden müsste. Sprich bei Eingabe einer anderen Zahl außer 1 und 2. In der einen Lösung ist es ja schon mit dem Eingeben von Buchstaben gelöst, wie kann man das Eingeben einer falschen Zahl verhindern?

Gruß Blackpandinus
 

mic_checker

Top Contributor
Mach ne do...while Schleife, les den Wert ein, wenn der eingegebene Wert ein anderer ist als 1 oder 2 les noch mal ein, das so lange bis 1 oder 2 eingegeben wurde.

Schau dir einfach mal die do....while Schleife an.
 
G

Gast

Gast
@Blackpandinus
schau mal:

Code:
if (eingabe == 1) {
                    stimmenKandidat1++;
                    stimmen--;
                } else if (eingabe == 2) {
                    stimmenKandidat2++;
                    stimmen--;
sowohl die stimmen für kandidat1 als auch die für kandidat2 werden NUR DANN hochgezählt, wenn du ENTWEDER eine 1 ODER eine 2 eingibst. auch die restlichen stimmen, die noch ausgewertet werden müssen, werden nur dann um eins erniedrigt. alle anderen zahlen-eingaben verändern nichts, somit musst du hier auch nichts weiter überprüfen..
 
G

Guest

Gast
So, ich denke ich bin jetzt fertig ..... mit EURER Hilfe.

VIELEN DANK!!! :D

Ich habe aus den mir zur Verfügung gestellten Quelltexten von den lieben Helfern einen zusammengebastelt, der so passen müsste:

Code:
import java.io.*;
public class Klassensprecherwahl
{
    public static void main(String args[]) throws IOException
    {
        int stimmenKandidat1 = 0;
        int stimmenKandidat2 = 0;
        int stimmen = 0;
        int eingabe = 0;
        try
        {
            InputStreamReader input = new InputStreamReader(System.in);
            BufferedReader din = new BufferedReader(input);
            System.out.println("Die Wahl des neuen Klassensprechers!");
            System.out.println("");
            System.out.print("Bitte die Anzahl gueltiger Stimmen eingeben: ");
            stimmen = Integer.parseInt(din.readLine());

            while (stimmen > 0)
            {
                System.out.println("");
                System.out.println("noch zu zaehlende Stimmen: " + stimmen);
                System.out.println("");
                System.out.print("naechste Stimme fuer Kandidat (1) oder (2)? ");
                eingabe = Integer.parseInt(din.readLine());

                if (eingabe < 0 || eingabe > 2)
                {
                    System.out.println("Es duerfen nur die Ziffern 1 und 2 eingegeben werden!");
                }

                if (eingabe == 1)
                {
                    stimmenKandidat1++;
                    stimmen--;
                }
                else if (eingabe == 2)
                {
                    stimmenKandidat2++;
                    stimmen--;
                }
            }
        }
        catch (NumberFormatException e)
        {
           System.out.println("Es duerfen nur Ziffern eingegeben werden!");
        }
        System.out.println("");
        System.out.println("gezaehlte Stimmen: " + (stimmenKandidat1+stimmenKandidat2));
        System.out.println("Kandidat 1 hat " + stimmenKandidat1 + " Stimmen");
        System.out.println("Kandidat 2 hat " + stimmenKandidat2 + " Stimmen");
        System.out.println("");
        
        if(stimmenKandidat1>stimmenKandidat2)
        System.out.println("Kandidat 1 hat mit " +stimmenKandidat1+ " Stimmen gewonnen!");
        else
        System.out.println("Kandidat 1 hat mit " +stimmenKandidat2+ " Stimmen gewonnen!");
    }
}


Bitte gebt mir noch kurz bescheid, ob man das so stehen lassen kann, oder ob das ein schlechter Programmierstil ist. Wie z.B. die Anmerkung, das man Variablen grundsätzlich klein schreiben sollte. Aus solchen kritischen Anmerkungen kann ich nur lernen. Also nochmals vielen Dank und allen noch ein schönes Wochenende.

Gruß Blackpandinus
 
G

Gast

Gast
das sieht doch jetzt ganz gut aus! bis auf eines: in deiner letzten if-abfrage hast du noch einen kleinen fehler, schau sie mal genau an (tipp: es gewinnt immer kandidat1).
wenn du das korrigiert hast, musst du in der if-abfrage noch den fall berücksichtigen, wenn beide gleich viel stimmen erhalten haben und eine entsprechende meldung ausgeben. wenn du das nicht tust, 'gewinnt' immer kandidat2, obwohl es unentschieden ist.
ansonsten passt es meiner meinung nach schon!
 
G

Gast

Gast
noch was:
if (eingabe < 0 || eingabe > 2)
ist nicht ganz korrekt! hier erlaubst du auch eine '0' als eingabe! die war in der alten version zum abbruch da, hier brauchst du sie aber doch nicht mehr. also: if (eingabe < 1 || .....
 
B

Blackpandinus

Gast
Hallo Gast,

ich habe den Quelltext nochmals überarbeitet.
Ich finde es sehr gut, das Du mir zwar Hilfen, aber nicht die Lösung für solch kleinen Probleme gibst ....denn das hiulft beim Lernen und finden von Fehlern :D

Code:
System.out.println("");
        System.out.println("gezaehlte Stimmen: " + (stimmenKandidat1+stimmenKandidat2));
        System.out.println("Kandidat 1 hat " + stimmenKandidat1 + " Stimmen");
        System.out.println("Kandidat 2 hat " + stimmenKandidat2 + " Stimmen");
        System.out.println("");
        
        if (stimmenKandidat1 > stimmenKandidat2)
        System.out.println("Kandidat 1 hat mit " +stimmenKandidat1+ " Stimmen gewonnen!");
        else if (stimmenKandidat1 == stimmenKandidat2)
        System.out.println("Da beide Kandidaten gleich viele Stimmen haben, besteht ein Unentschieden!");
        else
        System.out.println("Kandidat 2 hat mit " +stimmenKandidat2+ " Stimmen gewonnen!");
    }
}

Ich habe es getestet und denke jetzt ist jeder Fehler weg, stimmt es?


Danke schön!

Gruß Blackpandinus[/quote]
 

Henrik

Aktives Mitglied
@mic_checker

mir ist schon klar das dass absoluter mist Code ist den ich nie so schreiben würde ich wollte nur seine Lösung so abänder das sie klapt.

mfg

Henrik
 

mic_checker

Top Contributor
Die "Kritik" bezog sich eigentlich ja auch auf seinen Grundcode, den du ja lediglich abgeändert hast , damit er läuft....dass du da nicht alle Variablennamen änderst etc., damit es "schöner" aussieht ist klar ;)
 
Status
Nicht offen für weitere Antworten.

Oben