Javaのプログラムについて質問なのですが。

このQ&Aのポイント
  • マンデルブローを描くプログラムで、ボタンを押すたびにcountがカウントアップし、wwの値が巡回的に変化します。
  • actionPerformedメソッドのボタンの処理をどう記述すれば良いかわかりません。
  • コンパイルすると表示されるので、mainメソッドは完成していると思います。
回答を見る
  • ベストアンサー

Javaのプログラムについて質問なのですが。

マンデルブローを図を描くプログラムなのですが、ボタンを押すたびにcountがカウントアップされ それに従って、wwの値が巡回的に、0.0、1.0、2.0、3.0、0.0、1.0、... なるようにして、その値で マンデルブロー図を書くプログラムみたいなのですが、 2つのメソッドactionPerformedとmainの中を完成させたいのですが、 一応mainの中身はコンパイルすると表示されるので出来たと思うのですが、 actionPerformedのボタンの処理をどう記述したらいいのかわかりません。 どなたか教えてください。 以下にプログラムを記述します。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Mandel extends JPanel implements ActionListener{ double ww = 0.0; int count = 0; int myHeight = 400, myWidth = 400; JButton b; JLabel valww; Mandel(){ setPreferredSize(new Dimension(myHeight, myWidth)); b = new JButton("scale"); valww = new JLabel("ww=0.0"); add(b); add(valww); b.addActionListener(this); } public void paintComponent(Graphics g){ super.paintComponent(g); int istart =-myWidth/2, istop = myWidth/2; Color [] col ={ Color.green,Color.cyan, Color.black, Color.red, Color.blue,Color.white, Color.gray,Color.yellow, Color.lightGray,Color.pink,Color.darkGray,Color.magenta }; double ox=-1.1, oy=0.0; double zr,zi, cr, ci, tr, ti; int i, j, k; for (i=istart; i<=istop; i++){ for (j=-myHeight/2+50; j<=myHeight/2; j++){ zr=0.0; zi=0.0; cr=ww*i/1000.0+ox; ci=ww*j/900.0+oy; for (k=1; k<100; k++){ tr=zr*zr-zi*zi; ti=2*zr*zi; zr=tr+cr; zi=ti+ci; if (zr*zr+zi*zi >=20000.0) break; } g.setColor(col[k%12]); g.drawLine(i+myWidth/2,j+myHeight/2,i+myWidth/2,j+myHeight/2); } } } //ここのactionPerformedの記述がわかりません。 public void actionPerformed(ActionEvent e){ if(e.getSource()==b){ repaint(); } } //コンパイルすると表示されるので、ここは出来たと思うのですが。 public static void main(String args[]){ JFrame f = new JFrame(); Mandel m = new Mandel(); f.getContentPane().add(m,BorderLayout.CENTER); f.pack(); f.setVisible(true); }

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

不足しているのは ・wwをカウントアップ ・valwwのテキストを書き換え これだけっぽいわね。

関連するQ&A

  • C言語)マンデルブロー集合

    1.マンデルブロー集合の計算する。 2.発散するまでの計算回数を2次元配列にいれる。 3.計算回数に応じて色分けして画像ファイルを作る という流れのプログラムに挑戦しているのですが 1は何とかできたのですが2.の2次元配列に入れることができなくて悩んでいます。 #include <stdio.h> #define MAX 20 int main() { double tlx=-1.6, tly=1.2, brx=0.9, bry=-1.2;/*複素数座標の入力用*/ double cr, ci, zr, zi, zrp, zip;/*漸化式の計算用*/ double x, y; int k;/*計算回数記録用*/ for(y=tly; y>=bry; y-=0.1)/*虚数軸*/ { cr=y; for(x=tlx; x<=brx; x+=0.1)/*実数軸*/ { ci=x; zip=zrp=0; for(k=1; k<MAX; k++) { zr=zrp*zrp-zip*zip+ci;/*漸化式・実数部*/ zi=2*zrp*zip+cr;/*漸化式・虚数部*/ if((zr*zr+zi*zi)>4) /*発散の判定*/ break; zrp=zr; zip=zi; } printf("%3d",k); } printf("\n"); } return 0; } これが現在のソースなのですが、助言などいただけないでしょうか? とりあえず25x25の2次元配列にいれてみようとおもっています。

  • 数独のJavaプログラム

    数独の解答を一発で出すプログラムを考えています。 自分が考えたプログラムは下記の通りです。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ) break; count++; } count = 0; } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]); } System.out.print("\n"); } } } これを実行すると、正しい数独の解が出来るまでに実行を20~30回。多い時は200回前後実行しないと出来ません。 実行結果(0は数独のルール上数字が入らない所) 9 3 6 5 4 1 7 8 2 1 7 4 2 9 6 5 3 0 5 2 8 7 3 0 0 0 0 2 1 5 3 7 8 4 6 9 8 6 3 4 1 9 2 7 5 4 9 7 6 5 2 1 0 0 7 5 1 8 6 4 9 2 3 3 8 2 9 0 0 0 0 0 6 4 9 1 2 5 8 0 0 これを一発で0がない状態にしたいのです。 因みにC言語だと下記のプログラムで一発で出るのですが。(前回質問したプログラム) int main(void) { int i,j,k,l,chk=0,num=0,tmp,count=0; int a[9][9];  srand((unsigned) time(NULL)); start: count=0; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) a[i][j]=0; for(tmp=1;tmp<10;tmp++){ num=0; while(num<9){ i = rand() % 9; j = rand() % 9; chk=0; for(k=0;k<9;k++) if(a[i][k]==tmp)chk=1; for(k=0;k<9;k++) if(a[k][j]==tmp)chk=1; for(k=(i/3)*3;k<(i/3)*3+3;k++){ for(l=(j/3)*3;l<(j/3)*3+3;l++){ if(a[k][l]==tmp)chk=1; } } if((chk==0)&&(a[i][j]==0)){ a[i][j]=tmp; num++; } if(count%100==99){ count++; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) if(a[i][j]==tmp)a[i][j]=0; num=0; } if(count>10000) goto start; count++; } } for(i = 0; i < 9; i++){ for(j = 0; j < 9; j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0; } このプログラムを実行すると一発で解答が出ます。 上のJavaプログラムを下のプログラムのようにするにはどうしたら良いでしょうか。

    • ベストアンサー
    • Java
  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • javaのプログラムについて

    初めまして。java初心者のものです。 コンピュータとじゃんけんをするというプログラムをつくりたいのですが、 コンパイルしたところ、次のようなエラーが出ました。 「シンボルが見つかりません。」 どこをどう直せばよいのでしょうか。お教え願います。 以下が私のプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.AudioClip; class Zyanken extends YJFrame implements ActionListener{ JButton[] btn; JPanel panel; Zyanken(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ panel.setText("COMはグーです。"); } else if(com==2){ panel.setText("COMはチョキです。"); } else{ panel.setText("COMはパーです。"); } if(e.getSource()==btn){ if(com==1){ panel.setText("あいこです。"); } else if(com==2){ panel.setText("あなたの勝ちです。"); } else{ panel.setText("あなたの負けです。"); } } else if(e.getSource()==btn){ if(com==1){ panel.setText("あなたの負けです。"); } else if(com==2){ panel.setText("あいこです。"); } else{ panel.setText("あなたの勝ちです。"); } } else{ if(com==1){ panel.setText("あなたの勝ちです。"); } else if(com==2){ panel.setText("あなたの負けです。"); } else{ panel.setText("あいこです。"); } } } } 大変恐縮ですが、よろしくお願いします。

  • Javaで数独の自動解法プログラム

    Javaで次のようなプログラムを作りました。 次に、ここから実行で得られた数独を自動解法プログラムによって、解が「1つ or 複数」かを調べるようにしたいのですが、その自動解法プログラムは新しく作らなければいけないのでしょうか。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, m, n, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; Random rnd1 = new Random(); int ran1; Random rnd2 = new Random(); int ran2; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ )  //横列に入る数字をチェック if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ )  //縦列に入る数字をチェック if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ )  //ボックスに入る数字をチェック for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; } } for ( i=0; i<30; i++ ) {    //0を入れる回数 ran1 = rnd1.nextInt(9); m = ran1; ran2 = rnd2.nextInt(9); n = ran2; if ( a[m][n] == 0 ) {  //0にしようとした場所が既に0だったら直前に戻る i--; } a[m][n] = 0; } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを(最初に入れる0の数を30個として)実行すると、次のようになります。 0 7 6 9 4 1 8 2 5 2 0 5 3 7 0 9 4 0 9 0 4 8 2 5 0 3 7 1 0 2 0 0 0 5 0 6 6 9 3 1 0 0 0 8 2 7 0 8 0 0 0 0 1 4 0 0 0 0 0 0 0 0 3 4 3 0 5 6 8 2 7 9 5 2 9 4 3 7 0 0 8 皆さんの回答の程宜しくお願いします。

  • Javaで数独の自動問題作成プログラム

    Javaで次のようなプログラムを作りました。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; }       } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを実行すると、次のようになります。 2 5 3 6 8 4 9 1 7 4 7 9 1 3 5 2 6 8 8 1 6 9 2 7 3 4 5 7 3 5 4 1 6 8 9 2 9 2 1 8 5 3 6 7 4 6 4 8 7 9 2 5 3 1 1 9 4 2 6 8 7 5 3 5 6 2 3 7 1 4 8 9 3 8 7 5 4 9 1 2 6 あとは、ここからランダムに50個数字を抜いて数独の問題にしたいのですが、 どうやったらランダムに数字を抜くことが出来るでしょうか? プログラムソースを提示していただくとありがたいのですが。宜しくお願いします。

  • javaの簡単な質問です

    学校の課題で、ループ文を使い、1-6までのカードを順に引いた場合、起こりうるパターンを全て表示するプログラムを作りなさいというのが出ました。 六枚全てを引くのだけではなく、一枚や二枚、五枚だけ引くというのもあるので、720+360+120+30+6通りがあります 下が作ったものなのですが、うまくいきません。 こういった場合、どのようなコードを書けばよいのでしょうか?for文で実現可能なのでしょうか?whileで同じ数字が出なくなるまで++するような形にするほうが良いのでしょうか? プログラミング初心者で、よくわかっていないです。すみません。どなたか助けてください。 *printsは表示処理を行う関数です public static void main(String[] args){ int[] numbers=new int[6];; for(int i=0;i<numbers.length;i++){//1 for(int j=0;j<numbers.length-1;j++){//2 int o=(i+j+1)%6; prints(numbers[i],numbers[o]); for(int k=0;k<numbers.length-2;k++){//3 int p=(o+k+1)%6; prints(numbers[i],numbers[o],numbers[p]); for(int l=0;l<numbers.length-3;l++){//4 int q=(p+l+1)%6; prints(numbers[i],numbers[o],numbers[p],numbers[q]); for(int m=0;m<numbers.length-4;m++){//5 int r=(q+m+1)%6; prints(numbers[i],numbers[o],numbers[p],numbers[q],numbers[r]); for(int n=0;n<numbers.length-5;n++){//6 int s=(r+n+1)%6; prints(numbers[i],numbers[o],numbers[p],numbers[q],numbers[r],numbers[s]); } } } } } } private void prints(int... num){ for(int i=0;i<num.length;i++){ System.out.print(num[i]); } } }

  • Javaのエラーの箇所

    (絶っっ対、無理)。 そんな無茶な教授から宿題が出ました。 しかも大急ぎです(後二時間しかない…)。 どうかどこにどんなエラーが出るのか教えて下さい。 For the declaration of I1: interface I1{ int I1f1(); void I1f2(int i); } identify the errors. (a) in the declaration of the interface I2: interface I2 extends I1{ double I2f1(); void I2f2(); int I1f1(); double I2f1(){return 10;} private int AC1f4(); private int n=10; } (b) in the declaration of class CI1: class CI1 implements I1{ int I1f1(){.....} void I1f2(int i){.....} int CI1f3(){.....} } (c) and in the declaration of object c6: I1 c6 = new I1(); 勘ですが、(a)はinterface I1がpublicと宣言されてないので (a)の中の int I1f1(); が呼べないのでしょうか? (b)と(c)はまったく分かりません。

    • ベストアンサー
    • Java
  • LU分解を利用した逆行列のプログラム(Java)

    LU分解を利用した逆行列のプログラムが作れません… というか、作ったのですが実行するとエラーが出てしまいます(´Д`;) どこをどう直せばいいか、もしくはこのようにプログラムした方が効率がよい などのアドバイスどなたか下さい double a[][]={{2,5,4}, {2,3,-1}, {6,9,28}}; int N=a.length; double[][] s=new double[N][N]; for(int k=0; k<a[0].length-1; k++){ for(int i=k+1; i<N; i++){ s[i][k]=a[i][k]/a[k][k]; a[i][k]=s[i][k]; for(int j=k+1; j<N; j++){ a[i][j] -= s[i][k] * a[k][j]; } } } double[][] y=new double[N][N]; double[][] X=new double[N][N]; double[][] e=new double[N][N]; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(i==j){ e[i][j]=1; }else{ e[i][j]=0; } } } for(int i=0;i<N;i++){ y[1][i]=e[1][i]; for(int k=2;k<=N;k++){ for(int j=1;j<=N;j++){ y[k][i]=e[k][i]-s[k][j]*y[j][i]; } } X[N][i]=y[N][i]/a[N][N]; for(int k=N-1;k>=1;k--){ for(int j=k+1;j<=N;j++){ X[k][j]=(y[k][j]-s[k][j]*X[j][i])/a[k][k]; } } } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ System.out.printf(" %6.5f ", X[i][j] ); } System.out.println(""); }

  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java

専門家に質問してみよう