WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Auszählprogramm in Java (http://www.wcm.at/forum/showthread.php?t=150940)

midas 21.11.2004 12:36

Auszählprogramm in Java
 
Hi!

Ich soll ein Programm nach diesen Aufgabenstellungen machen, komme aber nicht weiter:
Zitat:

Bei manchen Kinderspielen werden Abzählreime verwendet, um z.B. einem Kind eine besondere Funktion zuzuteilen. Diese Vorgehensweise soll hier durch ein Programm modelliert werden, in dem ein array int[] kinder der Länge n mit der Besetzung 1..n zyklisch durchlaufen wird in Schritten der Grösse s. Die beiden (positiven) int-Werte n und s sind vom Benutzer zu erfragen, die "Kinder" sind in der Reihenfolge Ihres Ausscheidens auszudrucken.
Ich hab jetzt schon folgendes gemacht und die Arrays belegt, nur komme ich mit dem Auszählen nicht weiter, ich hoffe es kann mir jemand helfen.
Code:

public class Bsp11
{

        public static void main(String[] args)
        {
                int[] kinder;
                int n,s,i,schritte=0; // n = children s = Steps
                boolean run = true;


                // get inputs
                System.out.println("Bitte Anzahl der Kinder eingeben >0: ");
                n = SavitchIn.readLineInt();
                kinder = new int[n];
                System.out.println("Bitte Schritte eingeben >0: ");
                s = SavitchIn.readLineInt();


                for(i=0;i < n; i++)                                                // kinder[] gets a value from 1..n
                        {
                                kinder[i] = i+1;
                                //System.out.println(kinder[i]);

                        }

                System.out.println(); //blank line



                //The real work






        }
}


jak 21.11.2004 14:57

Probier's mal mit
Code:

int j=0; //j ist die Variable mit der das Array durchlaufen wird
for(int i=0;i<n; i++){ //i dient dazu, daß das Array nur einmal durchlaufen wird
  j+=s; //Kurz für j=j+s;
  if(j>=n){j-=n;} //Damit j nicht über das Array hinausläuft
  System.out.println(kinder[j]);
}

Hab's nicht probiert, sollte aber funktionieren.
Würde trotzdem empfehlen EPROG ordentlich zu machen, du wirst es brauchen...

Jak

flinx 21.11.2004 16:32

Sowas ala
Code:

z=n-1
for(i=0;i < n; i++) {
  for (j=0; j<s; j++}
  {
      z=(z+1) Modulo n
      While kinder[z]=0
      {
        z=(z+1) Modulo n
      }     
  }
    Ausgabe(kinder[z])
    kinder[z]=0
}

könnte ev. funktionieren.
k.A. wie die Syntax in Java aussieht. :)

Tarjan 21.11.2004 19:10

so sollte es gehen:

Code:

import java.util.ArrayList;

/**
 * @author Tarjan
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Kinderreim
{

        public static void main(String[] args)
        {
                int n = Integer.valueOf(args[0]).intValue();        // Anzahl Kinder
                int s = Integer.valueOf(args[1]).intValue();        // Schrittgröße
               
                // Array befüllen und Kinder bennen
                ArrayList kinder = new ArrayList(n);
                for (int i=0, l=kinder.size(); i<n; i++)
                {
                        kinder.add("Kind " + (i+1));        //+1 da Java mit 0 zu zählen beginnt, wir aber mit 1 ;)
                }
               
                // Auszählreim
                int i=s-1;        // Zählindex beginned beim ersten Kind
                while (kinder.size() > 0)        // solange es noch Kinder gibt
                {
                        while (i >= kinder.size()) {i -= kinder.size();} // sollte Ende erreicht sein -> von vorne
                        System.out.println(kinder.get(i));        // Kind ausdrucken
                        kinder.remove(i);        // Kind scheidet aus
                        i+=s-1;        // um Schrittgöße weiterzählen (minus eines wegen ausgeschiedenen Kind
                }
               
        }
}

gibt für n=9, s=3 folgendes aus:
Kind 3
Kind 6
Kind 9
Kind 4
Kind 8
Kind 5
Kind 2
Kind 7
Kind 1

midas 22.11.2004 22:30

Ich habs jetzt so gelöst
Code:

public class Bsp11
{

        public static void main(String[] args)
        {
                int[] kinder;
                int n=1,s,arraylaenge,hilf,j,k=1; // n = children s = Steps


                // get inputs
                System.out.println("Bitte Anzahl der Kinder eingeben >0: ");
                n += SavitchIn.readLineInt();
                kinder = new int[n+1];
                arraylaenge = n;
                System.out.println("Bitte Schritte eingeben >0: ");
                s = SavitchIn.readLineInt();


        for (int i=1; i<=n; i++)
                        {
                                kinder[i] = i;
                }

                System.out.println(); //blank line



                //The real work

        for(int i=1;n > 1;i++) { //when all arrays are moved

                //System.out.println(n);
                //System.out.println();
                System.out.println("next run");
                j=1;
                do { //till the run var is as large as the var that is the end of the search area
                        System.out.println("Ausgeschieden ist Kind: " + kinder[j]);
                        hilf = kinder[j];
                        kinder[j] = kinder[arraylaenge-k];
                        kinder[arraylaenge - k] = hilf;
                        //Checksets
                        System.out.println("Durchlauf: " + j);
                        System.out.println("n: " + n);
                        System.out.println("j: "+ j);
                        System.out.println();
                        //var increments
                        n--;
                        k++;
                        j+=s;
                        } while (j<n);
        }



Alle Zeitangaben in WEZ +2. Es ist jetzt 13:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag