- ベストアンサー
Java Appletでの虫食い算での質問
- Java Appletで作成された虫食い算プログラムが正常に動作しない問題について相談したいです。
- プログラム内の特定の条件を満たす穴埋めされた部分の数を求める虫食い算プログラムがありますが、結果が期待通りに表示されません。
- 指摘やアドバイスをいただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Event; import java.awt.Font; import java.awt.Graphics; import java.awt.Panel; import java.applet.Applet; /* 元のをベースにしたもので、本来はもっと改良できるはず。 なのでまだ締め切らない方が良いかと */ public class musikuizan_1 extends Applet { public int A, B; public int cnt; public int sub(int n,int m) { int i; for (i=1; i<=m; i++)/* 終了条件を変更 */ { n /= 10; } return n % 10; } public void puzzle() { int a; int b; int c; int d; int e; for (a=1; a<=99; a++) { for (b=1; b<=99; b++) { c = a * (b % 10); d = a * (b / 10); e = a * b; if (c>=100 && c<=999 && d>=10 && d<=99 && e>=100 && e<=999) /*桁数調整*/ { if (sub(b,1)==3 && sub(c,1)==1 && sub(d,1)==8) /*穴埋めされてある部分の数*/ { A = a; B = b; cnt++; } } } } } public void init() { setBackground(new Color(150,180,200)); setLayout(new BorderLayout()); Panel psouth = new Panel(); psouth.add(new Button("実行")); add("South", psouth); } public void paint(Graphics g) { int i, c, d, e; for (i=1; i<=2; i++) { g.drawRect(97-i*20, 5,16,16); g.drawRect(97-i*20,25,16,16); g.drawRect(77-i*20,65,16,16); } for (i=1; i<=3; i++) { g.drawRect(97-i*20,45,16,16); g.drawRect(97-i*20,85,16,16); } for (i=1; i<=4; i++) { g.drawLine(30,43,100,43); g.drawLine(30,83,100,83); g.setFont(new Font("Helvetica",Font.BOLD,18)); g.drawString("x",40, 40); } if (A == 0) { g.drawString("3",60, 40); g.drawString("1",60, 60); g.drawString("8",60, 80); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("cnt = ",30,115); /* デバッグ用 g.drawString("A:"+Integer.toString(A),300,300); g.drawString("B:"+Integer.toString(B),300,310); */ } else { c = A * (B % 10); d = A * (B / 10); e = A * B; g.setFont(new Font("Helvetica",Font.BOLD,18)); /* sub関数の変更に伴い、ループの開始条件・終了条件、および表示する座標の式が変化しているので注意 */ for (i=0; i<=1; i++) { g.drawString(Integer.toString(sub(A,i)),80-i*20, 20); g.drawString(Integer.toString(sub(B,i)),80-i*20, 40); } for (i=0; i<=2; i++) { g.drawString(Integer.toString(sub(c,i)),80-i*20, 60); } for (i=0; i<=1; i++) { g.drawString(Integer.toString(sub(d,i)), 60-i*20, 80); } for (i=0; i<=2; i++){ g.drawString(Integer.toString(sub(e,i)),80-i*20,100); } g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("cnt = "+Integer.toString(cnt),30,115); g.drawString("A:"+Integer.toString(A),300,300); g.drawString("B:"+Integer.toString(B),300,310); } } public boolean action(Event e, Object arg) { if (arg.toString().equals("実行")) { if (A == 0){ puzzle(); } else { repaint(); } } return true; } }
その他の回答 (3)
- himajin100000
- ベストアンサー率54% (1660/3060)
>if (sub(b,1)==3 && sub(c,1)==1 && sub(d,1)==8) /*穴埋めされてある部分の数*/ if (sub(b,1)==3 && sub(c,1)==1 && sub(d,0)==8) /*穴埋めされてある部分の数*/ 凡ミスしている自分が本気で嫌になりましたorz
お礼
本当に助かりました。 これを機に私もこれからJavaのほうを勉強していきたいと思います。 ありがとうございました。
- himajin100000
- ベストアンサー率54% (1660/3060)
何かおかしいと思ったら・・・ >実行ボタンを二度押すと 俺のコードのpuzzle();の後ろに repaint(); を入れて。一回で済むようになるから。
- himajin100000
- ベストアンサー率54% (1660/3060)
>上記のように設定したいもので ええ、ですからそういうコードを書いたのです。 このjavaのソースコードをjavacを利用してコンパイルし、 hoge.html等のobject要素から呼び出し、 実行ボタンを二度押すと 2 9 * 3 4 ------- 1 1 6 8 7 ------- 9 8 6 という答えが出ますよ 。 ただし、 実際に探す時に if (sub(b,1)==3 && sub(c,1)==1 && sub(d,1)==8) /*穴埋めされてある部分の数*/ { A = a; B = b; cnt++; } ということで上書きしてしまっているため cnt = 2 でも 答えは1つしか表示されてないですけどね。(全てが表示されるわけではない) #N桁 * M桁で自動クイズ生成のためのコード書いてみようかと思って挫折しました。
お礼
なるほどです。。。 ほんとにわざわざご回答していただきありがとうございます。
お礼
ご回答ありがとうございます。 申し訳ないですが □には一つの数字が入る。 最上位の□には0は入らない。 □□ ×3□ ------ □1□ □8 ----- □□□ 課題:□に入る数を求めなさい。 上記のように設定したいもので説明不足で申し訳ないです。。。