这是一个图形化的约瑟夫环先是用JOptionPane的来接收n 然后我想用JTextField来接受n 但是总说数组越界?先是用JOptionPane的  JoseAwt.javaimport java.awt.*;
import java.awt.event.*;
import java.util.StringTokenizer;
import java.util.Vector;import javax.swing.*;
import javax.swing.event.*;import test.Josephes.Ren;public class JoseAwt { static char c;
static int onec = 0;
static Ren a1 = new Ren(1, 1);
static Ren index = a1;
//n表示小圆的个数
static int n = Integer.parseInt(JOptionPane
.showInputDialog("输入人数:(小于10 个)"));
static int btnc = 0;
static int sum;//每当小圆没有的时候再回到原先的n个小圆状态  最初的小圆用
static String line = "";//line表示剩余的数字的字符串
//每次删一个数字line就少一个 然后把每一次剩余的数字存在reline中
static String[] reline = new String[n]; public static void main(String[] args) {
// j 指向人
for (int i = 2; i <= n; i++)// 初始化每个人
{
index.next = new Ren(i, i);
index = index.next;
}
index.next = a1;
if (line == "" || line == null) {
for (int i = 1; i <= n; i++) {
line = line.concat("" + i);
}
} int m = 2;
for (int i = 0; i < n; i++) {
// reline[i] = showlast();
for (int k = 0; k < m - 1; k++)// 轮转
{
index = index.next;
}
int t = i + 1;
// System.out.println("第" + t + "次  " + index.next.flag + "出局");
onec = index.next.flag;
//String s = line;
reline[i]=line;
StringTokenizer st = new StringTokenizer(line, "" + onec);
Vector v = new Vector();
while (st.hasMoreElements()) {
v.add(st.nextElement());
}
line = "";
for (int ii = 0; ii < v.size(); ii++) {
line += (String) v.elementAt(ii);
}
// System.out.println(line); //reline[i] = s; m = index.next.mima;// 可以实现剔除后转换为此人拥有的密码.
index.next = index.next.next;
}
// 约瑟夫部分结束¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
// 下面是画圆¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ final JoseAwt ob = new JoseAwt(); final JFrame f = new JFrame();
JButton bu1 = new JButton("MINUS");
final JComponent newContentPane = new JPanel();
class MyCanvas extends Canvas { double PI = 3.1415926;
int x = 50;
int y = 70;
int rbig = 150;
int xCenterB = x + rbig;// 大圆圆心
int yCenterB = y + rbig; int rsmall = 30;
int xCenterS, yCenterS;
int num[] = new int[n]; // static int count = 0;
// String s; public void paint(Graphics g) {
String s;
System.out.println(ob.reline[btnc]);
s = ob.reline[btnc];
System.out.println(" reline:" + s);
int count = 0;// 表示小圆个数
while (count < s.length()) {// reline中的数一个一个放在小圆里 // char c = s.charAt(count); System.out.print(" sc:"+c); num[count] = (Integer.parseInt(s.charAt(count) + "")); // System.out.print(" char:"+num[count]);
// num[count] = num[count] % n;// 不取余就是50几了 不知为什么
// --现在知道了 刚才从字符串取出来的是char System.out.print(" char:" + num[count]);
count++;
}
System.out.println("");
g.setColor(Color.white);
g.drawOval(x, y, 2 * rbig, 2 * rbig);
for (int i = 0; i < s.length(); i++) {
xCenterS = xCenterB
+ (int) Math.round(rbig * Math.sin(2 * PI * i / n));
yCenterS = yCenterB
+ (int) Math.round(rbig * Math.cos(2 * PI * i / n));
g.setColor(Color.red); g.drawOval(xCenterS - rsmall, yCenterS - rsmall,
2 * rsmall, 2 * rsmall);
g.setFont(new Font("", Font.BOLD, 23));
System.out.print(" " + num[i]);
/*
 * if (num[i] == 0) { num[i] = n; }
 */
g.drawString(num[i] + "", xCenterS, yCenterS);
}
System.out.println("");
}
} final MyCanvas newCanvas = new MyCanvas();
newCanvas.setSize(400, 400);
newContentPane.add(newCanvas);
f.setContentPane(newContentPane); bu1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { n--;
btnc++;
if (btnc > sum) {
btnc = 0;
n = sum;
}
newContentPane.remove(newCanvas);
newContentPane.add(newCanvas); }
});
// JComponent newCanvas = new JosephAwt();
f.add(bu1, BorderLayout.SOUTH);
f.add(newCanvas, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 500);
f.setVisible(true);
}
}
然后我想用JTextField来接受nT1.javaimport java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringTokenizer;
import java.util.Vector;import javax.swing.*;import test.Josephes.Ren;public class T1 {
static char c;
static int onec = 0;
static Ren a1 = new Ren(1, 1);
static Ren index = a1;
static int n;//n表示小圆的个数
static int btnc = 0;
static int sum;//每当小圆没有的时候再回到原先的n个小圆状态  最初的小圆用
static String line = "";//line表示剩余的数字的字符串
//每次删一个数字line就少一个 然后把每一次剩余的数字存在reline中
static String[] reline = new String[n];


public static void main(String[] args) {

final JFrame f = new JFrame(); JButton bu1 = new JButton("MINUS");
final JComponent newContentPane = new JPanel();
final JTextField ta = new JTextField(20);
JButton binput = new JButton("OK");
JPanel pinput = new JPanel(new FlowLayout());
pinput.add(ta);
pinput.add(binput);
newContentPane.add(pinput, BorderLayout.NORTH);
newContentPane.add(bu1, BorderLayout.SOUTH);
f.setContentPane(newContentPane); class MyCanvas extends Canvas { double PI = 3.1415926;
int x = 50;
int y = 70;
int rbig = 150;
int xCenterB = x + rbig;// 大圆圆心
int yCenterB = y + rbig; int rsmall = 30;
int xCenterS, yCenterS;
int num[] = new int[n]; // static int count = 0;
// String s; public void paint(Graphics g) {
String s = "";
System.out.println("btnc " + btnc);
// System.out.println(reline[btnc]);
// s = reline[btnc]; System.out.println(" reline:" + s);
int count = 0;// 表示小圆个数
while (count < s.length()) {// reline中的数一个一个放在小圆里 // char c = s.charAt(count); System.out.print(" sc:"+c); num[count] = (Integer.parseInt(s.charAt(count) + "")); // System.out.print(" char:"+num[count]);
// num[count] = num[count] % n;// 不取余就是50几了 不知为什么
// --现在知道了 刚才从字符串取出来的是char System.out.print(" char:" + num[count]);
count++;
}
System.out.println("");
g.setColor(Color.white);
g.drawOval(x, y, 2 * rbig, 2 * rbig);
for (int i = 0; i < s.length(); i++) {
xCenterS = xCenterB
+ (int) Math.round(rbig * Math.sin(2 * PI * i / n));
yCenterS = yCenterB
+ (int) Math.round(rbig * Math.cos(2 * PI * i / n));
g.setColor(Color.red); g.drawOval(xCenterS - rsmall, yCenterS - rsmall,
2 * rsmall, 2 * rsmall);
g.setFont(new Font("", Font.BOLD, 23));
System.out.print(" " + num[i]); g.drawString(num[i] + "", xCenterS, yCenterS);
}
System.out.println("");
}
} binput.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
//JOptionPane input = new JOptionPane();
// JosephAwt ob=new JosephAwt();
n = Integer.parseInt(ta.getText());
ta.setText("");
sum = n;
// final String[] reline = new String[n];
for (int i = 2; i <= n; i++)// 初始化每个人
{
index.next = new Ren(i, i);
index = index.next;
}
index.next = a1;
if (line == "" || line == null) {
for (int i = 1; i <= n; i++) {
line = line.concat("" + i);
}
} int m = 2;
for (int i = 0; i < n; i++) {
// reline[i] = showlast();
for (int k = 0; k < m - 1; k++)// 轮转
{
index = index.next;
}
int t = i + 1;
// System.out.println("第" + t + "次  " + index.next.flag + "出局");
onec = index.next.flag;
//String s = line;
reline[i]=line;
StringTokenizer st = new StringTokenizer(line, "" + onec);
Vector v = new Vector();
while (st.hasMoreElements()) {
v.add(st.nextElement());
}
line = "";
for (int ii = 0; ii < v.size(); ii++) {
line += (String) v.elementAt(ii);
}
// System.out.println(line); //reline[i] = s; m = index.next.mima;// 可以实现剔除后转换为此人拥有的密码.
index.next = index.next.next;
}
final MyCanvas newCanvas = new MyCanvas();
newCanvas.setSize(400, 400);
newContentPane.add(newCanvas);
} }); bu1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final MyCanvas newCanvas = new MyCanvas();
n--;
btnc++;
if (btnc > sum) {
btnc = 0;
n = sum;
}
newContentPane.remove(newCanvas);
newContentPane.add(newCanvas); } }); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 500);
f.setVisible(true); } public static class Ren// 定义人的链表
{
int flag;// 序号
Ren next;// 指针
int mima; public Ren(int n, int m) {
flag = n;
mima = m;
} public Ren() {
this(1, 1);
// data = 0;
// next = null;
}
}
}

