• 締切済み

appletを使ったプログラミング2

前回も違う質問をさせて頂いたのですが、bubble sortとselection sortを ボタンを押す事によって順次長方形を左から右に動かしたいのですが、 どのようにしたら良いのか止まってしまいました。 import java.awt.*; import java.applet.*; import java.awt.event.*; import java.util.Random; import java.io.*; public class GUI extends Applet { public void update(Graphics g) { paint(g); } Button button = new Button("Sort Me"); Label text = new Label("Pink: Selection Sort" + "\n" + "Green: Inseration Sort"); int[] store = new int[20]; public static int[] findValue(int [] store){ int rand; for (int i = 0; i < store.length; i ++){ do{ rand = (int)(Math.random()*51)+10; } while(doesExists(rand, store, i)); store[i] = rand; } return store; } private static boolean doesExists(int rand, int[] arr, int i){ if(i != 0){ for(int j =0; j < i; j++){ if(rand == arr[j]){ return true; } } } return false; } int Counter = 0; int xScale = 0; public void displayRectangles(Graphics g) { if(Counter < 20) { xScale += 12; int x = 80 + xScale; int H = store[Counter]; g.setColor(Color.pink); g.fillRect(x, (140 - H), 10, H); g.setColor(Color.green); g.fillRect(x, 140, 10, H); Counter++; } } private void Rectangles(int xScale, int y, int W, int Counter){ this.xScale = xScale; this.Counter = Counter; } public void setxScale(int xScale){ this.xScale = xScale; } public void setCounter(int Counter){ this.Counter = Counter; } public int getxScale(){ return xScale; } public int getCounter(){ return Counter; } public void selectionSort(int[] list){ int min,temp; int n = list.length; for(int p = 0; p < n-1; p++){ min = p; for (int i = p+1; i < n; i++){ if (list[i]<list[min]) min = i; if (p != min){ temp = list[p]; list[p] = list[min]; list[min] = temp; } } } } public void insertionSort (int[] list){ int i,temp; int n = list.length; for(int k = 1;k < n; k++){ temp = list[k]; i = k; while (i > 0 && temp < list[i-1]){ list[i] = list[i -1]; i--; } list[i] = temp; } } public void init() { setSize(500, 350); setBackground(Color.WHITE); add(button); add(text); button.addActionListener(new buttonHandler()); store = findValue(store); } int c = 0; public void paint(Graphics g) { //scrambleRectangles(store); // scrambled array will be newStore[] c++; displayRectangles(g); if(c < 20) { repaint(); } } int count = 0; class buttonHandler implements ActionListener{ public void actionPerformed(ActionEvent e){ count ++; button.setLabel("pass " + count); if(e.getActionCommand()=="pass") repaint(); } } } 最終形は以下のリンクの様にしたいのですが、どのようにしたら良いのか分かりません。 http://hills.ccsf.cc.ca.us/~cconner/Java/Sorts/S … どなたかアドバイス頂けますでしょうか? よろしくお願い致します。

みんなの回答

  • cpen
  • ベストアンサー率58% (18/31)
回答No.1

前回と同じように、書いたメソッドを呼んでないので、それではもちろん動かないでしょう。 ボタン押したら、sortしたい。で、ボタン押したら呼ばれるコードはbuttonHandlerのactionPerformedメソッド、だけどそのメソッドの中でそれぞれのソートのメソッドを呼んでない。 ただし、今のままではそうしても正しく動作しません。なぜなら、ランダムな数で埋めた配列が1つしかないから。 アルゴリズムの動作を比較するためには同じ数で埋めた配列がアルゴリズムの数だけ必要だけど、今はstoreという一つだけの配列しか作ってないですよね。 そして、それ以外にコメント 0)クラス、変数とメソッドの名前は「意味」があるものにしないと理解しにくいです。 例、GUIなんてgenericな名前ではなくSortDemoAppletみたいな名前にする。 int[] findValue(int[] store) ではなく void fillWithRandomValues(int[] store) か int[] getRandomValues() にする。 GUI用のメソッドでx,Hとかなら分かりますけど、cだとかCounterだとか、意味が分からない。 コード書くときは、人に理解できるように書かないと、時間が経ったら書いた自分ですら意味が分からなくなりますよ。 それに、読む人に必要のないことを考えさせてイラつかせて、自分がわざわざ説明しなくてはいけないかもしれないと考えると面倒でしょう(笑) 1)findValueでは "store"の参照を直接変更しているので,そうしたいのなら、"store"を戻す必要がない。 2)コードには全く関係ありませんが、doesExistsではなく、正確にはdoesExistが文法的には正しいです。 そして、今気づいたんですけど、GUIのコードが正しく動作してませんね。まずは、↑のリストを基にコードをキレイに分かりやすいように書き直してください。 そして、具体的にどう正しく動作してないのか、ちゃんと考えてから質問してください。 厳しいこと言うようですが、これくらいの単純なプログラムのことで自分で考えないで「正しく動作しません、アドバイスください」なんて言ってるようだとプログラミング一生上手くなりませんよ。せめて、「多分、これが原因でこの部分が誤作動してると思う」くらいは書けるように、質問する前に考えてみてください。そうすれば、いずれ、質問しなくても直し方が見えてくるようになるでしょう。

6usagi9
質問者

お礼

ご丁寧なご回答ありがとうございます。 すみませんでした。 友達と一緒に作っていて、assignmentで表示されたクラス名を既に使っていたので、ダミーでクラス名を付けていました。そしておっしゃる様にdoesExistでtypoでした。 Assignment内容をしっかり読めれば良いのですが、読解力不足があり、いまいち分からない部分が多いのも事実です。instructorともやりとりしているのですが、onlineのクラスでメールを送っても返って来るのが数日後になるので、ストップしてしまい、ここで色々質問してしまいました。 そうですね、私自身も分からない状態でやっているのも事実です。日本語のテキストを日本に帰った時に探して再度ちゃんと読み込んで勉強したいと思っています。 今日、学校にtutorが居るので、その人に再度聞いてみます。 ありがとうございました。

関連するQ&A