• 締切済み

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 … どなたかアドバイス頂けますでしょうか? よろしくお願い致します。

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

みんなの回答

  • 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

  • appletを使ったJavaプログラミング

    Java初心者なのですが、ランダムユニークナンバーをarrayに代入し、長方形の高さが全て違う様に表記したいのですが、全く表記出来ません。 おそらく、arrayに代入する時点までは大丈夫だとは思うのですが、どのようにしたら長方形に高さを代入してappletで表記出来るのでしょうか? 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()*21)+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 += 15; 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++; } } public void init() { setSize(500, 350); setBackground(Color.WHITE); add(button); add(text); button.addActionListener(new buttonHandler()); } int c = 0; public void paint(Graphics g) { 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/SortsWithButton.html どうしたら良いのかどうしても分かりません。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • C++のポインタの動作を教えてください

    ちょっと長いですが、ある部分の動作がわかりません そこを詳しく教えてください。 void queue::store(int i)の//リスト末尾に置くっていうところからで なぜ、if(tail)tail->next=item; tail=item; こう書くのかわからないです。 tail->next=itemの次にtail=itemを実行すると、tail->nextの内容も変わるのでは?と思っているのですがどうなっているのかわからないのでお願いします。 説明が下手ですがすみませんが教えてください。 //仮想関数の実例 #include <iostream> #include <cstdlib> #include <cctype> using namespace std; class list{ public: list *head; //リスト先頭へのポインタ list *tail; //リスと末尾へのポインタ list *next; //次項目へのポインタ int num; //格納される値 list(){ head=tail=next=NULL; } virtual void store(int i)=0; virtual int retrieve()=0; }; //キュー型リストの作成 class queue:public list{ public: void store(int i); int retrieve(); }; void queue::store(int i) { list *item; item=new queue; if(!item){ cout << "メモリ割り当てエラー" << endl; exit(1); } item->num=i; //リスト末尾に置く if(tail)tail->next=item; tail=item; item->next=NULL; if(!head)head=tail; } int queue::retrieve() { int i; list *p; if(!head){ cout << "リストは空です" << endl; return 0; } //リスト先頭から取り除く i=head->num; p=head; head=head->next; delete p; return i; } //スタック型リストの作成 class stack:public list{ public: void store(int i); int retrieve(); }; void stack::store(int i) { list *item; item=new stack; if(!item){ cout << "メモリ割り当てエラー" << endl; exit(1); } item->num=i; //スタックのような操作になるよう、リスト最前部におく if(head)item->next=head; head=item; if(!tail)tail=head; } int stack::retrieve() { int i; list *p; if(!head){ cout << "リストは空です" << endl; return 0; } //リスト先頭から取り除く i=head->num; p=head; head=head->next; delete p; return i; } class sorted:public list{ public: void store(int i); int retrieve(); }; void sorted::store(int i) { list *item; list *p,*p2; item=new sorted; if(!item){ cout << "メモリ割り当てエラー" << endl; exit(1); } item->num=i; //次項目のおき場所を見つける p=head; p2=NULL; while(p){ //中へ if(p->num>i){ item->next=p; if(p2)p2->next=item; //先頭要素ではない if(p==head)head=item; //新しい先頭要素 break; } p2=p; p=p->next; } if(!p){ //終わりへ if(tail)tail->next=item; tail=item; item->next=NULL; } if(!head)//先頭要素 head=item; } int sorted::retrieve() { int i; list *p; if(!head){ cout << "リストは空です" << endl; return 0; } //リスト先頭から取り除く i=head->num; p=head; head=head->next; delete p; return i; } int main() { list *p; //キューのデモ queue q_ob; p=&q_ob; //キューをさす p->store(1); p->store(2); p->store(3); cout << "キュー:"; cout << p->retrieve(); cout << p->retrieve(); cout << p->retrieve(); cout << endl; //スタックのデモ stack s_ob; p=&s_ob; //スタックをさす p->store(1); p->store(2); p->store(3); cout << "スタック:"; cout << p->retrieve(); cout << p->retrieve(); cout << p->retrieve(); cout << endl; //ソート済みリストのデモ sorted sorted_ob; p=&sorted_ob; p->store(4); p->store(1); p->store(3); p->store(9); p->store(5); cout << "ソ\ート:"; cout << p->retrieve(); cout << p->retrieve(); cout << p->retrieve(); cout << p->retrieve(); cout << p->retrieve(); cout << endl; return 0; }

  • C言語の穴埋め問題です

    配列に初期化されたデータの中から最小値を求めるプログラムなのですが、■■■を教えて頂けないでしょうか? #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int min(int *p , int n); int main(void) { int data[N] = {15,34,28,12,33}; printf("最小値は%d\n" , ■■■); } int min(int *p , int n) { int min; //最小値 int i; //カウンタ min = *p; for(i = 1 , ■■■; i < n; i++ , ■■■){ if (min >■■■ ){ min =■■■ ; } } return ■■■; }

  • 小さい順に並べ替えるプログラム

    コンピュータに10個のてきとうな数字を入力させ それを、小さい順に並べ替えるプログラムです。 以下のようにしたのですが、エラー0 警告0 なのに動きません。 どこが違うのでしょうか? #include<iostream> #include<cstdlib> #include<ctime> using namespace std; const int NUM_ELEMENTS=10; void sort(int*); void generation(int*); void exchange(int&,int&); void sort(int* a){ int min, locate, i, j; for(i=0; i<NUM_ELEMENTS-1; i++){ min = a[i]; locate = i; for(j=i; j<NUM_ELEMENTS; j++){ if(min > a[j]){ min = a[j]; locate = j; } } exchange(a[i],a[locate]); } } void generation(int* a){ int i; srand(time(NULL)); for(i=0; i<NUM_ELEMENTS; i++){ a[i] = rand(); } } void exchange(int& a,int& b){ int t; t=a; a=b; b=t; } int main(){ int data[NUM_ELEMENTS]; generation(data); sort(data); return 0; }

  • プログラミング・C言語の配列(単純選択ソート)についてです

    最近プログラミングを勉強し始めた初心者です。 今、配列について勉強していて あるプログラムを作成しています。 それは10個の実数を入力して、入力された実数を降順に並び替えるものなのですが、 降順に並び替えることができません(泣 どこが違うのか教えていただきたいのですが・・・ よろしくお願いします。 #include <stdio.h> #define NUMBER 10 int main(void) { int i, j, min, min_a, temp; double zissu[NUMBER]; printf("%d個の実数を入力してください", NUMBER); min=i; printf("date[%d]:", i); scanf("%lf", &zissu[i]); for(j=i+1; j<NUMBER; j++) { if(zissu[j] < zissu[min]) min_a =j; } temp = zissu[min]; zissu[min] = zissu[min_a]; zissu[min_a] = temp; } for(i = 0; i < NUMBER; i++) printf("date[%d]=%lf \n", i, zissu[i]); return (0); } 【入出力例】 10個の実数を入力してください data[0]:24.2 data[1]:2 ・・・ data[9]:9 降順にソートしました data[0] = 2 data[1] = 9 data[2] = 24.2 ・・・ みたいにしたいのです。 よろしくお願いします

  • プログラミングのポインタの所の課題で、途中までやったのですが・・・

    プログラミングのポインタの所の課題で、途中までやったのですが・・・ どうしてもとけません。どなたか解けるかた、ご指導お願いします。。。 課題は以下の通りです。 1.文字配列の先頭文字でソートを行って出力するプログラムを完成させよ。ただし、my_sort_stringsはポインタ配列とその要素数を引数として、登録されている文字配列を昇順に並べ替える関数である。 #include<stdio.h> #include<string.h> void print_strings(char **p, int n); void swap_strings(char **p, int i, int j); int min_index(); void my_sort_strings(); int main() { char*p[100]; char Orange[] = "orange"; char Apple[] = "apple"; char Peach[] = "peach"; char Grape[] = "grape"; char Melon[] = "melon"; int i; p[0] = Orange; p[1] = Apple; p[2] = Peach; p[3] = Grape; p[4] = Melon; print_strings(p, 5); my_sort_strings(); print_strings(p, 5); return 0; } void print_strings(char **s, int n) { int i; printf("-----------begin: print_string ----------\n"); printf("print_string: s's value: %08x\n", s); for(i = 0; i < n; i++) { printf("(s[%d])'s value: %08x\n", i, s[i]); printf("(s[%d])'s address: %08x\n", i, &s[i]); } for(i = 0; i < n; i++) printf("%d: %s\n, i, s[i]"); printf("-----------end: print_strings-----------\n"); } void swap_strings(char **p, int i, int j) { char *tmp; tmp = p[i]; p[i] = p[j]; p[j] = tmp; } int min_index(char **a, int n) { } void my_sort_strings( ) { } 2.課題1を元に文字配列の2文字目以降の順序まで考慮した辞書式順序でソートを行うプログラムを作成せよ。関数名はlexicographic_sortとする。

  • この問題を教えてください

    配列に初期化されたデータの最小値を求めるプログラムなのですが この問題のX,Yの部分がわかりません 教えて頂けないでしょうか? #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int min(int *p , int n); int main(void) { int data[N] = {15,34,28,12,33}; printf("最小値は%d\n" ,X); } int min(int *p , int n) { int min; //最小値 int i; //カウンタ min = *p; for(i = 1; i < n; i++){ if (min >Y ){ min = Y; } } return min; }

  • ポインターを使った並べ替え

    ポインタを用いてソートを行うプログラムを作成しています しかし、関数部分が悪いのか、上手く作動されません よろしければ、アドバイスをいただけると嬉しいです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, *last, t; last=a+n; for(i=a; i<last; i++){ min=a; for(i=a+1; i<last; i++) if(*i<*min) min=i; t=*min; *min=*i; *i=t; } } main(){ int *a, i; a=(int*)calloc(MAX,sizeof(int)); for(i=0; i<MAX; i++) a[i]=rand()%RandMax; select_sort(a, MAX); printf("data size=%d \n", MAX); for(i=0; i<MAX; i++){ printf("%5d", a[i]); if(i%10==9) printf("\n"); } } 以上が私の作成したプログラムです よろしくお願いします

  • C言語でわからない問題があります

    下のプログラムのXXXの値なのですが、何を返すのかがわかりません プログラム(1)と(2)では、処理にどういう違いがあるのでしょうか、できれば教えてください プログラム(1) #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int min(int *p , int n); int main(void){ int data[N] = {15,34,28,12,33}; int index; //最小値の位置 index = min(data,N); printf("最小値はdata[%d]で%d\n" , index, data[index]); } int min(int *p , int n){ int *pmin; //最小値のアドレス int i; //カウンタ pmin = p; for(i = 1; i < n; i++){ if (*pmin > *(p+i)){ pmin = p+i; } } return XXX; } プログラム(2) #include <stdio.h> #define N 5 //関数のプロトタイプ宣言 int *min(int *p , int n); int main(void){ int data[N] = {15,34,28,12,33}; int *p; //最小値の位置 p = min(data,N); printf("最小値は%d\n" , *p); } int *min(int *p , int n){ int *pmin; //最小値のアドレス int i; //カウンタ pmin = p; for(i = 1; i < n; i++){ if (*pmin > *(p+i)){ pimn = p+i; } } return pmin; }

  • プログラミングに関して

    多数省略しておりますが今このような双六をプログラミングしているのですが位置、所持金情報が上手く更新されず、上手くいかなくて困ってます。 どうすればいいでしょうか?教えてください。お願いします。 //メイン関数 int main(void){ printf("map説明 s:start,c:chance,$:money,!:振り出しに戻る,G:goal\n"); int position=0,money=500; do{ do_turn(position,money); }while(money<<0 || position==15); if(money<<0){ printf("gameover"); } } //イベント作成 void do_event(int position,int money) { int number; number=position; switch(number) { case 1:printf("チャンスタイム\n"); game1(money); break; case 2:printf("game2"); game2(money); break; case 3: printf("100Gを手に入れた"); money += 100; break; //マップ作成 void print_map(int position) { int i; for( i = 0; i <= position + 5; i++ ) { printf("%3d|",i); if(position==i){ printf("●|"); } else if(!(position==i)){ printf("○|"); } printf(" %c\n",event_name[i]); } return ; } void do_turn(int position,int money){ int me,go,energy; double z, R15=RAND_MAX+1; srand ((unsigned int) time(NULL)*314159265); z = rand() / R15; me = (int)(z*3) + 1; print_map(position); printf("現在の所持金:%dG\n",money); wait_enter(); printf("\nエネルギーを選んでください\n"); printf("1.ウコンの力 100G 2.ユンケル 200G\n"); scanf("%d",&energy); if(energy==1){ money-=100; if(me==1 || me==3) go=1; else if(position==14) go=1; else if(me==2) go=2; position+=go; printf("%d進みます\n",go); } else if(energy==2){ money-=200; if(me==1 || me==3) go=2; else if(position==14) go=1; else if(me==2) go=1; position+=go; printf("%d進みます\n",go); } print_map(position); do_event(position,money); printf("%d,%d",position,money); wait_enter(); system("pause"); } //ゲームを行う関数(じゃんけんゲーム) void game1(int money){ int comp,you; double r15=RAND_MAX+1; char* s[3]; s[0]="グー";s[1]="チョキ";s[2]="パー"; srand((unsigned int) time(NULL)*314159265); printf("じゃんけんをします勝てばお金が1.5倍に、負ければ半額を頂きます\n"); while(1){ comp=(int)(rand()/r15*3)+1; printf("1:グー、2:チョキ、3:パー ?..."); scanf("%d",&you); printf("あなたは%s,わたしは%s\n",s[you-1],s[comp-1]); if(you==comp)printf("あいこ"); else if((you+3-comp)%3==2){ printf("おめでとう、あなたの勝ち。お金が1.5倍になります\n"); money=money+money/2; break; } else{ printf("残念。あなたの負けです。お金は頂きます\n"); money=money/2; break; } } printf("所持金%dG\n",money); }

専門家に質問してみよう