解决方案 »

  1.   

    约瑟夫环啊 好经典的数据结构copy下来帮你看看
      

  2.   

    继续做界面吧 界面啥都没有啊。很XX的错误。/*
     *author:a276202460
     *CreateDate:2009-11-24
     *
     */package com.rich.csdn.test;import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.StringTokenizer;
    import java.util.Vector;import javax.swing.*;public class T1 { static char c; static int onec = 0; static Ren a1 = new Ren(1, 1); static Ren index = a1; static int n;// n表示小圆的个数 static int btnc = 0; static int sum;// 每当小圆没有的时候再回到原先的n个小圆状态 最初的小圆用 static String line = "";// line表示剩余的数字的字符串
    // 每次删一个数字line就少一个 然后把每一次剩余的数字存在reline中 static String[] reline = null; public static void main(String[] args) { final JFrame f = new JFrame(); JButton bu1 = new JButton("MINUS");
    final JComponent newContentPane = new JPanel();
    final JTextField ta = new JTextField(20);
    JButton binput = new JButton("OK");
    JPanel pinput = new JPanel(new FlowLayout());
    pinput.add(ta);
    pinput.add(binput);
    newContentPane.add(pinput, BorderLayout.NORTH);
    newContentPane.add(bu1, BorderLayout.SOUTH);
    f.setContentPane(newContentPane); class MyCanvas extends Canvas { double PI = 3.1415926; int x = 50; int y = 70; int rbig = 150; int xCenterB = x + rbig;// 大圆圆心 int yCenterB = y + rbig; int rsmall = 30; int xCenterS, yCenterS; int num[] = new int[n]; // static int count = 0;
    // String s; public void paint(Graphics g) {
    String s = "";
    System.out.println("btnc " + btnc);
    // System.out.println(reline[btnc]);
    // s = reline[btnc]; System.out.println(" reline:" + s);
    int count = 0;// 表示小圆个数
    while (count < s.length()) {// reline中的数一个一个放在小圆里 // char c = s.charAt(count); System.out.print(" sc:"+c); num[count] = (Integer.parseInt(s.charAt(count) + "")); // System.out.print(" char:"+num[count]);
    // num[count] = num[count] % n;// 不取余就是50几了 不知为什么
    // --现在知道了 刚才从字符串取出来的是char System.out.print(" char:" + num[count]);
    count++;
    }
    System.out.println("");
    g.setColor(Color.white);
    g.drawOval(x, y, 2 * rbig, 2 * rbig);
    for (int i = 0; i < s.length(); i++) {
    xCenterS = xCenterB
    + (int) Math.round(rbig * Math.sin(2 * PI * i / n));
    yCenterS = yCenterB
    + (int) Math.round(rbig * Math.cos(2 * PI * i / n));
    g.setColor(Color.red); g.drawOval(xCenterS - rsmall, yCenterS - rsmall,
    2 * rsmall, 2 * rsmall);
    g.setFont(new Font("", Font.BOLD, 23));
    System.out.print(" " + num[i]); g.drawString(num[i] + "", xCenterS, yCenterS);
    }
    System.out.println("");
    }
    } binput.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
    // JOptionPane input = new JOptionPane();
    // JosephAwt ob=new JosephAwt();
    n = Integer.parseInt(ta.getText());
    ta.setText("");
    sum = n;
    reline = new String[n];
    // final String[] reline = new String[n];
    for (int i = 2; i <= n; i++)// 初始化每个人
    {
    index.next = new Ren(i, i);
    index = index.next;
    }
    index.next = a1;
    if (line == "" || line == null) {
    for (int i = 1; i <= n; i++) {
    line = line.concat("" + i);
    }
    } int m = 2;
    for (int i = 0; i < n; i++) {
    // reline[i] = showlast();
    for (int k = 0; k < m - 1; k++)// 轮转
    {
    index = index.next;
    }
    int t = i + 1;
    // System.out.println("第" + t + "次 " + index.next.flag +
    // "出局");
    onec = index.next.flag;
    // String s = line;
    reline[i] = line;
    StringTokenizer st = new StringTokenizer(line, "" + onec);
    Vector v = new Vector();
    while (st.hasMoreElements()) {
    v.add(st.nextElement());
    }
    line = "";
    for (int ii = 0; ii < v.size(); ii++) {
    line += (String) v.elementAt(ii);
    }
    // System.out.println(line); // reline[i] = s; m = index.next.mima;// 可以实现剔除后转换为此人拥有的密码.
    index.next = index.next.next;
    }
    final MyCanvas newCanvas = new MyCanvas();
    newCanvas.setSize(400, 400);
    newContentPane.add(newCanvas);
    } }); bu1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    final MyCanvas newCanvas = new MyCanvas();
    n--;
    btnc++;
    if (btnc > sum) {
    btnc = 0;
    n = sum;
    }
    newContentPane.remove(newCanvas);
    newContentPane.add(newCanvas); } }); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(400, 500);
    f.setVisible(true); } public static class Ren// 定义人的链表
    {
    int flag;// 序号 Ren next;// 指针 int mima; public Ren(int n, int m) {
    flag = n;
    mima = m;
    } public Ren() {
    this(1, 1);
    // data = 0;
    // next = null;
    }
    }
    }