【初心者】Java の宿題ここで答えます 5.0【歓迎】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
【Java宿題スレッド基本ルール 五箇条のご誓文】

1. 問題文は自己省略せずに、直接全部貼り付けてください。
 宿題&課題をそのまま丸投げするのが、一番好ましい提示法です。

2. 数学問題は何々法でせよだけでなく、その解を出す為の数式を
 具体的に詳細に説明してください。

3. 宿題&課題とその回答プログラムに対する質問はOKですが、
 それ以外の質問はここではしないでください。

4. JavaScriptなど、他言語の課題はやめてください。

5. もし自分の提示課題への回答プログラムが返って来たら、
 動いた動かなかった位の返レスをお願いします。

throws
コードはwikiに貼り付けてはいけません。
512kエラーなどなかったことにします。

【前スレ】
【好調】Java の宿題ここで答えます【三巡目】
http://pc5.2ch.net/test/read.cgi/tech/1100565043/

【関連サイト】
2ch Java初心者質問スレ Wiki
2デフォルトの名無しさん:05/02/02 22:20:35
【関連サイト】
2ch Java初心者質問スレ Wiki
http://www.wikiroom.com/java/

..
3デフォルトの名無しさん:05/02/02 22:26:51
String型配列をChar型配列に変換する方法を教えてください
4デフォルトの名無しさん:05/02/02 22:30:10
>>3
Stringをchar[]?
String[]をchar[]?
String[]をchar[][]?
5デフォルトの名無しさん:05/02/02 22:33:04
String[]をchar[]です
6デフォルトの名無しさん:05/02/02 22:36:28
>>5
StringBufferでつなげてからtoCharArray()すれば?
7デフォルトの名無しさん:05/02/02 22:39:56
>>5
String str[] = {…};
char array[];
StringBuffer sb = new StringBuffer(1000);
for(int i = 0; i < str.length;i++)
sb.append(str[i]);

array = sb.toString().toCharArray();
8デフォルトの名無しさん:05/02/02 22:40:59
やってみます。ありがとうございます
9デフォルトの名無しさん:05/02/02 22:50:05
というか質問スレに…。
10デフォルトの名無しさん:05/02/02 23:00:30
>>1
なんで5.0なんだよ…。
11デフォルトの名無しさん:05/02/02 23:21:06
できました。ホントにありがとうございます
12デフォルトの名無しさん:05/02/02 23:31:45
>>10
いくつならいいんだー
13デフォルトの名無しさん:05/02/02 23:43:20
簡易エディタをJavaの勉強のためにつくっています。
カット、コピー、ペーストまではできたのですが、以下が手も足もでませんでした。

「ctrl-a」を「行頭に移動」 に割り当てる。
「ctrl-space」を「マーク設定」 に割り当てる。
マーク設定後はキャレットが移動すると、
その設定したマークから現在のキャレットまでが選択される。

キャレットがらみのアクションをどうかけばよいかサッパリわからないのです。
どなたかお願い致します。。
14デフォルトの名無しさん:05/02/02 23:47:02
>>13
お願いだから質問は質問スレでしてよ。
15デフォルトの名無しさん:05/02/02 23:47:53
うちの学生みっけwww
16デフォルトの名無しさん:05/02/03 00:09:57
この5.0とやらはTigerのことを意味しているのか?
登場してからまだ半年も経っていないのにJava5の宿題がもう沢山出るほどになったのか?
17デフォルトの名無しさん:05/02/03 00:14:04
>>14
質問スレでしたのですが、みんなわからないのかスルーされっぱなしだったので・・
両方みているかぎり、こちらのほうが親切でレベル高い人が多そうに思えたので。
間違いでしたらすみません。
またほかのところで聞いてきます。
181:05/02/03 01:05:14
>>16
no-
スレッドのバージョンです。
Tigerにもかかってていいかなとは思ったけど。
191:05/02/03 01:10:24
>>13
KeyEventとかJTextAreaとかJTextComponentとかAPIリファレンスを参照すれば、
自分で出来ると思いますよ。
20デフォルトの名無しさん:05/02/03 06:54:06
>>17
親切に見えるのは問題文が明確になってるから答えやすいだけ。
答える人間はたぶんどっちのスレも見てるからレベルは対して変わらんと思う。
211/2:05/02/03 10:33:30
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import javax.swing.text.*;
import java.io.*;

public class MyEditor extends JFrame{
Container myContainer;
JTextPane myTextPane;

public static void main(String[] args){
MyEditor myApp = new MyEditor( "( New File )" );
myApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myApp.setVisible(true);
}
222/2:05/02/03 10:34:51
MyEditor(String title){
super( title );
setBounds( 10, 10, 800, 500 );

myContainer = this.getContentPane();
myContainer.setLayout(new BorderLayout());

myTextPane = new JTextPane();

InputMap inputMap = myTextPane.getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW );
ActionMap actionMap = myTextPane.getActionMap();

KeyStroke moveLineStartKey = KeyStroke.getKeyStroke( "ctrl A" );
inputMap.put( cutKey, moveLineStartAction );
actionMap.put( moveLineStartAction, moveLineStartAction );
}

class MoveLineStartAction extends AbstractAction{
MoveLineStartAction( String text ){ super(text); }
public void actionPerformed( ActionEvent e ){
????
}
}
}
2317:05/02/03 10:40:03
↑これで、ctrl-aで行頭まで移動というのを実装しようと思いました。

ソースの最後の方の、????の部分にCaretクラスのmoveDotというメソッドで、
改行にマッチするまでmoveDot(-1)を繰り返すというようにしたいのですが、
myTextPane.moveDot(-1)はダメですよね。

自分は継承とかアクションとかがそもそもあまりよく分かっていないのだと思います。
C言語になれていていつでもどこでも関数使いたいんですが・・。
もしよろしければ作ってみてください。

スレ汚しすいませんでした。
2423:05/02/03 19:19:29
ごめんなさい。できました。
25デフォルトの名無しさん:05/02/03 19:42:46
62*75*84*42*93*88*69*79*69*72
上記の十人のテストの成績をwhieを用いず、二通りの方法を考え、それぞれ成績の良いものから順に並び替えて表示させよ。
26デフォルトの名無しさん:05/02/03 20:45:07
forを使う
27デフォルトの名無しさん:05/02/03 21:31:09
forの条件の部分がわからないのですが…
28デフォルトの名無しさん:05/02/04 01:34:59
>>25
public class TestSort {
public static void main(String[] args) {
int[] points = { 62,75,84,42,93,88,69,79,69,72 };

for (int i = 100; i >= 0; i--) {
for (int j = 0; j < points.length; j++) {
if (i == points[j]) {
System.out.println(points[j]);
}
}
}
}
}
2928:05/02/04 01:35:56
イヒ
30デフォルトの名無しさん:05/02/04 02:40:58
前レス
>>927
(音楽サーチ)
http://www.wikiroom.com/java/?%A5%BD%A1%BC%A5%B9%C5%BD%C9%D5%A4%B1
に回答例を貼っときました。

半角空白、全角空白で区切った複数キーワードに対応してます。
検索&再生できるフォーマットはMIDIだけです・・・
アクセスに時間がかかるサイトなどでは、アクセス中止ボタンを押すと
アクセスを中断できます。
真ん中のテキストエリアの情報をよく見て操作してください。

取り合えず動作例としては、「クラシック音楽の部屋」で検索して
みてください。
31デフォルトの名無しさん:05/02/04 03:03:33
プロトコルを設計し、実際にプログラムを用いて動作を確認せよ。
題材として、一行掲示板(ログ付きのチャットと読み替え可)を作成する。
 クライアントの認証機能を付ける
 サーバは書き込まれた内容を管理する
以上が必須項目です。

これだけしか制限はないのですが流れは、
 ログイン(ここで認証?)
 書き込みかログの読み込みの選択
 ・書き込み
 ・読み込み
 ログアウト
のような感じだと思います。

簡単なもので構わないと思うのですが、
Java未経験なので何をしたら良いのか見当がつきません。
どなたか作って頂けませんでしょうか・・・
どうかよろしくお願いします。
3231:05/02/04 03:09:01
すみません。
土曜日の夜までにお願いします
33デフォルトの名無しさん:05/02/04 07:16:54
>>31
それホントに宿題なの?Java未経験でそんな宿題なんて・・・
34デフォルトの名無しさん:05/02/04 07:49:57
プロトコル設計しろって書いてあるから
サーブレットじゃなくてJavaアプリだよね
35デフォルトの名無しさん:05/02/04 07:58:06
出たのいつだよ('A`)
36デフォルトの名無しさん:05/02/04 11:36:57
25のでwhieを使うとどんなプログラムになるのでしょうか?
3731:05/02/04 16:06:00
>>33
本当は言語は自由なんですが、途中までJavaでやってみたんです。
サーバとクライアントを繋げるのはネットで見つけたんですけど、
その先がわからなくて・・・
過去ログにあった、チャットを使うことってできますか?

>>34
プロトコルがいまいち分からないんですけど、
レポートにアルゴリズムとかやり取りを書けば良いみたいです。

>>35
出たのは結構前なんです・・・
38デフォルトの名無しさん:05/02/04 17:59:14
>>37
>出たのは結構前なんです・・・
便秘ですか?
39デフォルトの名無しさん:05/02/04 23:53:25
>>36
難しくて解けません
40デフォルトの名無しさん:05/02/05 02:34:10
41>>31 その1:05/02/05 03:15:49
import java.io.*;
import java.util.*;
import java.util.regex.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
public class HW76 implements HtmlText {
private static final String HOST = "http://localhost";
private static final String PORT = ":80/";
private static final Map MEMBER = new TreeMap() {
{
put("田中", "tanaka");
put("鈴木", "suzuki");
put("佐藤", "satou");
put("高橋", "takahashi");
put("山田", "yamada");
}
};
private static Map partic = Collections.synchronizedMap(new TreeMap());
private static List chatLog = new ArrayList();
public static void main(String[] args) {
Selector sel;
try {
sel = Selector.open();
ServerSocketChannel sv = ServerSocketChannel.open();
sv.configureBlocking(false);
sv.socket().bind(new InetSocketAddress(80));
sv.register(sel, SelectionKey.OP_ACCEPT);
sv = ServerSocketChannel.open();
sv.configureBlocking(false);
sv.socket().bind(new InetSocketAddress(90));
sv.register(sel, SelectionKey.OP_ACCEPT, new Object());
42>>31 その2:05/02/05 03:16:31
} catch (Exception e2) {
System.out.println("サーバーバインドエラー");
return;
}
loop: while (!sel.keys().isEmpty()) {
try {
if (sel.selectNow() == 0)
continue;
} catch (Exception e1) {
continue;
}
Iterator it = sel.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
Channel ch = key.channel();
if (ch instanceof ServerSocketChannel) {
if (key.attachment() != null)
break loop;
try {
ServerSocketChannel sc = (ServerSocketChannel) ch;
SocketChannel cc = sc.accept();
cc.configureBlocking(false);
cc.register(sel, SelectionKey.OP_READ);
} catch (Exception e) {
}
} else {
SocketChannel cc = (SocketChannel) ch;
if (key.readyOps() == SelectionKey.OP_READ)
processRead(key, cc);
else
processWrite(key, cc);
}
43>>31 その3:05/02/05 03:17:42
it.remove();
}
}
Iterator it = sel.keys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
try {
key.channel().close();
} catch (IOException e) { }
}
try {
sel.close();
} catch (IOException e) { }
System.out.println("サーバー終了");
}
private static void processRead(SelectionKey key, SocketChannel cc) {
try {
ByteBuffer bb = (ByteBuffer) key.attachment();
if (bb == null)
bb = ByteBuffer.allocate(1000);
if (cc.read(bb) != -1 && bb.remaining() == 0)
return;
block: {
ByteBuffer value = ByteBuffer.wrap(new byte[] { 0x0d, 0x0a, 0x0d, 0x0a });
byte[] array = bb.array();
for (int i = 0; i + 4 < array.length; i++) {
if (value.equals(ByteBuffer.wrap(array, i, 4)))
break block;
}
return;
}
44>>31 その4:05/02/05 03:18:22
ByteBuffer buf = controlAccess(bb);
key.attach(buf);
key.interestOps(SelectionKey.OP_WRITE);
} catch (Exception e3) {
}
}
private static void processWrite(SelectionKey key, SocketChannel cc) {
try {
ByteBuffer bb = (ByteBuffer) key.attachment();
try {
cc.write(bb);
} catch (Exception e) {
}
if (bb.remaining() == 0) {
try {
cc.close();
} catch (IOException e3) {
}
key.cancel();
}
} catch (Exception e) {
}
}
private static ByteBuffer controlAccess(ByteBuffer bb) throws Exception {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(bb.array()));
String line = in.readLine();
String[] token = line.split(" ");
String path = token[1];
String id = "", enter = "", leave = "", text = "";
Matcher mat = Pattern.compile("^/(\\w+)").matcher(path);
45>>31 その5:05/02/05 03:19:04
if (mat.find())
id = mat.group(1);
mat = Pattern.compile("enter=([^\\&]+)").matcher(path);
if (mat.find())
enter = mat.group(1);
mat = Pattern.compile("leave=([^\\&]+)").matcher(path);
if (mat.find())
leave = mat.group(1);
mat = Pattern.compile("text=([^\\&]+)").matcher(path);
if (mat.find())
text = mat.group(1);
boolean flag = false;
String auth = "";
while ((line = in.readLine()).length() > 0) {
token = line.split(":");
if (token[0].trim().equalsIgnoreCase("Authorization"))
auth = token[1].trim();
}
StringBuffer head = new StringBuffer(), body = new StringBuffer();
String host = HOST + PORT, name = "";
if (id.length() > 0 && partic.containsKey(id)) {
name = (String) partic.get(id);
if (text.length() > 0) {
addElementToChatLog(name, text);
head.append("HTTP/1.1 303 See Other\r\n");
head.append("Location: " + host + id + "\r\n\r\n");
} else if (leave.length() > 0){
partic.remove(id);
addElementToChatLog(name + "さんが退席しました");
head.append("HTTP/1.1 303 See Other\r\n");
head.append("Location: " + host + "\r\n\r\n");
} else {
46>>31 その6:05/02/05 03:19:49
host += id;
head.append("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n");
body.append(TITLE);
body.append(FORM);
generateText(body);
flag = true;
}
} else {
if (enter.length() > 0) {
if (auth.length() > 0 && (name = authorize(auth)) != null
&& !partic.containsValue(name)) {
synchronized (HW76.class) {
id = String.valueOf(System.currentTimeMillis());
}
partic.put(id, name);
addElementToChatLog(name + "さんが入室しました");
head.append("HTTP/1.1 303 See Other\r\n");
head.append("Location: " + host + id + "\r\n\r\n");
} else {
head.append("HTTP/1.1 401 Unauthorized\r\n");
head.append("WWW-Authenticate: Basic realm=\"chat\"\r\n\r\n");
}
} else {
head.append("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n");
body.append(TITLE);
body.append(ENTER);
generateText(body);
flag = true;
}
}
47>>31 その7:05/02/05 03:20:32
String bodytxt = "";
if (flag) {
body.append(FOOT);
bodytxt = body.toString().replaceAll("#host#", host).replaceAll("#name#", name);
byte[] bodyB = bodytxt.getBytes("Shift_JIS");
head.append("Content-Length: " + bodyB.length + "\r\n\r\n");
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(head.toString().getBytes("Shift_JIS"));
out.write(bodytxt.getBytes("Shift_JIS"));
return ByteBuffer.wrap(out.toByteArray());
}
private static void generateText(StringBuffer body) {
List view = getChatLogView();
for (int i = view.size() - 1, c = 0; i >= 0 && c < 20; i--, c++) {
String[] dat = (String[]) view.get(i);
String text = TEXT.replaceAll("#name#", dat[0]).replaceAll("#text#", dat[1]);
body.append(text);
}
}
private static String authorize(String auth) {
String base64 = auth.split(" ")[1].trim();
ByteArrayOutputStream bs = new ByteArrayOutputStream();
int pos = 0;
byte buf = 0;
for (int i = 0; i < base64.length(); i++) {
char c = base64.charAt(i);
48>>31 その8:05/02/05 03:21:38
if (c >= 'A' && c <= 'Z') {
c = (char) (c - 'A' + 0 << 2);
} else if (c >= 'a' && c <= 'z') {
c = (char) (c - 'a' + 26 << 2);
} else if (c >= '0' && c <= '9') {
c = (char) (c - '0' + 52 << 2);
} else if (c == '+') {
c = (char) (c - '+' + 62 << 2);
} else if (c == '-') {
c = (char) (c - '-' + 63 << 2);
} else {
bs.write(buf);
break;
}
buf |= (byte) (c >>> pos);
if (pos + 6 >= 8) {
bs.write(buf);
buf = (byte) (c << (8 - pos));
}
pos = pos + 6 & 0x07;
}
try {
String dec = new String(bs.toByteArray(), "Shift_JIS");
String name = dec.split(":")[0].trim();
String pass = dec.split(":")[1].trim();
if (MEMBER.get(name).equals(pass)) return name;
else return null;
} catch (Exception e) {
return null;
}
}
49>>31 その9:05/02/05 03:22:19
private static List getChatLogView() {
synchronized (chatLog) {
return Collections.unmodifiableList(chatLog);
}
}
private static void addElementToChatLog(String name, String text) {
Matcher mat = Pattern.compile("%([\\dA-F]{2})|\\w+").matcher(text);
StringBuffer sb = new StringBuffer();
ByteArrayOutputStream bt = new ByteArrayOutputStream();
while (mat.find()) {
if (mat.group().matches("\\w+")) {
try {
sb.append(new String(bt.toByteArray(), "Shift_JIS"));
bt.reset();
} catch (UnsupportedEncodingException e) {
}
sb.append(mat.group());
} else {
bt.write(Integer.parseInt(mat.group(1), 16));
}
}
try {
sb.append(new String(bt.toByteArray(), "Shift_JIS"));
} catch (UnsupportedEncodingException e) {
}
synchronized (chatLog) {
chatLog.add(new String[] { name, sb.toString() });
}
}
50>>31 その10:05/02/05 03:22:54
private static void addElementToChatLog(String text) {
synchronized (chatLog) {
chatLog.add(new String[] { "情報", text });
}
}
}
interface HtmlText {
String HEAD = "<html><head><meta http-equiv=content-type content=text/html; charset=Shift_JIS>"
+ "<meta http-equiv=content-style-type content=text/css><meta http-equiv=pragma content=no-cache>"
+ "</head><body>";
String TITLE = "<div style=\"text-align: center; font: bold 16px monospace; border: solid 2px rgb(0,0,160);"
+ "background-color: rgb(200,200,255); margin: 0% 5%\">チャットシステム</div>";
String ENTER = "<center><form action=#host# method=GET><input type=submit name=enter value=参加する></form></center>";
String FORM = "<br><form action=#host# method=GET style=\"margin: 0% 5%; border: dotted 2px rgb(160,120,200);"
+ "padding: 8px 0px; text-align: center; white-space: nowrap; background-color: rgb(250,245,255);\">"
+ "<input type=submit name=post value=送信> #name#さま:<input type=text name=text size=100 maxlength=100>"
+ "<input type=submit name=leave value=退席></form><br>";
String TEXT = "<div style=\"text-align: left; font: 16px monospace; border: dashed 1px rgb(200,200,255);"
+ "background-color: rgb(250,250,255); margin: 0% 5%; padding: 4px;\">#name#:#text#</div>";
String FOOT = "</body></html>";
}
51デフォルトの名無しさん:05/02/05 03:28:39
>>31
全部コピペしてコンパイル。
実行するとポート80にチャットサーバーがバインドされます。
インターネットエクスプローラなどのブラウザで、http://localhost
にアクセスするとチャット画面がでます。
ポート90にアクセスするとサーバーが終了します。(例:http://localhost:90

名前&パスは
名前  パスワード
田中  tanaka
鈴木  suzuki
佐藤  satou
高橋  takahashi
山田  yamada
です
52>>23 その1:05/02/05 03:43:51
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
public class HW75 {
public static void main(String[] args) {
final JTextArea ta = new JTextArea();
final InputMap oldmap = ta.getInputMap();
final InputMap newmap = new InputMap() {
public String toString() {
return "myMap";
}
};
newmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "selection-forward");
newmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "selection-backword");
newmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "selection-up");
newmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "selection-down");
newmap.setParent(ta.getInputMap());
oldmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_DOWN_MASK),
"linehead");
oldmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.CTRL_DOWN_MASK),
"mark-switch");
53>>23 その2:05/02/05 03:44:28
ActionMap amap = ta.getActionMap();
amap.put("linehead", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
try {
int pos = ta.getCaretPosition();
int lineno = ta.getLineOfOffset(pos);
ta.setCaretPosition(ta.getLineStartOffset(lineno));
} catch (BadLocationException e1) {
}
}
});
amap.put("mark-switch", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
if (ta.getInputMap().toString().equals("myMap"))
ta.setInputMap(JComponent.WHEN_FOCUSED, oldmap);
else
ta.setInputMap(JComponent.WHEN_FOCUSED, newmap);
}
});
JFrame frame = new JFrame();
JScrollPane scroll = new JScrollPane(ta);
frame.getContentPane().add(scroll);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(640, 480);
frame.setVisible(true);
}
}
5431:05/02/05 04:01:15
>>41
どうもありがとうございます。
コンパイルしてみたのですが、

HW76.java:121: 警告: java.io.DataInputStream の readLine() は推奨されません。
String line = in.readLine();
^
HW76.java:139: 警告: java.io.DataInputStream の readLine() は推奨されません。
while ((line = in.readLine()).length() > 0) {

とでました。どうしたら良いですか?
あと、これはクライアントのプログラムを作ることはできないんでしょうか?
55デフォルトの名無しさん:05/02/05 07:52:07
できません
56デフォルトの名無しさん:05/02/05 12:08:02
>>54
警告ですので、実行上は何も問題ありません。そのまま実行できます。
プログラムを簡単に作る為に、あえて非推奨メソッドを用いました。
通信時の文字セットがlatin限定の時は、readLine()は何も問題ありません。
自分のレベルでは、DataInputStream#readLine()はソケット通信の時に
非常に便利ですので、あえて使ってます。

クライアントプログラムはIEなどのブラウザです。IEでアクセス
してください。
57デフォルトの名無しさん:05/02/05 12:33:59
>>1
スレ立てどうもです。
5831:05/02/05 16:47:15
>>56
実行できました。チャットも動きました
どうもありがとうございます。
59デフォルトの名無しさん:05/02/05 17:24:30
JAVA初心者です。たいした質問ではないのですが、APIとは何の略語でしょうか?
60デフォルトの名無しさん:05/02/05 17:27:29
Application Program Interface
6159:05/02/05 17:34:43
即レスありがとうございました m(_ _)m
62デフォルトの名無しさん:05/02/05 17:42:14
合ってたのか?よかったよかったw
63デフォルトの名無しさん:05/02/05 18:42:04
今日初めてJAVAに触ったヘタレでチンプンカンプンです。

テストの結果を入力して
70点以上なら「合格」
それ以外なら「不合格」

というのはどのように打ちこめばいいのでしょうか?
よろしくお願いしますm(_ _)m
64デフォルトの名無しさん:05/02/05 18:47:49
打ち込んだところでコンパイルして実行するまで辿り着けるのか心配
65デフォルトの名無しさん:05/02/05 18:50:24
とりあえず文字だけは出力(?)できました・・・。
66デフォルトの名無しさん:05/02/05 18:53:28
実行って言うんですね(⊃Д`)
6763:05/02/05 20:08:28
どなたかお願いします・・・。
68デフォルトの名無しさん:05/02/05 20:22:15
>>67
質問は質問スレへ。
6963:05/02/05 20:48:39
>>68
ああいう宿題なんです。
途中までやったのここに書こうとしたら串がなんとかでできないし・・・。
いまは携帯からですが自力でやってみます(´・ω・`)
7068:05/02/05 20:52:30
>>69
そ。んじゃ。
// Seventy.java
import java.io.*;
public class Seventy {
public static void main(String[] args) throws IOException {
System.out.print( "点数を入力してください > " );
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
int score = Integer.parseInt(line);
if( score >= 70 ) System.out.println( "合格" );
else System.out.println( "不合格" );
}
}
7163:05/02/05 21:53:21
ありがとうございます!
今からバイトなので帰ってから試してみます!

自分でやってたのと結構ちがってますねorz
72デフォルトの名無しさん:05/02/06 00:43:48
Pascalプログラムを読み込んでそのPAD図をフレームに描画するプログラムを作るとするとどんな感じになるでしょう。
なにか良いアイデアがあったら助かります。

7363:05/02/06 03:53:28
>>70
できました!ほんとにありがとうございましたm(_ _)m
明日からしっかり勉強したいとおもいます。
74デフォルトの名無しさん:05/02/06 07:34:45
指定したIPアドレスからホスト名に変換するにはどうしたらいいですか?

ってか自分自身のIPアドレス&ホスト名を取得したいと思ってIPアドレスを
取得するのに↓こんな量になっちゃいました。もっと簡単な方法あるでしょうか?
(この質問をすると「127.0.0.1とlocalhost」と表示されちゃうプログラムを答える人が多い…)

//////////////////////
NetworkInterface ni = null;
InetAddress ipa = null;
Enumeration enuIfs = NetworkInterface.getNetworkInterfaces();
while(enuIfs.hasMoreElements()){
ni = (NetworkInterface)enuIfs.nextElement();//NetworkInterfaceに対する処理。
}
Enumeration enuAddrs = ni.getInetAddresses();
while(enuAddrs.hasMoreElements()){
ipa = (InetAddress)enuAddrs.nextElement();//InetAddressに対する処理。
}
String ipad = ipa.toString().substring(1);
///////////////////////

ってことでString型ipadにIPアドレス(127.0.0.1じゃないよ)が格納されています。
これをホスト名に変換したいんですが…
75デフォルトの名無しさん:05/02/06 07:54:59
マルチうざい
76デフォルトの名無しさん:05/02/06 15:03:42
>>74
String host = ipad.getHostName();
としませう
7774:05/02/06 15:19:29
>>76
あっ、そうするとプロバイダのホスト名じゃなく、
ローカルPC名が表示されちゃうんですよ…
なぜなんでしょうね?

ちなみに@niftyなので〜〜なんたらかんたら〜.ppp.infoweb.ne.jp
みたいに表示されるようにしたいんです。
78デフォルトの名無しさん:05/02/06 15:26:43
>>77
String host = ipad.getCanonicalHostName()
としませう
7977:05/02/06 19:56:28
>>78
それでもやはりPC名が出てします…
80デフォルトの名無しさん:05/02/06 20:18:50
マルチは放置でいいよ
81デフォルトの名無しさん:05/02/06 21:04:02
>>80
ダジャレ
82デフォルトの名無しさん:05/02/06 23:54:41
何がダジャレ?
83oops:05/02/07 00:45:19
abstractメソッドdisplay()を含むabstractクラスFoodから、abstractクラスVegetableとabstractクラスFruitを作成しなさい。
さらにVegetableクラスから3つのサブクラス、Carrot,Pumpkin,PotatoをFruitクラスから4つのサブクラスApple,Banana,
Orange,Strawberryを作成し、display()メソッドではその種類を日本語で表示するようにしなさい(例:にんじん、りんごなど)
mainメソッドで、各サブクラスをインスタンス化しFood型に配列に格納しなさい。ループを用いてdisplay()メソッドを呼び出し
なさい。

だれかよろしくおねがいします
84デフォルトの名無しさん:05/02/07 01:37:37
>>59-61
Application Programming Interface
85デフォルトの名無しさん:05/02/07 01:38:37
>>59-62
Application Programming Interface
86デフォルトの名無しさん:05/02/07 01:40:03
>>83
abstract class Food{ abstract public void display();}
abstract class Vegetable extends Food{
protected String name;
public void display(){ System.out.println(name); } }
abstract class Fruit extends Food{
protected String name;
public void display(){ System.out.println(name); } }
class Carrot extends Vegetable{public Carrot(){ name = "にんじん"; }}
class Pumpkin extends Vegetable{ public Pumpkin(){ name = "かぼちゃ"; }}
class Potato extends Vegetable{ public Potato(){ name = "じゃがいも"; } }
class Apple extends Fruit{ public Apple(){ name = "りんご"; } }
class Banana extends Fruit{public Banana(){ name = "バナナ"; } }
class Orenge extends Fruit{public Orenge(){ name = "みかん"; } }
class Strawberry extends Fruit{public Strawberry(){ name = "いちご"; } }
public class FoodTest{
public static void main(String[] args){
Food[] foods = new Food[7];
foods[0] = new Carrot();
foods[1] = new Pumpkin();
foods[2] = new Potato();
foods[3] = new Apple();
foods[4] = new Banana();
foods[5] = new Orenge();
foods[6] = new Strawberry();
for(int i=0;i<foods.length;i++) foods[i].display();
}
}
87Oops:05/02/07 02:30:42
>>86
動きました。ありがとうございます!
88デフォルトの名無しさん:05/02/08 16:25:16
A robot needs help finding its way home.
Write a program to allow a randomly placed remote-controlled robot (in a grid environment) to move to its home.
(The home is also randomly placed, and needs to be shown on the grid.)
The user will specify the robot moves.The robot can move horizontally or vertically but not diagonally to an adjacent cell.
It must pay $1.00 travel fee for every move it makes.
Calculate the total cost to go home.The program should not let the user drop the robot off the planet.
You can use keys such as “i” for up, “j” for left, “l” for right and “m” for down, or the arrow keys, or mouse clicks on a cell.
(The mouse clicks are harder to program.)
Update the world after each move to show the new location of the robot, relative to the home location.
The user can specify the size of the world (in terms of number of cells).
The world is a flat square (that is, it is an nXn matrix.) Using a GUI interface will earn a maximum of 110 points.
There is only one player at this time in this game.
The user can also reset a game or play a new game when the current game is over.

英文で失礼します。以下概略です。
ロボットをキーボードで操作してHOMEに帰すゲームです。
以下がゲームの必要事項です。

スタートボタンを押すとロボットとHOMEをランダムで格子状のステージに配置します。
HOMEはプレイヤーにはわからないようにします。
ロボットはキーボード操作でマスを上下左右に移動できます。(斜めはなし)
上=I, 下=M, 右=L, 左=Jのキー配置です。
ロボットが一マス動くごとに1ドルのコストがかかり、それを計算して最終的にトータルコストを表示します。
ロボットが一マス動くごとにステージをアップデートしてHOMEまでの距離を表示します。
ロボットがHOMEについた時点でゴールです。
ゴール後ウィンドウをポップアップさせてトータルのコストとリプレイするかしないかを表示します。
アプレットとgridLayoutを使って作ります。

以上です。
どなたかお願いいたします。
89デフォルトの名無しさん:05/02/08 17:14:34
N個同士の集合の交わりを求めるプログラムを作り、実測し理論値との比較を考察する。
交わりはNの1割くらいにする。
Nを変化させる。
ハッシュを用いる方法と最も早い整列(比較を用いる)を用いる方法の2通りを実現して、両者も比較する。

課題本文を丸写ししました。
どなたかプログラムだけでも教えて頂けないでしょうか?
お願いします。
9068:05/02/08 22:16:41
>>88
// RobotApplet.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
* <applet code="RobotApplet.class" width="400" height="400"> </applet>
*/
public class RobotApplet extends Applet implements KeyListener {
public static final int SIZE_ROW = 5;
public static final int SIZE_COL = 5;
JPanel northPanel, southPanel;
JTextField messageField;
private int cost = 0;
int HOME_POS = 0;
int robot_pos = 0;
private JLabel[] labels = new JLabel[SIZE_ROW*SIZE_COL];
public void init() {
play();
}
private void play() {
cost = 0;
northPanel = new JPanel();
southPanel = new JPanel();
setLayout(new BorderLayout());
northPanel.setLayout(new GridLayout(SIZE_ROW, SIZE_COL));
for( int i=0; i<SIZE_ROW*SIZE_COL; i++ ) {
labels[i] = new JLabel();
labels[i].setFont(new Font(null, Font.PLAIN, 15));
labels[i].setBorder( BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK) );
northPanel.add(labels[i]);
9168:05/02/08 22:17:23
>>88
つづき
}
robot_pos = (int)(Math.random()*SIZE_ROW*SIZE_COL);
putRobot( robot_pos );
HOME_POS = robot_pos;
do {
HOME_POS = (int)(Math.random()*SIZE_ROW*SIZE_COL);
putHome( HOME_POS );
} while( robot_pos == HOME_POS );
southPanel.add(messageField = new JTextField(10));
messageField.setEditable(false);
messageField.setText( "距離:" + calculateDistance() );
add(BorderLayout.CENTER, northPanel);
add(BorderLayout.SOUTH, southPanel);
addKeyListener(this);
}
private void putRobot(int i) {
labels[i].setText("p[-_-]q");
}
private void removeRobot(int i) {
labels[i].setText("");
}
private void putHome(int i) {
// labels[i].setText("H");
}
private int[] one2two(int i) {
if( i>SIZE_ROW*SIZE_COL-1 ) System.out.println( "ERROR at one2two()" );
return new int[]{ i/SIZE_COL, i%SIZE_COL, };
}
private int two2one(int[] is) {
int i = is[0]*SIZE_COL + is[1];
9268:05/02/08 22:17:53
>>88
つづき
if( i>SIZE_ROW*SIZE_COL-1 ) System.out.println( "ERROR at two2one()" );
return i;
}
private int calculateDistance() {
int[] robot_pos__ = one2two(robot_pos);
int[] home_pos__ = one2two(HOME_POS);
return Math.abs(robot_pos__[0]-home_pos__[0]) + Math.abs(robot_pos__[1]-home_pos__[1]);
}
public void keyTyped(KeyEvent ke) {
removeRobot(robot_pos);
// 上
if(ke.getKeyChar() == 'i' || ke.getKeyChar() == 'I') {
robot_pos = (robot_pos - SIZE_COL < 0 ? robot_pos : robot_pos - SIZE_COL);
cost++;
// 下
} else if(ke.getKeyChar() == 'm' || ke.getKeyChar() == 'M') {
robot_pos = (robot_pos + SIZE_COL > SIZE_ROW*SIZE_COL-1 ? robot_pos : robot_pos + SIZE_COL);
cost++;
// 右
} else if(ke.getKeyChar() == 'l' || ke.getKeyChar() == 'L') {
robot_pos = ( one2two(robot_pos)[1]+1 > SIZE_COL-1 ? robot_pos : robot_pos+1 );
cost++;
// 左
} else if(ke.getKeyChar() == 'j' || ke.getKeyChar() == 'J') {
robot_pos = ( one2two(robot_pos)[1]-1 < 0 ? robot_pos : robot_pos-1 );
cost++;
}
putRobot(robot_pos);
int distance = calculateDistance();
messageField.setText( "距離:" + distance );
9368:05/02/08 22:19:08
>>88
つづき
if( distance == 0 ) {
removeKeyListener(this);
final JDialog dialog = new JDialog( new JFrame(), "おめ", true );
dialog.setSize( 200, 100 );
dialog.setLayout(new BorderLayout());
JLabel messageLabel = new JLabel();
messageLabel.setText( "コスト:" + cost);
JButton continueButton = new JButton("続ける");
JButton cancelButton = new JButton("やめる");
continueButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
dialog.dispose();
play();
repaint();
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
dialog.dispose();
}
});
dialog.add(BorderLayout.CENTER, messageLabel);
JPanel p = new JPanel();
p.add(continueButton);
p.add(cancelButton);
dialog.add(BorderLayout.SOUTH, p);
dialog.setVisible(true);
}
}public void keyPressed(KeyEvent ke) {}public void keyReleased(KeyEvent ke) {}
}
9468:05/02/08 22:20:00
[続ける]ボタンでの再描画がうまくできてませんが、だいたい動きます。
9568:05/02/08 22:30:57
>>88
あうあうあー。ちょいバグありました。
(1)
play()直後の
cost = 0;
は取ってください。
(2)
do...while内の
putHome(HOME_POS);
はwhile文の直後にしてください。
---
do {
HOME_POS = (int) (Math.random() * SIZE_ROW * SIZE_COL);
} while (robot_pos == HOME_POS);
putHome(HOME_POS);
---
つー感じで。
他にもバグあるだろーな。。。
96デフォルトの名無しさん:05/02/09 00:09:38
>>89
その問題文はどうも分かりません・・・・
9788:05/02/09 12:24:01
>>90-95
遅くなりましたが、どうもありがとうございました。
これから確認してまた返事したいと思います。
9888:05/02/09 16:07:36
>>90-95
NetBeans 3.6を使って書いたのですが、実行すると「アプレットが初期化されていません」
というメッセージが出てプレイできません。
9990-95:05/02/09 21:48:04
>>98
それだけの情報では分かりません。。
スタックトレース貼って。
10088:05/02/09 22:55:39
>>99
申し訳ないです。
java.lang.NoClassDefFoundError: program1/robotApplet (wrong name: robotApplet)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:162)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:118)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:577)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:710)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:639)
at sun.applet.AppletPanel.run(AppletPanel.java:319)
at java.lang.Thread.run(Thread.java:595)

10190-95:05/02/09 23:02:36
>>100
・クラス名が違います。先頭のRは大文字です。
・パッケージは切ってません。program1というパッケージの中に入れないでください。
10288:05/02/09 23:07:24
すみません。
>>98はこちらのミスでした。
>>94の指摘以外はきちんと動きました。
どうもありがとうございました。
10388:05/02/09 23:28:55
>>88に追加です。
>>88をrobot, home, Stage, Mainの4つのクラスに分けて作れ。

Add a score keeper for your game, and record the top n scores in a file.
Implement three sorting algorithms to sort these scores.
(Only one sorting algorithm needs to be in place by your program due date.
The other two will be used in the analysis.)
Two of the algorithms may be an elementary sorting algorithm, such as: insertion sort, selection sort, bubble sort.
One of the algorithms must be an efficient sorting algorithm, such as: the quick sort, the shell sort, the heap sort, the merge sort, or the radix sort.
You may choose which list structure to use for the scores, such as your own array or linked list, or an ArrayList or a LinkedList.

To implement sorting of the scores:
The score data type will need a method to compare objects. Typically this involves a compareTo() method as well as an equals() method (use the Comparable Interface).
Duplicate scores are allowed in your list.
Use file input and output to store the scores.
Use exception handling for file errors.
10488:05/02/09 23:32:27
>>103の続き。

Part C:
Use exception handling to control user errors.
Display the list of customers and their account balances in sorted order.
Implement three sorting algorithms for the list of customers.
(Only one sorting algorithm needs to be in place by your program due date.
The other two will be used in the analysis.)
Two of the algorithms may be an elementary sorting algorithm, such as: insertion sort, selection sort, bubble sort.
One of the algorithms must be an efficient sorting algorithm, such as: the quick sort, the shell sort, the heap sort, the merge sort, or the radix sort.
The list structure is your choice, such as your own array or linked list, or an ArrayList or a LinkedList.

To implement sorting customers:
The customer data type will need methods to compare objects. Typically this involves a compareTo() method as well as an equals() method (use the Comparable Interface).
Do not allow add duplicate object’s in your list.
Use file input and output to store several objects.
Use exception handling for file errors.

今、時間がないので英文混じりで失礼します。
中には読める方はもちろんたくさんいらっしゃると思うので載せました。
後で日本語概略を載せたいと思いますが、必要ないときは、そんなもんいらねー等、一言いただけたらうれしいです。
105デフォルトの名無しさん:05/02/09 23:35:35
その挑戦的な態度に激しい不快感を覚えました。
10688:05/02/10 02:05:02
>>105
不快に思われたのなら本当にすみませんでした。
私としては、ここを利用していらっしゃるみなさんは本当に優秀な人が多いので
英文を簡単に読める人がたくさんいると思っていました。
でも、中には英語は苦手だっていう方もいらっしゃると思い、このような書き込みになりました。
ですから、挑戦的な意味も態度も一切ありません。
不快に思われた方、深くお詫びをしたいと思います。
10788:05/02/10 02:34:39
>>103-104の日本語概略です。
先ほども書き込ませていただきましたが、不快に思われた方に深くお詫びをしたいと思います。

>>88のプログラムにスコアキーパーを追加して、トップスコアいくつかを(たとえばTop5とかTop10とかいくつでも。)
ファイルに保存しなさい。3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。

以上です。
どなたかお願いいたします。
108105:05/02/10 10:00:33
ウソです。気にしないでください。
109デフォルトの名無しさん:05/02/10 14:38:19
・例外処理を利用してユーザーエラーをコントロールしなさい。
・顧客リストとそれぞれの残高を名前順、残高順に表示しなさい。
・顧客のデータタイプはオブジェクトを比較するメソッドを使用します。
・通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
・データの重複は禁止します。
・file input, outputを使用して、スコアを保存してください。
・ファイルエラーに例外処理(exception)を使用してください。

だれか、これをお願いします。
110デフォルトの名無しさん:05/02/10 14:48:47
■ ■ ■ そそくさと会社辞めていったB.Sへ ■ ■ ■
おまえ普段からエロペグ収集やゲームに夢中で仕事なんかしてなかっただろ。
キーボードまったく叩かずに頬杖ついてマウスでクリックばっかりやってれば、いかにも仕事してないってわかるし、だいたい夜なんかあんたの後ろのガラスにエロ画像表示した画面が丸映り。
システムGr全員と社長もとっくに知ってたよ。
いつも一日中頬杖マウスで納期間際になると決まってすごい勢いでキーボードバチバチ叩いてたもんな。
そんなことやってるからあんたの組んだシステムはお客さんに納めてからバグが連発するんだよ。
いつもそうだったろ、学習しろよ。皆にとっていい迷惑なんだよ。
おまえのこと、もう1年以上前から皆の間じゃ問題になっててこっそりハードディスクの中も調べたらエロ画像だらけだし、どうするべきかおまえがいないときに皆で会議とかやってたんだよ。
M部長を含め、大方の社員はクビにしろっていってたけど、おまえは集中すれば能力高いしエロ画像見てることを指摘して気まずくなるのもなんだから、もう少し様子見ようっていう社長の意見でおまえは今まで会社にいられたんだぞ。
それ知らないで社長に怒られるたびに社長を悪く言ってたけど、再三チャンスを与えてたのは社長なんだからな。怒られてるうちに自分で態度を改めろよ。
そうこうしているうちにおまえがあんな大問題を起こしてさっさと辞めてっちまったけど、これじゃ社長は社内外どちらも立場がないだろ。
社長はあれからお客さんに散々謝って後始末に追われて大変だったんだぞ。
おまえ2ちゃんねるも頻繁に覗いてたみたいだったからここに書いてみた。
どうせまだ暇でここ見てるんだろ。
まぁ40過ぎて独身で会社もクビで大変だろうけど、またのうのうと仕事サボってエロ画像楽しんでいられる幸運な職場にたどり着けることを祈ってるよ。
じゃぁな。プッ!!
111デフォルトの名無しさん:05/02/10 19:07:20
>>109
本当に問題はこれだけ?前提条件とかここに至るまでの問題とかないの?
112デフォルトの名無しさん:05/02/10 22:25:42
iこのプログラムを実行すると書き込みエラーになります。
冷害にならないようにするにはどうすればいいでしょうか。
プログラムは特にいじらないっぽいです。
113112:05/02/10 22:26:13
import java.io.*;

public class Approx{
public static void main(String[] args){
int i,n=10000;
int k=0;
double x,y,ap;
PrintWriter fo;
try{
fo=new PrintWriter(
new BufferedWriter(
new FileWriter(args[0])));
for(i=0;i<n;i++){
x=2*Math.random()-1;
y=Math.random();
if((x*x*1)*y<x*x)
k++;
}
ap=4.0*k/n;
fo.println("近似値="+ap);
fo.close();
}
catch(Exception e){
System.out.println("書き込みエラー"+e);
}
}
}

以上です。よろしくお願いします。
114デフォルトの名無しさん:05/02/10 22:53:05
提出期日が迫ってきてしまったので、失礼かとは思いましたが重複の書き込みをさせていただきました。

>>88のプログラムをrobot, Home, Stage, Mainの4つのクラスに分けて作れ。
>>88のプログラムにスコアキーパーを追加して、トップスコアいくつかを(たとえばTop5とかTop10とかいくつでも。)
ファイルに保存しなさい。3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。

以上です。
よろしくお願いします。
115デフォルトの名無しさん:05/02/10 23:01:21
>>114
答えてもらえない原因を考えた方が良いね。
116デフォルトの名無しさん:05/02/10 23:06:51
>>113
別に例外にならないけど。
コマンドライン引数を渡してない、とかそんなことでいいの?
117112:05/02/10 23:24:34
>>115
それはどうすればよいのでしょうか・・。
プロンプトでjava Approxで実行すると例外がキャッチされる状況です。
118デフォルトの名無しさん:05/02/10 23:30:58
>>117
コマンドライン引数に何も与えてないから
args[0]
でArrayIndexOutOfBoundsExceptionが発生する。
ファイルの書き込みエラーじゃないけど
catch(Exception)って書いてるから例外なら何でもcatchしてる。

java Approx aaa.txt
と実行してみ。
119デフォルトの名無しさん:05/02/10 23:40:54
>>118
なるほど。
実行できました。
あいがとうございました。
120112:05/02/10 23:53:10
もう一つ質問させてください。
>>112のプログラムで発生する乱数の範囲を調べたいのですが、
x,yの式からどうやって範囲を出すのでしょうか。
121デフォルトの名無しさん:05/02/11 02:33:09
>>115
>>104の件でしたら、先に書き込んだとおり本当に挑戦的、挑発的な意味はまったくありません。
ここのルールで宿題は丸投げせよ、と書いてありましたが、宿題文がすべて英文だったため
>>106の理由の通り、自分の拙い英語ですが訳文を書き込ませていただきました。
その他の失礼はなるべく無いよう気をつけてますが、2ちゃんねる初心者のため
初心者板や、その他のルールなど少し目を通しましたが、まだ他に失礼があったかもしれません。
2ちゃんねるを上手に使っていくため、そしてみなさんに不快な思いをさせないためにも、
他にもなにか失礼があればご指摘ください。
3のルールに反する書き込み失礼しました。
122105:05/02/11 09:58:39
あの、挑戦的な態度というのはウソです。
自分は英語の成績が悪いのでうっかり書いてしまいました。
123デフォルトの名無しさん:05/02/11 10:50:40
>>122
何度も引っ張ってるかのように書いてますがあんまり気にしないでください。
こちらとしてもちょっと言い方も悪かったかなぁ・・・、と思ってましたので。
では、どうして答えてもらえないんでしょうか?いろいろ考えてみて心当たりはもうすでに書き込ませていただいたのですが・・・。
なにかご指摘ありませんか?
124>>114 その1:05/02/11 17:21:45
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
import java.text.*;
interface Constants {
int XSIZE = 8, YSIZE = 8, PATHSIZE = 16;
String filename = "score.dat";
}
public class Main extends JApplet implements KeyListener, ActionListener, Constants {
private Robot robot = new Robot();
private Home home = new Home();
private Stage stage;
private List scoreList = new ArrayList();
public void init() {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
scoreList = (List) in.readObject();
} catch (Exception e) {
System.out.println("スコアファイル読み込みエラー");
}
int width = getContentPane().getSize().width,
height = getContentPane().getSize().height;
stage = new Stage(width, height, robot, this);
stage.addKeyListener(this);
setContentPane(stage);
startGame();
}
125>>114 その2:05/02/11 17:22:25
void quickSort(Score[] data, int begin, int end) {
if (begin >= end)
return;
Score num = data[begin + 1];
data[begin + 1] = data[begin];
int loc = begin;
for (int idx = begin + 1; idx <= end; idx++) {
if (num.compareTo(data[idx]) >= 0) {
++loc;
Score swap = data[idx];
data[idx] = data[loc];
data[loc] = swap;
}
}
data[begin] = data[loc];
data[loc] = num;
quickSort(data, begin, loc - 1);
quickSort(data, loc + 1, end);
}
void startGame() {
robot.reset();
home.reset();
stage.putRobot(robot);
int dist = Math.abs(robot.getPx() - home.getPx())
+ Math.abs(robot.getPy() - home.getPy());
stage.displayInfo("ゴールへの距離 " + dist + "m : ゲームスタート");
stage.requestFocus();
}
126>>114 その3:05/02/11 17:22:57
void endGame() {
robot.change();
stage.displayInfo("ゲームクリア");
scoreList.add(new Score(robot.getCost()));
Score[] data = (Score[]) scoreList.toArray(new Score[0]);
quickSort(data, 0, data.length - 1);
scoreList = new ArrayList(Arrays.asList(data));
String msg = "クリアしました\nかかった経費" + robot.getCost()
+ "ドル\nもう一度プレイしますか?";
int ans = JOptionPane.showConfirmDialog(this, msg, "ゲームのリトライ",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (ans == JOptionPane.YES_OPTION) {
startGame();
} else {
getContentPane().setVisible(false);
}
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
out.writeObject(scoreList);
} catch (Exception e) {
System.out.println("スコアファイル書き込みエラー");
}
}
public void keyTyped(KeyEvent e) {
switch (e.getKeyChar()) {
case 'i':
case 'I':
if (robot.getPy() > 0)
robot.movePy(-1);
break;
127>>114 その5:05/02/11 17:23:31
case 'j':
case 'J':
if (robot.getPx() > 0)
robot.movePx(-1);
break;
case 'm':
case 'M':
if (robot.getPy() < YSIZE)
robot.movePy(+1);
break;
case 'l':
case 'L':
if (robot.getPx() < XSIZE)
robot.movePx(+1);
}
stage.putRobot(robot);
int dist = Math.abs(robot.getPx() - home.getPx())
+ Math.abs(robot.getPy() - home.getPy());
stage.displayInfo("ゴールへの距離 " + dist + "m : 現在の経費 "
+ robot.getCost() + "ドル");
if (robot.getPx() == home.getPx() && robot.getPy() == home.getPy())
endGame();
}
public void actionPerformed(ActionEvent e) {
if (stage.isButtonSelected()) {
StringBuffer sb = new StringBuffer("スコア表 ベスト10\n\n");
for (int i = 0; i < scoreList.size() && i < 10; i++) {
sb.append((i + 1) + "位 " + scoreList.get(i).toString());
}
stage.displayScores(sb.toString());
128>>114 その6:05/02/11 17:25:01
} else {
stage.removeScores();
}
stage.requestFocus();
}
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
}
class Score implements Comparable, Serializable {
private static MessageFormat msg = new MessageFormat(
"コスト {0,number,integer} ドル 日時 {1,date,short} {1,time,short} \n");
private int number;
private Date date = new Date(System.currentTimeMillis());
Score(int number) {
this.number = number;
}
public int compareTo(Object obj) {
Score sc = (Score) obj;
return new Integer(number).compareTo(new Integer(sc.number));
}
public String toString() {
return msg.format(new Object[] { number, date });
}
}
class Robot extends JLabel implements Constants {
private int px, py, cost;
Robot() {
setFont(new Font("Dialog", 1, 15));
setForeground(new Color(50, 50, 250));
setBounds(0, 0, PATHSIZE, PATHSIZE);
}
129>>114 その7:05/02/11 17:25:50
void reset() {
px = 0;
py = 0;
cost = 0;
setText("●");
}
int getCost() {
return cost;
}
int getPx() {
return px;
}
int getPy() {
return py;
}
void movePx(int pt) {
px += pt;
++cost;
}
void movePy(int pt) {
py += pt;
++cost;
}
void change() {
setText("★");
}
}
130>>114 その8:05/02/11 17:26:24
class Home implements Constants {
private int px, py;
void reset() {
px = 0;
py = 0;
while (px == 0 && py == 0) {
px = (int) (Math.random() * XSIZE);
py = (int) (Math.random() * YSIZE);
}
}
int getPx() {
return px;
}
int getPy() {
return py;
}
}
class Stage extends JPanel implements Constants {
private JPanel room = new JPanel(new GridLayout(YSIZE, XSIZE, PATHSIZE, PATHSIZE));
private JLabel[][] wall = new JLabel[XSIZE][YSIZE];
private JLabel topBar = new JLabel();
private JTextArea scores = new JTextArea();
private JLayeredPane lp = new JLayeredPane();
private JToggleButton btn = new JToggleButton("スコア表示");
131>>114 その9:05/02/11 17:27:04
Stage(int width, int height, Robot rb, ActionListener al) {
setBackground(Color.black);
topBar.setBorder(BorderFactory.createEtchedBorder());
topBar.setPreferredSize(new Dimension(1000, 0));
topBar.setHorizontalAlignment(JLabel.CENTER);
topBar.setFont(new Font("Dialog", 1, 13));
topBar.setOpaque(true);
topBar.setBackground(new Color(200, 200, 255));
btn.setFont(new Font("Dialog", 0, 10));
btn.setMargin(new Insets(2, 2, 2, 2));
btn.addActionListener(al);
Box menu = Box.createHorizontalBox();
menu.add(btn);
menu.add(topBar);
room.setBackground(new Color(240, 240, 255));
room.setBorder(BorderFactory.createEmptyBorder(PATHSIZE, PATHSIZE,
PATHSIZE, PATHSIZE));
Dimension wallsize = new Dimension((width - PATHSIZE * (XSIZE + 1))
/ XSIZE, (height - PATHSIZE * (YSIZE + 1)) / YSIZE);
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b] = new JLabel();
wall[a][b].setPreferredSize(wallsize);
wall[a][b].setOpaque(true);
wall[a][b].setBackground(new Color(200, 200, 250));
wall[a][b].setBorder(BorderFactory.createRaisedBevelBorder());
}
}
132>>114 その10:05/02/11 17:27:39
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
room.add(wall[a][b]);
}
}
room.setBounds(0, 0, width, height - btn.getPreferredSize().height);
lp.add(room, new Integer(0));
lp.add(rb, new Integer(1));
setLayout(new BorderLayout());
add(lp);
add(menu, BorderLayout.NORTH);
scores.setOpaque(false);
scores.setMargin(new Insets(16, 32, 16, 32));
scores.setFont(new Font("Dialog", 1, 16));
scores.setForeground(Color.green);
}
void putRobot(Robot rb) {
int cpX, cpY, rbX = (rb.getPx() == XSIZE) ? rb.getPx() - 1 : rb.getPx(),
rbY = (rb.getPy() == YSIZE) ? rb.getPy() - 1 : rb.getPy();
if (rb.getPx() < XSIZE)
cpX = wall[rbY][rbX].getLocation().x - PATHSIZE;
else
cpX = wall[rbY][rbX].getLocation().x
+ wall[rbY][rbX].getSize().width;
if (rb.getPy() < YSIZE)
cpY = wall[rbY][rbX].getLocation().y - PATHSIZE;
else
cpY = wall[rbY][rbX].getLocation().y
+ wall[rbY][rbX].getSize().height;
rb.setLocation(cpX, cpY);
}
133>>114 その11:05/02/11 17:28:13
void displayInfo(String text) {
topBar.setText(text);
}

boolean isButtonSelected() {
return btn.isSelected();
}
void displayScores(String text) {
scores.setBounds(room.getBounds());
scores.setText(text);
lp.add(scores, new Integer(2));
room.setBackground(new Color(240, 240, 255, 128));
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b].setBackground(new Color(200, 200, 255, 128));
}
}
}
void removeScores() {
lp.remove(scores);
lp.validate();
room.setBackground(new Color(240, 240, 255, 255));
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b].setBackground(new Color(200, 200, 255, 255));
}
}
}
}
134デフォルトの名無しさん:05/02/11 18:02:42
>>124-133
どうもありがとうございました。
プログラム自体はきちんと動作してくれてます。
ただ、
public String toString() {
return msg.format(new Object[] { number, date });
}
の return msg.の行にエラーが出ます。
互換性のない型 出現:int 要求:java.lang.Objectとでます。
そしてファイルの書き込み、読み込みともにエラーになってしまいます。
135デフォルトの名無しさん:05/02/11 18:12:20
>>134
失礼。そこだけAutoBoxingにしてしまいました。(JDK1.5対応)

public String toString() {
return msg.format(new Object[] { number, date });
}

public String toString() {
return msg.format(new Object[] { new Integer(number), date });
}
としてください。
136デフォルトの名無しさん:05/02/11 18:36:01
>>135
どうもありがとうございました。
エラーは消えましたが、プレイするたびにファイルの書き込みエラー
読み込みエラーが出ます。
これはどうしたら無くすことができますか?
137デフォルトの名無しさん:05/02/11 18:58:45
授業単元: Javaプログラミング実習
問題文: マインスイーパを作成せよ。サイズは9*9とする。
期限:2/14までに作っていただければ幸いです

です。どうかよろしくお願いします。。。
138デフォルトの名無しさん:05/02/11 19:23:19
あげ
139デフォルトの名無しさん:05/02/11 20:17:00
>>136
元々アプレットには、File Permission がないですから・・・
ファイルパーミッションを持つappletviewerで実行させるしか
ありません・・・
140デフォルトの名無しさん:05/02/12 00:25:27
>>137
コンソールでもなんでもいいのか?
アプレット限定とかなら、ちゃんとかけよ。
141>>137 その1:05/02/12 01:24:20
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.text.*;
public class HW78 extends JFrame {
static final int SIZE = 9, BOMBCNT = 10;
JLabel[][] cell = new JLabel[SIZE][SIZE];
JLabel info = new JLabel();
JButton btn = new JButton("開始");
int[][] attCM, figCM;
Set bombSet = new HashSet(), noneSet = new HashSet();
PanelAction action = new PanelAction();
boolean endFlag;
static ChoiceFormat cfOpen = new ChoiceFormat(
"0# |1#1|2#2|3#3|4#4|5#6|6#6|7#7|8#8|9#9|10#爆");
static ChoiceFormat cfClose = new ChoiceFormat("0# |1# |2#危|3#印");
static final int NONE = 0, BOMB = 10;
static final int CLOSE = 0, OPEN = 1, DENG = 2, MARK = 3;
static final int NEXT = 0, CLEAR = 1, OVER = 2;
static final Point[] AROUND = new Point[] { new Point(0, -1), new Point(-1, -1),
new Point(-1, 0), new Point(-1, 1), new Point(0, 1), new Point(1, 1),
new Point(1, 0), new Point(1, -1) };
public static void main(String[] args) {
new HW78();
}
142>>137 その2:05/02/12 01:24:58
HW78() {
JPanel pal = new JPanel(new GridLayout(9, 9));
pal.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
for (int a = 0; a < cell.length; a++) {
for (int b = 0; b < cell.length; b++) {
cell[a][b] = new JLabel();
cell[a][b].setOpaque(true);
cell[a][b].setHorizontalAlignment(JLabel.CENTER);
cell[a][b].setFont(new Font("Dialog", 1, 18));
cell[a][b].setName(a + "-" + b);
cell[a][b].addMouseListener(action);
pal.add(cell[a][b]);
}
}
info.setHorizontalAlignment(JLabel.CENTER);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startGame();
}
});
JPanel top = new JPanel(new BorderLayout());
top.add(btn, BorderLayout.WEST);
top.add(info);
getContentPane().add(pal);
getContentPane().add(top, BorderLayout.NORTH);
startGame();
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
143>>137 その3:05/02/12 01:25:30
void startGame() {
attCM = new int[SIZE][SIZE];
figCM = new int[SIZE][SIZE];
bombSet.clear();
while (bombSet.size() < BOMBCNT) {
int x = (int) (Math.random() * 9), y = (int) (Math.random() * 9);
bombSet.add(new Point(x, y));
attCM[x][y] = BOMB;
}
for (int a = 0; a < cell.length; a++) {
for (int b = 0; b < cell.length; b++) {
noneSet.add(new Point(a, b));
}
}
noneSet.removeAll(bombSet);
Iterator it = noneSet.iterator();
while (it.hasNext()) {
Point pt = (Point) it.next();
int count = 0;
for (int i = 0; i < AROUND.length; i++) {
Point newpt = new Point(pt);
newpt.translate(AROUND[i].x, AROUND[i].y);
if (newpt.x >= 0 && newpt.x < SIZE && newpt.y >= 0 && newpt.y < SIZE) {
if (attCM[newpt.x][newpt.y] == BOMB)
++count;
}
}
attCM[pt.x][pt.y] = count;
}
144>>137 その4:05/02/12 01:26:01
for (int a = 0; a < cell.length; a++) {
for (int b = 0; b < cell.length; b++) {
cell[a][b].setBackground(new Color(220, 220, 255));
cell[a][b].setBorder(BorderFactory.createRaisedBevelBorder());
cell[a][b].setText("");
cell[a][b].setForeground(Color.black);
}
}
info.setText("ゲームスタート:爆弾数" + BOMBCNT);
endFlag = false;
}
void endGame(int ans) {
endFlag = true;
if (ans == CLEAR) {
info.setText("ゲームクリア");
Iterator it = bombSet.iterator();
while (it.hasNext()) {
Point pt = (Point) it.next();
cell[pt.x][pt.y].setText("消");
cell[pt.x][pt.y].setForeground(Color.blue);
}
} else {
info.setText("ゲームオーバー");
Iterator it = noneSet.iterator();
while (it.hasNext()) {
Point pt = (Point) it.next();
cell[pt.x][pt.y].setBackground(new Color(245, 245, 255));
cell[pt.x][pt.y].setBorder(BorderFactory.createLineBorder(new Color(200, 200, 255), 1));
String text = cfOpen.format(attCM[pt.x][pt.y]);
cell[pt.x][pt.y].setText(text);
cell[pt.x][pt.y].setForeground(Color.blue);
}
145>>137 その5:05/02/12 01:26:39
it = bombSet.iterator();
while (it.hasNext()) {
Point pt = (Point) it.next();
cell[pt.x][pt.y].setBackground(new Color(245, 245, 255));
cell[pt.x][pt.y].setBorder(BorderFactory.createLineBorder(new Color(200, 200, 255), 1));
cell[pt.x][pt.y].setText("爆");
cell[pt.x][pt.y].setForeground(new Color(255, 160, 0));
}
}
}
int openPanels(int x, int y) {
int ans = openPanel(x, y);
if (ans != NEXT)
return ans;
if (attCM[x][y] != NONE)
return NEXT;
LinkedList list = new LinkedList();
List checks = new ArrayList();
list.addLast(new Point(x, y));
while (!list.isEmpty()) {
Point pt = (Point) list.removeFirst();
for (int i = 0; i < AROUND.length; i++) {
Point newpt = new Point(pt);
newpt.translate(AROUND[i].x, AROUND[i].y);
if (newpt.x >= 0 && newpt.x < SIZE && newpt.y >= 0 && newpt.y < SIZE) {
if (attCM[newpt.x][newpt.y] != BOMB) {
ans = openPanel(newpt.x, newpt.y);
if (ans != NEXT)
return ans;
}
146>>137 その6:05/02/12 01:27:22
if (attCM[newpt.x][newpt.y] == NONE && !checks.contains(newpt)) {
list.addLast(newpt);
checks.add(newpt);
}
}
}
}
return NEXT;
}
int openPanel(int x, int y) {
cell[x][y].setBackground(new Color(245, 245, 255));
cell[x][y].setBorder(BorderFactory.createLineBorder(new Color(200, 200, 255), 1));
String text = cfOpen.format(attCM[x][y]);
cell[x][y].setText(text);
figCM[x][y] = OPEN;
if (attCM[x][y] == BOMB) {
cell[x][y].setForeground(Color.red);
bombSet.remove(new Point(x, y));
return OVER;
}
noneSet.remove(new Point(x, y));
if (noneSet.isEmpty())
return CLEAR;
else
return NEXT;
}
147:>>137 その7:05/02/12 01:27:52
void markPanel(int x, int y) {
if (figCM[x][y] == CLOSE) {
figCM[x][y] = DENG;
} else if (figCM[x][y] == DENG) {
figCM[x][y] = MARK;
} else if (figCM[x][y] == MARK) {
figCM[x][y] = CLOSE;
}
String text = cfClose.format(figCM[x][y]);
cell[x][y].setText(text);
}
int openPanelRounded(int x, int y) {
int ans = openPanel(x, y);
if (ans != NEXT)
return ans;
Point pt = new Point(x, y);
for (int i = 0; i < AROUND.length; i++) {
Point newpt = new Point(pt);
newpt.translate(AROUND[i].x, AROUND[i].y);
if (newpt.x >= 0 && newpt.x < SIZE && newpt.y >= 0 && newpt.y < SIZE) {
if (figCM[newpt.x][newpt.y] != DENG) {
ans = openPanel(newpt.x, newpt.y);
if (ans != NEXT)
return ans;
}
}
}
return NEXT;
}
148>>137 その8:05/02/12 01:28:31
class PanelAction extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (endFlag)
return;
Component cp = e.getComponent();
int x = Integer.parseInt(cp.getName().split("-")[0]);
int y = Integer.parseInt(cp.getName().split("-")[1]);
if (figCM[x][y] == OPEN)
return;
if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0
&& (e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) != 0) {
int ans = openPanelRounded(x, y);
if (ans != NEXT)
endGame(ans);
} else if (e.getButton() == MouseEvent.BUTTON1) {
int ans = openPanels(x, y);
if (ans != NEXT)
endGame(ans);
} else if (e.getButton() == MouseEvent.BUTTON3) {
markPanel(x, y);
}
}
}
}
149デフォルトの名無しさん:05/02/12 15:47:01
質問です。クラスVec1にあるメソッドnaisekiを実行して、
結果cを表示するプログラムを作りたいです。
どこをどう直せばよいでしょうか。
class Vec1{
public static void naiseki(double[]a,double[]b,double[]c){
double ci=0;
for(int i=0;i<a.length;i++){
ci+=a[i]*b[i];
c[i]=ci;
}
}
}
以下のプログラムにコンパイルエラーが出ます。
class VecSousa1{
public static void main(String[] args){
Vec1 vec=new Vec1();
vec naiseki(a,b,c);
double[]a={1,2,3};
double[]b={2,3,4};
System.out.println("内積a・b=" +c[i]);
}
}
150デフォルトの名無しさん:05/02/12 16:48:40
class VecSousa1{
public static void main(String[] args){
Vec1 vec=new Vec1();
double[]a={1,2,3};
double[]b={2,3,4};
double[]c={0,0,0};
vec.naiseki(a,b,c);
System.out.println("内積a・b=" +c[i]);
}
}
151デフォルトの名無しさん:05/02/12 17:22:52
Swingを用いて簡単なアクションゲームを作れとの課題が出ました。
誰か出来ましたらお願いします m(_ _)m
期限は来週の金曜までです。
152デフォルトの名無しさん:05/02/12 17:28:07
>>141 ありがとうございました!!
153デフォルトの名無しさん:05/02/12 17:36:38
>>150
ありがとうございます。
直してコンパイルしたところ
System.out.println("内積a・b=" +c[i]);
の行で変数Cを解決できない、と出てしまいます。
これはどうすればよいでしょうか。
154デフォルトの名無しさん:05/02/12 17:44:35
>>153
もともとのソース(>>149)にcが宣言されてないからだろう
155デフォルトの名無しさん:05/02/12 17:46:28
this.add(new Button("1"));
でつくったボタンのオブジェクト名ってなんになるの?

たとえば Button myButton = new Button("1");
this.add(myButton)
としたらオブジェクト名はmyButtonですよね
156デフォルトの名無しさん:05/02/12 18:30:46
それはあくまで参照名
もともとオブジェクト名なるものは存在しない
あるのはクラスとそのインスタンス
157デフォルトの名無しさん:05/02/12 18:33:39
158デフォルトの名無しさん:05/02/12 18:40:37
>>157
その本は知ってます。書店で見ました。。。表紙のとんがり帽子の娘に
ハァハァでしたが、参考にしてもゲームを作るのには労力がいります。
誰か参考に作ってください、。。。
159デフォルトの名無しさん:05/02/12 20:24:31
じゃあ作るから待ってろ
160155:05/02/12 20:30:20
参照はポインタですよね
mybutton.setfont(new font(ほにゃらら))
はできるけどthis.add(new Button("1"));
だと参照名がわからないから、あとからいじるのは不可能なように思えます。
メモリをサーチしてアドレスを突き止めるしかないのでしょうか
161デフォルトの名無しさん:05/02/12 21:03:56
>>160
>>160
getComponent(int n)
getComponents()
を使えば後からでもできる。
162153:05/02/12 21:53:27
>>154
class Vec1{
public static void naiseki(double[]a,double[]b,double[]c){
double ci=0;
for(int i=0;i<a.length;i++){
ci+=a[i]*b[i];
c[i]=ci;
}
}
}
もとのソースとはこれですよね?
これはcを宣言していないことになるのでしょうか・・。
これと>>150でどう動かせばよいんでしょう。
163デフォルトの名無しさん:05/02/13 12:09:18
import java.io.*;

class Vec1 {
public void naiseki(double[] a, double[] b, double[] c) {
for(int i = 0; i < a.length; i++)
c[i] += a[i] * b[i];
}
}

public class VecSousa1 {
public static void main(String[] args) {
Vec1 vec = new Vec1();
double[] a = {1, 2, 3};
double[] b = {2, 3, 4};
double[] c = {0, 0, 0};
vec.naiseki(a, b, c);
System.out.print("内積 a・b = {");
for(int i = 0; i < c.length; i++){
System.out.print(c[i] + ((i < c.length - 1) ? ", " : "}\n"));
}
}
}
164デフォルトの名無しさん:05/02/13 12:35:50
>>149 == >>153
public class VecSousa {
public static void main(String[] args) {
Vec vec_a = new Vec(new double[] {1, 2, 3});
Vec vec_b = new Vec(new double[] {2, 3, 4});
Vec vec_c = vec_a.naiseki(vec_b);
System.out.println("内積 a・b = " + vec_c.toString());
}
}

class Vec {
double[] vec;
Vec(double[] v) {
vec = v;
}
public Vec naiseki(Vec v) {
double[] result = vec;
for(int i = 0; i < result.length; i++)
result[i] *= v.vec[i];
return new Vec(result);
}
public String toString() {
String result = "{";
for(int i = 0; i < vec.length; i++)
result += vec[i] + ((i < vec.length - 1) ? ", " : "}");
return result;
}
}
165149:05/02/13 13:25:19
>>163
>>164
動きました。ありがとうございます!
これから理解します。
166デフォルトの名無しさん:05/02/13 13:32:12
>>149>>163 で Vec1 が別クラスになってる意味が全然分からん
167デフォルトの名無しさん:05/02/13 19:16:41
class A {
public int aaa() {
return bbb();
}

private int bbb() {
int i =ccc() + ddd();
return i;
}
}

みたいなクラスでaaaメソッドをJunitでテストしたいのですが
どうすればいいでしょうか?
aaaメソッドを単体でテストしたいのでbbbメソッドを
何か値を返す別のものにしたいのですが、良い方法
が思いつきません。privateをprotectedにしてしまうのも
1つの手ですが、あまりやりたくありません。
168デフォルトの名無しさん:05/02/13 20:28:56
>>167
aaaはbbbの戻り値を返すだけのメソッドなの?
なら、テストする必要ないじゃん。

あと、そういうとこで悩むってことはクラス設計が悪いってこと。
設計見直せ。
169159 >>151 その1:05/02/14 02:12:07
ちょっと長いがすまそ

import java.io.*;
import java.util.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class FaqMan {
public static void main(String[] args) {
new GameFrame();
}
}

170>>151 その2:05/02/14 02:12:58
class ImgPalette {
static final String[] itemBmp = {
"0000000000300300000000000030030000000000000000000030030000300300",
"0000000000300300000000000030030000000000000000000030030000300300",
"0000000000300300333333333300003333333000000333330030003333000300",
"0000000000300300000000000000000000000300003000000030000000000300",
"0000000000300300000000000000000000000300003000000030000000000300",
"0000000000300300333333333300003333000300003000330003333333333000",
"0000000000300300000000000030030000300300003003000000000000000000",
"0000000000300300000000000030030000300300003003000000000000000000",
"0000000000000000000000000030030000300300003003000030030000000000",
"0000000000000000000000000030030000300300003003000030030000000000",
"3333300000033000000333330030030000300033330000333300030033333333",
"0000030000300300003000000030030000300000000000000000030000000000",
"0000030000300300003000000030030000300000000000000000030000000000",
"3333300000300300000333330003300000300033333333333300030033000033",
"0000000000300300000000000000000000300300000000000030030000300300",
"0000000000300300000000000000000000300300000000000030030000300300",
"0022220000111100000000000000000000111100010000100011110000111100",
"0222222001111110000000000001100001111111011001101111111001111110",
"2202202211111111000000000011110011111110111001110111111111111111",
"2202202211111111000110000111111011111000111111110001111111111111",
"2222222211111111000110000111111011111000111111110001111111111111",
"2222222211111111000000000011110011111110111111110111111111100111",
"0202202001111110000000000001100001111111011111101111111001100110",
"2020020200111100000000000000000000111100001111000011110001000010"
};
BufferedImage bi;

171>>151 その3:05/02/14 02:13:33
ImgPalette() {
int width = itemBmp[0].length();
int height = itemBmp.length;
byte[] pixel = new byte[width * 3 * height];
for(int j = 0; j < height; j++){
for(int i = 0; i < width; i++){
int p = itemBmp[j].charAt(i) - '0';
byte red = 0, green = 0, blue = 0;
if(p == 1) red = -1;
if(p == 1 || p == 2) green = -1;
if(p == 3) blue = -1;
pixel[(j * width + i) * 3] = red;
pixel[(j * width + i) * 3 + 1] = green;
pixel[(j * width + i) * 3 + 2] = blue;
}
}
bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
bi.getRaster().setDataElements(0, 0, width, height, pixel);
}

public BufferedImage getImage() { return bi; }
}

172>>151 その4:05/02/14 02:14:06
class GameFrame extends JFrame {
static final String title = "FaqMan";
final int CanvasW = 640, CanvasH = 480;
final int FieldX = 40, FieldY = 80;
final int StateX = 170, StateY = 270, StateC = 100;
final int InfoX = 160, InfoY = 20;
final int ScoreX = 160, ScoreY = 40;
final ImgPalette imgpalette = new ImgPalette();
final int itemW = 16, itemH = 16, itemB = 8;
final int markp = 19, dotp = 18, faq_wink = 17, mon = 16, maxmove = 10;
final int scene_0 = 50, scene_1 = 60, scene_9 = 99999999;
final Font font = new Font("Terminal", Font.BOLD, itemH);
final Random random = new Random();

FieldCanvas field;
int key;

class GameKeyListener implements KeyListener {
public void keyPressed(KeyEvent e) { key = e.getKeyChar(); }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) { }
}

173>>151 その5:05/02/14 02:15:25
class Stage {
int posx, posy, direc, dots, mons;
String[] map;
Stage(int x, int y, int d, int t, int s, String[] m) {
posx = x; posy = y; direc = d; dots = t; mons = s; map = m;
}
}
final Stage[] stage = {
174>>151 その6:05/02/14 02:15:52
new Stage(10, 13, 0, 176, 3, new String[] {
"5222222222f2222222224",
"1iiiiiiiii1iiiiiiiii1",
"1i524i524i1i524i524i1",
"1j101i101i1i101i101j1",
"1i627i627ibi627i627i1",
"1iiiiiiiiiiiiiiiiiii1",
"1ia28i9ia2f28i9ia28i1",
"1iiiii1iii1iii1iiiii1",
"62224ic280b0a2ei52227",
"00001i100000001i10000",
"a2227ib0580a40bi62228",
"00000i001000100i00000",
"a2224i906222709i52228",
"00001i100000001i10000",
"52227ib0a2f280bi62224",
"1iiiiiiiii1iiiiiiiii1",
"1ia24ia28ibia28i528i1",
"1jii1iiiii0iiiii1iij1",
"c28ibi9ia2f28i9ibia2e",
"1iiiii1iii1iii1iiiii1",
"1ia222d28ibia2d2228i1",
"1iiiiiiiiiiiiiiiiiii1",
"622222222222222222227"
}),
175>>151 その7:05/02/14 02:16:39
new Stage(10, 13, 2, 206, 9, new String[] {
"52228ia222f2228ia2224",
"1iiiiiiiii1iiiiiiiii1",
"1i524i524i1i524i524i1",
"1j101i101i1i101i101j1",
"1i627i627ibi627i627i1",
"1iiiiiiiiiiiiiiiiiii1",
"1ia28i9ia2f28i9ia28i1",
"1iiiii1iii1iii1iiiii1",
"62224ic280b0a2ei52227",
"00001i1iiiiiii1i10000",
"a2227ibi580a4ibi62228",
"iiiiiiii1iii1iiiiiiii",
"a2224i906222709i52228",
"00001i100000001i10000",
"52227ib0a2f280bi62224",
"1iiiiiiiii1iiiiiiiii1",
"1ia24ia28ibia28i528i1",
"1jii1iiiii0iiiii1iij1",
"c28ibi9ia2f28i9ibia2e",
"1iiiii1iii1iii1iiiii1",
"1ia222d28ibia2d2228i1",
"1iiiiiiiiiiiiiiiiiii1",
"62228ia22222228ia2227"
})
};

176>>151 その8:05/02/14 02:17:20
class FieldCanvas extends Canvas implements Runnable {
Thread thread = null;
int threadsleep = 20;
Dimension dbuf = null;
Image imgbuf = null;
Graphics gbuf = null;
int width, height;
int[] posx = new int[maxmove];
int[] posy = new int[maxmove];
int[] direc = new int[maxmove];
int dots, mons, snum, score, state, heartbeat;
int[][] map;

FieldCanvas() {
snum = 0; score = 0;
}

177>>151 その9:05/02/14 02:18:13
public void loadStage(int n) {
Stage s = stage[(snum = n) > 0 ? 1 : 0];
width = s.map[0].length(); height = s.map.length;
posx[0] = s.posx; posy[0] = s.posy; direc[0] = s.direc;
dots = s.dots; mons = s.mons;
map = new int[height][width];
for(int j = 0; j < height; j++){
for(int i = 0; i < width; i++){
char c = s.map[j].charAt(i);
map[j][i] = (c <= '9') ? (c - '0') : (c - 'a' + 10);
}
}
for(int i = 1; i <= mons; i++){
posx[i] = 10; posy[i] = 11; direc[i] = (i % 2) * 2;
}
state = 0; heartbeat = 0;
}

178>>151 その10:05/02/14 02:19:02
public void start() {
if(thread == null){
thread = new Thread(this);
thread.start();
}
}

public void stop() {
if(thread != null){
thread.stop();
thread = null;
}
}

179>>151 その11:05/02/14 02:19:38
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
while(thread != null){
repaint();
if(heartbeat < scene_9) heartbeat++;
if(heartbeat < scene_0){
key = 0;
}else{
if(crash()){
state = -1;
continue;
}
if(map[posy[0]][posx[0]] == markp){
map[posy[0]][posx[0]] = 0;
score += 10;
dots--;
}
if(map[posy[0]][posx[0]] == dotp){
map[posy[0]][posx[0]] = 0;
score++;
dots--;
}
if(dots == 0){
state++;
continue;
}
180>>151 その12:05/02/14 02:20:27
switch(key){
case 'H': case 'h': direc[0] = 2; break;
case 'J': case 'j': direc[0] = 3; break;
case 'K': case 'k': direc[0] = 1; break;
case 'L': case 'l': direc[0] = 0; break;
}
for(int i = 0; i <= mons; i++){
if(i > 0 && ((int)random.nextLong() % 100 < 10)){
if(heartbeat < scene_1) direc[i] = 2 - direc[i];
else direc[i] = (int)random.nextLong() % 4;
}
switch(direc[i]){
case 0:
if(posx[i] == width - 1) posx[i] = 0;
else if(!wall(posx[i] + 1, posy[i])) posx[i]++;
break;
case 1:
if(posy[i] == 0) posy[i] = height - 1;
else if(!wall(posx[i], posy[i] - 1)) posy[i]--;
break;
case 2:
if(posx[i] == 0) posx[i] = width - 1;
else if(!wall(posx[i] - 1, posy[i])) posx[i]--;
break;
case 3:
if(posy[i] == height - 1) posy[i] = 0;
else if(!wall(posx[i], posy[i] + 1)) posy[i]++;
break;
}
}
181>>151 その13:05/02/14 02:21:07
}
try{
Thread.sleep(threadsleep);
}catch(InterruptedException e){ }
}
}

public boolean wall(int x, int y) {
if(map[y][x] > 0 && map[y][x] < mon) return true;
else return false;
}

public boolean crash() {
boolean result = false;
for(int i = 1; i <= mons; i++){
if(posx[0] == posx[i] && posy[0] == posy[i]){
result = true;
break;
}
}
return result;
}

public void update(Graphics g) {
paint(g);
}

182>>151 その14:05/02/14 02:21:44
public void paint(Graphics g) {
Dimension dm = size();
if(dbuf == null
|| dbuf.width != dm.width || dbuf.height != dm.height){
dbuf = dm;
imgbuf = createImage(dbuf.width, dbuf.height);
gbuf = imgbuf.getGraphics();
}
if(gbuf != null){
bufferedPaint(gbuf);
g.drawImage(imgbuf, 0, 0, this);
}
}

183>>151 その15:05/02/14 02:22:29
public void bufferedPaint(Graphics g) {
g.setColor(Color.black);
g.fillRect(0, 0, dbuf.width, dbuf.height);
g.drawImage(imgpalette.getImage(), 0, 0, 128, 48, this);
if(map == null) return;
for(int j = 0; j < height; j++){
for(int i = 0; i < width; i++){
transItem(g, i, j, map[j][i]);
}
}
transItem(g, posx[0], posy[0],
faq_wink + ((heartbeat % 2 == 0) ? 0 : (3 + direc[0])));
for(int i = 1; i <= mons; i++){
transItem(g, posx[i], posy[i], mon);
}
g.setFont(font);
g.setColor(Color.yellow);
g.drawString("FaqMan ←:H ↓:J ↑:K →:L", InfoX, InfoY);
g.setColor(Color.green);
g.drawString("Stage " + (snum + 1)
+ " Score " + score, ScoreX, ScoreY);
184>>151 その16:05/02/14 02:23:03
if(heartbeat < scene_0){
g.setColor(Color.red);
g.drawString("Start " + (scene_0 - heartbeat),
StateX, StateY);
}
if(state < 0){
g.setColor(Color.magenta);
g.drawString("Game Over", StateX, StateY);
}
if(state > 0){
g.setColor(Color.cyan);
g.drawString("Stage Clear " + (StateC - state),
StateX, StateY);
}
if(state > StateC){
loadStage(++snum);
}
}

public void transItem(Graphics g, int x, int y, int item) {
int sx = itemW * (item % itemB);
int sy = itemH * (int)(item / itemB);
int dx = FieldX + x * itemW - sx;
int dy = FieldY + y * itemH - sy;
g.copyArea(sx, sy, itemW, itemH, dx, dy);
}
}

185>>151 その17:05/02/14 02:23:36
GameFrame() {
super(title);
addKeyListener(new GameKeyListener());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
pack();
Dimension dm = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((dm.width - CanvasW) / 2, (dm.height - CanvasH) / 2);
Insets is = getInsets();
setSize(CanvasW + is.left + is.right, CanvasH + is.top + is.bottom);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});

field = new FieldCanvas();
getContentPane().add(field);

setVisible(true);

field.loadStage(0);
field.start();
}
}
186159:05/02/14 02:24:11
以上です
187デフォルトの名無しさん:05/02/14 02:29:12
>>186
おお! ありがとうございます。
長大なソースをわざわざ作ってくださって感謝感激です!
これからエクリプスを立ち上げて、コンパイルさせて頂きますが
どの様なゲームなのか概要を教えてください。
ルールと操作法もお願いします。
188デフォルトの名無しさん:05/02/14 02:33:05
動作確認age
189デフォルトの名無しさん:05/02/14 02:36:48
>>187
某ゲームの「もどき版」です。
操作方法は画面上に書いてあります。
190デフォルトの名無しさん:05/02/14 02:59:47
>>189
すいません。
コンパイル&報告は明日の帰宅後にさせて頂きます。
191デフォルトの名無しさん:05/02/14 12:49:31
すごいな〜
192デフォルトの名無しさん:05/02/14 13:11:42
質問です。BM法という文字列照合アルゴリズムを用いてlistboxに照合成功した
文字を表示するプログラムを作ったのですが、表示される文字列が配列の第一要素しか
表示されません。どこを直せばよいのか教えてください。

 
193デフォルトの名無しさん:05/02/14 13:19:21
>>192
ソースがないとどこを直せばいいのかわかりません
せめて、そのBM法で照合成功した後だけでもいいので書いてください
194デフォルトの名無しさん:05/02/14 16:27:39
>>185
すごい。。。記録を塗り替えたよ。
確か今までの最長コードは15レスだったが、今17レスの新記録が
生まれた。
さあ、皆でこのスレッドをソースコードで埋め尽くすのだ!
JAVAプログラマの力を見せ付けてやるのだ!

195デフォルトの名無しさん:05/02/14 16:32:23
お前らスゴいよ、尊敬する
196デフォルトの名無しさん:05/02/14 17:42:40
質問スレ埋まっちゃって、俺立てられなかったから
ここで聞いてみる。

byte[] b = new byte[] {
0xDB, 0x01
};
こういうbyte配列宣言したいんだけど、
0xDBが signed byteの範囲を超えてるから怒られるんだよ。
こういうときってどうしたらいいのん?
197デフォルトの名無しさん:05/02/14 17:52:59
大文字小文字を区別せずにファイルの中身を検索して、マッチした行を表示する方法と、
大文字小文字を区別してファイルの中身を検索し、マッチした行を表示する方法教えてください。
198デフォルトの名無しさん:05/02/14 17:55:48
>>196
byte[] b = new byte[] {
-37, 0x01
};
199デフォルトの名無しさん:05/02/14 17:56:36
>>196
byte[] b = new byte[] {
(byte) 0xDB, 0x01
};
200デフォルトの名無しさん:05/02/14 18:09:02
>>198
なる。signedに変えちゃうか…。
でもそれだと、0xDBであることがわかりにくくなるから、
あまり気持ちよくないね…。

>>199
あ、それいい。
とりあえずそれで行ってみるよ。
こんなことに気づけなかった漏れ…orz
201デフォルトの名無しさん:05/02/14 18:27:28
便乗質問です
byte[] b = new byte[] {
0xDB, 0xBE, 0x8B, 0xAB, 0x9F, 0xEB, 0xCB, 0x01
};
みたいなときに
(byte)0xDB, (byte)0xBE, (byte)0x8B, (byte)0xAB, (byte)0x9F, (byte)0xEB, (byte)0xCB, 0x01
って書きたくないんですけど、
やっぱりこれしか方法は無いんですかね。・・・orz
202デフォルトの名無しさん:05/02/14 18:41:29
>>201
int[] a = {0xDB, 0xBE, 0x8B, 0xAB, 0x9F, 0xEB, 0xCB, 0x01};
byte[] b = new byte[a.length];
for(int i = 0; i < b.length; i++)
b[i] = (byte)a[i];
203デフォルトの名無しさん:05/02/14 19:09:24
これをやってみろ!と言われたのですが、当方JAVAの知識がなく困っています。
勉強中ですがいまいちJAVAのプログラム方法がつかめません。

宿題の内容はこのディレクトリのREADME.TXT中のThe exerciseと
Challenge Exercisesに書いてあります(文頭が+になっているものです)。

ttp://www.daimi.au.dk/dIntProg/eksempler/bluej/chapter04/club/

Club.javaのソースに付け足す形になります。

本当に丸投げになってしまい申し訳ありませんがよろしくお願いします。
204デフォルトの名無しさん:05/02/14 19:19:08
>>203
当方英語の知識がなく困っています。
読めっつってんの?
205197です。:05/02/14 19:22:19
大文字小文字を区別せずにファイルの中身を検索して、マッチした行を表示する方法と、
大文字小文字を区別してファイルの中身を検索し、マッチした行を表示する方法のメソッドを作るのですがよろしくお願いします。
206デフォルトの名無しさん:05/02/14 19:25:44
>>202
ありがとうございます。
なかなかスマートな方法ですね。
一旦intに入れたり、実行中にコピーされるのが
無駄な感じがしますが仕方ないですね。
207デフォルトの名無しさん:05/02/14 19:28:53
>>205
行がずれてたり片方には無かったりすることは考えなくていいの?
それともdiffコマンド見たいなもの作れって言う話?
208デフォルトの名無しさん:05/02/14 19:31:56
>>170-171
これ結構感動しました。
でもWindowsでは動くのですが、うちのLinux君だと動いてくれません。
どうしたもんでしょうか?
209204:05/02/14 20:01:38
>>203
できたから貼っとく。
英語めんどいわ。。

import java.util.ArrayList;
public class Club {
ArrayList memberList;
public Club() { memberList = new ArrayList(); }
public void join(Membership member) { memberList.add(member); }
public int numberOfMembers() { return memberList.size(); }
public int joinedInMonth(int month) {
int count=0;
for( int i=0; i<memberList.size(); i++ ) {
if( ((Membership)memberList.get(i)).getMonth() == month ) count++;
}
return count;
}
public ArrayList purge(int month, int year) {
ArrayList purgedList = new ArrayList();
for( int i=0; i<memberList.size(); i++ ) {
if( ((Membership)memberList.get(i)).getMonth() == month ) {
if( ((Membership)memberList.get(i)).getYear() == year ) {
memberList.remove(i);
purgedList.add((Membership)memberList.get(i));
}
}
}
return purgedList;
}
}
210デフォルトの名無しさん:05/02/14 22:46:16
今週中にJAVA使って何でも良いからアニメーション作れとか言われました。
ただの絵でもいいらしいんですができれば少しぐらい動いたほうが良いらしいです。

誰かなんか作って下さい。
211java初心者:05/02/14 22:51:26
明日までに仕上げないといけないプログラムがあるのですが
どうしても一つ分からないところがあります。
作っているのはブロック崩しのゲームなのですが、ボールの当たり判定がよくわかりません。
ballX+=ballVX;
if (ballX<=2) {
ballX=2;
ballVX=-ballVX;
} else if (ballX>=118) {
ballX=118;
ballVX=-ballVX;
} else {
i=(ballY/10)*6+ballX/20;
if (0<=i && i<60 && block[i]!=0) {
block[i]=block[i]-1;
ballVX =-ballVX;
if (--rest<=0) init=S_CLEAR;

}
}
この部分を説明しなくてはいけないのですが、ここはどういった意味なのでしょう?
分かる方いらっしゃいましたらご指導お願いします。
212java初心者:05/02/14 22:53:27
作っているのは120x130ドットのiアプリです。
213デフォルトの名無しさん:05/02/14 23:27:05
ballXちうのはボールのX座標なんだろうなー。
でballVXちうのはボールの移動速度のX座標分なんだろうなー。
でもってballXが2以下かもしくは118以上ってのは横の壁に当たったことを意味してるのかなー。違うかなー。
壁に当たったからボールの移動方向が逆になってるんだろーなー。
でこのiってなんだろーなー意味分からんなー。
ちうかそもそもこの処理はいつ呼ばれるのかなー。
>>211はボールの当たり判定とか言ってるから、ボールが何かに当たったときにコールされるのかなー。分からんなー。
あーなんか腹立ってきたなー。こんなんで分かれっていう奴の神経が分からんなー。
このelse文はブロックに当たったときなのかなー。
block配列はブロックの有無を表してるフラグなのかなー。
iがなんなのかよく分からんが、とりあえずこのif文はボールの座標にブロックがあった場合なのかなー。
ある状態が1でない状態が0だからボールがブロックに当たったらblock配列のi番目を1引いてるのかなー。
んでもってぶつかったからボールの移動方向が逆になってるんだろーか。
俺ならボールの移動速度の「Y座標」の正負を逆にしたいなー。勘違いしてるかなー。
最後のif文なんやろーなー。
あーrestって「残り」ってことかなー?ボールがブロックにぶつかって残りブロックが1引かれて、
それが0以下なら消さなきゃいけないブロックはないからこのステージは終わりなんやろーなー。
だからinitっていうなんかよー分からん変数に「ステージクリアー」のフラグを立ててるんやろーなー。
違うかなー。でも別にどーでもいいなー。
214java初心者:05/02/14 23:38:10
>>213さん
返信ありがとうございます。
>>213さんの推測どおりであっています!さすがです。
iっていうのはブロック数です。縦10x横6の60個で構成されています。
>>213さんのお陰でなんとか分かりそうです。ありがとうございます。
あと
i=(ballY/10)*6+ballX/20;
が何を表しているのかがよく分かりません。
よろしければ教えてください。
何度もすみません
215デフォルトの名無しさん:05/02/14 23:49:45
>>211
その部分は自分で作ってるんじゃないのか?
216213:05/02/14 23:54:52
>>214
>>213さんの推測どおりであっています!さすがです。
あってるってことが分かってるってことは
理解できてるんじゃん。

イマイチ>>213で俺の言いたいことが伝わってないっぽいけど、
持ってる情報は「全部」出して。

今回のケースなら変数が何を表してるのかってのはそっちで分かってるんでしょ?
でもこっちはそれすら推測しなきゃいけないんだから、はっきりいってツライ。

iはブロック数じゃないでしょ。ブロックがある場所だわきっと。
0 1 2  3  4 5
6 7 8 ...
てな具合に0から59まで横6縦10でブロックを配置してる。
でブロックは1コにつき横20縦10のサイズなんだと思う。
だからボールのy座標を10で割れば「どの行」にボールがいるか分かるわけで
たとえばボールのy座標が11なら10で割って6掛ければ「6」だから
iが6から11のどれかってゆーのが分かる。
x座標も同様。たとえばx座標が50なら20で割って「2」だから
さっきの6に2足してiは8。
つまりボールのx座標とy座標からブロックのある場所を計算してる。
217デフォルトの名無しさん:05/02/14 23:56:56
>>214
それはボールの座標から、当たったブロックのブロック配列の中での位置(i)を算出
218デフォルトの名無しさん:05/02/15 00:00:05
>>204

ありがとうございました。感動しました。私の日本語訳よりソースの完成が早い
とは思いませんでした。

これから勉強して自分で出来るようにならないといけませんね。今回は本当にあ
りがとうございました。
219デフォルトの名無しさん:05/02/15 00:01:09
>>215さん
判定の部分は友人に作ってもらいました・・・。
>>213さん
あ、そうです。iはブロックのある場所でした。すみません。
0は背景で設定しているので、1〜60がブロックになります。
ブロックのサイズも213さんのおっしゃる通りです。
ご説明ありがとうございます。結構なぞが解けてきました。
でわ、1ステージ分のソースを載せさせていただきます
220デフォルトの名無しさん:05/02/15 00:01:11
っつーかソース中にマジックナンバー書きまくるなよ
もし他の香具師が作ったものをメンテで作り直してるんなら
この際そこら辺も直しとけ
221デフォルトの名無しさん:05/02/15 00:02:59
>あ、そうです。iはブロックのある場所でした。すみません。
>0は背景で設定しているので、1〜60がブロックになります。

お前のブロックは左上が欠けてるのか?
222java初心者:05/02/15 00:03:39
>>217さん
ありがとうございます。213さんの説明で納得できました。
>>220
マジックナンバーって何だかよくわかりません・・・すみません。
223デフォルトの名無しさん:05/02/15 00:04:14
>>219
お待ちしております
224デフォルトの名無しさん:05/02/15 00:05:20
225java初心者:05/02/15 00:08:41
import com.nttdocomo.ui.*;

//ブロック崩し(キャンバス)
final class BlockCanvas extends Canvas {
private static int event;

void exe() {
Graphics g=getGraphics();
int i,j,k;
int stage=0;
int S_TITLE=0, //シーン定数
S_PLAY =3,
S_CLEAR=1,
S_MISS =2;
String[] TEXT={//テキスト
"PLEASE START",
"CLEAR!",
"MISS!"};

226デフォルトの名無しさん:05/02/15 00:09:11
//システム
int scene ; //シーン
int init ; //初期化
int rest; //ノ残り
long sleepTime; //前時間

//ブロック・ボール・バー
int ballX; //ボールX座標
int ballY; //ボールY座標
int ballVX; //ボールX速度
int ballVY; //ボールY速度
int barX; //バーX座標
227java初心者:05/02/15 00:10:17
int[][] BLOCK={
{ //stage=0 のブロック
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,}
Image[] image =new Image[61];//イメージ
int[] block =new int[60];//ブロック
228java初心者:05/02/15 00:10:49
while(stage<=3){
switch(stage){
case 0:
//システム
scene =S_TITLE; //シーン
init =S_TITLE; //初期化
rest =0; //ノ残り
sleepTime=0; //前時間

ballX =0; //ボールX座標
ballY =0; //ボールY座標
ballVX=0; //ボールX速度
ballVY=0; //ボールY速度
barX =0; //バーX座標
229デフォルトの名無しさん:05/02/15 00:11:21
がんがれ〜
230java初心者:05/02/15 00:11:46
try {
//画面サイズ
g.setColor(g.getColorOfName(g.BLUE));
g.fillRect(0,0,getWidth(),getHeight());
if (getHeight()>=130) {
g.setOrigin((getWidth()-120)/2,(getHeight()-130)/2);
} else {
g.setOrigin((getWidth()-120)/2,0);
}
//フォントサイズ
if (Font.getDefaultFont().getHeight()>12)
g.setFont(Font.getFont(Font.SIZE_SMALL));
231java初心者:05/02/15 00:12:25
MediaImage m;
for (i=60;i>=1;i--) {
if (BLOCK[stage][i-1]!=0) {
k=100*stage+i;
m=MediaManager.getImage("resource:///"+k+".gif");
m.use();
image[i]=m.getImage();
}
}
m=MediaManager.getImage("resource:///00.gif");
m.use();
image[0]=m.getImage();
232java初心者:05/02/15 00:12:56
setSoftLabel(SOFT_KEY_2,"終了");
while (true) {
//初期化
if (init>=0) {
scene=init;
init=-1;
//タイトル・プレイ
if (scene==S_TITLE || scene==S_PLAY) {
rest=0;
for (i=59;i>=0;i--) {
block[i]=BLOCK[stage][i];
if (block[i]!=0) rest=rest+block[i];
}
}
233java初心者:05/02/15 00:13:57
//タイトル・クリア・ミス
if (scene!=S_PLAY) {
setSoftLabel(SOFT_KEY_1,"スタート");
}
//プレイ
else {
ballX =60;
ballY =113;
ballVX =0;
ballVY =0;
barX =60;
setSoftLabel(SOFT_KEY_1,"");
}
}
234java初心者:05/02/15 00:14:43
//ブロック
g.lock();
g.setColor(g.getColorOfName(g.WHITE));
g.fillRect(0,0,120,130);
g.drawImage(image[0],0,0);
for (i=59;i>=0;i--) {
if (block[i]!=0) {
g.drawImage(image[i+1],(i%6)*20,(i/6)*10);
}
}
//プレイ
if(scene==S_PLAY) {
//バー移動
if (((1<<Display.KEY_LEFT)&getKeypadState())!=0) {
barX-=8;
if (barX<10) barX=10;
if (ballVX==0) ballX-=8;
}
if (((1<<Display.KEY_RIGHT)&getKeypadState())!=0) {
barX+=8;
if (barX>110) barX=110;
if (ballVX==0) ballX+=8;
}
235java初心者:05/02/15 00:15:20
//バー衝突判定
if (barX-12<=ballX && ballX<=barX+12 &&
116 <=ballY && ballY<=120) {
ballVY=-Math.abs(ballVY);
if (ballX>=barX+8) {
ballVX=4;
} else if (ballX<=barX-8) {
ballVX=-4;
} else if (ballX>=barX+4) {
ballX+=3;
} else if (ballX<=barX-4) {
ballX-=3;
}
}
236デフォルトの名無しさん:05/02/15 00:16:12
もうオブジェクト指向も糞もへったくれも無いな。
237デフォルトの名無しさん:05/02/15 00:17:08
BASICからの移植じゃないのか?
238java初心者:05/02/15 00:17:14
//X軸衝突判定
ballX+=ballVX;
if (ballX<=2) {
ballX=2;
ballVX=-ballVX;
} else if (ballX>=118) {
ballX=118;
ballVX=-ballVX;
} else {
i=(ballY/10)*6+ballX/20;
if (0<=i && i<60 && block[i]!=0) {
block[i]=block[i]-1;
ballVX =-ballVX;
if (--rest<=0) init=S_CLEAR;
}
}
239java初心者:05/02/15 00:18:19
//Y軸衝突判定
ballY+=ballVY;
if (ballY<=2) {
ballY=2;
ballVY=-ballVY;
} else if (ballY>=128) {
ballY=128;
init=S_MISS;
S_TITLE=0;
} else {
i=(ballY/10)*6+ballX/20;
if (0<=i && i<60 && block[i]!=0) {
block[i]=block[i]-1;
ballVY =-ballVY;
if (--rest<=0) init=S_CLEAR;
}
}
240デフォルトの名無しさん:05/02/15 00:18:32
コメント書かれてないと読めないようなコードは良くない
241java初心者:05/02/15 00:18:57
//ボールとバーと残りブロックの描画
g.setColor(g.getColorOfName(g.RED));
g.fillRect(ballX-2,ballY-2,4,4);
g.setColor(g.getColorOfName(g.GREEN));
g.fillRect(barX-10,116,20,4);
g.drawString(String.valueOf(rest),3,13);
}
//タイトル・クリア・ミス
else{
g.setColor(g.getColorOfName(g.BLACK));
g.drawString(TEXT[scene],
(120-TEXT[scene].getBytes().length*6)/2+1,116);
g.setColor(g.getColorOfName(g.RED));
g.drawString(TEXT[scene],
(120-TEXT[scene].getBytes().length*6)/2,116);
}
g.unlock(true);
// case 0 の終わり
if(scene==S_CLEAR){stage+=1;break;}
242デフォルトの名無しさん:05/02/15 00:19:35
>>226
//システム
int scene ; //シーン
int init ; //初期化
int rest; //ノ残り
long sleepTime; //前時間

//ブロック・ボール・バー
int ballX; //ボールX座標
int ballY; //ボールY座標
int ballVX; //ボールX速度
int ballVY; //ボールY速度
int barX; //バーX座標

・・・
243java初心者:05/02/15 00:19:43
//スリープ
while (System.currentTimeMillis()<sleepTime+70L) Thread.yield();
sleepTime=System.currentTimeMillis();
//イベント
if (S_TITLE==0 && scene==S_PLAY && event==Display.KEY_SELECT) {
ballVX=-4;
ballVY=-3;
if (barX>60) ballVX=3;
} else if (scene!=S_PLAY && event==Display.KEY_SOFT1) {
init=S_PLAY;
} else if (event==Display.KEY_SOFT2) {
IApplication.getCurrentApp().terminate();
}
event=-222;
}
} catch (Exception e) {
}
244java初心者:05/02/15 00:20:33
一応これで全部です。
当方超初心者の為色々不備があると思いますが
ご指導お願いします
245デフォルトの名無しさん:05/02/15 00:22:33
これって携帯用だけど
エミュ持ってないから遊べないや
246デフォルトの名無しさん:05/02/15 00:25:39
>>244
おつかれさまです
いまから試してみます
247java初心者:05/02/15 00:25:44
教授に教えられながら何とかやったプログラムです。
初めて組んだjavaのプログラムなので、相当不備があると思われます。
すみません。
>>245
エミュはドコモのHPにありますよ。
248java初心者:05/02/15 00:26:48
>>246
改行多すぎとか色々言われて時間が掛かってしまいました。
249デフォルトの名無しさん:05/02/15 00:27:35
250デフォルトの名無しさん:05/02/15 00:30:37
まあ携帯のアプリなら構造化したりクラス分けしたりして
サイズ大きくなるより、読みにくくてもストレートなコード
書く傾向にあるのは止むを得まい。
251java初心者:05/02/15 00:33:19
>>249
ご指導ありがとうございます。ブックマークさせていただいたので
後ほどじっくり勉強したいと思います。
>>250
超初心者なので全てストレートです。何も応用とかはしていません。
252デフォルトの名無しさん:05/02/15 00:37:13
ストレートってそういう意味じゃないんだけど
253java初心者:05/02/15 00:38:56
>>252
あ・・・そうでしたか・・・すみません。
254デフォルトの名無しさん:05/02/15 00:50:22
途中割り込みがいっぱいあって面倒だったのですが
ダウンロード完了しました。
255java初心者:05/02/15 00:52:12
>>254
お疲れ様でした。とろとろしていた私にも責任があります。
すみませんでした。そして、ありがとうございます。
256java初心者:05/02/15 00:54:11
何度もすみません、もう一つどうしても分からないのがあります。
バーの衝突判定なのですが・・・本当に何度もすみません。

//バー衝突判定
if (barX-12<=ballX && ballX<=barX+12 &&
116 <=ballY && ballY<=120) {
ballVY=-Math.abs(ballVY);
if (ballX>=barX+8) {
ballVX=4;
} else if (ballX<=barX-8) {
ballVX=-4;
} else if (ballX>=barX+4) {
ballX+=3;
} else if (ballX<=barX-4) {
ballX-=3;
}

この部分です。これを説明おねがいします。何度もすみません。
257デフォルトの名無しさん:05/02/15 00:56:32
>>227
ここでエラーが出ます

int[][] BLOCK={
{ //stage=0 のブロック
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,}
Image[] image =new Image[61];//イメージ
int[] block =new int[60];//ブロック
258java初心者:05/02/15 00:58:14
>>257さん
int[] BLOCK={
{ //stage=0 のブロック
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,}
Image[] image =new Image[61];//イメージ
int[] block =new int[60];//ブロック

これで動きませんか?
259デフォルトの名無しさん:05/02/15 01:03:40
これってプログラム以外にも
リソースの00.gifとかxx.gif
っていうファイルいっぱいいるよね?
260java初心者:05/02/15 01:05:55
>>259
はい。いっぱいあります。それもUPします。少々お待ちください。
261デフォルトの名無しさん:05/02/15 01:06:51
一応Java初心者の宿題だから流れ的には全然OKなんだけど、
ここに出した方が良かったのかも知れない。
http://pc5.2ch.net/test/read.cgi/tech/1102844217/l50
262java初心者:05/02/15 01:08:49
>>259
http://upload.fam.cx/cgi-bin/img-box/uh750215010700.zip
ここにUPしました。すべてのプログラムもここにあります。
最初からこうすればよかったですね。すみません。
263java初心者:05/02/15 01:09:40
>>261さん
あ・・・そうですね。そちらの方がよかったかもしれないですね・・・
申し訳ないです
264デフォルトの名無しさん:05/02/15 01:12:40
>>258
int[][] BLOCK={{ //stage=0 のブロック
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,}};

将来ステージが増える(かもしれない)ことを考えるとこっちじゃないかな
265java初心者:05/02/15 01:15:58
>>264さん
あ・・・そうなりますか・・・すみません。
>>262にすべてのプログラムをUPしました。
最初からこうすればよかったですね・・・本当にご面倒をおかけして申し訳ないです
266デフォルトの名無しさん:05/02/15 01:33:16
勘違いだったら申し訳ないんだが、
try{ と }catch() までの間に } が一個多い。
対応おかしくなってるかソースの貼り間違いじゃないのか・・・orz
267デフォルトの名無しさん:05/02/15 01:34:34
っつーか switch の中に case 0 しかないしw
268デフォルトの名無しさん:05/02/15 01:35:57
プログラム途中で終わってる。
ソース全部貼ってないだろう。
269java初心者:05/02/15 01:37:19
>>266-267さん
貼り付けているうちになんだか混乱してしまいました・・・
>>262に完全なプログラムをUPさせていただきましたので
そちらをご参照ください。ご面倒おかけして本当にすみません。
270java初心者:05/02/15 01:38:33
>>268さん
申し訳ありません。削っているうちに余計なのまで削ったりしてしまったようです。
くわしくは>>262をご参照ください。ご面倒おかけして本当にすみません。
271デフォルトの名無しさん:05/02/15 01:39:53
http://upload.fam.cx/cgi-bin/img-box/uh750215010700.zip
ここ見たら中身全然違うしw
272java初心者:05/02/15 01:40:39
>>271さん
すみません。そうですよね。本当に申し訳ありません・・・
273デフォルトの名無しさん:05/02/15 01:41:46
>>269-270
とりあえずめちゃくちゃなソースなんで清書するわ
274java初心者:05/02/15 01:44:23
>>273さん
めちゃくちゃですか・・・ご面倒おかけして本当に申し訳ありません。
275デフォルトの名無しさん:05/02/15 01:46:13
なんかリソースの中のgifの番号飛んでるし同じ画像いっぱいあるし
これそのまま使って大丈夫なん?
276java初心者:05/02/15 01:50:09
>>275さん
はい。これはこのままでOKです。正常に動きます。
277java初心者:05/02/15 01:50:57
>>275さん
あ、第一ステージだけ発表のため一部省略していますが、そのままで動きます。
278デフォルトの名無しさん:05/02/15 01:53:59
case 1 以下が全部抜けてるのか・・・
279java初心者:05/02/15 01:54:58
>>278さん
そうです。すみません・・・
280デフォルトの名無しさん:05/02/15 02:01:02
これさー、case 0, 1, 2, 3 がそれぞれ stage 毎の処理なんだよね。
同じ処理が繰り返し書かれてるんだけど、この書き方って最悪・・・
281java初心者:05/02/15 02:02:43
>>280さん
そうなんです・・・全く応用ができなかったものでそれでもう提出してしまいました・・・
すみません
282デフォルトの名無しさん:05/02/15 02:03:55
やはりマジックナンバー書きまくってるのと、
おなじ処理の繰り返しにコピペをしている発想がまずすぎ。

判定するためのコードは共通にして、関数化する必要がある。
各stage毎の処理は関数呼び出し時のパラメータで変化させる。

こりゃ清書どころか全面的に書き直しだな。
283デフォルトの名無しさん:05/02/15 02:05:10
ところでさ、00.gif の画像っていいよね。プロのデザイナーが作ったみたいで。
284デフォルトの名無しさん:05/02/15 02:07:30
>>211
この宿題って明日までなんだよね?
285java初心者:05/02/15 02:09:40
>>282さん
ご指摘ありがとうございます。これからもっと勉強していきます。
もうこれで提出してしまったので、書き直しはできません・・・
まだまだ私の知識が甘いって事を痛感しております。
>>283さん
ありがとうございます。ちょっと頑張りました。
286java初心者:05/02/15 02:11:10
>>284さん
プログラム自体はもう提出してありまして、明日は発表なのです。
だからプログラム全体を理解しておかないとまずいんです。
プログラムは教授と友人の助けによりなんとかなったのですが、
発表は自分でやらないといけないので・・・
287デフォルトの名無しさん:05/02/15 02:11:48
>>285
清書出来たら戻ってくる
288java初心者:05/02/15 02:14:55
>>287さん
申し訳ありません。本当にありがとうございます。
私も明日の発表用の論文とパワーポイントをやってきます。

みなさん、本当にありがとうございます。
289デフォルトの名無しさん:05/02/15 02:15:10
ゲーム自体完成してても、プログラムそのものはかなり完成度低い。
明日発表なら考察に「リファクタリングが今後の課題」とでも書いて桶。
290java初心者:05/02/15 02:22:43
>>289さん
ご意見ありがとうございます。参考にさせていただきます。
291java初心者:05/02/15 02:25:44
しばらく論文に集中してきますので席を空けます。
みなさん本当にありがとうございました!
292java初心者:05/02/15 03:13:40
先ほども質問したのですが、論文書いてて気づきました。バーの衝突判定もよくわかりません・・・
どなたか解説お願いします。本当に何度もすみません

//バー衝突判定
if (barX-12<=ballX && ballX<=barX+12 &&
116 <=ballY && ballY<=120) {
ballVY=-Math.abs(ballVY);
if (ballX>=barX+8) {
ballVX=4;
} else if (ballX<=barX-8) {
ballVX=-4;
} else if (ballX>=barX+4) {
ballX+=3;
} else if (ballX<=barX-4) {
ballX-=3;
}

これです。
293デフォルトの名無しさん:05/02/15 03:28:58
294デフォルトの名無しさん:05/02/15 03:31:09
if (barX-12<=ballX && ballX<=barX+12 &&
116 <=ballY && ballY<=120) {
ballVY=-Math.abs(ballVY);
ballX が bar の左端と右端の間にあって
ballY が bar の上と下の間にあればボールは上にもどる

295java初心者:05/02/15 03:32:29
>>293さん
心にズキズキ響きます。リファクタリングはこれから勉強していきます・・・
296デフォルトの名無しさん:05/02/15 03:32:42
if (ballX>=barX+8) {
ballVX=4;
} else if (ballX<=barX-8) {
ballVX=-4;
bar の比較的外側にあたったときは逆方向に打ち返される
297デフォルトの名無しさん:05/02/15 03:33:32
} else if (ballX>=barX+4) {
ballX+=3;
} else if (ballX<=barX-4) {
ballX-=3;
}
bar の比較的中心(スウィートスポット)に当たった時は順方向に跳ね返るだけ
298java初心者:05/02/15 03:35:07
>>294さん
ご説明ありがとうございます。
ballVY=-Math.abs(ballVY);
がballY が bar の上と下の間にあればボールは上にもどる
という意味なのでしょうか?
ballVY=-Math.abs(ballVY);
の意味がよく分からないんです・・・
299デフォルトの名無しさん:05/02/15 03:36:37
最後うそだな。中心から少し外れたときの条件が書かれている。
スウィートスポットの話はではないが、それは条件が除外された後の話。
300java初心者:05/02/15 03:36:39
>>296-297さん
ご説明ありがとうございます。理解できました!ありがとうございました。
301java初心者:05/02/15 03:37:29
>>299さん
え、そうなのですか?うぅどうしよう・・・
302デフォルトの名無しさん:05/02/15 03:38:05
ballVY=-Math.abs(ballVY);
これは上下の中間に入ってしまった時に誤動作しないための処理。
もし、
ballVY=-ballVY;
と書いてしまうと、ボールがbarの中でバウンドするはずw
303java初心者:05/02/15 03:41:31
>>302さん
なるほど。そうなんですか!ありがとうございます。
304デフォルトの名無しさん:05/02/15 03:45:30
やってみればわかるw
305java初心者:05/02/15 03:56:25
>>304さん
やってみました。特に問題なく動いたのですが、バーに当たったときの
ボールの跳ね返り方に変化がありました。ワンパターンな跳ね返りしかしませんでした。
-Math.abs(ballVY);にはどういった意味があるのですか?
306java初心者:05/02/15 04:21:12
明日早いのでそろそろ寝ます。発表なので少しは寝ないとまずいので・・・
色々ご指導してくださったみなさん、本当にありがとうございました。
感謝感謝です。
307デフォルトの名無しさん:05/02/15 06:23:53
>>262
そこのiアプリ実行してみました。stage1はなかなか良いですね。
ブロックが白じゃなくて他の色だともっと楽しめると思います。
他に気になることと言えば、ブロックに書いてある数字より少ない
カウントでブロックが消えることが多いように見受けられます。
画像が合ってないのかプログラムの配列の初期値がおかしいのか、
ブロック減数のバグとか衝突判定のバグとか何が間違えてるかは不明。
308>>210 その1:05/02/15 23:19:32
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.util.Timer;
public class HW80 extends JFrame {
static final double XMIN = -1, XMAX = 1, YMIN = -1, YMAX = 1, ZMIN = -1, ZMAX = 1;
static final int N = 20;
double z[][] = new double[N][N];
double degX = 45, degY = 45;
double radX = Math.toRadians(degX), radY = Math.toRadians(degY);
int prevX, prevY;
boolean axisZFlag;
int cntZ = 0;
BufferedImage img;
Graphics2D g;
JLabel lab = new JLabel();
public static void main(String[] arg) {
new HW80();
}
HW80() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
z[i][j] = 0.4 * Math.sin(2.0 * Math.PI / N * i)
* Math.sin(2.0 * Math.PI / N * j);
}
}
309>>210 その2:05/02/15 23:20:11
lab.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
prevX = e.getX();
prevY = e.getY();
}
});
lab.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
int addX = (e.getX() - prevX) / 4 * 4;
int addY = (e.getY() - prevY) / 4 * 4;
if (addX == 0 && addY == 0)
return;
degY += addX;
if (degY >= 360)
degY = 0;
else if (degY < 0)
degY = 359;
degX += addY;
if (degX >= 360)
degX = 0;
else if (degX < 0)
degX = 359;
prevX = e.getX();
prevY = e.getY();
radX = Math.toRadians(degX);
radY = Math.toRadians(degY);
draw();
}
});
getContentPane().add(lab);
310:>>210 その4:05/02/15 23:20:41
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
draw();
new Timer().schedule(new TimerTask() {
public void run() {
moveZ();
draw();
}
}, 100, 50);
}
synchronized void moveZ() {
if (axisZFlag) {
--cntZ;
if (cntZ <= -15)
axisZFlag ^= true;
} else {
++cntZ;
if (cntZ >= 15)
axisZFlag ^= true;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
z[i][j] = 0.4 * Math.sin(2.0 * Math.PI / N * i)
* Math.sin(2.0 * Math.PI / N * j)
* ((double) cntZ / 10);
}
}
}
311>>210 その5:05/02/15 23:21:15
int transX(double x) {
return (int) ((x - XMIN) / (XMAX - XMIN) * getSize().width * 0.8 + (getSize().width * 0.1));
}
int transZ(double z) {
return (int) ((ZMAX - z) / (ZMAX - ZMIN) * getSize().height * 0.8 + (getSize().height * 0.1));
}
synchronized void draw() {
if (img == null) {
img = new BufferedImage(getSize().width, getSize().height,
BufferedImage.TYPE_INT_ARGB);
g = img.createGraphics();
g.setBackground(Color.white);
g.setColor(Color.black);
lab.setIcon(new ImageIcon(img));
}
g.clearRect(0, 0, img.getWidth(), img.getHeight());
double xx[][] = new double[z.length][z.length];
double zz[][] = new double[z.length][z.length];
double sinA = Math.sin(radX), sinB = Math.sin(radY);
double cosA = Math.cos(radX), cosB = Math.cos(radY);
double x, y, y0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
x = XMIN + (XMAX - XMIN) / N * i;
y = YMIN + (YMAX - YMIN) / N * j;
y0 = y * cosA - z[i][j] * sinA;
zz[i][j] = y * sinA + z[i][j] * cosA;
xx[i][j] = x * cosB - y0 * sinB;
}
}
312>>210 その6:05/02/15 23:22:16
for (int i = 0; i < N - 1; i++) {
for (int j = 0; j < N - 1; j++) {
int xpg[] = { transX(xx[i][j]), transX(xx[i + 1][j]),
transX(xx[i + 1][j + 1]), transX(xx[i][j + 1]) };
int zpg[] = { transZ(zz[i][j]), transZ(zz[i + 1][j]),
transZ(zz[i + 1][j + 1]), transZ(zz[i][j + 1]) };
g.drawPolygon(xpg, zpg, xpg.length);
}
}
lab.repaint();
}
}
313デフォルトの名無しさん:05/02/16 00:03:34
今週中にJAVA使って何でも良いからアニメーション作れとか言われました。
ただの絵でもいいらしいんですができれば少しぐらい動いたほうが良いらしいです。

誰かなんか作って下さい。
314デフォルトの名無しさん:05/02/16 00:09:06
315デフォルトの名無しさん:05/02/16 00:12:20
>>308-312
お尻とオパーイに見えた
316デフォルトの名無しさん:05/02/16 00:23:12
>>313
すぐ上に作ってるよー
317デフォルトの名無しさん:05/02/16 00:24:27
>>308-312
なんかエッチなアプリだな。
318デフォルトの名無しさん:05/02/16 00:25:22
>>315
溜まりすぎだ。ちゃんと定期的に抜いてオケよ。
319デフォルトの名無しさん:05/02/16 02:21:20
腰のあたりのクビレがなんとも言えませんな。
320デフォルトの名無しさん:05/02/16 02:56:06
>318
珍しく感想を言おう。おまいはエロい。
321デフォルトの名無しさん:05/02/16 09:38:30
地震こわい
322デフォルトの名無しさん:05/02/16 16:01:37
>>88>>114に追加の宿題です。
今までのプログラムに以下のものを追加せよ。
・自分のロボットと敵(コンピュータ)のロボットをフィールド上にランダムに
配置して交互に一マスずつロボットを進めていき、先にHOMEにたどり着けたほうが勝ち。
・HOMEまでの道のりのマスにボーナス(20ドルゲットとか50ドルゲットとか)をランダムで配置。
・勝った場合、賞金として100ドルゲット。
・HOMEにいたるまでのコストを賞金から引いて残金を最終スコアとする。
・スコアキーパー(デフォルトのTOP5のデータを入れておく。)からデータを読み取り、TOP5を記録。
このとき、現在プレイしたスコアがTOP5入りするようなら名前の入力を求める。

以上です。
どなたかお願いします。
323デフォルトの名無しさん:05/02/16 17:33:50
ゲーム系専門学校の課題なのだろうか?
アミューズメント・クリエーター学院とか
324sage:05/02/17 02:50:35
>>323
普通の4年制大学です。アルゴリズムのクラスですね。
325デフォルトの名無しさん:05/02/17 19:19:40
だれか >>322 やってる?
326デフォルトの名無しさん:05/02/17 19:31:47
多分誰もやってないと思ふ
327322:05/02/17 20:07:58
だれかお願いします・・・。
328115:05/02/17 20:31:49
>>322
115では答えてもらえない原因って書いたけど、
「追加の宿題」ってこっちからしたら
今までの問題すべてふまえないといけないのでめんどくさいんだよね。。
これまでの宿題ったって人の書いたソースだからいちいち読まないし。
329322:05/02/17 22:32:48
>>115
おっしゃることは最もだと思います。ただ、うちの先生の方針がこうなので・・・。
皆さんの作ったのを参考にしたいので、今までの方とは違ったものでもいいので
どなたかお願いできませんか?
330322:05/02/18 14:15:43
ロボットをキーボードで操作してHOMEに帰すゲームをGUIを使って作りなさい。
以下がゲームの必要事項です。

スタートボタンを押すとロボット(プレイヤー)とロボット(コンピュータ)
HOMEをそれぞれランダムで格子状(gridLayoutを使って作ります)のステージに配置します。
ステージのマスの数(縦×横)はプレイヤーが数字を入力して選べます。
HOMEはプレイヤーにはわからないようにします。
プレイヤーとコンピュータのロボットは交互に一マスずつ動いていきます。
ロボットが一マス動くごとに1ドルのコストがかかります。
ロボットが一マス動くごとにステージをアップデートしてHOMEまでの距離を表示します。
ロボットはキーボード操作でマスを上下左右に移動できます。(斜めはなし)
上=I, 下=M, 右=L, 左=Jのキー配置です。
HOMEまでの道のりのマスにボーナス(20ドルゲットとか50ドルゲットとか)をランダムで配置します。
どちらかのロボットが先にHOMEについた時点でゴールです。
プレイヤーが先にゴールした場合、ボーナスとして100ドルを受け取れます。
最終スコアは勝った場合のボーナスとHOMEまでの道のりで得たボーナスから
コストを引いたものが最終スコアとなります。
スコアキーパー(デフォルトのTOP5のデータを入れておく。)からデータを読み取り、TOP5を記録。
このとき、現在プレイしたスコアがTOP5入りするようなら名前の入力を求める。
ゴール後ウィンドウをポップアップさせて最終スコアとリプレイするかしないかを表示します。
331322:05/02/18 14:19:53
>>330の続き

スコアキーパーは3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。

>>115さんの発言を踏まえ、前を見直さなくてもわかるように
ひとつにまとめてみました。(長すぎて2つになりましたが・・・。)
今までに回答を下さった方にはとても感謝していますしとても参考になりました。
また、新たにこれをやってやろうと考えている方がおりましたら、
他の方のソースを踏まえてでも、オリジナルでもかまいませんのでお願いいたします。
332デフォルトの名無しさん:05/02/18 16:02:32
>>330
プログラムを作るには曖昧なところがいっぱいあるね。私が作るとするなら、まず以下のようなことを明らかにしたいと思うと思う。

a) プレイヤーとコンピュータの両ロボット、HOME、ボーナスの初期配置に関して、同一セルに配置してはいけないものはあるか。

b) a に関連して、ステージのマスの数を受け付ける際、プログラムとして受け付ける最大値と最小値は?(1x1って入力されたらどうするの?)

c) コンピュータ側のロボットの動き方。HOMEに向かって突き進むのか、ランダムに動くのか。

d) c に関して「HOMEに突き進む」とする場合、コンピュータ側ロボットの斜め方向にHOMEがある場合、縦位置と横位置のどちらを先に合わせようとするか、等。

e) プレイヤーが格子状世界から飛び出るような動きをした場合、動けるのか?(反対側にワープ?)

f) e のような場合を「動けない」と扱う場合、e のようなキー入力のあとにコンピュータ側ロボットの移動に移るのか、あるいは、無効な入力としてもう一度プレイヤーの入力を待つのか。

g) ボーナス配置について、格子状世界全体にランダムに配置するのか、「HOMEまでの道のり」上のみに配置するのか。(ボーナスをゲットしたことを、HOMEに近づいているというヒントとしてプレイヤーに提示するゲームなのか?)

h) g に関して「HOMEまでの道のり上のみに配置する」場合、その道のりが複数経路考えられる場合どうするか。

i) ボーナスの種類と頻度と可視性。どの種類のボーナスをどれくらいの頻度で配置するか。ボーナスは見えるのか。

j) 「HOMEまでの距離を表示」とあるのは、プレイヤー側のロボットのHOMEまでの距離か、コンピュータ側のロボットのHOMEまでの距離か、あるいは両方か。

k) j に関連して、表示する距離は直線距離か、マンハッタン距離か。

l) 所持金不足で動けなくなることはあるのか。(所持金という概念があるのかどうか)
333デフォルトの名無しさん:05/02/18 16:19:18
そこまで考えた上で面白いゲームじゃないから要らないや
334デフォルトの名無しさん:05/02/18 16:27:40
> 下のような 10 × 10 の地図と島の数と広さを表示しなさい
> 隣接した小島はひとつの島とします (ナナメも隣接とする)

○●○○○○○●○○
○○○○●○●○○○
○○●○○○○○○●
○○○○○○○○○○
●●○○○○○●●○
○●○●●○○○○○
●○●○○●●●○●
○●○○○○○○○○
●○○○○○○●○●
●○○○○●○○●○
1.Island(1)
2.Island(2)
3.Island(1)
4.Island(1)
5.Island(1)
6.Island(13)
7.Island(2)
8.Island(1)
9.Island(3)
10.Island(1)
total:10(26)
335330:05/02/18 16:32:27
>>332
先生から与えられた問題が>>330-331の通りなのでその通りに載せさせていただきました。
336デフォルトの名無しさん:05/02/18 16:33:40
いいから誰か黙ってやりなさい。
へらず口を利くヒマがあったら、キーボードの一つでも叩きなさい。
337330:05/02/18 16:33:47
連続ですみません。
細かいところは各自で考えて好きにしていいそうです。
>>332の通りもうちょっと煮詰めてからここに書いたほうがいいですか?
338デフォルトの名無しさん:05/02/18 16:36:18
作ってから判る仕様もあるから
他人を動かすより自分の手を動かせ
339>>330 その1:05/02/18 22:39:44
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
import java.text.*;
interface Constants {
int SIZE = 8, PATHSIZE = 16;
String filename = "score.dat";
}
public class HW81 extends JApplet implements KeyListener, ActionListener, Constants {
private Home home = new Home();
private Robot robot = new Robot();
private Enemy enemy = new Enemy();
private Stage stage;
private List scoreList = new ArrayList();
private List goldList = new ArrayList();
private static boolean initFlag;
public void init() {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
filename));
scoreList = (List) in.readObject();
} catch (FileNotFoundException e) {
scoreList.add(new Score(100, "aaa"));
scoreList.add(new Score(90, "bbb"));
scoreList.add(new Score(80, "ccc"));
scoreList.add(new Score(70, "ddd"));
scoreList.add(new Score(60, "eee"));
340>>330 その2:05/02/18 22:40:17
} catch (Exception e) {
System.out.println("スコアファイル読み込みエラー");
System.out.println(e);
}
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
if (!initFlag) {
int width = getContentPane().getSize().width, height = getContentPane()
.getSize().height;
stage = new Stage(width, height, robot, enemy, HW81.this);
stage.addKeyListener(HW81.this);
setContentPane(stage);
startGame();
initFlag = true;
}
}
});
}
void quickSort(Score[] data, int begin, int end) {
if (begin >= end)
return;
Score num = data[begin + 1];
data[begin + 1] = data[begin];
int loc = begin;
for (int idx = begin + 1; idx <= end; idx++) {
if (num.compareTo(data[idx]) <= 0) {
++loc;
Score swap = data[idx];
data[idx] = data[loc];
data[loc] = swap;
}
}
341:>>330 その3:05/02/18 22:42:40
data[begin] = data[loc];
data[loc] = num;
quickSort(data, begin, loc - 1);
quickSort(data, loc + 1, end);
}
void startGame() {
home.reset();
List ptList = new ArrayList();
while (ptList.size() < 2) {
ptList.clear();
int dist = (int) ((Math.random() * SIZE) + SIZE);
for (int x = 0; x <= SIZE; x++) {
for (int y = 0; y <= SIZE; y++) {
if (Math.abs(home.x() - x + home.y() - y) == dist)
ptList.add(new Point(x, y));
}
}
}
Collections.shuffle(ptList);
robot.reset((Point) ptList.get(0));
enemy.reset((Point) ptList.get(1));
stage.putPiece(robot);
stage.putPiece(enemy);
for (int i = 0; i < goldList.size(); i++)
stage.removePiece((Home) goldList.get(i));
goldList.clear();
for (int i = 0; i < SIZE * SIZE / 2; ) {
Gold gold = new Gold();
if (!examineOverlaps(gold.x, gold.y)) {
goldList.add(gold);
342>>330 その4:05/02/18 22:43:58
stage.addPiece(gold, 1);
stage.putPiece(gold);
++i;
}
}
int dist = Math.abs(robot.x() - home.x())
+ Math.abs(robot.y() - home.y());
stage.displayInfo("距離" + dist + "m  ゲームスタート");
stage.requestFocus();
}
void endGame(Robot obj) {
obj.modifyMoney(100);
stage.displayInfo("ゲーム終了  お金" + robot.money() + "$  敵の金"
+ enemy.money() + "$");

String msg;
if (robot.money() >= enemy.money()) {
String name = JOptionPane.showInputDialog(this, "あなたは" + robot.money
+ "$対" + enemy.money() + "$で勝利しました。名前を入力してください。",
"スコア登録", JOptionPane.INFORMATION_MESSAGE);
scoreList.add(new Score(robot.money(), name));
Score[] data = (Score[]) scoreList.toArray(new Score[0]);
quickSort(data, 0, data.length - 1);
scoreList = new ArrayList(Arrays.asList(data));

try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(filename));
out.writeObject(scoreList);
} catch (Exception e) {
343:>>330 その5:05/02/18 22:46:44
System.out.println("スコアファイル書き込みエラー");
System.out.println(e);
}
msg = "もう一度プレイしますか?";
} else {
msg = "あなたは敗北しました\nもう一度プレイしますか?";
}
int ans = JOptionPane.showConfirmDialog(this, msg, "ゲームのリトライ",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (ans == JOptionPane.YES_OPTION) {
startGame();
} else {
getContentPane().setVisible(false);
}
}
boolean examineOverlaps(int x, int y) {
if (robot.x() == x && robot.y() == y)
return true;
if (enemy.x() == x && enemy.y() == y)
return true;
for (int i = 0; i < goldList.size(); i++) {
Gold gold = (Gold) goldList.get(i);
if (gold.x() == x && gold.y() == y)
return true;
}
return false;
}
344>>330 その6:05/02/18 22:47:26
public void keyTyped(KeyEvent e) {
switch (e.getKeyChar()) {
case 'i':
case 'I':
robot.moveY(-1, enemy);
break;
case 'j':
case 'J':
robot.moveX(-1, enemy);
break;
case 'm':
case 'M':
robot.moveY(+1, enemy);
break;
case 'l':
case 'L':
robot.moveX(+1, enemy);
}
stage.putPiece(robot);
if (goldList.contains(robot)) {
Gold gold = (Gold) goldList.remove(goldList.indexOf(robot));
robot.modifyMoney(gold.point());
stage.removePiece(gold);
}
enemy.move(robot, home);
stage.putPiece(enemy);
345:>>330 その7:05/02/18 22:48:02
if (goldList.contains(enemy)) {
Gold gold = (Gold) goldList.remove(goldList.indexOf(enemy));
enemy.modifyMoney(gold.point());
stage.removePiece(gold);
}
int dist = Math.abs(robot.x() - home.x())
+ Math.abs(robot.y() - home.y());
stage.displayInfo("距離" + dist + "m  お金" + robot.money() + "$  敵の金"
+ enemy.money() + "$");
if (robot.equals(home))
endGame(robot);
else if (enemy.equals(home))
endGame(enemy);
}
public void actionPerformed(ActionEvent e) {
if (stage.isButtonSelected()) {
StringBuffer sb = new StringBuffer("スコア表 ベスト5\n\n");
for (int i = 0; i < scoreList.size() && i < 5; i++) {
sb.append((i + 1) + "位 " + scoreList.get(i).toString());
}
stage.displayScores(sb.toString());
} else {
stage.hiddenScores();
}
stage.requestFocus();
}
346>>330 その8:05/02/18 22:48:35
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
}
class Stage extends JPanel implements Constants {
private JPanel room = new JPanel(new GridLayout(SIZE, SIZE, PATHSIZE,
PATHSIZE));
private JLabel[][] wall = new JLabel[SIZE][SIZE];
private JLabel topBar = new JLabel();
private JTextArea scores = new JTextArea();
private JLayeredPane lp = new JLayeredPane();
private JToggleButton btn = new JToggleButton("スコア");
Stage(int width, int height, Robot rb, Enemy em, ActionListener al) {
setBackground(Color.black);
topBar.setBorder(BorderFactory.createEtchedBorder());
topBar.setPreferredSize(new Dimension(1000, 0));
topBar.setHorizontalAlignment(JLabel.CENTER);
topBar.setFont(new Font("Dialog", 1, 13));
topBar.setOpaque(true);
topBar.setBackground(new Color(200, 200, 255));
btn.setFont(new Font("Dialog", 0, 10));
btn.setMargin(new Insets(2, 1, 2, 1));
btn.addActionListener(al);
Box menu = Box.createHorizontalBox();
menu.add(btn);
menu.add(topBar);
room.setBackground(new Color(240, 240, 255));
room.setBorder(BorderFactory.createEmptyBorder(PATHSIZE, PATHSIZE,
PATHSIZE, PATHSIZE));
347:>>330 その9:05/02/18 22:49:10
Dimension wallsize = new Dimension((width - PATHSIZE * (SIZE + 1))
/ SIZE, (height - PATHSIZE * (SIZE + 1)) / SIZE);
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b] = new JLabel();
wall[a][b].setPreferredSize(wallsize);
wall[a][b].setOpaque(true);
wall[a][b].setBackground(new Color(200, 200, 250));
wall[a][b].setBorder(BorderFactory.createRaisedBevelBorder());
}
}
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
room.add(wall[a][b]);
}
}
room.setBounds(0, 0, width, height - btn.getPreferredSize().height);
lp.add(room, new Integer(0));
lp.add(rb, new Integer(1));
lp.add(em, new Integer(1));
setLayout(new BorderLayout());
add(lp);
add(menu, BorderLayout.NORTH);
scores.setOpaque(false);
scores.setMargin(new Insets(16, 32, 16, 32));
scores.setFont(new Font("Dialog", 1, 16));
scores.setForeground(Color.green);
}
348::>>330 その10:05/02/18 22:49:45
void addPiece(Home obj, int zorder) {
lp.add(obj, new Integer(zorder));
}
void removePiece(Home obj) {
lp.remove(obj);
}
void putPiece(Home obj) {
int cpX, cpY, rbX = (obj.x() == SIZE) ? obj.x() - 1 : obj.x(), rbY = (obj
.y() == SIZE) ? obj.y() - 1 : obj.y();
if (obj.x() < SIZE)
cpX = wall[rbY][rbX].getLocation().x - PATHSIZE;
else
cpX = wall[rbY][rbX].getLocation().x
+ wall[rbY][rbX].getSize().width;
if (obj.y() < SIZE)
cpY = wall[rbY][rbX].getLocation().y - PATHSIZE;
else
cpY = wall[rbY][rbX].getLocation().y
+ wall[rbY][rbX].getSize().height;
obj.setLocation(cpX, cpY);
}
void displayInfo(String text) {
topBar.setText(text);
}
boolean isButtonSelected() {
return btn.isSelected();
}
349>>330 その11:05/02/18 22:50:18
void displayScores(String text) {
scores.setBounds(room.getBounds());
scores.setText(text);
lp.add(scores, new Integer(2));
room.setBackground(new Color(240, 240, 255, 128));
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b].setBackground(new Color(200, 200, 255, 128));
}
}
}
void hiddenScores() {
lp.remove(scores);
lp.validate();
room.setBackground(new Color(240, 240, 255, 255));
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b].setBackground(new Color(200, 200, 255, 255));
}
}
}
}
class Home extends JLabel implements Constants {
int x, y;
void reset() {
x = 0;
y = 0;
350:>>330 その12:05/02/18 22:50:52
while (x == 0 && y == 0) {
x = (int) (Math.random() * (SIZE + 1));
y = (int) (Math.random() * (SIZE + 1));
}
}
int x() {
return x;
}
int y() {
return y;
}
public boolean equals(Object obj) {
return x == ((Home) obj).x && y == ((Home) obj).y;
}
}
class Gold extends Home implements Constants {
private int point;
Gold() {
point = (int) (Math.random() * 9) * 10 + 10;
x = (int) (Math.random() * (SIZE + 1));
y = (int) (Math.random() * (SIZE + 1));
setFont(new Font("Dialog", 1, 15));
setForeground(new Color(200, 50, 250));
setBounds(0, 0, PATHSIZE, PATHSIZE);
setText(String.valueOf(point));
}
351>>330 その13:05/02/18 22:51:39
int point() {
return point;
}
}
class Robot extends Home implements Constants {
int money;
Robot() {
setFont(new Font("Dialog", 1, 15));
setForeground(new Color(50, 50, 250));
setBounds(0, 0, PATHSIZE, PATHSIZE);
}
void reset(Point pt) {
x = pt.x;
y = pt.y;
money = 0;
setText("●");
}
int money() {
return money;
}
boolean moveX(int pt, Enemy em) {
if (x + pt >= 0 && x + pt <= SIZE && (x + pt != em.x() || y != em.y())) {
x += pt;
--money;
return true;
}
return false;
}
352:>>330 その14:05/02/18 22:52:42
boolean moveY(int pt, Enemy em) {
if (y + pt >= 0 && y + pt <= SIZE && (x != em.x() || y + pt != em.y())) {
y += pt;
--money;
return true;
}
return false;
}
void modifyMoney(int value) {
money += value;
}
void changeFigure() {
setText("★");
}
}
class Enemy extends Robot {
private int rbDist = 0;
private List route = new ArrayList();
Enemy() {
setForeground(new Color(250, 50, 50));
}
void reset(Point pt) {
x = pt.x;
y = pt.y;
money = 0;
rbDist = 0;
setText("■");
}
353>>330 その15:05/02/18 22:53:21
void move(Robot rb, Home hm) {
int px, py, count = 0;
do {
px = x;
py = y;
if (Math.random() < 0.5) {
if (x < hm.x)
++px;
else if (x > hm.x)
--px;
} else {
if (y < hm.y)
++py;
else if (y > hm.y)
--py;
}
++count;
if (count >= 10)
return;
} while ((px == x && py ==y) || (px == rb.x() && py == rb.y()));
x = px;
y = py;
--money;
}
}
354:>>330 その16:05/02/18 22:53:52
class Score implements Comparable, Serializable {
private static MessageFormat msg = new MessageFormat(
"{0,number,integer}$ {1} {2,date,short} {2,time,short} \n");
private int number;
private String name;
private Date date = new Date(System.currentTimeMillis());
Score(int number, String name) {
this.number = number;
this.name = name;
}
public int compareTo(Object obj) {
Score sc = (Score) obj;
return new Integer(number).compareTo(new Integer(sc.number));
}
public String toString() {
return msg.format(new Object[] { number, name, date });
}
}
355デフォルトの名無しさん:05/02/18 22:54:48
>>339-354
荒らし失せろ
356>>330 訂正:05/02/18 22:58:30
メソッド void endGame(Robot obj) { の下の行に

obj.changeFigure(); 
↑を挿入してください。
357デフォルトの名無しさん:05/02/18 23:02:15
>>339-354
長いんだよ。ウザインだよ。クソコード書き散らしてるんじゃねえ。
自分から低レベルコーディングをバラして楽しいか?
358デフォルトの名無しさん:05/02/19 05:58:28
おいおい、ここは宿題をおしえてあげるスレだろ?
とりあえず動けばいいんだよ。
いちゃもんつけてないで自分がおしえてあげたらどうなんだ?
それとも自分のレベル晒すのが恥ずかしいのか?
359デフォルトの名無しさん:05/02/19 06:33:49
>>357
なんで
>>339-354
を非難して
>>169-185
がお咎め無しなんだ?
あっちの方が長いのに
360デフォルトの名無しさん:05/02/19 07:35:22
これから先も3日ペースで「追加の宿題でました」がきそうだからだろ
361デフォルトの名無しさん:05/02/19 12:19:39
同じゲームでも、もっと複雑な課題ならやってやるんだが。
あの程度の内容じゃやる気が出ない。
もっと「要コーディングテクニック」な課題をキボン
362デフォルトの名無しさん:05/02/19 12:58:13
>>334 まだですか?
363>>334 その1:05/02/19 13:16:50
import java.util.*;
public class HW82 {
static final String seamap =
"○●○○○○○●○○\n"
+ "○○○○●○●○○○\n"
+ "○○●○○○○○○●\n"
+ "○○○○○○○○○○\n"
+ "●●○○○○○●●○\n"
+ "○●○●●○○○○○\n"
+ "●○●○○●●●○●\n"
+ "○●○○○○○○○○\n"
+ "●○○○○○○●○●\n"
+ "●○○○○●○○●○";

static class Cell {
int x, y;
boolean island;
Cell(int x, int y, boolean island) {
this.x = x;
this.y = y;
this.island = island;
}
public boolean equals(Object obj) {
return x == ((Cell) obj).x && y == ((Cell) obj).y;
}
}
364>>334 その2:05/02/19 13:17:30
public static void main(String[] args) {
System.out.println(seamap);
List cellList = new ArrayList();
String[] line = seamap.split("\n");
for (int y = 0; y < line.length; y++) {
for (int x = 0; x < line[y].length(); x++) {
cellList.add(new Cell(x, y, line[y].charAt(x) == '●'));
}
}
int[][] around = { {0, -1}, {-1, -1}, {-1, 0}, {-1, 1},
{0, 1}, {1, 1}, {1, 0}, {1, -1} };
List countList = new ArrayList();
LinkedList queue = new LinkedList();
while (!cellList.isEmpty()) {
Cell cell = (Cell) cellList.remove(0);
if (!cell.island)
continue;
queue.addLast(cell);
int count = 0;
365:>>334 その3:05/02/19 13:18:06
while (!queue.isEmpty()) {
cell = (Cell) queue.removeFirst();
if (cell.island) {
++count;
for (int i = 0; i < around.length; i++) {
int idx = cellList.indexOf(new Cell(cell.x + around[i][0],
cell.y + around[i][1], true));
if (idx != -1)
queue.addLast(cellList.remove(idx));
}
}
}
countList.add(new Integer(count));
}
int total = 0;
for (int i = 0; i < countList.size(); i++) {
System.out.println(i + 1 + ":Island( " + countList.get(i) + " )");
total += ((Integer) countList.get(i)).intValue();
}
System.out.println("total:" + countList.size() + "(" + total + ")");
}
}
366デフォルトの名無しさん:05/02/19 13:21:27
お前らそんなにすきなら10万ステップのコードここに載せちゃうぞ
367デフォルトの名無しさん:05/02/19 13:25:42
やれるもんならやってみろ!
って、プロキシ経由の自動投稿ツール作れば容易にできるが・・・
368デフォルトの名無しさん:05/02/19 13:27:13
つーか、ここの回答者(コード貼りつけてる香具師)って何人なんだ?
369330:05/02/19 13:39:48
>>339-354
どうもありがとうございました。きちんと動きました。
ただ、前回と同じくファイルの書き込み、読み込みができません。

スコアファイル読み込みエラー
java.security.AccessControlException: access denied (java.io.FilePermission score.dat read)
スコアファイル書き込みエラー
java.security.AccessControlException: access denied (java.io.FilePermission score.dat write)

>>360
すみませんが、今回の教授の方針がこうなもので。
これからもお世話になるかもしれませんがよろしくお願いします。
370デフォルトの名無しさん:05/02/19 13:57:22
>>369
他人が頑張ってるんだから、それぐらい自分で調べるべきだ
371デフォルトの名無しさん:05/02/19 14:04:52
よーし、TomCatのコード流しちゃうぞー。
自動投稿ツール作ってみたけど、これ使うとアクセス禁止にならんよな?
372デフォルトの名無しさん:05/02/19 14:10:31
順番復元できるようにうpしてくらさい
373330:05/02/19 15:45:49
>>370
そうですね。調べてみます。
374デフォルトの名無しさん:05/02/19 16:03:24
1レスに収まりきらないソース貼り付けたい場合、これを使うという手もある。
http://sourcepost.sytes.net/
375デフォルトの名無しさん:05/02/19 17:11:26
個人のプロフィールを格納する Profile クラスを作ることになった。
フィールドとして、氏名・年齢・性別、そして「彼女がいるかどうか」を示すデータも作れと言われた。

教官が「俺を題材にしてデータを入れてもいいぞ」って言ったから
boolean 型じゃなくて配列型にしてやった。

教官に怒られた。
376デフォルトの名無しさん:05/02/19 17:13:09
「彼女がいるかどうか」だけなら配列にする必要無いだろ
377デフォルトの名無しさん:05/02/19 17:20:29
>>339
いきなり定数インタフェースパターンかよ。w
378デフォルトの名無しさん:05/02/19 18:43:10
個人のプロフィールを格納する Profile クラスを作ることになった。
フィールドとして、氏名・年齢・性別、そして「彼女がいるかどうか」を示すデータも作れと言われた。

教官が「俺を題材にしてデータを入れてもいいぞ」って言ったから
boolean型をstatic finalにした。中身はfalse。

教官に退学させられた。
379デフォルトの名無しさん:05/02/19 19:47:06
しかし、アルゴリズム、設計の指針まで全部おんぶに抱っこで何の
糧になるんだ?試行錯誤もしないでプログラムを写すことで何が得られるんだ?
教えてくれよ
380デフォルトの名無しさん:05/02/19 19:51:05
とりあえず留年せずに卒業できるというメリットがある
381デフォルトの名無しさん:05/02/19 19:56:14
プログラム系科目は、単位を取る為だけって人も多いからね。
苦労してやっても将来使わないし、それなら誰かにやってもらって
丸写しした方が良い。外の本当に大切な勉強に時間を使えるし。
382デフォルトの名無しさん:05/02/19 20:01:58
>>380
大学のほとんどの学生はその考え方だろうな
それで金を親に払わせてるやつはどうしようもないな

>>381
何も勉強できない奴のいいわけじゃんw
つうかプログラムだけでなく宿題は他人まかせだろw
383デフォルトの名無しさん:05/02/19 20:25:33
情報工学でプログラムを道具として使う連中じゃなければ
プログラミングなぞ無用だもんな。そっかそっか。悲しいなぁ
384デフォルトの名無しさん:05/02/19 20:36:41
宿題を他人に任せて自分は何もできない。
自分で勉強できないから全て先生のせいになる。
日本のレベルはますます下がるばかり。悲しいね
385デフォルトの名無しさん:05/02/19 21:01:48
この本って有名だよね?どうかな?

わかりやすいにもほどがある!!「新Java言語入門」!!
http://page10.auctions.yahoo.co.jp/jp/auction/m10934672
386デフォルトの名無しさん:05/02/19 22:08:26
気に入らなければ放置すればよい。
そうやって伸びなかった奴は勝手に土木建築員になってるだろうし
そうやって大成した奴は要領が良かったと言うことだ。
387デフォルトの名無しさん:05/02/20 01:18:02
>>382
留年したら余計に金かかるんだから、
宿題写してでもさっさと卒業した方が
親にも迷惑掛けないで済むんじゃね?
388デフォルトの名無しさん:05/02/20 01:21:56
日本の景気がいつまでも悪い原因はそれか。
儲かってるのは教育関係くらいだしな。
389デフォルトの名無しさん:05/02/20 05:10:57
つーか、これはjavaの宿題に答えるスレだろ?
無駄口たたいてないで答えりゃいいじゃん。
390デフォルトの名無しさん:05/02/20 05:52:04
問題出てないじゃん
391デフォルトの名無しさん:05/02/20 09:28:45
>>387
そもそも、大学の行ってるやつのほとんどは
大学に行ってる意味が無いから、すでに迷惑だと思うが
392デフォルトの名無しさん:05/02/20 09:55:33
おまえらはたらけー
393デフォルトの名無しさん:05/02/20 10:46:38
日曜くらいゆっくりさせろ。
394デフォルトの名無しさん:05/02/20 12:16:09
395M.B.:05/02/20 14:11:44
二か月ばかり Java のプログラムをいじってなかったら、
「このパターンはあのプログラムからパクッてきて……」とかいった
「鑑」(=「土地鑑」の「鑑」)が鈍っちゃって四苦八苦。
アクセルロッドの『囚人のジレンマ』問題のコードを書くのに、
三時間以上も苦しんでいる漏れ……

 ちくしょう ○| ̄|_
396デフォルトの名無しさん:05/02/20 15:34:14
なんか痛い奴だな。
397デフォルトの名無しさん:05/02/20 16:02:08
>>395
>「鑑」(=「土地鑑」の「鑑」)

これ、今の流行?
398デフォルトの名無しさん:05/02/20 16:22:06
勘でいいと思う
399デフォルトの名無しさん:05/02/20 19:18:36
課題:コンピュータとの対戦型オセロゲームを作成せよ(相手思考ルーチンを含む)。

です。丸投げですがお願いします
400デフォルトの名無しさん:05/02/20 19:49:37
期限はいつまで?
Applet?それとも単体で動けばいいのか?
401デフォルトの名無しさん:05/02/20 19:52:14
402デフォルトの名無しさん:05/02/20 19:54:37
あげ
403デフォルトの名無しさん:05/02/20 20:06:13
>>401
あ、ググれば良かったのですね。そっちを参考にします。
ありがとうございました。
404デフォルトの名無しさん:05/02/20 23:57:38
JAVAプログラミング swingの課題なんですが、
「ボタンを1個用意して、それを押すたびにラベルに各自の姓と名が交互に表示されるようにする」
です。お願いします。
405その1:05/02/21 01:19:49
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Main extends JFrame implements ActionListener {
  private JLabel label;
  private JButton button;
  private String first_name = "Jun'ichiro";
  private String last_name = "Koizumi";
  public Main() {
    label = new JLabel(first_name);
    button = new JButton("push me");
    button.addActionListener(this);
    Container contentPane = getContentPane();
    contentPane.add(button, BorderLayout.NORTH);
    contentPane.add(label, BorderLayout.CENTER);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
  }
406その2:05/02/21 01:20:38
  public void actionPerformed(ActionEvent arg0) {
    if (label.getText().equals(first_name)) {
      label.setText(last_name);
    } else {
      label.setText(first_name);
    }
  }
  public static void main(String[] args) {
    Main main = new Main();
  }
}
407デフォルトの名無しさん:05/02/21 01:56:35
ありがとうございます!
早速試しました。無事に動きました!
408デフォルトの名無しさん:05/02/21 02:12:07
>>399
ここ数ヶ月の暇つぶしでちょうど作ってるところ。
バグだらけで見せられる代物ではないが。
自分でやってみたら面白いよ。

コンピューター側のアルゴリズムが腐ってて、
min-maxで思考できるのは、最後の10手くらい。
409デフォルトの名無しさん:05/02/21 02:50:12
>>408
>コンピューター側のアルゴリズムが腐ってて、
>min-maxで思考できるのは、最後の10手くらい。
もともとオセロってそういうもんだよ。
序盤中盤はmin-maxの評価の仕方が違う。
そもそも石の数で評価してはいけない。
410デフォルトの名無しさん:05/02/21 14:13:03
できる皆様は、コードは毎回すべて手書きしているのですか?
それともコピペして必要な所だけ書き直しているのでしょうか?
411デフォルトの名無しさん:05/02/21 14:27:04
ここにできる人はいないよ。
412& ◆R7PNoCmXUc :05/02/21 16:11:13
アプレットで作ってくるな!なんて指示はなかったからアプレットで作っていったら
アプレットじゃ受けとらん、なんてこといわれました・・・。
アプレットを使わずに以下のプログラムをどなたかできませんでしょうか?

ロボットをキーボードで操作してHOMEに帰すゲームをGUIを使って作りなさい。
以下がゲームの必要事項です。

スタートボタンを押すとロボット(プレイヤー)とロボット(コンピュータ)
HOMEをそれぞれランダムで格子状(gridLayoutを使って作ります)のステージに配置します。
ステージのマスの数(縦×横)はプレイヤーが数字を入力して選べます。
HOMEはプレイヤーにはわからないようにします。
プレイヤーとコンピュータのロボットは交互に一マスずつ動いていきます。
ロボットが一マス動くごとに1ドルのコストがかかります。
ロボットが一マス動くごとにステージをアップデートしてHOMEまでの距離を表示します。
ロボットはキーボード操作でマスを上下左右に移動できます。(斜めはなし)
上=I, 下=M, 右=L, 左=Jのキー配置です。
HOMEまでの道のりのマスにボーナス(20ドルゲットとか50ドルゲットとか)をランダムで配置します。
どちらかのロボットが先にHOMEについた時点でゴールです。
プレイヤーが先にゴールした場合、ボーナスとして100ドルを受け取れます。
最終スコアは勝った場合のボーナスとHOMEまでの道のりで得たボーナスから
コストを引いたものが最終スコアとなります。
スコアキーパー(デフォルトのTOP5のデータを入れておく。)からデータを読み取り、TOP5を記録。
このとき、現在プレイしたスコアがTOP5入りするようなら名前の入力を求める。
ゴール後ウィンドウをポップアップさせて最終スコアとリプレイするかしないかを表示します。
413& ◆R7PNoCmXUc :05/02/21 16:12:17
>>412の続き

スコアキーパーは3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。

どなたかおねがいいたします。
414デフォルトの名無しさん:05/02/21 16:19:42
またおまえか
415デフォルトの名無しさん:05/02/21 17:02:54
>>412はどうやって>>369を解決したんだろう?
416デフォルトの名無しさん:05/02/21 18:59:14
何故彼は勝手にアプレットにしてしまったのか・・・・
ファイル書き込みが出来ないのは、その為だというのに・・・
417デフォルトの名無しさん:05/02/21 19:31:29
>>412
以前のプログラムのメソッドを以下の様に置き換えてください。
置き換えるメソッドは4つです。
HW81.HW81()
HW81.endGame()
HW81.keyTyped()
Stage.Stage()
418デフォルトの名無しさん:05/02/21 19:32:24
public static void main(String[] arg) {
new HW81();
}

HW81() {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
filename));
scoreList = (List) in.readObject();
} catch (FileNotFoundException e) {
scoreList.add(new Score(100, "aaa"));
scoreList.add(new Score(90, "bbb"));
scoreList.add(new Score(80, "ccc"));
scoreList.add(new Score(70, "ddd"));
scoreList.add(new Score(60, "eee"));
} catch (Exception e) {
System.out.println("スコアファイル読み込みエラー");
System.out.println(e);
}
stage = new Stage(PANELW, PANELH, robot, enemy, HW81.this);
stage.addKeyListener(HW81.this);
setContentPane(stage);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
startGame();
}
419デフォルトの名無しさん:05/02/21 19:32:54
void endGame(Robot obj) {
obj.changeFigure();
obj.modifyMoney(100);
stage.displayInfo("ゲーム終了  お金" + robot.money() + "$  敵の金"
+ enemy.money() + "$");
String msg;
if (robot.money() >= enemy.money()) {
String name = JOptionPane.showInputDialog(this, "あなたは" + robot.money
+ "$対" + enemy.money() + "$で勝利しました。\n"
+ "名前を入力してください。", "スコア登録",
JOptionPane.INFORMATION_MESSAGE);
scoreList.add(new Score(robot.money(), name));
Score[] data = (Score[]) scoreList.toArray(new Score[0]);
quickSort(data, 0, data.length - 1);
scoreList = new ArrayList(Arrays.asList(data));

try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(filename));
out.writeObject(scoreList);
} catch (Exception e) {
System.out.println("スコアファイル書き込みエラー");
System.out.println(e);
}
msg = "もう一度プレイしますか?";
} else {
msg = "あなたは" + robot.money + "$対" + enemy.money()
+ "$で敗北しました。\nもう一度プレイしますか?";
}
420デフォルトの名無しさん:05/02/21 19:33:31
int ans = JOptionPane.showConfirmDialog(this, msg, "ゲームのリトライ",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (ans == JOptionPane.YES_OPTION) {
startGame();
} else {
getContentPane().setVisible(false);
}
}
421デフォルトの名無しさん:05/02/21 19:34:11
synchronized public void keyTyped(KeyEvent e) {
switch (e.getKeyChar()) {
case 'i':
case 'I':
robot.moveY(-1, enemy);
break;

case 'j':
case 'J':
robot.moveX(-1, enemy);
break;
case 'm':
case 'M':
robot.moveY(+1, enemy);
break;
case 'l':
case 'L':
robot.moveX(+1, enemy);
break;
default:
return;
}
stage.putPiece(robot);
if (goldList.contains(robot)) {
Gold gold = (Gold) goldList.remove(goldList.indexOf(robot));
robot.modifyMoney(gold.point());
stage.removePiece(gold);
}
int dist = Math.abs(robot.x() - home.x())
+ Math.abs(robot.y() - home.y());
stage.displayInfo("距離" + dist + "m  お金" + robot.money() + "$  敵の金"
+ enemy.money() + "$");
422デフォルトの名無しさん:05/02/21 19:34:49
if (robot.equals(home))
endGame(robot);
try {
EventQueue.invokeLater(new Runnable() {
public void run() {
synchronized (HW81.this) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
enemy.move(robot, home);
stage.putPiece(enemy);
if (goldList.contains(enemy)) {
Gold gold = (Gold) goldList.remove(goldList.indexOf(enemy));
enemy.modifyMoney(gold.point());
stage.removePiece(gold);
}
int dist = Math.abs(robot.x() - home.x()) + Math.abs(robot.y() - home.y());
stage.displayInfo("距離" + dist + "m  お金" + robot.money()
+ "$  敵の金" + enemy.money() + "$");
if (enemy.equals(home))
endGame(enemy);
}
}
});
} catch (Exception e1) {
}
}
423デフォルトの名無しさん:05/02/21 19:35:20
Stage(int width, int height, Robot rb, Enemy em, ActionListener al) {
setBackground(Color.black);
topBar.setBorder(BorderFactory.createEtchedBorder());
topBar.setMaximumSize(new Dimension(1000, 1000));
topBar.setHorizontalAlignment(JLabel.CENTER);
topBar.setFont(new Font("Dialog", 1, 13));
topBar.setOpaque(true);
topBar.setBackground(new Color(200, 200, 255));
btn.setFont(new Font("Dialog", 0, 10));
btn.setMargin(new Insets(2, 1, 2, 1));
btn.addActionListener(al);
Box menu = Box.createHorizontalBox();
menu.add(btn);
menu.add(topBar);
room.setBackground(new Color(240, 240, 255));
room.setBorder(BorderFactory.createEmptyBorder(PATHSIZE, PATHSIZE,
PATHSIZE, PATHSIZE));
Dimension wallsize = new Dimension((width - PATHSIZE * (SIZE + 1))
/ SIZE, (height - PATHSIZE * (SIZE + 1)) / SIZE);
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
wall[a][b] = new JLabel();
wall[a][b].setPreferredSize(wallsize);
wall[a][b].setOpaque(true);
wall[a][b].setBackground(new Color(200, 200, 250));
wall[a][b].setBorder(BorderFactory.createRaisedBevelBorder());
}
}
424デフォルトの名無しさん:05/02/21 19:37:54
for (int a = 0; a < wall.length; a++) {
for (int b = 0; b < wall[a].length; b++) {
room.add(wall[a][b]);
}
}
room.setBounds(0, 0, width, height);
lp.add(room, new Integer(0));
lp.add(rb, new Integer(1));
lp.add(em, new Integer(1));
lp.setPreferredSize(new Dimension(width, height));
setLayout(new BorderLayout());
add(lp);
add(menu, BorderLayout.NORTH);
scores.setOpaque(false);
scores.setMargin(new Insets(16, 32, 16, 32));
scores.setFont(new Font("Dialog", 1, 16));
scores.setForeground(Color.green);
}
425デフォルトの名無しさん:05/02/21 21:03:03
>410
八割方コピペでしょう。
「できるプログラマ」というのは、おおむね「既存のコードを
適切にパクる技術に長けているプログラマ」であると同時に、
「再利用しやすいコードを書くプログラマ」でもあったりするし。
426デフォルトの名無しさん:05/02/21 22:29:58 ID:??? BE:46662645-
 初めまして.現在,「スモールコンパイラの制作で学ぶプログラムのしくみ」という参考書を用いて学習を行っているのですが,
2 月末が期限として出された課題の中でどうしても解らない問題があり大変困っています.
皆さんのお力を貸していただきご教授いただけないでしょうか?

出されている課題の内容は, Java 言語で書かれたコンパイラの機能拡張が目的で,

(1) 関数の引数として 1 次元配列を渡せるように機能拡張せよ.
  渡し方は C言語の方法に習え.すなわち, 配列の要素全体のコピーを渡すのではなく, 配列の先頭の番地を渡せ.

(2) 変数の「参照渡し」を実現せよ.「参照渡し」とは, 変数を関数の実引数にしたとき, 変数の中身ではなく変数自体の番地を渡すことにより,
呼び出された関数の中から呼び出し元の変数の内容を更新できるようにするものである.
 
の 2問です.何卒宜しくお願いします.

コンパイラのソースコードは,

http://book.gihyo.co.jp/s-com/ からダウンロードできるようになっております.

 この本を読んだことがない方でも, 上記 2 問に対する拡張方法のプログラムが解る方からの返信もお待ちしております.
427デフォルトの名無しさん:05/02/21 22:37:09
おながいします。
JTree のコンストラクタを使って、以下のツリーを作成しなさい

JTree
+- colors
| +- blue
| +- violet
| +- red
| +- yellow
+- sports
| +- basketball
| +- soccer
| +- football
| +- bockey
+- food
 +- hot dogs
 +- pizza
 +- ravioli
 +- bananas

428デフォルトの名無しさん:05/02/21 23:02:21
>>427
// JTreeSample.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.WindowConstants;
public class JTreeSample extends JFrame {
public JTreeSample() {
JPanel panel = new JPanel();
JTree tree = new JTree();
panel.add(tree);
panel.setVisible(true);
add(panel);
}
public static void main(String[] args) {
JTreeSample self = new JTreeSample();
self.setSize(200, 400);
self.setTitle(self.getClass().getName());
self.setVisible(true);
self.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
429デフォルトの名無しさん:05/02/21 23:14:58
bockey
w
430デフォルトの名無しさん:05/02/21 23:28:35
すまぬ。

JTree のデフォルト コンストラクタにサンプルデータが入って
いることをソースを見てはじめて知って、俺みたいに無知な
やつが釣られてくれるかと思ったのだが。

タイプミスで結局 TreeNode または TreeModel を使って
コンストラクタを呼び出すのが正解になってしまった...

ちなみにこれも追加おながい。

Toolkit tk = self.getToolkit();
Dimension scrSz = tk.getScreenSize();
Dimension frameSz = self.getSize();
self.setLocation((scrSz.width-frameSz.width)/2 ,(scrSz.height-frameSz.height)/2);
431デフォルトの名無しさん:05/02/22 01:49:40
>>426
第3章 拡張
の4つソースコードを改変しろとの事なのですか?
432デフォルトの名無しさん:05/02/22 06:25:10
第3章 拡張
の4つソースコードを改変しろとの事なのです
433デフォルトの名無しさん:05/02/22 12:13:44
これはハードな問題ですね
434デフォルトの名無しさん:05/02/22 15:17:55
>>417
4つのメソッドの置き換えだけですね。
わかりました、やってみます。
ありがとうございました。
435デフォルトの名無しさん:05/02/22 17:10:39
indexOfで指定された文字が最初に出現する位置のインデックスを返すメソッドってどのように、書くのですか?教えてください。
436デフォルトの名無しさん:05/02/22 17:13:04
String a = "abc";
int pos = a.indexOf( "b" );
437435:05/02/22 19:06:50
>436さん
ありがとうございます。
もう少し詳しく教えていただけますか?
438デフォルトの名無しさん:05/02/22 19:13:43
>>437
>>436>>435の質問に対して十分詳しく教えてると思うが
何を教えればいいんだ?
439デフォルトの名無しさん:05/02/22 19:34:18
>>435
「indexOfで」これが、どこにかかるのかわからん。
440デフォルトの名無しさん:05/02/23 01:29:45
打ち込んで動作みて考えろよ。お前は無数糞コンパイラ未満の頭しかないのか?
441デフォルトの名無しさん:05/02/23 04:38:45
ここはひとにやらせるスレだからな
442デフォルトの名無しさん:05/02/23 10:08:23
締め切りが明日の課題なんですがお願いします。


クライアントでコマンドラインの引数として1個のdouble型数値(実際は文字列)を取り込み、
それをホストに送り、ホストではその値を2乗してクライアントに返し、
返してもらったクライアントはそれを表示する
以上を実現するプログラムをサーバサイド、クライアントサイドで作成する
443442:05/02/23 10:17:24
追記
Java Swingの課題です。
444デフォルトの名無しさん:05/02/23 19:02:27
プロトコルは何でも良いの?
445442:05/02/23 19:25:03
特に指定されていないので何でも構わないと思います。
446デフォルトの名無しさん:05/02/23 20:14:05
JAVA初心者です。よろしくお願いします<m(__)m>

実行例に示すとおり、二つの整数値を読み込んで、後者が前者の約数であれば、
「BはAの約数です。」と表示し、そうでなければ、「BはAの約数ではありません。」
と表示するプログラムを作成しなさい。

実行例

二つの整数値を入力してください。
整数A:10
整数B:5
BはAの約数です。
447デフォルトの名無しさん:05/02/23 20:16:12
>>446
アプレット?
448446:05/02/23 20:18:11
はい。
449446:05/02/23 21:30:27
すみません。アプレットと448で答えましたが、特に指定ないです。
450M.B.:05/02/23 22:06:28
>>446
import java.io.*;
public class yakusu {
  public static void main(String[] args) {
    try {
      BufferedReader in =
          new BufferedReader(new InputStreamReader(System.in));
      System.out.println("二つの整数値を入力してください。");
      System.out.print("整数A:");
      System.out.flush();
      int a = Integer.parseInt(in.readLine());
      System.out.print("整数B:");
      System.out.flush();
      int b = Integer.parseInt(in.readLine());
      System.out.print("BはAの約数");
      if ((a % b) == 0) {
        System.out.print("です。");
      } else {
        System.out.print("ではありません。");
      }
    } catch (IOException e) {
      System.out.println("失敗。");
    }
  }
}
451デフォルトの名無しさん:05/02/23 22:34:46
すごいな〜
452442:05/02/23 22:53:55
早くしろよ。時間無いって言ってるだろ!
453442:05/02/23 22:56:47
>>452 は僕ではありません。
勝手な書き込みしないでください。
454446:05/02/23 23:09:30
回答ありがとうございます。
コンパイルしたところ不正な文字ですとエラーが100個と出たのですがなぜでしょうか?
コマンドプロンプトからSDKでjavac ファイル名.javaでしました。
455デフォルトの名無しさん:05/02/23 23:23:40
>>454
空白が全角スペースなんでしょ。半角に。
>>442。Client-Serverを実現するプログラムなんて初めて書いたからなんかアヤシイ。
以前ココに貼られたソースを参考にしました。
パッケージ切ってます。こちらの管理の都合のためだけです。
// Server.java
package power;
import java.io.*;
import java.net.*;
public class Server {
static boolean isEnd = false;
public static void main(String[] args) {
ServerSocket ss = null;
try {
System.out.print("サーバ起動..");
ss = new ServerSocket(22003);
System.out.println("完了");
} catch (Exception e1) {
System.out.println("エラー終了");
System.exit(0);
}
while (!isEnd) {
try {
Socket sc = ss.accept();
new HttpIO(sc).start();
} catch (IOException e) {
}
}
try {
ss.close();
} catch (IOException e) {
}
456455:05/02/23 23:24:20
>>442 つづき
System.out.println("サーバ終了");
}
static class HttpIO extends Thread {
Socket sc;

HttpIO(Socket sc) {
this.sc = sc;
}

public void run() {
try {
io();
} catch (Exception e) {
} finally {
try {
sc.close();
} catch (IOException e1) {
}
}
}
void io() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
String line = br.readLine();
double inputNumber = Double.parseDouble(line.split(" ")[1]);
OutputStream out = sc.getOutputStream();
StringBuffer sb = new StringBuffer();
// 重い処理を想定。
Thread.sleep(1000);
sb.append("Server->Client " + (inputNumber * inputNumber));
out.write(sb.toString().getBytes());
br.close();
457455:05/02/23 23:25:14
>>442 つづき
out.close();
isEnd = true;
}
}
}
// Client.java
package power;
import java.io.*;
import java.net.*;
import java.nio.channels.*;
import javax.swing.*;
public class Client extends JFrame {
JTextArea textArea;
public static void main(String[] args) {
Client self = new Client();
self.setSize( 300, 300 );
self.setTitle( self.getClass().getName() );
self.setVisible(true);
self.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
self.process(Double.parseDouble(args[0]));
}
public void process(double inputNumber) {
SocketChannel ch;
try {
textArea = new JTextArea();
getContentPane().add(textArea);
textArea.append("コマンドライン引数:" + inputNumber + "\n");
textArea.append("サーバにデータを送信中...");
ch = SocketChannel.open(new java.net.InetSocketAddress("localhost", 22003));
StringBuffer sb = new StringBuffer();
sb.append("Client->Server " + inputNumber + "\r\n");
458455:05/02/23 23:26:12
>>442 つづき
ch.write(java.nio.ByteBuffer.wrap(sb.toString().getBytes("ISO-8859-1")));
textArea.append("完了" + "\n");

textArea.append("サーバからデータを受信中...");
Socket sc = ch.socket();
BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
String line = br.readLine();
double outputNumber = Double.parseDouble(line.split(" ")[1]);
textArea.append("完了" + "\n");
textArea.append("受信データ:" + outputNumber + "\n");
ch.close();
} catch(IOException ioe) {
textArea.append(ioe.getMessage());
}
}
}

ポートは22003番使ってます。
Serverを立ち上げてからClientを実行してください。
459M.B.:05/02/23 23:39:19
>>446
> 回答ありがとうございます。
いえいえ、こちらこそリハビリに役立てさせていただきました。m(_ _)m
(話は全然違うが『囚人のジレンマ』問題は interface と抽象クラスの
手頃なサンプルになってなかなか演習向きだと思った)
> コンパイルしたところ不正な文字ですとエラーが100個と出たのですがなぜでしょうか?
>>455 氏のおっしゃる通り。全角スペースを半角スペースに直し、yakusu.java
の名前にしてjavac yakusu.java。
460446:05/02/23 23:58:31
>>455さん
>>459さんありがとうございました。
無事コンパイルすることができました。
461デフォルトの名無しさん:05/02/24 00:02:01
>>455

そもそもなんで1回計算しただけで isEnd に true を立てる
設計なのかわからないけど、

static boolean isEnd = false;

じゃなくて、

static volatile boolean isEnd = false;

じゃないと、別スレッドから isEnd を変更したときに
その変更が見えないかもしれないんじゃないかと思う。
(あるいは、synchronized なメソッド経由で isEnd を参照するか)
462デフォルトの名無しさん:05/02/24 00:33:31
n個の整数値を入力し(値はカンマで区切る)、
読み込まれた値を昇順に並べ替えるプログラムを作成しなさい。

実行結果

整数値を入力してください。
1,4,2,3
1,2,3,4

よろしくお願いします<m(__)m>
463442:05/02/24 00:35:52
>>455-458
本当にありがとうございました。
今のところ動作の確認は完了してませんが、
コンパイルは出来たのでなんとかなりそうです。

途中偽者が二人いますが後ろの方どうもです。
464442:05/02/24 02:30:20
できれば、もう少し早くやってくれれば良かったんですがね。
明日提出なんですから。ちょっと遅すぎです。
おかげで夜遅くなってしまいました。睡眠時間が減ってしまいましたが
どうしてくれるのですか?
465デフォルトの名無しさん:05/02/24 02:41:40
くだらん
466デフォルトの名無しさん:05/02/24 11:21:30
百済ん
467デフォルトの名無しさん:05/02/24 11:22:11
JAVA初心者です。よろしくお願いします。
後述のappletAを既存のappletBのボタンを押したら新しいフレームで表示させるよう
にしたいのですが。
組み込みたいappletAは以下です。
import java.applet.*;
import java.awt.*;

public class testApp extends Applet {

HighScoreManager HS;
Image im;
Graphics g;

Panel p = new Panel();
TextField F;

public void init() {

HS = new HighScoreManager(10);

setLayout(new BorderLayout());

add("South", p);
468デフォルトの名無しさん:05/02/24 11:22:45
p.add( new Button("Add"));
p.add( new Button("Change Color"));
F = new TextField(10);
p.add(F);
repaint();
}

public void update(Graphics bg) {


int panel_height = p.preferredSize().height;
Rectangle r= new Rectangle(0,0,size().width,size().height-panel_height);

im=createImage(size().width,size().height);
g=im.getGraphics();
g.clipRect(0,0,size().width,size().height);
HS.paintScores(g,r);

paint(bg);
}

public void paint(Graphics bg) {
if(im!=null)
bg.drawImage(im,0,0,null);

}

public boolean action(Event evt, Object arg) {

if("Change Color".equals(arg)) {
469デフォルトの名無しさん:05/02/24 11:23:16
HS.newColors();
repaint();
return true;
}
if ("Add".equals(arg)) {
HS.addScore(F.getText(),(int)(Math.random() * 1000),"blah@blah"," ");
F.setText(null);
repaint();
return true;
}
return false;
}
}
470デフォルトの名無しさん:05/02/24 12:40:27
無駄な改行大杉
471デフォルトの名無しさん:05/02/24 12:46:31
>>467
答えを求めるより勉強した方がよさそう
472デフォルトの名無しさん:05/02/24 14:41:07
JAVA初心者です。この問題をお願いします<m(__)m>

n個の整数値を入力し(値はカンマで区切る)、
読み込まれた値を昇順に並べ替えるプログラムを作成しなさい。

実行結果

整数値を入力してください。
1,4,2,3
1,2,3,4

というプログラムです。
473デフォルトの名無しさん:05/02/24 14:58:11
>>472

import java.io.*;
import java.util.*;

public class Sample {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s[];
String strErr = "エラーが発生しました。\n";
int i,l,intArr[];

try{
System.out.println("整数値を入力してください。");
s = in.readLine().split(",");
l = s.length;
intArr = new int[l];
for(i = 0; i < l; i++)
intArr[i] = Integer.parseInt(s[i]);
Arrays.sort(intArr);
for(i = 0; i < l - 1; i++)
System.out.print(intArr[i] + ",");
System.out.println(intArr[i]);
}catch(IOException e){
System.out.println(strErr + "出入力に異常がある可能性があります。");
}catch(NumberFormatException e){
System.out.println(strErr + "入力された値が適当でない可能性があります。");
}catch(Exception e){
System.out.println(strErr);
}
}
}
474472:05/02/24 16:18:57
>>473
回答ありがとうございます<m(__)m>
無事コンパイル&実行することができました。
ホントにありがとうございます。
475デフォルトの名無しさん:05/02/24 22:15:31
これをお願いします。。。

rmi(Remote Method Invocation)を用いたアプリケーション作成
rmiを用いて簡単なメッセージネットワークを作成する。仕様は以下の通りとする。

※サーバーと複数のクライアントから構成される。
※クライアントは自分の画面にメッセージを表示させるメソッド
 showMessage(String message)を実装したリモートオブジェクトを持つ。
※クライアントは起動すると、まずサーバーに自分の名前を登録する。
※クライアントは通信したい相手の名前を指定してサーバーに要求を出す。
※サーバーはその相手名が存在してるなら、相手側のリモートオブジェクトを
 取得してそれを要求側に送る。同じく要求側のリモートオブジェクトを
 取得して相手側に送る。それ以降は双方のリモートオブジェクトのshowMessageが
 互いに呼び出される事によって、クライアント同士の直接通信が可能となる。
※クライアントは同時に複数の相手と通信できるようにする。
※アクティベーションを用いる。
※サーバープログラムとクライアントプログラムの二つを作成する。

という課題です。期限は2月末です。よろしくお願いします。
476デフォルトの名無しさん:05/02/25 01:53:16
[a-zA-Z]のいずれかの文字がランダムに並んだDataが2つ存在します。
この中から、共通の文字列をより多く見つけるアルゴリズム考えよという
問題が出ました。これは編集距離を求める問題らしいです。
しかし設問2に
このランダムな文字列の長さが100、1000、10000、100000、1000000と増えた
場合にも対応可能な手法も考えよという問題がでました。
編集距離を求めるには大きなメモリコストがかかるためどのようにアルゴリズム
を組めばよいのか苦慮しています。
477デフォルトの名無しさん:05/02/25 02:30:59
>>476
なんでメモリコスト大きいの?
478デフォルトの名無しさん:05/02/25 03:01:19
それって編集距離を求める問題なのか?
今ネットで調べたけど、なんか違うことが書いてある。

私が調べたところによると、編集距離とは、例えば文字列が「あいうえお」と与えられたとして、
これを、「あおいうみ」に変更したい。ただし、やってよい手段の種類は、一字削除、一字挿入、
一字置換の3つだけ。一字削除にはX円、一字挿入にはY円、一字置換にはZ円かかります。
この3つの手段を、与えられた文字列の好きな位置に好きなだけ繰り返して、できるだけ安く
「あおいうみ」を作り出した場合、おいくらになりますか?ってことだとおもう。
479デフォルトの名無しさん:05/02/25 03:10:20
要求が良く分からん
たとえば
AABCDDD
 と
ABCCDDDD
では、どういう答えが導き出される事を期待している?
480デフォルトの名無しさん:05/02/25 23:14:31
質問です。
ソ−ス中のタイトルにあるとおり、図形をフレーム表示するプログラムを作りたいです。
エラーが出るのですが、どこを直して良いやら分かりません。
宜しくお願いします。

import java.awt.*;
import java.awt.event.*;

public class Diamond extends Frame{
public Diamond(){
setSize(600,500);
setTitle("分割数が4から7までのダイアモンドリングを描く");
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public void paint(Graphics g){
int ix=30,iy=60; //バーを考慮したマージン
int sx=10; //図形間のマージン
int ox,oy; //中心
int r=90; //半径
int x1,y1,x2,y2; //円分点
double t,t1,t2; //角度
ox=ix+r;oy=iy+r; //最初の中心
481480続き:05/02/25 23:15:32
for(int p=4;p<=7;p++){
t=2*Math.360/p; //p分割の単位角
for(int i=0;i<p-2;i++){
t1=i*t;
x1=ox+r*Math.rint(r*Math.cos(t1));
y1=oy-r*Math.rint(r*Math.sin(t1));
for(int j=i+1;j<p-1;j++){
t2=j*t;
x2=ox+r*Math.rint(r*Math.cos(t2));
y2=oy-r*Math.rint(r*Math.sin(t2));
g.drawLine(x1,y1,x2,y2);
}
}
ox=ox+2*r+sx;
}

public static void main(String[] args){
Frame w=new Diamond();
w.show();
}
}

以上です。
482>>475 サーバー その1:05/02/26 00:00:40
package hw83;
import java.util.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.activation.*;
interface ServerBehavior extends Remote {
boolean entryUser(String name, String host, int port) throws RemoteException;
void removeUser(String name) throws RemoteException;
Remote openConnection(Remote sendR, String sender, String receiver)
throws RemoteException;
}
public class HW83 {
static final String CODEBASE = System.getProperty("user.dir");
static final String HOST = "localhost";
static final int PORT = 1099;
static Map userMap = Collections.synchronizedMap(new TreeMap());
static public void main(String[] args) {
System.setProperty("java.security.policy",
System.getProperty("user.dir") + "/myapp.policy");
System.setProperty("java.rmi.server.codebase", CODEBASE);
try {
Registry reg = LocateRegistry.createRegistry(PORT);
Properties ps = new Properties();
ActivationGroupDesc groupD = new ActivationGroupDesc(ps, null);
ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupD);
ActivationGroup.createGroup(groupID, groupD, 0);
ActivationDesc desc = new ActivationDesc(groupID, "hw83.HW83$Server",
CODEBASE, null);
Remote stab = Activatable.register(desc);
reg.rebind("server", stab);
483:>>475 サーバー その2:05/02/26 00:01:28
} catch (Exception e) {
e.printStackTrace();
System.out.println("エラー終了");
}
}
public static class Server extends Activatable implements ServerBehavior {
public Server(ActivationID id, MarshalledObject mo)
throws RemoteException {
super(id, 0);
}
public boolean entryUser(String name, String host, int port)
throws RemoteException {
if (name.length() == 0)
return false;
if (userMap.containsKey(name))
return false;
userMap.put(name, new String[] { host, String.valueOf(port) });
return true;
}
public void removeUser(String name) throws RemoteException {
userMap.remove(name);
}
public Remote openConnection(Remote sendR, String sender,
String receiver) throws RemoteException {
try {
if (sender.equals(receiver))
return null;
String[] userData = (String[]) userMap.get(receiver);
484::>>475 サーバー その3:05/02/26 00:02:28
if (userData == null)
return null;
String url = "rmi://" + userData[0] + ":" + userData[1] + "/client";
Remote receiveR = Naming.lookup(url);
receiveR.getClass().getMethod("openPanel",
new Class[] { Remote.class, String.class })
.invoke(receiveR, new Object[] { sendR, sender });
return receiveR;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
}
485>>475 クライアント その1:05/02/26 00:03:21
package hw832;
import java.util.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.activation.*;
import java.lang.reflect.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
interface ClientBehavior extends Remote {
void showMessage(String msg) throws RemoteException;
void closeConnection() throws RemoteException;
void openPanel(Remote partner, String partnerName) throws RemoteException;
Long getTextAreaID() throws RemoteException;
}
public class ClientFrame extends JFrame {
static final String CODEBASE = System.getProperty("user.dir");
static final String SERVERHOST = "localhost";
static final int SERVERPORT = 1099;
static final String HOST = "localhost";
static int PORT = 1100;
static ActivationGroupID groupID;
static Registry reg;
static JTabbedPane tabpane = new JTabbedPane(JTabbedPane.TOP,
JTabbedPane.WRAP_TAB_LAYOUT);
static JPanel entryPanel, conePanel;
static String myname;
static Map textMap = Collections.synchronizedMap(new TreeMap());
486:>>475 クライアント その2:05/02/26 00:04:00
public static void main(String[] args) {
if (args.length > 0)
PORT = Integer.parseInt(args[0]);
System.setProperty("java.security.policy",
System.getProperty("user.dir") + "/myapp.policy");
System.setProperty("java.rmi.server.codebase", CODEBASE);
try {
reg = LocateRegistry.createRegistry(PORT);
Properties ps = new Properties();
ActivationGroupDesc groupD = new ActivationGroupDesc(ps, null);
groupID = ActivationGroup.getSystem().registerGroup(groupD);
ActivationGroup.createGroup(groupID, groupD, 0);
ActivationDesc desc = new ActivationDesc(groupID, "hw832.ClientFrame$Client",
CODEBASE, null);
Remote stab = Activatable.register(desc);
reg.rebind("client", stab);
} catch (Exception e) {
e.printStackTrace();
System.out.println("エラー終了");
return;
}
new ClientFrame();
}
ClientFrame() {
entryPanel = new JPanel(new BorderLayout());
final JButton entbtn = new JButton("登録");
final JTextField enttfd = new JTextField();
entbtn.addActionListener(new ActionListener() {
487>>475 クライアント その3:05/02/26 00:04:42
public void actionPerformed(ActionEvent e) {
entry(enttfd.getText());
enttfd.setText("");
}
});
conePanel = new JPanel(new BorderLayout());
final JButton conebtn1 = new JButton("通信");
final JButton conebtn2 = new JButton("退席");
final JTextField conetfd = new JTextField();
conebtn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
connect(conetfd.getText());
conetfd.setText("");
}
});
conebtn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
remove();
}
});
conePanel.add(conebtn1, BorderLayout.WEST);
conePanel.add(conetfd);
conePanel.add(conebtn2, BorderLayout.EAST);
entryPanel.add(entbtn, BorderLayout.WEST);
entryPanel.add(enttfd);
getContentPane().add(entryPanel, BorderLayout.NORTH);
getContentPane().add(tabpane);
setSize(640, 480);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
488>>475 クライアント その4:05/02/26 00:05:22
void entry(String myname) {
ClientFrame.myname = myname;
try {
Remote server = Naming.lookup("rmi://" + SERVERHOST + ":" + SERVERPORT + "/server");
Method meth = server.getClass().getMethod("entryUser",
new Class[] { String.class, String.class, Integer.TYPE });
Boolean flag = (Boolean) meth.invoke(server, new Object[] { myname, HOST, PORT } );
if (!flag.booleanValue()) {
JOptionPane.showMessageDialog(this, "名前が空かすでに使われてます",
"登録失敗通知", JOptionPane.ERROR_MESSAGE);
return;
}
JOptionPane.showMessageDialog(this, myname + "の名前で登録しました",
"登録通知", JOptionPane.INFORMATION_MESSAGE);
getContentPane().remove(entryPanel);
getContentPane().add(conePanel, BorderLayout.NORTH);
getContentPane().validate();
setTitle(myname);
getContentPane().repaint();
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(this, e1 + "の例外が発生しました",
"エラー通知", JOptionPane.ERROR_MESSAGE);
}
}
void connect(String partnerName) {
try {
Remote meR = reg.lookup("client");
Remote server = Naming.lookup("rmi://" + SERVERHOST + ":" + SERVERPORT + "/server");
489:>>475 クライアント その5:05/02/26 00:05:55
Remote partnerR = (Remote) server.getClass().getMethod("openConnection",
new Class[] { Remote.class, String.class, String.class })
.invoke(server, new Object[] { meR, myname, partnerName });
if (partnerR == null) {
JOptionPane.showMessageDialog(this, "その相手名は存在しません",
"通信失敗通知", JOptionPane.ERROR_MESSAGE);
return;
}
((ClientBehavior) meR).openPanel(partnerR, partnerName);
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(this, e1 + "の例外が発生しました",
"エラー通知", JOptionPane.ERROR_MESSAGE);
}
}
void remove() {
try {
Remote server = Naming.lookup("rmi://" + SERVERHOST + ":" + SERVERPORT + "/server");
Method meth = server.getClass().getMethod("removeUser",
new Class[] { String.class });
meth.invoke(server, new Object[] { ClientFrame.myname } );
JOptionPane.showMessageDialog(tabpane, ClientFrame.myname + "の名前を解約しました",
"解約通知", JOptionPane.INFORMATION_MESSAGE);
getContentPane().remove(conePanel);
getContentPane().add(entryPanel, BorderLayout.NORTH);
getContentPane().validate();
setTitle("");
getContentPane().repaint();
490>>475 クライアント その6:05/02/26 00:06:31
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(this, e1 + "の例外が発生しました",
"エラー通知", JOptionPane.ERROR_MESSAGE);
}
}
public static class Client implements ClientBehavior {
String hereName = "";
Long textareaID = new Long(hashCode());
CommunicationPanel cpanel;
public Client(ActivationID id, MarshalledObject mo)
throws RemoteException, Exception {
Activatable.exportObject(this, id, 0);
ActivationDesc desc = new ActivationDesc(groupID,
"hw832.ClientFrame$Client", CODEBASE, null);
Remote stab = Activatable.register(desc);
reg.rebind("client", stab);
textMap.put(textareaID, new JTextArea());
}
public void showMessage(String msg) throws RemoteException {
System.out.println(msg);
((JTextArea) textMap.get(textareaID)).append(hereName + ": " + msg + "\n");
}
public void openPanel(Remote partner, String partnerName)
throws RemoteException {
try {
cpanel = new CommunicationPanel(this, partner);
491>>475 クライアント その7:05/02/26 00:07:06
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(tabpane, e1 + "の例外が発生しました",
"エラー通知", JOptionPane.ERROR_MESSAGE);
return;
}
tabpane.add(cpanel, partnerName);
hereName = partnerName;
// JOptionPane.showMessageDialog(tabpane, hereName + "さんとの通信が開始しました",
// "接続通知", JOptionPane.INFORMATION_MESSAGE);
}
public void closeConnection() throws RemoteException {
tabpane.remove(cpanel);
JOptionPane.showMessageDialog(tabpane, hereName + "さんとの通信が終了しました",
"接続終了通知", JOptionPane.INFORMATION_MESSAGE);
}
public Long getTextAreaID() throws RemoteException {
return textareaID;
}
}
static class CommunicationPanel extends JPanel {
CommunicationPanel(final Object me, final Object partner)
throws Exception {
JPanel pal = new JPanel(new BorderLayout());
Long id = (Long) ((ClientBehavior) me).getTextAreaID();
final JTextArea tarea = (JTextArea) textMap.get(id);
tarea.setEditable(false);
final JButton btn1 = new JButton("送信");
final JButton btn2 = new JButton("終了");
final JTextField tfd = new JTextField();
492>475 クライアント その8:05/02/26 00:07:42
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
partner.getClass().getMethod("showMessage",
new Class[] { String.class })
.invoke(partner, new Object[] { tfd.getText() });
tarea.append(myname + ": " + tfd.getText() + "\n");
tfd.setText("");
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(tabpane, e1 + "の例外が発生しました",
"エラー通知", JOptionPane.ERROR_MESSAGE);
}
}
});
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
partner.getClass().getMethod("closeConnection", new Class[0])
.invoke(partner, new Object[0]);
((ClientBehavior) me).closeConnection();
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(tabpane, e1 + "の例外が発生しました",
"エラー通知", JOptionPane.ERROR_MESSAGE);
}
}
});
493>475 クライアント その9:05/02/26 00:12:55
pal.add(btn1, BorderLayout.WEST);
pal.add(tfd);
pal.add(btn2, BorderLayout.EAST);
setLayout(new BorderLayout());
add(pal, BorderLayout.NORTH);
add(new JScrollPane(tarea));
}
}
}


同一マシンでのテスト実行
rmid.exeを起動後にサーバーを実行します。次にクライアントを実行します。
クライアントはデフォルトでポート1100にバインドされます。
2つ以降のクライアントは実行引数でポート指定できます。
(例:hw832.ClientFrame 1101)
パッケージhw83とhw832を置いたフォルダに、rmiを実行可能にする
ポリシーファイルを置いてください。
494デフォルトの名無しさん:05/02/26 00:23:30
ポリシーファイル名はmyapp.policyにしてください。
495デフォルトの名無しさん:05/02/26 00:35:24
感動した
496>>476 その1:05/02/26 09:16:31
import java.util.*;
import java.io.*;
public class HW84 {
static class Node extends javax.swing.tree.DefaultMutableTreeNode {
Node(Object obj) {
super(obj);
}
}
public static void main(String[] args) {
String str1 = "", str2 = "";
try {
System.out.print("文字列1の入力:");
str1 = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.print("文字列2の入力:");
str2 = new BufferedReader(new InputStreamReader(System.in)).readLine();
} catch (IOException e) {
System.out.print("エラー発生終了");
System.exit(0);
}
Set stringSet = new TreeSet();
Node root1 = makeTree(str1), root2 = makeTree(str2);
LinkedList queue = new LinkedList();
queue.addLast(root1);
497:>>476 その2:05/02/26 09:17:07
while (!queue.isEmpty()) {
Node node = (Node) queue.removeFirst();
if (node.getChildCount() == 0) {
Object[] path = node.getUserObjectPath();
int count = compareTree(path, root2);
if (count >= 2) {
for (int i = 0; i < count - 1; i++) {
StringBuffer sb = new StringBuffer();
for (int k = 1; k <= count - i; k++)
sb.append(((Character) path[k]).charValue());
stringSet.add(sb.toString());
}
}
} else {
for (int i = 0; i < node.getChildCount(); i++)
queue.addLast(node.getChildAt(i));
}
}
System.out.println("両Stringの共通文字列(2文字以上)");
Iterator it = stringSet.iterator();
int no = 1;
while (it.hasNext())
System.out.println((no++) + "個目: " + it.next());
}
498>>476 その3:05/02/26 09:17:40
static Node makeTree(String str) {
Node root = new Node(new Character('@'));
for (int i = 0; i < str.length(); i++) {
Node next = root;
for (int idx = i; idx < str.length(); idx++) {
Node parent = next;
Node node = new Node(new Character(str.charAt(idx)));
block: {
for (int k = 0; k < parent.getChildCount(); k++) {
Node child =(Node) parent.getChildAt(k);
if (child.getUserObject().equals(node.getUserObject())) {
next = child;
break block;
}
}
parent.add(node);
next = node;
}
}
}
return root;
}
499:>>476 その4:05/02/26 09:18:13
static int compareTree(Object[] line, Node node) {
loop: for (int i = 1; i < line.length; i++) {
for (int k = 0; k < node.getChildCount(); k++) {
Node child = (Node) node.getChildAt(k);
if (child.getUserObject().equals(line[i])) {
node = child;
continue loop;
}
}
return i - 1;
}
return line.length - 1;
}
}
500デフォルトの名無しさん:05/02/26 10:09:47
>>480
p分割の単位角
Math.360 って何
501デフォルトの名無しさん:05/02/26 10:34:38
479様へ
AABCDDD(1)
ABCCDDD(2)とすれば
(1)にはBCの後にCを挿入してAABCCDDDとして
(2)にはAの後にAを挿入してAABCCDDDとするというように
編集すれば最小の編集で同じ文字列が生成されるということをわかりたいの
です。差分情報から、最小の編集コストを見つけたいということです。
ただ、LCSとかやるとメモリが[m*n]消費してしまって500kbのデータなんて
比較することもできません。
502デフォルトの名無しさん:05/02/26 11:56:00
503デフォルトの名無しさん:05/02/26 12:17:59
http://hp.vector.co.jp/authors/VA007799/viviProg/doc5.htm
これで組んでもメモリの使用量減らないですがどうすればいいの?
結局[m,n]の容量必要なのですが。1kのデータそれで比較しただけ1Mですよ?
504デフォルトの名無しさん:05/02/26 12:27:46
いまどき1Mはたいした量じゃない
505デフォルトの名無しさん:05/02/26 14:02:23
三平方の定理の計算をしたいのですが

kyori[i] = kyorix[i]*kyorix[i]+kyoriy[i]*kyoriy[i];

右辺をまるごと√で括るにはどうしたらいいでしょうか?
506デフォルトの名無しさん:05/02/26 14:14:01
>>503
バックトラックじゃだめなの?
>>505
java.lang.Math#sqrt(double)
java.lang.StrictMath#sqrt(double)
507デフォルトの名無しさん:05/02/26 15:10:08
>>505
kyori[i] = √(kyorix[i]*kyorix[i]+kyoriy[i]*kyoriy[i]);
508デフォルトの名無しさん:05/02/26 21:13:33
>>503
ただメモリを使わないだけのアルゴリズムなら簡単なはずだが・・・

52枚のトランプの画像を使って対人戦の神経衰弱を作れという宿題です。
よろしくお願いします

510デフォルトの名無しさん:05/02/27 04:57:36
画像はあるの?
画像はあります
512デフォルトの名無しさん:05/02/27 07:01:20
その画像をまずくれ
513デフォルトの名無しさん:05/02/27 10:22:33
反応が無いので>>509はスルー
514デフォルトの名無しさん:05/02/27 12:19:10
515デフォルトの名無しさん:05/02/27 12:41:23
メモリを使わないだけのアルゴリズム教えてください。
思いつかない。ダメだ....
516デフォルトの名無しさん:05/02/27 12:49:51
>>515
両データの編集距離を求めるプログラムでいいの?
AABCDDDとABCCDDDだったら2とか。
ABCDDDとABCCDDDだったら1とか。
517デフォルトの名無しさん:05/02/27 17:40:02
うんうん、それ判れば差分も取れるから問題ないっす
518デフォルトの名無しさん:05/02/27 22:07:55
解答よろしくお願いします

1、カスタマークラスを作成しなさい
またカスタマークラスの動作を確認をのメインメソッドをもつクラスを作成しなさい

カスタマークラスは名前、住所という2つのインスタンス変数を持つ

2、 2つのコンストラクタを持つ
引数を持たないコンストラクタと名前を受け取りインスタンス変数に設定するコンストラクタ

5つのメソッドを持つ
@注文メソッド「注文をしました」と出力
A名前設定メソッド
B名前取得メソッド
C住所設定メソッド
D住所取得メソッド

よろしくお願いしますです
519518:05/02/27 22:12:45
すみません 書き忘れました・・・
二つのインスタンス変数はprivateで宣言する を追加でおねがいします
よろしくお願いします
520デフォルトの名無しさん:05/02/27 23:25:09
>>518 「名前を受け取りインスタンス変数に設定するコンストラクタ」って書いてるけど、
コンストラクタが受け取るのは名前だけ?住所もだよね?
名前と住所は String 型でいいんだよね?姓と名は分けなくてもいいんだよね?

public class Customer { private String name; private String address;
public Customer() {} public Customer(String name, String address) { this.name = name; this.address = address; }
public String getName() { return name; } public String getAddress() { return address; }
public void setName(String name) { this.name = name; } public void setAddress(String address) { this.address = address; }
public void order() { System.out.println("注文をしました"); } public static void main(String[] args) {
Customer c = new Customer(); System.out.println(c.getName()+c.getAddress());
c.setName("name"); System.out.println(c.getName()+c.getAddress());
c.setAddress("addr"); System.out.println(c.getName()+c.getAddress());
c = new Customer("NAME", "ADDR"); System.out.println(c.getName()+c.getAddress()); c.order(); }}

テスト用クラスは別に作らず、カスタマークラスの中にメインメソッドを置いた。
テスト項目は一応全ての機能を使い結果を標準出力に吐かせるだけにとどめた。(目で確認)
(本来は、setしているものを正しくgetできるか、nameへのsetがaddressに影響を及ぼさないか等を
網羅的に、かつプログラムで確認すべき。っていうかテストケースを書くべき。)
名前や住所が設定されていなくても注文はできる。(本来はエラーにすべきか?)
改行が多いと2chには貼れないので、改行をいくつも削除した。
521518:05/02/27 23:52:54
>520
ありがとうですー
情報ちゃんとだしてなくてすみません
名前と住所とかの条件はおっしゃられたとおりです〜
一応元の宿題が 
インスタンス変数で
名前 ID 住所とインスタンス変数をとるという形だったのですが
自分で挑戦してみようと思い 先程のような形でだしてみたのです
とても助かりました
ありがとうございました
509です、寝落ちしてしまって申し訳ないです。
画像はこれを使います

http://up.isp.2ch.net/up/cff0a5cd0987.zip

お願いします
523デフォルトの名無しさん:05/02/28 15:44:50
下記のプログラムをコンパイルしてアップレットビューアで動かそうとしたのですが
DOS窓で「appletviewer ButtonEvents.java」と打ってもウィンドウすら出ずに終わってしまいます。何故でしょうか?
「Apple」「Banana」「Orange」と書かれたボタン3つと空文字列の入ったラベル1つを表示し、
ボタンを押すとラベルにボタンにかかれた文字が表示される、というプログラムらしいです。
某書籍にかかれたサンプルプログラムの丸写しのハズなんですが・・・。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/*
<applet code="ButtonEvents" width="400" height="60>
</applet>
*/
public class ButtonEvents extends Applet implements ActionListener{
Label label;
public void init(){
Button b1 = new Button("Apple");
b1.addActionListener(this);
add(b1);
Button b2 = new Button("Banana");
b1.addActionListener(this);
add(b2);
Button b3 = new Button("Orange");
b3.addActionListener(this);
add(b3);
label = new Label(" ");
add(label);
}
public void actionPerformed(ActionEvent ae){
label.setText(ae.getActionCommand());
}
}
524デフォルトの名無しさん:05/02/28 15:52:56
>>523
アプレットビューワーの使い方を検索するんだ!
525デフォルトの名無しさん:05/02/28 16:09:50
>>417-424
遅くなってすみませんが、エラーが出たためご相談です。

HW81.java [45:1] シンボルを見つけられません。
シンボル: 変数 PANELW
場所 : HW81 の クラス
stage = new Stage(PANELW, PANELH, robot, enemy, HW81.this);
^
HW81.java [45:1] シンボルを見つけられません。
シンボル: 変数 PANELH
場所 : HW81 の クラス
stage = new Stage(PANELW, PANELH, robot, enemy, HW81.this);
^
HW81.java [48:1] シンボルを見つけられません。
シンボル: メソッド setDefaultCloseOperation(int)
場所 : HW81 の クラス
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
^
HW81.java [49:1] シンボルを見つけられません。
シンボル: メソッド pack()
場所 : HW81 の クラス
pack();
^
注: C:\Documents and Settings\takuya\デスクトップ\java\HW81Frame\HW81.java の操作は、未チェックまたは安全ではありません。
注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
エラー 4 個
コンパイルエラー HW81.

言われたとおりに置き換えたところ以上のようなエラーが出ました。
どうしたらいいでしょうか?
トランプの画像を使って対人戦の神経衰弱を作れという宿題です。
よろしくお願いします

http://up.isp.2ch.net/up/cff0a5cd0987.zip
527デフォルトの名無しさん:05/02/28 17:18:01
対人戦の意味を教えてください。
人VSCPUじゃなくて人VS人ということです
529デフォルトの名無しさん:05/02/28 17:24:43
ネット通信対戦ですか?
オフラインです
一ゲーム終わった後にカードがシャッフルされる仕様です。
531デフォルトの名無しさん:05/02/28 18:05:14
>>525

interface Constants {
int SIZE = 8, PATHSIZE = 16;
String filename = "score.dat";
}
public class HW81 extends JApplet implements KeyListener, ActionListener, Constants {

interface Constants {
int SIZE = 8, PATHSIZE = 16, PANELW = 400, PANELH = 400;
String filename = "score.dat";
}
public class HW81 extends JFrame implements KeyListener, ActionListener, Constants {
にしてください。
532455:05/02/28 20:07:59
>>523
動作確認してないけど、気づいたところ。

×<applet code="ButtonEvents" width="400" height="60>
○<applet code="ButtonEvents.class" width="400" height="60">

・拡張子が抜けてる。
・heightのダブルクオーテーションが抜けてる。
533デフォルトの名無しさん:05/02/28 20:12:03
>>509の書き込みから>>522の書き込みまでの間にプログラム作り始めて
>>522の書き込み見てキレた人間が数名いると予想する。
534>>526 その1:05/02/28 21:56:53
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.text.*;
import java.util.List;
public class HW85 extends JFrame {
static final int SIZE = 4;
List allcardList, gamecardList;
JPanel table = new JPanel(new GridLayout(SIZE, SIZE, 16, 16));
JLabel info = new JLabel();
Image backpic;
MouseListener mouseOp = new MouseOperation();
boolean cardFlag, playerFlag;
int blueCount, redCount, reverseCount;
MessageFormat msg = new MessageFormat(
"{0}の番です : 青{1,number,integer}点  赤{2,number,integer}点");
static class CardData implements Cloneable {
String name;
Image img;
boolean reverse;
CardData(String name, Image img) {
this.name = name;
this.img = img;
}
public boolean equals(Object obj) {
return name.equals(((CardData) obj).name);
}
535>>526 その2:05/02/28 21:58:19
public Object clone() {
return new CardData(name, img);
}
}
public static void main(String[] args) {
try {
new HW85();
} catch (Exception e) {
e.printStackTrace();
System.out.println("初期化失敗エラー終了");
}
}
HW85() throws Exception {
URL url = ClassLoader.getSystemResource("card");
String[] names = new File(url.toURI()).list(
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.matches(".+\\.gif$")
&& !name.equalsIgnoreCase("omote.gif")
&& !name.equalsIgnoreCase("saa.gif");
}
});
allcardList = new ArrayList();
for (int i = 0; i < names.length; i++) {
Image img = ImageIO.read(new File(new File(url.toURI()),
names[i]));
CardData cd = new CardData(names[i], img);
allcardList.add(cd);
}
InputStream in = ClassLoader.getSystemResourceAsStream("card/omote.gif");
backpic = ImageIO.read(in);
536:>>526 その3:05/02/28 22:00:25
table.setBackground(new Color(200, 255, 200));
table.setBorder(BorderFactory.createEmptyBorder(16, 16, 16, 16));
table.setPreferredSize(new Dimension(600, 600));
info.setHorizontalAlignment(JLabel.CENTER);
info.setFont(new Font("Dialog", 1, 20));
info.setOpaque(true);
JButton btn = new JButton("開始");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startGame();
}
});
JPanel topbar = new JPanel(new BorderLayout());
topbar.add(btn, BorderLayout.WEST);
topbar.add(info);
getContentPane().add(topbar, BorderLayout.NORTH);
getContentPane().add(table);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
void startGame() {
List list = new ArrayList(allcardList);
Collections.shuffle(list);
list.subList(SIZE * SIZE / 2, list.size()).clear();
int size = list.size();
gamecardList = new ArrayList();
for (int i = 0; i < size; i++)
gamecardList.add(((CardData) list.get(i)).clone());
for (int i = 0; i < size; i++)
gamecardList.add(((CardData) list.get(i)).clone());
537::>>526 その4:05/02/28 22:01:50
Collections.shuffle(gamecardList);
table.removeAll();
for (int i = 0; i < gamecardList.size(); i++) {
JLabel lab = new JLabel(new ImageIcon(backpic));
lab.setName(String.valueOf(i));
lab.addMouseListener(mouseOp);
table.add(lab);
}
table.validate();
blueCount = 0;
redCount = 0;
reverseCount = 0;
showMessage();
}
void showMessage() {
String text = msg.format(new Object[] { !playerFlag ? "青" : "赤",
new Integer(blueCount), new Integer(redCount) });
info.setText(text);
if (playerFlag)
info.setBackground(new Color(255, 200, 200));
else
info.setBackground(new Color(200, 200, 255));
}
void endGame() {
String text1 = blueCount + "点 対 " + redCount + "点で";
String text2;
if (blueCount > redCount) {
text2 = "青の勝ちです";
info.setBackground(new Color(200, 200, 255));
} else if (redCount > blueCount) {
538>>526 その5:05/02/28 22:02:34
text2 = "赤の勝ちです";
info.setBackground(new Color(255, 200, 200));
} else {
text2 = "引き分けです";
info.setBackground(new Color(200, 255, 200));
}
info.setText(text1 + text2);
}
class MouseOperation extends MouseAdapter {
CardData prevCard;
JLabel prevLabel;
public void mouseClicked(MouseEvent e) {
final JLabel lab = (JLabel) e.getComponent();
int idx = Integer.parseInt(lab.getName());
CardData cd = (CardData) gamecardList.get(idx);
if (cd.reverse)
return;
if (!cardFlag) {
prevLabel = lab;
prevCard = cd;
prevLabel.setIcon(new ImageIcon(prevCard.img));
prevCard.reverse = true;
showMessage();
} else {
lab.setIcon(new ImageIcon(cd.img));
if (cd.equals(prevCard)) {
lab.setBorder(BorderFactory.createLineBorder(
!playerFlag ? Color.blue : Color.red, 2));
prevLabel.setBorder(BorderFactory.createLineBorder(
!playerFlag ? Color.blue : Color.red, 2));
539>>526 その6:05/02/28 22:03:11
cd.reverse = true;
if (playerFlag)
++redCount;
else
++blueCount;
showMessage();
reverseCount += 2;
if (reverseCount >= gamecardList.size())
endGame();
} else {
prevCard.reverse = false;
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
}
lab.setIcon(new ImageIcon(backpic));
prevLabel.setIcon(new ImageIcon(backpic));
showMessage();
}
});
playerFlag ^= true;
}
}
cardFlag ^= true;
}
}
}
540デフォルトの名無しさん:05/02/28 22:08:37
>>526
クラスパス上にcardパッケージ(フォルダ)を作成して、そこに
全カードGIF画像を入れてください。
static final int SIZEの数を変えると、卓の上に載るカードの数が
変わります。4〜8位の範囲で変えてください。あまり多くするとエラーになる。
541デフォルトの名無しさん:05/02/28 22:15:08
>>540
横槍スマソ。
早速動かしてみたけど、これちゃんと動く?
同じ数字でもあたり判定しないことがあるんだが。
>>526
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;

public class Game extends Applet implements MouseListener{

public String status;

int i = 13,j = 4;
int [][] masu = new int [j][i];
int [] card = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23,24,25,26,
27,28,29,30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,50,51,52};//カードの変数
int [] tate = new int [2];
int [] yoko = new int [2];
int mx,my;
int x,y,z,zz;
double a=0;
int b=0;
int loop1,loop2;
int pu ;
int turn;
int pr,qu;
int play = 1;
int play1;
int play2;
int win1,win2,win3;
int ban;
int stop;

public void init(){
//初期化
for(y=0;y<4;y++){
for(x=0;x<13;x++){
masu[y][x] = 0;
}
}
for(y=0;y<4;y++){
for(x=0;x<13;x++){
a = (Math.random()*100)%52;//ランダムをきめる
b = (int)a;//aをdouble型からint型にかえる

while(card[b] == 0){

a = (Math.random()*100)%52;
b = (int)a;
}
masu[y][x] = card[b];
card[b] = 0;
}
}
//リスナークラスのインスタンス化
EventHandler eh = new EventHandler();
//フィールドの初期化
status="out";
//リスナーの追加
this.addMouseListener(eh);
}
public void paint(Graphics gs){
Font fnt1 = new Font("TimesRoman",Font.BOLD,25);
gs.setFont(fnt1);
gs.drawString("現在の得点",700,100);
gs.drawString("player1 "+play1+"",720,130);
gs.drawString("player2 "+play2+"",720,160);
if(play == 1){
gs.drawString("player1の番です",100,350);
}else{
gs.drawString("player2の番です",100,350);
}
if(win1 == 1){
gs.drawString("player1の勝利です",100,450);
}else if(win2 == 1){
gs.drawString("player2の勝利です",100,450);
}else if(win3 == 1){
gs.drawString("引き分けです",100,450);
}
if(pu == 2){
gs.drawString("カードのある場所をクリックしてください",100,400);
}
Color bg = new Color(0,180,0);
gs.setColor( bg );//盤の色指定
gs.fillRect(5,5,10*70-23,5*52+20);//盤の表示
//線の表示
gs.setColor(Color.black);
for(z=0;z<i+1;z++){
gs.drawLine(52*z+5,5,z*52+5,j*70+5);
for(zz=0;zz<j+1;zz++){
gs.drawLine(5,70*zz+5,i*52+5,zz*70+5);
}
}
//カードの裏側の表示
for(y=0;y<4;y++){
for(x=0;x<13;x++){
if(masu[y][x] != 0){
Image img = getImage(getDocumentBase(),"omote.gif");
gs.drawImage(img,x*52+10,y*70+10,this);
}
}
}
//一枚目の表示
if(pu >= 1){
Image img1 = getImage(getDocumentBase(),masu[tate[0]][yoko[0]]+".gif");
gs.drawImage(img1,yoko[0]*52+10,tate[0]*70+10,this);
}
//二枚目の表示
if(pu >= 2){
Image img2 = getImage(getDocumentBase(),masu[tate[1]][yoko[1]]+".gif");
gs.drawImage(img2,yoko[1]*52+10,tate[1]*70+10,this);
}
}
class EventHandler implements MouseListener {
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
switch(play){
case 1:ban = 1;break;
case -1:ban = 2;break;
}
turn = 0;
mx = (e.getX() - 5) / 52;
my = (e.getY() - 5) / 70;
if(my >= 0 && my < 4 && mx >= 0 && mx < 13 && masu[my][mx] != 0){
if(pu == 0){//1クリック目
tate[0] = my;
yoko[0] = mx;
pu += 1;
}else if(pu == 1){//2クリック目

if(masu[tate[0]][yoko[0]] != masu[my][mx]){//1枚目と2枚目が同じじゃないかを調べる
tate[1] = my;
yoko[1] = mx;
pu += 1;
}
pr = masu[tate[0]][yoko[0]] - masu[tate[1]][yoko[1]];
qu = pr % 13
}else if(pu == 2){//3クリック目
if(masu[tate[0]][yoko[0]] != masu[tate[1]][yoko[1]]){
if(qu == 0){//同じカードならmasuに0を入れてカードを消す
masu[tate[0]][yoko[0]] = 0;
masu[tate[1]][yoko[1]] = 0;
}else{
turn = 1;
}
}
pu = 0;
check();
}
}
if(turn != 0){//順番を入れ替える
play = (-1)*play;
}
repaint();
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}
/*勝敗判定*/
public void check(){
if(play == 1 && qu == 0){
play1 += 1;
}else if(play == -1 && qu == 0){
play2 += 1;
}

stop = play1 + play2;
if(stop == 26){
if(play1 > play2){
win1 = 1;//pla
}else if(play1 < play2){
win2 = 1;
}else{
win3 = 1;
}

}
}
}
>>526
画像をこのソースのファイルと同じフォルダにすればOK

番号振るの忘れたorz
逝ってくる
550デフォルトの名無しさん:05/02/28 22:31:47
>>541
確認どうもです。
それはカードが小さいので、マークの見分けがつきにくいからです。
スペードとクラブ、ハートとダイアのカードが同じに見える事が
多々あります。カードをよく見ると問題ないです。
当たり判定は間違いないです。
551デフォルトの名無しさん:05/02/28 22:33:50
>>550
同じ数字かどうかじゃなくて同じカードかどうかを見てるのね。。
526です
コンパイルしたら以下のエラーが出ました
HW85.java:46: シンボルを解決できません。
シンボル: メソッド toURI ()
場所 : java.net.URL の クラス
String[] names = new File(url.toURI()).list(
^
HW85.java:56: シンボルを解決できません。
シンボル: メソッド toURI ()
場所 : java.net.URL の クラス
Image img = ImageIO.read(new File(new File(url.toURI())

>>542さんのは今確認します
553デフォルトの名無しさん:05/02/28 23:08:26
すでに2人貼ってるが仕様が大きく違ったり、コンパイルできそうになかったりしてるっぽいので
俺も一応載せとく。
画像からして仕様と違うがナー。

http://www.wikiroom.com/java/?%BF%C0%B7%D0%BF%EA%BC%E5
一番下のCards.zip。
>>526です

>>542さんのコンパイルできました
うまく動かなかったです。

>>553の仕様がよくわかりません
555553:05/02/28 23:29:41
>>554
コンパイルして動かすだけだって。
javac *.java
java Main
プレイヤは3人いるが2人にしたけりゃMain.javaを修正して。
556554:05/02/28 23:37:04
CardFrame.java:74: シンボルを解決できません。
シンボル: メソッド getComponentZOrder (CardPanel)
場所 : javax.swing.JPanel の クラス
int pos = panel.getComponentZOrder(cardPanel);
^
エラー 1 個

とでました。
557デフォルトの名無しさん:05/02/28 23:47:24
>>552
url.toURI()
の部分を
url.getFile().substring(1).replaceAll("%20", " ")

してください・・・・
558554:05/03/01 00:05:02
どこにあるかわかりません
559デフォルトの名無しさん:05/03/01 00:08:57

おーい、みんな554にからかわれてるだけだぞ。
3人も犠牲になったか・・・
560554:05/03/01 00:12:06
今頃気付いたのですか?(プゲラ
ご苦労さんw
561デフォルトの名無しさん:05/03/01 00:39:19
>>554
542のほうがソースはきれいだな
動かないが(プゲラ
562デフォルトの名無しさん:05/03/01 02:23:52
下のアルゴリズム改良して、1Mのデータを比較できるようにならないでしょうか?
public static void main(String[] args) {
 String x = "aaaaabccaaddd", y = "aabbbcaaadcdaa";
 int xlen = x.length(), ylen = y.length();
 int[][] lcs = new int[xlen][ylen];
 String[][] move = new String[xlen][ylen];
 for(int i = 0; i < xlen; i++){
  lcs[i][0] = 0;
 }
 for(int j = 1; j < ylen; j++){
  lcs[0][j] = 0;
 }
 for(int i = 1; i < xlen; i++){
  for(int j = 1; j < ylen; j++){
   if(x.charAt(i) == y.charAt(j)){
lcs[i][j] = lcs[i-1][j-1] + 1;
    move[i][j] = "S";
   else if(lcs[i-1][j] >= lcs[i][j-1]){
lcs[i][j] = lcs[i-1][j];
move[i][j] = "U";
   else{
  lcs[i][j] = lcs[i][j-1];
    move[i][j] = "L";}
   }
  }
 for(int i =0; i < xlen; i++){
   for(int j = 0; j < ylen; j++){
 System.out.print(move[i][j] + " ");}
   System.out.print("\n");
  }
}
563>>562 その1:05/03/01 04:09:41
import java.io.*;
import java.util.*;
import java.awt.Point;
public class HW86 {
static class Data {
int x, y, cost;
Data(int x, int y, int cost) {
this.x = x;
this.y = y;
this.cost = cost;
}
}
public static void main(String[] args) {
String text1 = "", text2 = "";
try {
System.out.print("文字列1の入力:");
text1 = new BufferedReader(new InputStreamReader(System.in))
.readLine();
System.out.print("文字列2の入力:");
text2 = new BufferedReader(new InputStreamReader(System.in))
.readLine();
} catch (IOException e) {
System.out.print("エラー発生終了");
System.exit(0);
}
564>>562 その2:05/03/01 04:10:18
String str1, str2 ;
if (text1.length() >= text2.length()) {
str1 = text2;
str2 = text1;
} else {
str1 = text1;
str2 = text2;
}
List list = new ArrayList();
for (int y = 0; y < str1.length(); y++) {
for (int x = 0; x < str2.length(); x++) {
if (str1.charAt(y) == str2.charAt(x))
list.add(new Point(x, y));
}
}
LinkedList queue = new LinkedList();
SortedSet costSet = new TreeSet();
Point pt = new Point(0, 0);
if (list.contains(pt)) {
queue.addLast(new Data(1, 1, 0));
} else {
if (1 < str2.length())
queue.addLast(new Data(1, 0, 1));
if (1 < str1.length())
queue.addLast(new Data(0, 1, 1));
}
565>>562 その3:05/03/01 04:10:58
while (!queue.isEmpty()) {
Data dat = (Data) queue.removeFirst();
if (dat.x == str2.length() - 1 && dat.y == str1.length() - 1) {
costSet.add(new Integer(dat.cost));
continue;
}
pt.setLocation(dat.x + 1, dat.y + 1);
if (list.contains(pt)) {
queue.addLast(new Data(dat.x + 1, dat.y + 1, dat.cost));
continue;
} else {
if (dat.x + 1 < str2.length())
queue.addLast(new Data(dat.x + 1, dat.y, ++dat.cost));
if (dat.y + 1 < str1.length())
queue.addLast(new Data(dat.x, dat.y + 1, ++dat.cost));
}
}
int mincost = ((Integer) costSet.first()).intValue();
System.out.println("二つの文字列の最小編集コスト:" + mincost);
}
}
566デフォルトの名無しさん:05/03/01 04:48:33
>>563 >>564 >>565
途中にこういうところがあるけど、これだと最悪の場合
str1.length() * str2.length() 個の Point オブジェクトが
出来てくるんじゃないか?

  List list = new ArrayList();
  for (int y = 0; y < str1.length(); y++) {
    for (int x = 0; x < str2.length(); x++) {
      if (str1.charAt(y) == str2.charAt(x))
      list.add(new Point(x, y));
    }
  }

あと、結果が間違ってる気がする。
>>516 に書いてる例を入れてみた。

  文字列1の入力:AABCDDD
  文字列2の入力:ABCCDDD
  二つの文字列の最小編集コスト:3

バックトラックすれば、マトリックス持たなくていいんじゃない?
567デフォルトの名無しさん:05/03/01 04:52:25
Kokugo="88" Shakai="67"
Kokugo="71" Shakai="49"
Kokugo="59" Shakai="79"

こういった内容のファイルに対して
Shakai=""の中身だけ取り出すにはどうすればいいのでしょうか?
フォーマットは上記のものだけです

上記の例だと
67
49
79
となります
568デフォルトの名無しさん:05/03/01 08:38:34
left(right(line, 3), 2)
569デフォルトの名無しさん:05/03/01 10:11:39
line.split("\"")
570525:05/03/01 13:10:44
>>531
コンパイルはできたんですが実行するとアプレットが初期化されてませんと出ます。
以下、スタックトレース

java.lang.ClassCastException: HW81
at sun.applet.AppletPanel.createApplet(AppletPanel.java:710)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:639)
at sun.applet.AppletPanel.run(AppletPanel.java:319)
at java.lang.Thread.run(Thread.java:595)
571デフォルトの名無しさん:05/03/01 13:20:09
>>566
おお、指摘どうもです。直します。
572>>562訂正 その1:05/03/01 13:22:04
import java.io.*;
import java.util.*;
import java.awt.Point;
public class HW86 {
static class Data {
int x, y, cost;
Data(int x, int y, int cost) {
this.x = x;
this.y = y;
this.cost = cost;
}
}
public static void main(String[] args) {
while (true) {
String text1 = "", text2 = "";
try {
System.out.print("文字列1の入力:");
text1 = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (text1.length() == 0)
break;
System.out.print("文字列2の入力:");
text2 = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (text1.length() == 0)
break;
} catch (IOException e) {
System.out.print("エラー発生");
break;
}
compare(text1, text2);
}
System.out.print("終了");
}
573>>562訂正 その2:05/03/01 13:23:41
static void compare(String text1, String text2) {
String str1 = text1, str2 = text2;
if (text1.length() >= text2.length()) {
str1 = text2;
str2 = text1;
}
List list = new ArrayList();
for (int y = 0; y < str1.length(); y++) {
boolean flag = false;
for (int x = y; x < str2.length(); x++) {
if (!flag || x + str1.length() - str2.length() <= str2.length() - x) {
if (str1.charAt(y) == str2.charAt(x)) {
list.add(new Point(x, y));
flag = true;
}
}
}
}
574>>562訂正 その3:05/03/01 13:24:19
LinkedList queue = new LinkedList();
SortedSet costSet = new TreeSet();
Point pt = new Point(0, 0);
if (list.contains(pt))
queue.addLast(new Data(0, 0, 0));
else
queue.addLast(new Data(0, 0, 1));
while (!queue.isEmpty()) {
Data dat = (Data) queue.removeFirst();
if (dat.x == str2.length() - 1 && dat.y == str1.length() - 1) {
costSet.add(new Integer(dat.cost));
continue;
}
pt.setLocation(dat.x + 1, dat.y + 1);
if (list.contains(pt)) {
queue.addLast(new Data(dat.x + 1, dat.y + 1, dat.cost));
continue;
} else {
if (dat.x + 1 < str2.length())
queue.addLast(new Data(dat.x + 1, dat.y, dat.cost + 1));
if (dat.y + 1 < str1.length())
queue.addLast(new Data(dat.x, dat.y + 1, dat.cost + 1));
if (dat.x + 1 < str2.length() && dat.y + 1 < str1.length())
queue.addLast(new Data(dat.x + 1, dat.y + 1, dat.cost + 1));
}
}
int mincost = ((Integer) costSet.first()).intValue();
System.out.println("二つの文字列の最小編集コスト:" + mincost);
}
}
575デフォルトの名無しさん:05/03/01 13:26:53
>>570
public class HW81 extends JApplet implements KeyListener, ActionListener, Constants {

public class HW81 extends JFrame implements KeyListener, ActionListener, Constants {

してください。
576>>562本当の訂正 その3:05/03/01 13:54:44
失礼。その3はこっちにしてください。
LinkedList queue = new LinkedList();
int mincost = str1.length() + str2.length();
Point pt = new Point(0, 0);
if (list.contains(pt))
queue.addLast(new Data(0, 0, 0));
else
queue.addLast(new Data(0, 0, 1));
while (!queue.isEmpty()) {
Data dat = (Data) queue.removeFirst();
if (dat.x == str2.length() - 1 && dat.y == str1.length() - 1) {
if (dat.cost < mincost)
mincost = dat.cost;
continue;
}
pt.setLocation(dat.x + 1, dat.y + 1);
if (list.contains(pt)) {
queue.addLast(new Data(dat.x + 1, dat.y + 1, dat.cost));
continue;
} else {
if (dat.x + 1 < str2.length())
queue.addLast(new Data(dat.x + 1, dat.y, dat.cost + 1));
if (dat.y + 1 < str1.length())
queue.addLast(new Data(dat.x, dat.y + 1, dat.cost + 1));
if (dat.x + 1 < str2.length() && dat.y + 1 < str1.length())
queue.addLast(new Data(dat.x + 1, dat.y + 1, dat.cost + 1));
}
}
System.out.println("二つの文字列の最小編集コスト:" + mincost);
}
}
577デフォルトの名無しさん:05/03/01 14:46:38
>>566
ばっくとらっくしてみたYo!(EditGraph.java)

ちょっと長くなったので、ここに貼った。
http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=21927

編集距離って、そういうことなのね。初めて知った。
578525:05/03/01 16:09:35
>>575
すみません、こちらのミスでした。
きちんと動きました。ありがとうございました。
579java初心者の名無し:05/03/01 19:31:19
次のプログラムをコンパイルして実行すると、実行結果の図と同じ表示になるように、
arrayPrintメソッドとreplaceメソッドを追加してください。

条件1
arrayPrintメソッドは、パラメータに渡された配列の要素を表示するようにしてください。

条件2
replaceメソッドは、パラメータに渡された2つの配列の要素を入れ替えるようにしてください。

条件3
replaceメソッドに渡される2つの配列がもし同じ要素数でない場合は、
エラーメッセージ「エラー!要素の数が同じではありません。」を表示して、
すぐにmainメソッドに戻るようにしてください。
580java初心者の名無し:05/03/01 19:31:56
書き換えるプログラムは

public class Test {
// ここにarrayPrintメソッドを追加してください。
// ここにreplaceメソッドを追加してください。
public static void main(String[] args) {
int[] array1 = new int[]{0, 1, 2, 3, 4};
int[] array2 = new int[]{5, 6, 7, 8, 9};
int[] array3 = new int[]{10, 11};
replace(array1,array2);
arrayPrint(array1);
arrayPrint(array2);
replace(array2,array3);
arrayPrint(array2);
arrayPrint(array3);
}
}

実行結果
5 6 7 8 9
0 1 2 3 4
エラー!要素の数が同じではありません。
0 1 2 3 4
10 11

です。どうか助けてください。よろしくお願いします。
581デフォルトの名無しさん:05/03/01 21:01:53
ブラックジャックゲームを作れとの課題が出ました。
ルールはこんな感じです。
ディーラー(コンピュータ)とプレーヤーの二人で対戦します。
ディーラーは、プレーヤーとディーラーにそれぞれ2枚ずつカードを配ります。
ディーラーのカードは1枚だけ表にしてもう一枚は裏にします。
ディーラーは自分の2枚のカードの合計が17点以上なら待機し、16点以下なら17点以上に
なるまでカードを引き続けます。点数の数え方や勝敗の決め方は普通のBJと同じです。
トランプの絵柄は、数字と簡単な記号位でいいそうです。
誰かお願いします。
582デフォルトの名無しさん:05/03/01 22:20:19
>>581
「普通のBJと同じ」とだけ誤魔化して書いた分だけ仕様がアバウトかも。
・「A」は合計が21より大きいときは「1」と数える。それ以外は「11」(カード保有者の都合のいいように解釈する)。
・コインを掛ける話が出てこないのでサレンダー、インシュア、ダブルダウンなどは考慮しなくていい。
こんなもんでOK?
583デフォルトの名無しさん:05/03/01 23:21:10
すみません、質問です。
//行列とベクトルの積を計算するメソッド
public void kakezan(double[][]a,double[]b,double[]c){
double cj;
for(int i=0;i<a.length;i++){
cj=0;
for(int j=0;j<a[0].length;j++){
cj+=a[i][j]*b[j];
c[j]=cj;
}
}
}
このメソッドを、
double[][]a={{1,2},
{4,5}};
double[]b={1,1};
double[]c=new double[2];
の条件でcの要素を表示させると
c={4,7};
になってしまいます。(手計算では{5,7})
どうしてでしょうか?ご教示願います。
584583:05/03/01 23:22:47
訂正です。
表示させるとc={4,9}でした。
よろしくお願いします。
585デフォルトの名無しさん:05/03/01 23:37:03
素数を計算してくときに
boolean型の配列に入れた素数を
割り算に使いたいときは
boolean型ではだめなんだそうです。
どうしたらいいのでしょうか。
586デフォルトの名無しさん:05/03/01 23:40:15
>>582
はい。それでいいです。カジノみたいな要素もいりません。
ただ勝敗を決めるだけです。
587デフォルトの名無しさん:05/03/01 23:49:00
580の設問矛盾してないか?Exception吐いたら、すぐmainに戻るはずなのに、
なんで、下の2行が実行されるんだ?しかも、下から2番目のarrayPrintが
1番目の配列を表示してるのにコード上は2番目の配列になってるけど。
何がしたいんだ?
588デフォルトの名無しさん:05/03/01 23:52:49
585は酔っ払いか?Javaのbooleanでいつから素数なんて扱えるようになったんだ?
酔い覚ましてきたほうがいいよ。
589デフォルトの名無しさん:05/03/01 23:54:09
>>583
一応それでもわかるけど、要素の入れ方を説明して欲しかった
例えばa[0][1]は行列の1行目の2列目みたいに
>>583だと逆みたいだね
あと結果が4,9じゃないくて3、9になりそうだけど

確認はしてないけど
cj = a[j][i] * b[j]を
cj = a[j][i] * b[j];
とすればいいはず
590585:05/03/01 23:58:29
>588
booleanで配列を用意して
maxを100などに指定したときに
for(i=2;i<max;i++)
prime[i]=true
判定して、その後にiの倍数は全て
素数じゃない・・・ って形で素数判定したんです。
その素数判定した後に残った配列をどうしたらいいのでしょう。
591579:05/03/02 00:02:48
>>587
自分には、それすらわからないです…。
でも、問題は間違えてないなかったです。
592デフォルトの名無しさん:05/03/02 00:05:36
ちと理解に苦しむのだが、ううーーん。
例だと2から100までだが、とりあえず10までで考えると、
2から10まで素数は2、3,5,7の4つだが
prime[2]、[3]、[5]、[7]がtrueでそれ以外はfalseが入るって事だよね?
んでもってここで1つしかないけど、10以下の数かつ3の倍数の素数はなんですか
って聞かれると3って出力したいってこと?
593デフォルトの名無しさん:05/03/02 00:09:30
ここにいる人らって
サーティファイのJava検2級や、Sun JAVAなんたらかんたらの認定試験
もってたりします?
594デフォルトの名無しさん:05/03/02 00:15:48
>>593
持ってなくて悪いか。
595デフォルトの名無しさん:05/03/02 00:17:10
585寝ちゃうぞ?
579しばしお待ちを...
596デフォルトの名無しさん:05/03/02 00:31:07
>>580
/**
* @param array1
*/
private static void arrayPrint(int[] array1) {
String temp = "";
for (int i = 0; i < array1.length; i++) {
temp += array1[i] + " ";
}
System.out.println(temp);
}

/**
* @param array1
* @param array2
*/
private static void replace(int[] array1, int[] array2) {
if (array1.length != array2.length) {
System.out.println("エラー!要素の数が同じではありません。");
return;
}
int[] temp = (int[]) array1.clone();

for (int i = 0; i < array2.length; i++) {
array1[i] = array2[i];
}
for (int i = 0; i < array1.length; i++) {
array2[i] = temp[i];
}
}
597583:05/03/02 00:32:29
>589
ありがとうございます。
その通り、a[0][1]は1行目の2列目です。
逆ってことは・・
例えばa={{1,2},{4,5}}
を手計算する時は{1,2}が1行目、{4,5}が2行目の要素になるという事でしょうか。
それともう一度実行してみましたが結果は変わらず{4,9}でした。
返信遅れてすみません。お願いします。
598デフォルトの名無しさん:05/03/02 00:45:19
public class Test {
public static void main(String[] args) {
int[] array1, array2, array3;
array1 = new int[] {0, 1, 2, 3, 4};
array2 = new int[] {5, 6, 7, 8, 9};
array3 = new int[] {10,11};
Test test = new Test();
test.Replace(array1, array2);
test.ArrayPrint(array1);
test.ArrayPrint(array2);
test.Replace(array2, array3);
test.ArrayPrint(array2);
test.ArrayPrint(array3);
}
public Test(){}
public void Replace(int[] array1, int[] array2){
if(array1.length == array2.length){
int temp;
for(int i =0; i < array1.length; i++){
temp = array1[i];
array1[i] = array2[i];
array2[i] = temp;
}
}else{
System.out.println("エラー!要素の数が同じではありません。");
return;}}
public void ArrayPrint(int[] PrintData){
for(int i = 0; i < PrintData.length; i++){
System.out.print(PrintData[i] + " "); }
System.out.print("\n");}
}
599585:05/03/02 00:50:17
>>592
すいません。もんもんと考えてました。
目的は素数を二つ掛け算したものを
素数判定した数字で割って、
もとの素数二つを見つけたいんです。
例えば10は2と5の素数判定ですので、
10%i==0の時に
それが素数って・・・うーん
頭足らなくて 意味のわからない文章になってすみません
600デフォルトの名無しさん:05/03/02 01:13:42
素数2つ用意してそれの積を取るのか。ふむふむ
積の余りが0になる数で割れるとその数は素数であるっていいたいのか。
そうゆうのを見つけるたいってことか
trueを書き込むときに解るんだからそこで答えだって出せばいいだろうし
どうしてもprimeの中身を見て判別しないといけないのなら、
prime[i] == trueの時のiの値が答えになると思うけど解釈違うかな?
601585:05/03/02 01:34:44
>>600
そうなんです。
ずばりそれなんで。
でもわからん〜
602デフォルトの名無しさん:05/03/02 05:16:31
>>599
暗号のクラックでもしようとしてるのか?
603デフォルトの名無しさん:05/03/02 05:37:12
>>585
???
判定した素数で順番に剰余求めていけばいいじゃない。
ところでprimeはなぜintの配列にしないのだろうか。
私は勘違いしてるのだろうか。
604デフォルトの名無しさん:05/03/02 06:38:43
intの配列は無駄
boolean prime[N];
prime[0] = false;
prime[1] = false;
prime[2] = true;
prime[3] = true;
prime[4] = false;
prime[5] = true;
prime[6] = false;
prime[7] = true;
prime[8] = false;
prime[9] = false;
prime[10] = false;
605デフォルトの名無しさん:05/03/02 06:45:09
int prime[N];
prime[0] = 2;
prime[1] = 3;
prime[2] = 5;
prime[3] = 7;
..
はどうなのさ。
606>>581 その1:05/03/02 07:20:06
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.awt.image.*;
class HW87 extends JFrame {
static final int NONE = 0, WIN = 1, LOSE = 2, DRAW = 3;
int issue, playerS, dealerS;
boolean waitFlag, exitFlag;
Player player, dealer;
CardHandler ch;
JLabel screen = new JLabel(), message = new JLabel();
JButton btn_hit = new JButton("Hit"), btn_stand = new JButton("Stand"),
btn_next = new JButton("Next"), btn_exit = new JButton("Exit");
BufferedImage table = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = table.createGraphics();
public static void main(String[] args) {
HW87 wnd = new HW87();
while (!wnd.exitFlag)
wnd.playGame();
wnd.drawTable();
wnd.screen.setText("ゲーム終了");
}
private HW87() {
JPanel panel = new JPanel();
btn_next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
waitFlag = false;
}
});
607:>>581 その2:05/03/02 07:20:43
btn_hit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Card card = ch.getOneCard();
player.receiveCard(card, false);
player.showReceivedCard(card);
if (player.getTotalNumber() > 21) {
judge();
}
}
});
btn_stand.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
judge();
}
});
btn_exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
waitFlag = false;
exitFlag = true;
}
});
message.setFont(new Font("Dialog", 1, 16));
message.setHorizontalAlignment(JLabel.CENTER);
message.setText("現在の経過: " + playerS + "勝 " + dealerS + "敗");
g.setBackground(new Color(180, 220, 180));
g.setFont(new Font("Dialog", 0, 20));
screen.setFont(new Font("Dialog", 1, 40));
screen.setHorizontalTextPosition(JLabel.CENTER);
screen.setIcon(new ImageIcon(table));
panel.add(btn_next);
panel.add(btn_hit);
608>>581 その3:05/03/02 07:21:29
panel.add(btn_stand);
panel.add(btn_exit);
getContentPane().add(screen);
getContentPane().add(panel, BorderLayout.SOUTH);
getContentPane().add(message, BorderLayout.NORTH);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
void playGame() {
screen.setText("ゲーム開始");
drawTable();
ch = new CardHandler(false);
player = new Player(new Rectangle(100, 380, 500, 100), this);
dealer = new Player(new Rectangle(100, 10, 500, 100), this);
dealCard();
btn_next.setEnabled(false);
btn_exit.setEnabled(false);
btn_hit.setEnabled(true);
btn_stand.setEnabled(true);
issue = NONE;
while (issue == NONE) {
}
btn_next.setEnabled(true);
btn_exit.setEnabled(true);
btn_hit.setEnabled(false);
btn_stand.setEnabled(false);
waitFlag = true;
609:>>581 その4:05/03/02 07:22:10
while (waitFlag) {
}
btn_next.setEnabled(false);
btn_exit.setEnabled(false);
}
void dealCard() {
Card card = ch.getOneCard();
player.receiveCard(card, false);
player.showReceivedCard(card);
card = ch.getOneCard();
dealer.receiveCard(card, true);
dealer.showReceivedCard(card);
card = ch.getOneCard();
player.receiveCard(card, false);
player.showReceivedCard(card);
card = ch.getOneCard();
dealer.receiveCard(card, true);
dealer.showReceivedCard(card);
dealer.reverseCard(1);
}
private void judge() {
btn_hit.setEnabled(false);
btn_stand.setEnabled(false);
final List eventList = new ArrayList();
EventQueue.invokeLater(new Runnable() {
public void run() {
dealer.reverseCard(0);
if (!eventList.isEmpty()) {
EventQueue.invokeLater((Runnable) eventList.remove(0));
}
}
});
610>>581 その5:05/03/02 07:22:47
while (dealer.getTotalNumber() <= 16) {
final Card card = ch.getOneCard();
dealer.receiveCard(card, false);
eventList.add(new Runnable() {
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
}
dealer.showReceivedCard(card);
if (!eventList.isEmpty()) {
EventQueue.invokeLater((Runnable) eventList.remove(0));
}
}
});
}
eventList.add(new Runnable() {
public void run() {
int pn = player.getTotalNumber(), dn = dealer.getTotalNumber();
String text;
if (pn == 100 && dn == 100) {
issue = DRAW;
text = "引き分け " + "BJ vs BJ";
} else if (pn == 100) {
issue = WIN;
text = "勝利 " + "BJ vs " + dn;
} else if (dn == 100) {
issue = LOSE;
text = "負け " + pn + " vs BJ";
} else if (pn > 21 && dn > 21) {
issue = DRAW;
text = "引き分け " + "Over vs Over";
611デフォルトの名無しさん:05/03/02 09:12:55
おつ
612589:05/03/02 10:04:06
>>583
これで大丈夫だと思う
public void kakezan(double[][]a,double[]b,double[]c){
double cj;
for(int i=0;i<a.length;i++){
cj=0;
for(int j=0;j<a[0].length;j++){
cj+=a[j][i] * b[j];
c[i]=cj;
}
}
}
613583:05/03/02 11:47:10
>589
ありがとうございます。
a[][]のjとiを入れ替えたんですね。
それで実行してみたのですが、cに入っているものは{2.0,7.0}でした。
計算メソッドと描画メソッドを載せておきます。
//行列とベクトルの積を計算するメソッド
public void kakezan(double[][]a,double[]b,double[]c){
double cj;
for(int i=0;i<a.length;i++){
cj=0;
for(int j=0;j<a[0].length;j++){
cj+=a[i][j]*b[j];
c[j]=cj;
}
}
}
public void paint(Graphics g){
double[][]a={{1,2},
{4,5}};
double[]b={1,1};
double[]c=new double[2];

kakezan(a,b,c);
g.drawString("A*b = (",60,60);
for(int i=0;i<c.length;i++)
g.drawString(""+c[i],100+30*i,60);
お願いします(*- -)(*_ _)
614589:05/03/02 11:53:34
>>613
>>612で答えが{5.0, 7.0}になったよ
615583:05/03/02 12:08:32
>>589
できました!
>c[i]=cj;
ここを見落としていました。
ありがとうございます。
616デフォルトの名無しさん:05/03/02 14:32:30
ロボットをキーボードで操作してHOMEに帰すゲームをGUIを使って作りなさい。
以下がゲームの必要事項です。

スタートボタンを押すとロボット(プレイヤー)とロボット(コンピュータ)
HOMEをそれぞれランダムで格子状(gridLayoutを使って作ります)のステージに配置します。
ステージのマスの数(縦×横)はプレイヤーが数字を入力して選べます。
HOMEはプレイヤーにはわからないようにします。
プレイヤーとコンピュータのロボットは交互に一マスずつ動いていきます。
ロボットが一マス動くごとに1ドルのコストがかかります。
ロボットが一マス動くごとにステージをアップデートしてHOMEまでの距離を表示します。
ロボットはキーボード操作でマスを上下左右に移動できます。(斜めはなし)
上=I, 下=M, 右=L, 左=Jのキー配置です。
HOMEまでの道のりのマスにボーナス(20ドルゲットとか50ドルゲットとか)をランダムで配置します。
どちらかのロボットが先にHOMEについた時点でゴールです。
プレイヤーが先にゴールした場合、ボーナスとして100ドルを受け取れます。
最終スコアは勝った場合のボーナスとHOMEまでの道のりで得たボーナスから
コストを引いたものが最終スコアとなります。
スコアキーパー(デフォルトのTOP5のデータを入れておく。)からデータを読み取り、TOP5を記録。
このとき、現在プレイしたスコアがTOP5入りするようなら名前の入力を求める。
ゴール後ウィンドウをポップアップさせて最終スコアとリプレイするかしないかを表示します。
617デフォルトの名無しさん:05/03/02 14:35:04
>>616の続き
スコアキーパーは3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。
618デフォルトの名無しさん:05/03/02 14:40:05
>>616の続き

上に追加した要素のほかに、
ArrayList, LinkedList, Vector, Stack, または Queue
を使って新要素を追加しなさい。

例えば、Queueを使ってパックマンの敵のようにステージのどこかで待機していて
ある一定時間たつと一匹ずつステージに出てきてパックマンを追い回すやつを作るとか。

上の例は本当にその通りじゃなくてもいいらしいです。
他の面白そうなものを自分で考えてもいいそうです。

以上です。どなたかお願いします。
619>>581 その6:05/03/02 15:57:21
} else if (pn > 21) {
issue = LOSE;
text = "負け " + "Over vs " + dn;
} else if (dn > 21) {
issue = WIN;
text = "勝ち " + pn + " vs Over";
} else if (pn > dn) {
issue = WIN;
text = "勝ち " + pn + " vs " + dn;
} else if (pn < dn) {
issue = LOSE;
text = "負け " + pn + " vs " + dn;
} else {
issue = DRAW;
text = "引き分け " + pn + " vs " + dn;
}
if (issue == WIN)
++playerS;
else if (issue == LOSE)
++dealerS;
screen.setText(text);
message.setText("現在の経過: " + playerS + "勝 " + dealerS + "敗");
}
});
}
void drawTable() {
g.setColor(Color.green);
g.clearRect(0, 0, table.getWidth(), table.getHeight());
screen.repaint();
}
620:>>581 その7:05/03/02 15:57:59
void drawCard(Card card) {
if (card.isReverse) {
g.setColor(new Color(180, 180, 220));
g.fillRect(card.x, card.y, 60, 90);
g.setColor(Color.black);
g.drawRect(card.x, card.y, 59, 89);
screen.repaint(card.x, card.y, 60, 90);
return;
}
g.setColor(Color.white);
g.fillRect(card.x, card.y, 60, 90);
g.setColor(Color.black);
g.drawRect(card.x, card.y, 59, 89);
String text;
switch (card.type) {
case Card.SPADE:
g.setColor(Color.black);
text = "spade";
break;
case Card.CLUB:
g.setColor(Color.blue);
text = "club";
break;
case Card.DIA:
g.setColor(Color.magenta);
text = "dia";
break;
case Card.HEART:
g.setColor(Color.red);
text = "heart";
break;
621>>581 その8:05/03/02 15:59:55
default:
g.setColor(Color.gray);
text = "joker";
g.drawString(text, card.x
+ (60 - g.getFontMetrics().stringWidth(text)) / 2, card.y
+ (90 - g.getFontMetrics().getHeight()) / 2
+ g.getFontMetrics().getAscent());
return;
}
g.drawString(text, card.x + (60 - g.getFontMetrics().stringWidth(text))
/ 2, card.y + g.getFontMetrics().getAscent());
switch (card.no) {
case 1:
text = "A";
break;
case 11:
text = "J";
break;
case 12:
text = "Q";
break;
case 13:
text = "K"; break;
default:
text = String.valueOf(card.no);
}
g.drawString(text, card.x + (60 - g.getFontMetrics().stringWidth(text))
/ 2, card.y + (90 - g.getFontMetrics().getHeight()) / 2
+ g.getFontMetrics().getAscent());
screen.repaint(card.x, card.y, 60, 90);
}
}
622>>581 その9:05/03/02 16:00:30
class Card {
static final int SPADE = 0, CLUB = 1, DIA = 2, HEART = 3, JOKER = 4;
int type;
int no;
int x = -1, y = -1;
boolean isReverse;
}
class CardHandler {
boolean hasJoker;
Card[] cards;
List cardList;
CardHandler(boolean hasJoker) {
this.hasJoker = hasJoker;
reset();
}
void shuffleCard() {
List list = Arrays.asList(cards);
Collections.shuffle(list, new Random(System.currentTimeMillis()));
cards = (Card[]) list.toArray(cards);
}
Card getOneCard() {
return (Card) cardList.remove(0);
}
void reset() {
if (hasJoker) {
cards = new Card[54];
int idx = 0;
623>>581 その10:05/03/02 16:01:16
for (int i = 0; i < 4; i++) {
for (int k = 1; k <= 13; k++) {
cards[idx] = new Card();
cards[idx].type = i;
cards[idx++].no = k;
}
}
cards[idx] = new Card();
cards[idx++].type = Card.JOKER;
cards[idx] = new Card();
cards[idx].type = Card.JOKER;
} else {
cards = new Card[52];
int idx = 0;
for (int i = 0; i < 4; i++) {
for (int k = 1; k <= 13; k++) {
cards[idx] = new Card();
cards[idx].type = i;
cards[idx++].no = k;
}
}
}
shuffleCard();
cardList = new ArrayList(Arrays.asList(cards));
}
}
class Player {
List myCard = new ArrayList();
Rectangle space;
HW87 gameObj;
624:>>581 その11:05/03/02 16:13:15
Player(Rectangle space, HW87 gameObj) {
this.space = space;
this.gameObj = gameObj;
}
void receiveCard(Card card, boolean reverse) {
card.x = myCard.size() * 60 + space.x + myCard.size() * 4;
card.y = space.y;
card.isReverse = reverse;
myCard.add(card);
}
void showReceivedCard(Card card) {
gameObj.drawCard(card);
gameObj.screen.repaint();
}
void reverseCard(int index) {
Card card = (Card) myCard.get(index);
card.isReverse ^= true;
gameObj.drawCard(card);
}
int getTotalNumber() {
int num = 0;
Set bjj = new TreeSet();
for (int i = 0; i < myCard.size(); i++) {
Card card = (Card) myCard.get(i);
if (card.no == 1) {
num += 11;
bjj.add(new Integer(1));
} else if (card.no >= 10) {
num += 10;
bjj.add(new Integer(2));
625>>581 その12:05/03/02 16:13:46
} else {
num += card.no;
bjj.add(new Integer(0));
}
if (i == 1) {
if (bjj.contains(new Integer(1))
&& bjj.contains(new Integer(2)))
return 100;
}
}
if (num > 21) {
for (int i = 0; i < myCard.size(); i++) {
Card card = (Card) myCard.get(i);
if (card.no == 1) {
num -= 10;
if (num <= 21)
break;
}
}
}
return num;
}
}
626580:05/03/02 17:32:09
>>596,598
ありがとうございました!!無事動きました!!
627デフォルトの名無しさん:05/03/02 21:25:00
>>593
その検定試験は無用。
特にSJC-Pは、例えるなら受験英語以上の非実用的な問題ばかりだ。
日本じゃ本来の英語運用とかけ離れた「受験英語」が批判されて久しいのに、
あの検定試験は、まさにそれ以上だと言える。
628デフォルトの名無しさん:05/03/02 23:16:53
577さんへ、その再起ループだと長さが10になるだけで尋常じゃない
時間処理かかりますよ。
629577:05/03/03 00:50:27
>>628
はい。そうです。遅すぎです。
どうしたらもっと速くなるんだろ。逆に知りたいくらいっす。
630デフォルトの名無しさん:05/03/03 02:07:10
学校で出された課題の答えがわかりません!どなたか教えてください。
 問題は

ある販売店がある。その店の各月の売り上げを入力し、
配列に格納する(12回繰り返し)
売上高順に売上高と月を表示する。
売り上げの配列と月の配列が必要

以上です。どうかよろしくお願いします!
631デフォルトの名無しさん:05/03/03 02:31:15
>売り上げの配列と月の配列が必要
こんな教え方するなんてどこのどいつだ。
各月の売り上げをまとめたクラス作ってクラスの配列作れ。
632630:05/03/03 02:40:27
レスありがとうございます。
クラスを作れ とは何をすることですか?
633デフォルトの名無しさん:05/03/03 05:49:56
>>630
javaの話だよな・・?
クラスというものをまだ習ってないのか・・
634デフォルトの名無しさん:05/03/03 11:05:37
>>630 短めにまとめてみました。売上データ保持用クラス無し。配列1個。
import java.io.*;public class S{public static void main(String[]s)throws
Exception{long d[]=new long[12];int i=0;for(;i<12;)try{d[i]=r(i++);}catch(
RuntimeException e){i--;}java.util.Arrays.sort(d);for(;i>0;)System.out.println(
(d[--i]&15)+1+"月:"+(d[i]>>>32)+"円");}static long r(int i)throws Exception{
System.out.print(i+1+"月売上:");return(((long)Integer.parseInt(new
BufferedReader(new InputStreamReader(System.in)).readLine()))<<32)+i;}}

635デフォルトの名無しさん:05/03/03 13:47:22
image.jpgをjarファイルにまとめるにはMakeファイルにどう書けばいいですか?
636M.B.:05/03/03 14:07:04
>>635
誰かJava用のプリティプリンタを上げてくれる香具師はおらんのか
637デフォルトの名無しさん:05/03/03 14:44:23
>>636
プリティプリンタって、eclipse の、source->format みたいなやつのこと?
638M.B.:05/03/03 14:57:09
>>637
Eclipse はちょっと触っただけなので知らんのだけど、
つまるところインデントとかを工夫して、
括弧の対応とかを分かりやすくし、
プログラム構造が見えるような形に整形してくれるプログラム。
 *コメントの切り出し(唯一複数行にまたがる解析処理)
 *文字定数のエスケープの処理(括弧の対応が以外に難物)
の部分を、非推奨のStringTokenizer を使うでもなく、
split みたいなString のメソッドを使うでもなく、
どう処理するかが見てみたい。
正規表現でうまく片付けるというのは難しそうなので。
639637:05/03/03 15:32:27
>>638
単に、括弧の対応だけなら簡単かもしれないけど、ダブルクォートの中に
出てくる括弧は無視しなきゃならないし、(文字列だから)。コメント部分に
ある括弧も無視しなきゃならないし、で、結局、ソース全体を読んで、
字句解析→構文解析しなきゃならないんじゃない?それって正規表現とか、
String#split() とかのレベルじゃないと思われ。ほとんどコンパイラ。

っていうか、eclipse は内部にコンパイラを持ってる、ソースの中の
plugins\org.eclipse.jdt.core\compiler の下あたりに入ってるよ。
もちろん Java で書いてあるから、気合入れて読んでみたら?
640デフォルトの名無しさん:05/03/03 16:27:35
次のプログラムの空欄を埋めて完成させなさい
public class JavaH1{
public static void main(String[]args){
FileIn fi = new FileIn();
if(! fi.open("hyouka.csv")){
System.out.println("ファイルを開けません、終了します");
System.exit(1);
}
????
???? = new int[rec.hyouji.length];

String buf=null;
????
if(! rec.parseRec(buf, ":")){
fi.close();
System.exit(1);
}
hyoukaCount[rec.conv()]++;
rec.dispRec();
}
if(! fi.close()){
System.out.println("ファイルを閉じられません、終了します");
System.exit(1);
}

for(int i =0; ???? i++){
if(hyoukaCount[i] !=0){
System.out.println(rec.hyouji[i] + "は"
+ hyoukaCount[i]+ "人です");
}}}}
641デフォルトの名無しさん:05/03/03 16:57:25
これもおながいしますorz 次のプログラムの空欄を埋めて完成させなさい
import java.util.regex.*;
public class HyoukaRec1 extends HyoukaRec0{
KeyIn ki = new KeyIn();
private String readString(String key){
String str = ki.readKey(key);
while(str.length()==0){
System.out.println("空文字列は不可です");
str=ki.readKey("再入力");
}
return str;
}
public boolean keyInNewRec(int count){
System.out.println((count + 1) + "人目のデータ");
this.bangou=ki.readInt("番号");
if(this.bangou <= 0)return false;
this.shimei=this.readString("氏名");
this.hyouka=this.readString("評価");
return true;
}
public boolean parseRec(String buf,String dlm){
Pattern p = Pattern.compile(dlm);
try{
String [ ] result = p.split(buf);
this.bangou = Integer.parseInt(result[0]);
this.shimei = result[1];
????
int count;
for(count = 0; rec.keyInNewRec(count); count++){
642641続き:05/03/03 16:58:28
if(! fo.writeln(rec.toString(":"))){
fo.close();
System.out.println("ファイルに出力できません、終了します");
System.exit(1);
}}

if(!fo.close()){
System.out.println("ファイルを閉じられません、終了します");
System.exit(1);
}
System.out.println(count + "件のデータをファイルに出力しました");
}}
643M.B.:05/03/03 19:18:32
> っていうか、eclipse は内部にコンパイラを持ってる、ソースの中の
> plugins\org.eclipse.jdt.core\compiler の下あたりに入ってるよ。
> もちろん Java で書いてあるから、気合入れて読んでみたら?
あ、そうなんだ。てっきりコンパイラはJavac を呼んでるだけかと
思ってた(たしかForte とかそうだったし)し、やるにしてもJavacc
とか使ってLALR かなんかで片付けてそうに思ってた。
文法的にはC からそう離れてないわけだし、単純にyacc 程度のカラクリで
なんとかなりそうだしね(とはいえJavac のエラーメッセージを見た
感じだと、なんか内部的にけっこう凝ったことをやってそうな気も
するのだが)。
IBM 純正のコードってちょっと読んでみたい気がするな。
頑張ってみる。サンクスコ。
644M.B.:05/03/03 19:40:56
> とはいえJavac のエラーメッセージを見た感じだと、
> なんか内部的にけっこう凝ったことをやってそうな気も
> するのだが
セルフつっこみ。
そういえばプログラムの最後に /* をつけると、
> コメントが閉じられていません。
というエラーが出るのは分かるのだが、
> 'class' または 'interface' がありません。
と出るのは、ちょっと謎な気がする……
645M.B.:05/03/03 19:45:27
>>640 >>641
せめて仕様くらい書いてくれ……
646デフォルトの名無しさん:05/03/03 20:19:41
>>645
同じく。
FileInってAPIにあったっけ?
とりあえず>>640の2番目と4番目は、

int[] hyoukaCount (or int hyoukaCount[])

i < hyoukaCount.length

だと思われ。

1、3番目はrecの所属クラスが分からんとむりぽ。

recの所属クラスで分かる事は、
・hyoujiと言う配列メンバを持つ。(型は多分String)
・parseRec、conv、dispRec、というメソッドを持つ
こういうクラスがどこかにあるはずだから(名前はシラネ)、それを
探して教えてケロ。> >>640
647640-642:05/03/03 20:22:44
>>645
二つとも番号、氏名、評価(A,B,C,Dで)を入力して、hyouka.csvに出力するだけのプログラムです。
あと参照用で↓のプログラムを忘れてました、すいませんorz
public class HyoukaRec0{
int bangou;
String shimei, hyouka;
final String DLM=",";
final String [] code={"A","B","C","D"};
final String [] hyouji={"優","良","可","不可"};
public String toString(String dlm){
return this.bangou + dlm +this.shimei +dlm
+ this.hyouka.toUpperCase();
}
public String toString(){
return this.toString(DLM);
}
public int conv(){
int i;
String str = this.hyouka.toUpperCase();
for(i=0; i<code.length && !str.equals(code[i]); i++){
}
return i;
}
public String convString(String dlm){
return this.bangou + dlm +this.shimei +dlm
+ this.hyouji[this.conv()];
}
648続き:05/03/03 20:23:19
public String convString(){
return this.convString(DLM);
}
public void dispRec(String dlm){
System.out.println(this.convString(dlm));
}
public void dispRec(){
System.out.println(this.convString(DLM));
}}
649646:05/03/03 21:08:20
FileIn と KeyIn は無い?
無かったら俺のAPI見落としだが...

あと、番号、氏名、評価、は

% java 2 ひろゆき A

って感じの入力仕様で良いのかな?

>>640
括弧が足りないと思ったら、3番目は
for(???){
なのね...
650646:05/03/03 21:11:51
>>640
とりあえず、1番目は
HyoukaRec1 rec = new HyoukaRec1();
でFA。
(コンストラクタがこれしかないからな...)
2,4番目も上の答えであってるでしょう。

で3番目だが、FileInとKeyInの仕様が必要と思われ。
651640:05/03/03 21:21:49
↓KeyInです。FileInはこれから打つので少々お待ちください...
import java.io.*;
public class KeyIn{
String buf = null;
BufferReader br=
new BufferReader(new InputStreamReader(System.in));
public String readKey(){
try{
buf=br.readLine();
}catch (IOException e){
System.out.println(e);
System.exit(1);
}
return buf;
}
public String readKey(String msg){
System.out.print(msg+">");
return readKey();
}
public int readInt(){
int inputIntValue;
while(true){
buf=readKey();
try{
inputIntValue=Integer.parseInt(buf);
break;
}catch(NumberFormatException e){
System.out.println("整数値を入力してください:" + buf);
System.out.print("再入力>");
}}
652651続き:05/03/03 21:22:51
return inputIntValue;
}
public int readInt(String msg){
System.out.print(msg + ">");
return readInt();
}}
653デフォルトの名無しさん:05/03/03 21:32:50
↓FileInです。
import java.io.*;
public class FileIn{
BufferedReader br = null;
public boolean open(String fname){
boolean sts = true;
try{
br = new BufferedReader(new FileReader(fname));
}catch(IOException e){
System.out.println("ファイル名に誤りがあります\n" + e);
sts = false;
}
return sts;
}
public String readLine(){
String buff;
try{
buff=br.readLine();
}catch(IOException e){
System.out.println("読み込みエラー\n" + e);
buff null;
} return buff; }
public boolean close(){
boolean sts = true;
try{
br.close();
}catch(IOException e){
System.out.println("ファイルクローズエラー\n" + e);
sts=false;
}
return sts;
}}
654デフォルトの名無しさん:05/03/03 21:35:48
ぐぁ・・・
修正、KeyInのBufferedReaderのとこがBufferReaderになってます
連続ですいません
655646:05/03/03 21:54:41
>>640
1. HyoukaRec1 rec = new HyoukaRec1();
2. int[] hyoukaCount (or int hyoukaCount[])
3. while(buf = rec.readLine()){
  (or while((buf = rec.readLine()) != null){)
4. i < hyoukaCount.length ;

だと思ふ

3は"=="の書き間違いじゃなくて、あくまで"="ね。
インデントが無いから分からんのだが、多分3はrec.dispRec();
の次の } と同じレベルにあるんだよね?(3のwhileはそこで閉じる)

スマンが>>641はもうちっと待って
656デフォルトの名無しさん:05/03/03 21:57:34
>>655
ありがとうございます!

あと今見直してみたら641-642が変になってます
修正するのでおまちをo........rz
657646:05/03/03 22:00:41
>>656
catch節が無いような希ガス
658641-642修正:05/03/03 22:05:40
>>657
そのとおりですたorz
import java.util.regex.*;
public class HyoukaRec1 extends HyoukaRec0{
KeyIn ki = new KeyIn();
private String readString(String key){
String str = ki.readKey(key);
while(str.length()==0){
System.out.println("空文字列は不可です");
str=ki.readKey("再入力");
}
return str;
}
public boolean keyInNewRec(int count){
System.out.println((count + 1) + "人目のデータ");
this.bangou=ki.readInt("番号");
if(this.bangou <= 0)return false;
this.shimei=this.readString("氏名");
this.hyouka=this.readString("評価");
return true;
}
public boolean parseRec(String buf,String dlm){
Pattern p = Pattern.compile(dlm);
try{
String [ ] result = p.split(buf);
this.bangou = Integer.parseInt(result[0]);
this.shimei = result[1];
????
659658続き:05/03/03 22:06:03
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("データに誤りがあります:" + buf);
System.out.println("プログラムを異常終了します:" + e);
return false;
}catch(NumberFormatException e){
System.out.println("データに誤りがあります:" + buf);
System.out.println("プログラムを異常終了します:" + e);
return false;
}catch(Exception e){
System.out.println("予期せぬエラーで異常終了します" + e);
return false;
}
return true;
}
public boolean parseRec(String buf){
return parseRec(buf, ",");
}}
660646:05/03/03 22:14:06
了解。
catch節が無いからcatch節が入るしかないと思ってた。

って事は、やっぱり>>641

this.hyouka = result[2];

ですね。なんか簡単な気もするが...
>>640の3.はちょっと自信ナシ
間違ってたらゴメンなさい...

遅くてもいいので、答え分かったら教えてケロ。
661640:05/03/03 22:21:17
>>660
ありがとおおおおお
662デフォルトの名無しさん:05/03/03 23:04:07
なんとなくこのスレの住人は男ばっかりだと思っていたが、
考えたら女のプログラマっつーのもおるんだよな。
愛が生まれたりすることもあるんだろうかw
663デフォルトの名無しさん:05/03/03 23:28:14
>>662
その話題はどこから出てきたんだ?
664M.B.:05/03/03 23:41:10
単に課題が出てないから雑談になっただけと思われ
665デフォルトの名無しさん:05/03/04 11:19:53
了解。
666M.B.:05/03/04 16:32:48
>>459
> (話は全然違うが『囚人のジレンマ』問題は interface と抽象クラスの
> 手頃なサンプルになってなかなか演習向きだと思った)
なんかの参考になるかも知れんので晒しとく。
スレ汚しスマソ。
Player.java
import java.util.*;
public abstract class Player implements Responce {
abstract int get();
abstract void put( int x );
}
667M.B.:05/03/04 16:33:51
Responce.java

public interface Responce {
public static final int 協調 = 0;
public static final int 裏切り = 1;
}
668M.B.:05/03/04 16:35:59
import java.util.*;
public class 囚人のジレンマ implements Responce {
  public static void main( String [] args ) throws Exception {
    Player x = new 竹箆返し様();
    Player y = new 正直者();
    int x_の得点 = 0;
    int y_の得点 = 0;
    for (int cnt = 0;cnt < 1000;cnt += 1) {
      int x_の出方 = x.get();
      int y_の出方 = y.get();
      x.put(y_の出方);
      y.put(x_の出方);
      if (x_の出方 == 協調) {
        System.out.print("x:協調/");
      } else {
        System.out.print("x:裏切り/");
      }
      if (y_の出方 == 協調) {
        System.out.println("y:協調");
      } else {
        System.out.println("y:裏切り");
      }
669M.B.:05/03/04 16:36:21
       // 協調同士  3点 : 3点
       // 裏切り同士 1点 : 1点
       // 協調/裏切り 5点 : 0点。
      if ((x_の出方 == 協調) && (y_の出方 == 協調)) {
        x_の得点 += 3;
        y_の得点 += 3;
      }
      if ((x_の出方 != 協調) && (y_の出方 != 協調)) {
        x_の得点 += 1;
        y_の得点 += 1;
      }
      if ((x_の出方 != 協調) && (y_の出方 == 協調)) {
        x_の得点 += 5;
        y_の得点 += 0;
      }
      if ((x_の出方 == 協調) && (y_の出方 != 協調)) {
        x_の得点 += 0;
        y_の得点 += 5;
      }
    }
    System.out.println("x の得点:" + x_の得点 + ", y の得点:" + y_の得点);
  }
}
670M.B.:05/03/04 16:37:08
import java.util.*;
public class 竹箆返し様 extends Player {
  boolean 最初;
  int 相手の出方;
  竹箆返し様() {
    最初 = true;
  }
  int get() {
    int retval;
    if (最初) {
      retval = 協調;
      最初 = false;
    } else {
      retval = 相手の出方;
    }
    return retval;
  }
  void put( int x ) {
    相手の出方 = x;
  }
}
671M.B.:05/03/04 16:49:08
※正直者
import java.util.*;
public class 正直者 extends Player {
  正直者() {
  }
  int get() {
    return 協調;
  }
  void put( int x ) {
  }
}
※でたらめ君
import java.util.*;
public class でたらめ君 extends Player {
でたらめ君() {}
int get() {
if ( Math.random() < 0.8 ) {
return 協調;
}
return 裏切り;
}
void put( int x ) {
}
}
672デフォルトの名無しさん:05/03/04 22:40:03
おお、これはなかなか興味深いプログラムです。
673デフォルトの名無しさん:05/03/05 10:44:51
GAで解いて見ると面白いかもナ
674dahoi:05/03/05 17:42:04
すみません〜!
こんなこと聞くのはどうかと思うんですけど
10進数を2進数に変化するプログラムが
分かりません〜〜!
誰か教えてくださぁ〜い
675:05/03/05 19:05:35
コンパイルエラーが起こります。import省略しました。エラーは
Controller.java:27: <identifier> がありません。
cart.add(ticketA);
       ^
Controller.java:28: <identifier> がありません。
cart.add(ticketB);
^
Controller.java:30: 型の開始が不正です。
try{
^
Controller.java:55: <identifier> がありません。
}
です。なぜに<identifier>なるのかが不明です。
すいません。何か助言お願い致します。
676:05/03/05 19:06:24
以下、ソースになります。
public class Controller {
//ユーザの作成
User user = new User("hoge","***-***","hege街","hoge@**.com",true);
//チケットの作成
Ticket ticketA = new Ticket("111−111","ほげほげZ",1900,new Date(104,7,31),"hoge");
Ticket ticketB = new Ticket("389-756","hogehoge",2000,new Date(104,12,24),"hoge");
Cart cart = new Cart();
cart.add(ticketA);
cart.add(ticketB);
try{
        〜略〜
} catch (ResourceNotFoundException e) {
e.printStackTrace();
} catch (ParseErrorException e) {
e.printStackTrace();
} catch (MethodInvocationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
677:05/03/05 19:06:58
インデントされてなくてすいません…。
678デフォルトの名無しさん:05/03/05 19:13:29
>>676
質問は質問スレへ。
679デフォルトの名無しさん:05/03/05 20:31:41
>>674
// ToBin.java
import java.io.*;
public class ToBin {
public static void main(String[] args) throws IOException {
System.out.print("Input a number: ");
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
String line = br.readLine();
int number = Integer.parseInt(line);
System.out.println( Integer.toBinaryString(number) );
}
}
680dahoi:05/03/05 21:11:46
>>679
プログラムを打ったんですが動きません・・・
こんなエラーが出ます↓
Exception in thread "main" java.lang.NumberFormatException: null

at java.lang.Integer.parseInt(Integer.java:436)

at yomikomi.Yomini.main(Yomini.java:38)
681679:05/03/05 21:18:05
>>680
>at yomikomi.Yomini.main(Yomini.java:38)
これは何?
ここでnull渡してるんじゃないの?
682M.B.:05/03/05 21:24:56
>>679 はそれだけで動くプログラムだ。
関数として使おうとか、なんか変なことしてないか?
(だいたい Yomini.java って何なんだよ)
キモになっているのは、
 Integer.toBinaryString(number)
の部分であって、number のところに整数型(int)で渡せば
String 型で値が返ってくるはずだが。
683:05/03/05 21:30:06
>677です。
なぜにスルー・・・質問スレでも…むなしいです。
これってクラス定義されてないってことなんでしょうか・・?
でも、CartクラスはLinkedLidt継承してそのaddメソッド
呼びたいのですが、そうではないってことなのですかね・・?
684:05/03/05 21:32:15
>でも、CartクラスはLinkedLidt継承してそのaddメソッド
LinkedListです。すいませんです。
685デフォルトの名無しさん:05/03/05 21:38:00
>>684
Controllerのコンストラクタ内でaddやtryを使えば大丈夫
686デフォルトの名無しさん:05/03/05 21:41:41
>>683
どこの質問スレで訊いたんだ?
687:05/03/05 22:09:24
>684さん
なんと。了解です。

>685さん
ここの「スレ立てるまでもない〜」です( ´-`)ショボン
688dahoi:05/03/05 22:17:05
>>681,682
>>681,682

ちゃんと動きました。
なんか変な事してました。

例えば、足し算なんかをしてから
それを2進数表示するにはどうすればいいんですか?
689:05/03/05 22:27:34
>687です
コンストラクタで行ったら先ほどのエラーは回避しましたが、
今度はimportされているVelocityのクラスが見えなくなりました…。
クラスパス通ってるのになぜでしょう…。意味わからなくなってきました。。。
690686:05/03/05 22:30:49
>>687
Javaの質問なんだからJava質問スレの方が良かったんじゃない?
691:05/03/05 22:38:04
そうですか・・Javaとついていたので問題ないと
思った私が間違ってましたね・・・。
ありがとうございました。_(._.)_
692デフォルトの名無しさん:05/03/06 10:18:02
重複書き込み失礼します。
忘れられてるか、スルーされてる恐れがあるのでまた書き込ませていただきました。
スレ汚しすみません。

ロボットをキーボードで操作してHOMEに帰すゲームをGUIを使って作りなさい。
以下がゲームの必要事項です。

スタートボタンを押すとロボット(プレイヤー)とロボット(コンピュータ)
HOMEをそれぞれランダムで格子状(gridLayoutを使って作ります)のステージに配置します。
ステージのマスの数(縦×横)はプレイヤーが数字を入力して選べます。
HOMEはプレイヤーにはわからないようにします。
プレイヤーとコンピュータのロボットは交互に一マスずつ動いていきます。
ロボットが一マス動くごとに1ドルのコストがかかります。
ロボットが一マス動くごとにステージをアップデートしてHOMEまでの距離を表示します。
ロボットはキーボード操作でマスを上下左右に移動できます。(斜めはなし)
上=I, 下=M, 右=L, 左=Jのキー配置です。
HOMEまでの道のりのマスにボーナス(20ドルゲットとか50ドルゲットとか)をランダムで配置します。
どちらかのロボットが先にHOMEについた時点でゴールです。
プレイヤーが先にゴールした場合、ボーナスとして100ドルを受け取れます。
最終スコアは勝った場合のボーナスとHOMEまでの道のりで得たボーナスから
コストを引いたものが最終スコアとなります。
スコアキーパー(デフォルトのTOP5のデータを入れておく。)からデータを読み取り、TOP5を記録。
このとき、現在プレイしたスコアがTOP5入りするようなら名前の入力を求める。
ゴール後ウィンドウをポップアップさせて最終スコアとリプレイするかしないかを表示します。
693デフォルトの名無しさん:05/03/06 10:18:22
>>692の続き

スコアキーパーは3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。

694デフォルトの名無しさん:05/03/06 10:19:22
>>693の続き

上に追加した要素のほかに、
ArrayList, LinkedList, Vector, Stack, または Queue
を使って新要素を追加しなさい。

例えば、Queueを使ってパックマンの敵のようにステージのどこかで待機していて
ある一定時間たつと一匹ずつステージに出てきてパックマンを追い回すやつを作るとか。

上の例は本当にその通りじゃなくてもいいらしいです。
他の面白そうなものを自分で考えてもいいそうです。

以上です。どなたかお願いします。

695686:05/03/06 11:52:48
>>692-694
しつこい男は嫌われる。
696M.B.:05/03/06 13:01:39
> しつこい男は嫌われる。
粘着で嫌われ者の私なのだが、
以前話題になった(たぶん前スレだ)「戻り値がvoid でないメソッドの
戻り値を受けないのはアリなのだろうか」という件で、
こんなものを見つけた。
 ttp://homepage.mac.com/jane_doe/doskoic.html
宿題どころかJava の話題ですらないのだが、
基本にかかわる部分(Java の“参照”とオブジェクトの
関係を理解するにはいいかもしれない)と思ったので、
貼っとく。スレ違い&スレ汚しスマソ。

697名無し:05/03/06 17:34:55
文字をビットに変換するのって
どういう風にすればいいのか・・・
誰か分かりませんかぁ?
698デフォルトの名無しさん:05/03/06 17:37:05
699古代帝國富士皇朝総帥・伯壬旭:05/03/06 17:50:22
>>694
ここに回答プログラムを貼っておきました。

http://www.wikiroom.com/java/?%A5%BD%A1%BC%A5%B9%C5%BD%C9%D5%A4%B1

数値(金)を全部取ったらゴールに向かってください。
700& ◆R7PNoCmXUc :05/03/07 06:47:43
>>699
いつもスルーせずにきちんと答えていただき本当にありがとうございました。
きちんと動きました。本当にありがとうございます。
701M.B.:05/03/07 08:52:27
>>697
岩谷宏『Java によるテキスト処理入門』
p.34 UnicharValue.java
702デフォルトの名無しさん:05/03/08 02:13:22
ttp://www.xmailserver.org/diff2.pdf
だれかヘルプ頼みます。8ページまでしか理解できません。
703M.B.:05/03/08 08:25:18
>>702
翻訳しろというのならスレ違い
704デフォルトの名無しさん:05/03/08 12:53:15
先月からjavaを習い始めた高校2年生です。
遊びすぎて宿題の意味がわかりません。先輩、教えてください


Class名 mondai1
30から1まで-2ぞつ表示するプログラムを作成しなさい
ただし、4の倍数は表示しないようにする


class名 mondai2
コマンドラインから2つの整数をあたえて、それぞれ最大の約数を求めるプログラムを
作成しなさい。また、割り切ることができなければ"素数です"と表示させること
ただし最大の約数を求める計算はmaxYakusuメソッドを作成し、そこで行うこと
引数、戻り値は自由とする

どうかお願いします
705デフォルトの名無しさん:05/03/08 12:57:46
class 名を考えさせるのも問題のうちに入れろと言いたい
706デフォルトの名無しさん:05/03/08 13:05:20
>>704 の1
class mondai1 {
 public static void main(String[] args){
for(int i = 30 ; i > 0 ; i -= 2){
   if(i%4 != 0) System.out.println(i);
  }
 }
}
707デフォルトの名無しさん:05/03/08 13:08:15
↑ゴメン、インデントが変だけどうまく調整してください
708704:05/03/08 13:12:01
>>706
神!これで春休み登校せずにすみます!
709デフォルトの名無しさん:05/03/08 13:52:19
あら、2.はいらないんだ。せっかく作ったのに...
ついでだから貼っておくか

class mondai2 {
 public static void main(String[] args){
  if(args.length != 2){
   System.out.println("コマンド引数を2つ入力して下さい");
   System.exit(1);
  }
  int num1 = 0;
  int num2 = 0;
  try {
   num1 = Integer.parseInt(args[0]);
   num2 = Integer.parseInt(args[1]);
  }catch(NumberFormatException e){
   System.out.println("コマンド引数は数値を入力して下さい");
   System.exit(1);
  }
  int max = maxYakusu(num1, num2);
  if(max != 0) {
   System.out.println("最大公約数は " + max + " です。");
  } else {

つづく
710つづき:05/03/08 13:53:02
   boolean num1_is_prime = isPrime(num1);
   boolean num2_is_prime = isPrime(num2);
   if(num1_is_prime && num2_is_prime){
    System.out.println(num1 + " と " + num2 + " は共に素数です。");
   }
   else if(num1_is_prime){
    System.out.println(num1 + " は素数です。");
   }
   else if(num2_is_prime){
    System.out.println(num2 + " は素数です。");
   }
   else {
    System.out.println("内部エラー");
    System.exit(1);
   }
  }
 }
 static int maxYakusu(int num1, int num2){
  int max = 0;
  for(int i = 2 ; i <= Math.min(num1, num2) ; i++){
   if(num1%i == 0 && num2%i == 0) max = i;
  }
  return max;
 }
 static boolean isPrime(int x){
  for(int i = 2; i < x ; i++){
   if(x%i == 0) return false;
  }
  return true;
 }
}
711↑訂正:05/03/08 13:59:00
(誤)System.out.println("内部エラー");
(正)System.out.println("最大公約数はありません");
712デフォルトの名無しさん:05/03/08 14:03:26
作ってから思ったんだが、素数判定する必要は別にないんだよね...
if(max != 0) {
 System.out.println("最大公約数は " + max + " です。");
} else {
の後は、"素数です"と表示して終わりで良いかも。
isPrimeメソッドもいらなくなるし、そっちの方がスッキリ
一応、そっちバージョンも作っておくか...

713デフォルトの名無しさん:05/03/08 14:05:55
素数判定しない簡易バージョン スレ汚しスマソ
class mondai2 {
 public static void main(String[] args){
  if(args.length != 2){
   System.out.println("コマンド引数を2つ入力して下さい");
   System.exit(1);
  }
  int num1 = 0;
  int num2 = 0;
  try {
   num1 = Integer.parseInt(args[0]);
   num2 = Integer.parseInt(args[1]);
  }catch(NumberFormatException e){
   System.out.println("コマンド引数は数値を入力して下さい");
   System.exit(1);
  }
  int max = maxYakusu(num1, num2);
  if(max != 0) {
   System.out.println("最大公約数は " + max + " です。");
  } else {
   System.out.println("素数です。");
  }
 }
 static int maxYakusu(int num1, int num2){
  int max = 0;
  for(int i = 2 ; i <= Math.min(num1, num2) ; i++){
   if(num1%i == 0 && num2%i == 0) max = i;
  }
  return max;
 }
}
714デフォルトの名無しさん:05/03/08 14:16:09
>>702
編集距離の代表的なアルゴリズムを紹介してるだけだが・・・
英語もそんなに難しいレベルのものじゃないし。
図表もあるのだから、そこからイメージして理解しる
715M.B.:05/03/08 15:16:42
>>706 氏のようなマメなヒトがうちの職場にいたら、
漏れも会社を辞めずに済んだのだが
716デフォルトの名無しさん:05/03/08 17:00:34
こんなメソッド書く奴は、おれならクビにする。

 static int maxYakusu(int num1, int num2){
  int max = 0;
  for(int i = 2 ; i <= Math.min(num1, num2) ; i++){
   if(num1%i == 0 && num2%i == 0) max = i;
  }
  return max;
 }
717713:05/03/08 17:26:04
だめだ... 漏れには
int min = Math.min(num1, num2);
for(int i = 2 ; i <= min ; i++){
くらいしか思いつかないぽ

  ||
  ||
 ∧||∧
(  ⌒ ヽ <<713
 ∪  ノ
  ∪∪
718デフォルトの名無しさん:05/03/08 18:17:01
>>716
おいおい... いくらなんでも宿題スレでそれは無責任だろ
間違ってるなら訂正してやれよ >>704が混乱するぞ
719M.B.:05/03/08 18:18:42
>>717
つーか「ユークリッド(Euclides)の互除法」でググれ。
720デフォルトの名無しさん:05/03/08 18:41:06
>>718
了解。

アルゴリズムという用語の説明として、「ユークリッドの互除法」が解説されています。
Javaのソース付き。
http://hwb.ecc.u-tokyo.ac.jp/current/CDD1B8ECBDB82FA5A2A5EBA5B4A5EAA5BAA5E0.html

ほとんどの場合において、ユークリッドの互助法を使ったほうが速い。
  maxYakusu(100, 100)
と呼ばれた場合、2から100まで順に調べるのと、いきなり num1 を num2 割ってみるのとでは、速度の差は歴然。

あと、>>716 に引用したメソッドには、バグがある。パラメタ num1 と num2 の両方に、
int 型の最大値である 2147483647 を渡した場合、for ループの中でいったん正しい値 (=2147483647)
をみつけて変数 max に代入するが、ループを抜けるかどうかの条件を調べる前に i++ が行われて
i の値が -2147483648 (マイナスの数!) になってしまい、ループを永遠に抜け出せない。

そのまま i の値はマイナスのまま絶対値を減らし続け、i == 0 となった時に、
「java.lang.ArithmeticException: / by zero」と、例外を吐いて落ちる。
721No.1:05/03/08 18:52:47
改造する元のソースは下記に張りました.最初の行に宿題の元になっているURLも
のせてあります.
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=22207

課題
1. プロジェクトを変更してBlueJ以外で動作するようにしなさい.
2. 部屋に任意のアイテムを設置出来るようにしなさい.例として本や鍵など.アイ
テムには説明と重さの情報を付加しなさい.
3. プロジェクトを変更して現在のplayerの部屋の状態を保持するPlayer classを付
け加えなさい.
4. さらにPlayer classを拡張して,playerがアイテムを持ち運べるようにしなさい
.アイテムを選択するコマンドは"take"と"drop"とする.
5. player情報を付け加えて,playerが持ち運べる最高重量を決められるようにしな
さい.
6. testWeightLimit()を含むTest classを実装して,playerが最高重量までしかアイ
テムを保持出来ないことを確認しなさい.Testコードを実行するにはplayerとアイテ
ム,それを呼び出すcallが必要となる.
722No.2:05/03/08 18:53:52
7. マジッククッキー(majic cookie)アイテムを一つの部屋に設置しなさい.クッキー
を食べる"eat cookie"コマンドを付け加えなさい.クッキーを食べる事によってplayer
が持ち運べる最高重量を増やしなさい.
8. testCookieコードをTestクラスに実装しクッキーを食べる動作によってplayerの持
ち運べる最高重量が変更されることを確認しなさい.
9. playerではないキャラクタ達を加えなさい(Non-Plyaer Characters = NPCs).NPCを
各部屋に配置してplayerが同じ部屋に来たときにアイテムを交換するか否かをplayerに
問いかけなさい.アイテムを交換する時のコマンドは"tarde X"とし,Xはplayerの持っ
ているアイテムから選択出来るようにする.NPCは一つしかアイテムを持たない.
10. processCommandはコマンド処理を行う.このデザインはよく出来ていない.なぜな
らば毎回コマンドの記述をソースコードに追加していかないといけない.簡単にコマン
ドを増やすことができるようにクラスを改造しプログラムに実装しなさい.


イギリスから交換研究者として赴任された先生からの課題です.英語にも一苦労ですが
JAVAには触れた事がなく途方に暮れています.

よろしくお願いします.
723デフォルトの名無しさん:05/03/08 19:10:37
>>719 >>720
勉強になりますた(´・ω・`) <<713
あと、コマンド引数がマイナスの場合も考慮してませんでした
このまま逃げると漏れも無責任とか言われそうなので、
>>704の2の改訂版貼っておきます↓
class mondai2 {
 public static void main(String[] args){
  if(args.length != 2){
   System.out.println("コマンド引数を2つ入力して下さい");
   System.exit(1);
  }
  int num1 = 0;
  int num2 = 0;
  try {
   num1 = Integer.parseInt(args[0]);
   num2 = Integer.parseInt(args[1]);
   if(num1 < 1 || num2 < 1){
    System.out.println("コマンド引数は自然数を入力して下さい");
    System.exit(1);
   }
  }catch(NumberFormatException e){
   System.out.println("コマンド引数は数値を入力して下さい");
   System.exit(1);
  }
  int max = maxYakusu(num1, num2);
  if(max != 1) {
   System.out.println("最大公約数は " + max + " です。");
  } else {
   System.out.println("素数です。");
  }
 }
724つづき:05/03/08 19:11:06
 static int maxYakusu(int num1, int num2){
  int a = Math.max(num1, num2);
  int b = Math.min(num1, num2);
  while( b != 0){
   int c = a%b;
   a = b;
   b = c;
  }
  return a ;
 }
}
725M.B.:05/03/08 20:08:15
>>723
いい人だ……
726M.B.:05/03/08 20:33:35
>>722
> マジッククッキー(majic cookie)
> イギリスから交換研究者として赴任された先生からの課題です.
その先生が使っているコンピュータには、
スペルチェッカがインストールされていないのか。
727デフォルトの名無しさん:05/03/08 20:53:10
>>721 >>722
ゲームって書いてあったので楽しみにしてたのに、
5つの部屋をうろつくことしか出来ないのね・・・。今は。

>>722 の 10番のやつって、どうやればいいんだろう・・・。
宿題出された者ではないけれど、興味あり。
728デフォルトの名無しさん:05/03/08 21:07:54
>>727
> ゲームって書いてあったので楽しみにしてたのに、
> 5つの部屋をうろつくことしか出来ないのね・・・。今は。
それを改造するのがこの宿題の趣旨なんでしょ。
プログラム板でプレイヤサイドに立ってちゃーだめっしょ。
729M.B.:05/03/09 00:04:28
>>727
> >>722 の 10番のやつって、どうやればいいんだろう……。
> 宿題出された者ではないけれど、興味あり。
C だと関数へのポインタを配列かなんかに持てば楽勝なのだが、
Java だと「オブジェクトそのもの(class)」ではなくて
インスタンスを持つのが普通なので、綺麗に(抽象的に)
実装すると、オブジェクト志向に慣れていないプログラマには
訳がわかんないものになると思われ。
前にうpした「囚人のジレンマ」プログラムも、プログラムで総当り戦を
やろうとしたら、「自分自身との対戦」の実装で禿死苦悩んだ。
けっきょくオブジェクトの配列を二つ(自分と相手)持つことにしたが。
730デフォルトの名無しさん:05/03/09 01:55:43
コールバック関数でも実装すればいいんじゃないの?
731モー:05/03/09 02:14:32
>>721
作りました。
ttp://203.141.155.121/~dev105/homework/20050309/HomeWork.zip
10番はインターフェースを定義して、Factoryクラスからインスタンス化
する方法です。
コールバック関数のイメージですね。
732デフォルトの名無しさん:05/03/09 08:04:55
岩石をオブジェクトとし、属性にはその重さを考えます。重さをカプセル化した
Rockクラスを定義し、10個のRockオブジェクトを作成して、それらの合計の重さを
計算するアプリケーションを作成しなさい。
Rockオブジェクトは配列に格納します。また、Rockオブジェクトを作成するときには、
岩石の重さを1〜10キログラムの値から無作為に選びます(Math.Random()を用いること)。



宜しくお願いします。
733デフォルトの名無しさん:05/03/09 09:24:53
class Rock {
  private final double weight;
  public Rock(double weight) {
    this.weight = weight;
  }
  public double getWeight() {
    return weight;
  }
}
public class Main {
  public static void main(String[] args) {
    Rock[] rocks = new Rock[10];
    for (int i=0; i<rocks.length; i++) {
      rocks[i] = new Rock(Math.random()*10);
    }
    double total = 0;
    for (int i=0; i<rocks.length; i++) {
      total += rocks[i].getWeight();
    }
    System.out.println("totalWeight=" + total);
  }
}
734733:05/03/09 09:33:50
>>733 についてメモ。

重さの無い岩石はありえない、っていう考え方をしたので、
Rock クラスのインスタンスを生成する際に、重さを指定させるようにした。
(重さがまだ指定されていない Rock オブジェクトは作れない。)

岩石の重さは変えられない、という設計方針にした。
weight フィールドを final にしたことや、 setWeight(double) メソッドを
作らなかったことで、そのことを表現した。

あ、今気が付いたけど、
「岩石の重さを1〜10キログラムの値から無作為に選びます」
↑この仕様に反するコードを書いちまった。ゴメン。
735デフォルトの名無しさん:05/03/09 10:50:54
>>734
まあ、
public Rock(double weight) {
  this.weight = weight;
}

public Rock() {
  this.weight = Math.random()*10;
}
にして、
 rocks[i] = new Rock(Math.random()*10);

 rocks[i] = new Rock();
にする、ですかね?
736M.B.:05/03/09 10:52:03
>>734
> あ、今気が付いたけど、
> 「岩石の重さを1〜10キログラムの値から無作為に選びます」
> ↑この仕様に反するコードを書いちまった。ゴメン。

  rocks[i] = new Rock(Math.random()*10);

  rocks[i] = new Rock(1.0 + Math.random()*9.0);
737732:05/03/09 13:14:46
>>733-736
オブジェクトを配列に格納するところがどうしても出来なかったのですが、
これで動くようになりました。有難うございます。
738Java初心者:05/03/09 18:32:35
全く分かりません。先輩方助けてください。

配列の中身を合計するプログラムです。?を埋めてください。
また、除算(/)を小数2桁まで出力するプログラムを作成してください。
0での除算の時のエラー処理も忘れないでください。

public class ArrayCount
{
public int total(int[] x)
{
int t= 0;
for(??????)
{
t+=x[i++];
}

return t;
}
public static void main(String args[])
{
ArrayCount ac = new ArrayCount();

int [] x = new int [args.length];
for (???????)
{
x[i] = ??????;
}
System.out.println(ac.total(x));
}
}
問題文そのまま載せました。
よろしくお願いします。
739デフォルトの名無しさん:05/03/09 19:16:41
for(int i = 0; i < x.length; )
{
t+=x[i++];
}

int [] x = new int [args.length];
for (int i = 0; i < x.length; i++)
{
x[i] = i;
}

public static void main(String[] args) {
try {
System.out.println(new java.text.DecimalFormat("0.##").format(
Double.parseDouble(args[0]) / Double.parseDouble(args[1])));
} catch (ArithmeticException ex) {
System.out.println("0で除算をしました");
} catch (Exception ex) {
System.out.println("数値入力が不正です");
}
}
740デフォルトの名無しさん:05/03/09 20:07:18
>>739
動作確認してから載せてあげろって。

3つめの??????は
Integer.parseInt(args[i])
だし、
浮動小数点数の割り算ではArithmeticException投げない。
741デフォルトの名無しさん:05/03/10 05:17:30
FileWriter fw = new FileWriter("record.txt");
String patient[][] = new String[500][2];
if (e.getSource() == btnSave) //セーブボタンがおされたら
{
patient[0][0] = tfID.getText(); //患者Aの番号をとる
patient[0][1] = tfFN.getText(); //患者Aの名前をとる

int intArrLen = (patient[0].length); //配列長さをとって
for(int intLoop = 0; intLoop < intArrLen; ++intLoop) //ループさせて
{
fw.write(patient[0][intLoop]);
fw.write("\r\n"); //TXTにセーブする。
}
}
という、SQLを使わない簡単なデータベースみたいなものを
多次元配列を使ってやってるんですが、
patient[1][0] = tfID.getText(); //患者Bの番号
patient[1][1] = tfFN.getText(); //患者Bの名前

patient[2][0] = tfID.getText(); //患者Cの番号
patient[2][1] = tfFN.getText(); //患者Cの名前
を同じTXTファイルに、上書きしないで(追記で)セーブするのはどうやってやればいいんでしょうか。。?
どうしても患者Bの番号と名前が患者Aの番号と名前に上書きされてしまうのです。
よろしければどなたかご教授ください。
742デフォルトの名無しさん:05/03/10 07:05:21
FileWriter のコンストラクタに、
public FileWriter(String fileName, boolean append)
ってのがあるよ。

public FileWriter(String fileName, boolean append) throws IOException
書き込まれたデータを追加するかどうかを示す boolean とファイル名を指定して、FileWriter オブジェクトを構築します。
パラメータ:
fileName - システムに依存するファイル名の文字列
append - boolean が true の場合、データはファイルの先頭ではなく最後に書き込まれる
743デフォルトの名無しさん:05/03/10 10:35:19
>>738 >>739 >>740
3つめの???は>>740の言うとおり、Integer.parseInt(args[i])
だろうね。ただ、問題文で配列の初期化についての言及がされてない
のが気になるけど、まあ、コマンド引数で与えるんだろうな。


浮動少数の0割は例外じゃないから自分でエラー処理書くしか
ないのかね?おいらにはそれ以外おもいつかんが。

あと>>739への追加指摘として、
"0.##" は "0.00" ではなかろうか?
浮動小数点2桁まで表示するって事は、
1 / 2 の結果を 0.50 って出せ、って事だと思うのだが

もう遅いかも知れないが、貼っとく>>738
744743:05/03/10 10:39:12
>>738 除算のほうだけ
コマンド引数の第1引数を第2引数で割った結果を小数点2桁まで表示します
第2引数が0だと、「0での除算は無効です」というメッセージを吐いて
プログラムを停止します

class Div {
 public static void main(String[] args){
  if(args.length != 2) {
   System.out.println("引数を2つ指定してください");
   System.exit(1);
  }
  try{
   double x = Double.parseDouble(args[0]);
   double y = Double.parseDouble(args[1]);
   if(y == 0.0){
    System.out.println("0での除算は無効です");
    System.exit(1);
   }
   double result = x/y;
   System.out.println(new java.text.DecimalFormat("0.00").format(result));
  }
  catch(NumberFormatException e){
   System.out.println("入力引数が不正です");
   System.exit(1);
  }
 }
}
745デフォルトの名無しさん:05/03/10 18:57:25
>>742
有難う。ちゃんと動いたよー。感謝です。

もう少し教えてほしいことがあるんですが、
TXTファイルに

001
Yamada
Taro
20
Dokaben

002
Iwaki
Masami
21
OtokoIwaki

003
以下略

と配列ごとに書き込まれてるとき、Textfieldに打ち込まれた文字から
その文字を含む配列を検索するプログラムはどうやって作るのでしょうか?
たとえばiwakiとTextfieldに打ち込んで
サーチボタンを押したら、ファイルから配列を探し出して、
002からOtokoIwakiまで表示してくれるようなやつです
もし複数候補(Iwakiを含む配列が2つ以上)が見つかったら、
どっちを開くか聞いてくれるやつだといいです。。
わからないサブプログラム丸投げなのは承知していますが、
もしおひまな方いらっしゃいましたら重ねて宜しくお願いします。
746デフォルトの名無しさん:05/03/10 19:47:51
>>745
何が知りたいんだ?

「ボタンを押したら、なんか動作するようにしたい。」
「ファイルの内容を配列に読み込む方法がわからない」
「ある文字列が、別なある文字列を含んでいるかどうかを確認する方法を知りたい」

宿題丸投げするなら、その宿題の内容を全て書け。
どこまで実装することが求められているのか、だけでなく、
どこまで実装することが求められていないのか、ということも知りたいから。

そのTXTファイルのデータ構造は、私が見るとすごく変な構造だと思う。
なんで1個のデータで1行を使わないの?

001,Yamada,Taro,20,Dokaben
002,Iwaki,Masami,21,OtokoIwaki

↑こういう構造になっていない理由が、「>>745が馬鹿だから」なのか、
「そういう仕様で書くことを求められているから」なのかによって、解答も
違ってくると思うぞ。
747721, 722:05/03/10 22:58:15
>>731 モー様, 宿題に対してコメントをして頂いたみなさま


ありがとうございました.動作確認しました.モー様のUpして頂いた時間を確認
してみると.......夜遅い時間まで本当にありがとうございました。
748モー:05/03/11 23:06:01
>>747
部屋を作成するところとメッセージは適当に
変えて使って頂戴。
749デフォルトの名無しさん:05/03/12 12:57:41
春休みのせいか、宿題がないね
750デフォルトの名無しさん:05/03/12 20:11:24
ピークは過ぎた模様
751 :05/03/13 15:50:14
次の機能を持つPlaceRectangleを、Rectangleの
サブクラスとして宣言してください。
・位置を表すint型のフィールドx,yを持つ
・3つのコンストラクタを持つ
(1)引数なし
(2)位置付き
(3)位置と大きさ付き
・位置を変更するメソッドsetLocationを持つ
・標準的な文字列表現を返すメソッドtoStringを持つ
x=12,y=34,width=123,height=45の時、
[ (12,34) [123,45] ]

class Rectangle{
int width;
int height;
Rectangle()
{setSize(0,0);}
Rectangle(int width,int height)
{setSize(width,height);}
void setSize(int width,int height)
{
this.width = width;
this.height= height;
}
public String toString()
{return"["+ width + "," + height + "]";}
}
どなたかご教授ください。
752デフォルトの名無しさん:05/03/13 16:33:29
>>751
class PlaceRectangle extends Rectangle {
int x;
int y;
PlaceRectangle() {
setPoint(0, 0);
setSize(0, 0);
}
PlaceRectangle( int x, int y ) {
setPoint(x, y);
setSize(0, 0);
}
PlaceRectangle( int x, int y, int width, int height ) {
setPoint(x, y);
setSize( width, height );
}
void setPoint( int x, int y ) {
this.x = x;
this.y = y;
}
public void setLocation( int new_x, int new_y ) {
setPoint( new_x, new_y );
}
public String toString() {
return "[ (" + x + "," + y + ") [" + width + "," + height + "] ]";
}
}

位置だけを定義したコンストラクタを作る意味があるのかどうかイマイチよく分からんが、
問題の通りに実装するとこんな感じだと思う。
753デフォルトの名無しさん:05/03/13 20:18:36
すみません。宿題が出ているのですがよくわかりません。
すみませんがどなたか教えてく頂けないでしょうか。
クラスTestThreadはThreadをextendsし、
コンストラクタの引数より取得したインスタンスを実行するメソッドを持つ。
クラスTestAdditionはインスタンス変数、AとBを持ち、AからBを積算し結果を表示するメソッドを持つ。
クラスTestDivideはインスタンス変数、AとBを持ち、AからBを除算し結果表示をするメソッドを持つ。
上記クラスはコンストラクタより値を取得する、そのときの引数は(short A,short B)とする。
メインクラスはTestThreadをインスタンス化しそのときの引数はTestAddition、もしくはTestDivideとす。
各スレッドは異なる引数を持ち、起動、終了後はその旨を運用者に通知する。(メインクラスにてスレッド単位で通知すること)
TestThreadは下記に示すものを????を修正し用いること????以外は修正を行なってはいけない。
上記の条件全てを満たすプログラムを作成せよ。
ここで????はワイルドカードの*と同様の扱いとする。

import ????
public class TestThread extends Thread {
???? execute;
????(????){
execute = ????;
}
????(){
sleep(5000);
execute.????;
}
}
754デフォルトの名無しさん:05/03/13 20:39:55
>>753
クラスTestAdditionとクラスTestDivideは同じスーパークラスを継承していないといけない気がしますが、
それについて問題文で言及されていませんか?
755デフォルトの名無しさん:05/03/13 21:47:19
>>753
あきらかに情報が不足している。
ちゃんと宿題全部晒せ。
756753:05/03/13 22:35:58
確認したのですが、
問題文には先ほどの記述以外載っていませんでした。

757デフォルトの名無しさん:05/03/13 22:59:44
変数名に動詞使うような初心者が作った宿題はやりたくない。
758デフォルトの名無しさん:05/03/13 23:37:11
スレッドは苦手でよくわかりません。
よろしくお願いします。

スレッドを二つ作成し、お互い同期を取りながら共通の資源
(この場合同じ変数)を10づつ加算するプログラムを作成せよ。
終了判定は任意とする。
759デフォルトの名無しさん:05/03/13 23:50:08
>>758
class Data{
private int num = 0;
Object o = new Object();
public void add(int n){
syncronized(o){
num += n;
}}}

class TestThread extends Thread{
private Data data;
void setData(Data data){ this.data = data;}
void run(){
for(int i=0;i<10;i++){
data.add(10);
}}}

class Test{
public static void main(String[] arg){
TestThread t1 = new TestThread();
TestThread t2 = new TestThread();
Data data = new Data();
t1.setData(data);
t2.setData(data);
t1.start();
t2.start();
t1.join();
t2.join();
}}
760デフォルトの名無しさん:05/03/13 23:51:41
JavaBeanの一部のPropertyをキーとして、ソートする方法ってないでしょうか?
例えば、

JavaBean Property-A Property-B Property-C
-----------------------------------------
Bean1 1 1 1
Bean2 1 3 1
Bean3 1 2 1

というListがあるとき、(Property-A, Property-B)をキーとしてソートすると、

Bean1
Bean3
Bean2

の順にソートしたリストが欲しいのです。
Collectionフレームワークについて調べてみたのですが、こういうことが出来るのかわかりませんでした。
761デフォルトの名無しさん:05/03/13 23:54:49
>>760
Comparator
762Java天才プログラマ:05/03/14 00:24:36
compareableインターフェースをimplementsして
compareToメソッドを実装しましょう。
あとはそれをArrays.sort()やSortedSetにaddすればソートされます。
763デフォルトの名無しさん:05/03/14 02:58:33
こんばんは!!
質問です。よろしくお願いします。
ある数値までの平方根までカウントさせたいときはどうしたらいいのでしょうか。
今、maxという数値があったとき、
√maxまでカウントしたいので
for(int i=2; i<sqrt(max); i++)
としたのですが、シンボルを解決できません、
とエラーが出てしまいました。
よろしくお願いします。
764デフォルトの名無しさん:05/03/14 03:21:10
sqrtは携帯にはない
765デフォルトの名無しさん:05/03/14 04:16:55
>>763

携帯Javaでなく、J2SEなら……
sqrtはjava.lang.Mathのstaticメソッドのはず。
あとは考えれ。

あと、どうでもいいけど、
for (int i = 2, n = (int)sqrt(max) + 1; i < n; i++) { ... }
のほうがこころもち速くなるかもね。
766デフォルトの名無しさん:05/03/14 04:22:38
それくらいコンパイル時に最適化されてるんじゃないか?
767デフォルトの名無しさん:05/03/14 06:56:55
逆に>>763の方がやってることがわかりやすいから>>765より最適化されるかもしれない
768デフォルトの名無しさん:05/03/14 08:13:13
>>766
>>767

コンパイル時の最適化って、可能なんでしょうか。
逆に、コンパイル時には、最適化してはいけないような気がする。

(私の「最適化」という言葉から想像する「最適化」の定義が、
みんなの定義と違ってるかもしれないという可能性もあるけど…)

Math#sqrt(double) が、同じ値を引数として渡している限り同じ値を返す、
かどうかは、実行時までわからないんじゃないか、と思う。

(実行時になら、最適化してもよいかどうか、は、私はよくわからない。
「実行時の最適化」って言葉にも、いろいろ定義が考えられそうで。)
769デフォルトの名無しさん:05/03/14 08:46:42
実行時まで分からないならそれで(・∀・)イイ!!し
コンパイラが max が for の中では変更されないことが分かれば
最初の一回計算するだけで(・∀・)イイ!!わけで
maxの値がコンパイル時に分かればさらに定数で置き換えても(・∀・)イイ!!ってはなしで

じっさいどうしているかは知りません
まあ予想で言ってもしょうがない気がするけど
770768:05/03/14 09:43:14
>>769
> コンパイラが max が for の中では変更されないことが分かれば
> 最初の一回計算するだけで(・∀・)イイ!!わけで

計算って、Math.sqrt(max) の呼び出しのことを指してるんだろうか。
771M.B.:05/03/14 15:11:21
>>768
「計算によるループ」と「値によるループ」っつー言葉があって
(共立出版から出ている『やさしいコンパイラのつくりかた』という
本に出てくる)、Java は「計算によるループ」(その都度計算する)
なのだが、「ループの中で、引数の書き換えが行なわれて
いないので、たぶんコンパイル時に『値によるループ』(最初に
計算された値がずっと使われる)を使うようにしてくれるだろう」
と勝手に思っちゃうわけだ(・∀・)。
「最適化」は英語でオプチマイズで、「楽観主義者」は
オプチミストだったりするのである。「ペシミストはC を使って
全部自分でやればいい」と漏れは思う。
ついでながら、平方根の計算というのは、数値演算パッケージが
標準的なCORDIC という手法を使っているならば、
たかだか掛け算一回分程度の手間しかかからない。
詳しくは一松信先生の『初等関数の数値計算』を嫁。
772768:05/03/14 15:39:48
>>771
何を言いたいのか、よくわからない。
多分わたしの疑問の書き方がまずかったのだろうと思うので、改めて書いてみる。

ループ内の、Math.sqrt(double) の呼び出しが、もしコンパイラによって
一回だけの呼び出し(2回目以降は一回目の呼び出しの際の戻り値を使う)に、
置き換えられるとしたら、

あとから Math クラス内の sqrt(double)の実装が変更された場合に、
再コンパイルが必要になってしまわないか?

sqrt(double) 内部で、値を返すための動作以外の動作(副作用)が
行われていた場合、それが一度しか実行されないことにならないか?
(例えば、呼ばれた回数をカウントするような実装。)

今回は、Math クラスのスタティックメソッド sqrt が題材になっているが、
コンパイラから見れば、単なる「或るクラスの或るスタティックメソッド」なので、
人間から見れば、「副作用が起るようなことはやってないに違いない」と、
あたりまえに思えることも、コンパイラにとってはそうではないのではないか?
773デフォルトの名無しさん:05/03/14 15:46:39
JITを知っているかな?
774763:05/03/14 15:52:54
みなさん、レスありがとうございます。

プログラムの先頭に
import java.lang.Math.*;
を追加したのですが、まだsqrtでエラーがでてしまいます。
なんでなのかよくわかりません。。。
申し訳ありませんが、
教えてください(>_<)
775デフォルトの名無しさん:05/03/14 15:58:28
そうじゃなくて、sqrtをMath.sqrtと書こうね、ということ。
それから、java.lang以下はimportしなくても使える。
776デフォルトの名無しさん:05/03/14 15:58:50
Mathなんぞimportする必要ないし、importの書式も間違ってる
777デフォルトの名無しさん:05/03/14 16:05:00
参考までに、J2SE1.5(5.0)なら、
import static java.lang.Math.sqrt;

という記法(static import)を使えば、
そのファイルの中では単にsqrtと書けるようになった。
778763:05/03/14 18:39:00
できましたっ!! 
ありがとうございました!!!
779デフォルトの名無しさん:05/03/14 20:09:57
>>772
> あとから Math クラス内の sqrt(double)の実装が変更された場合に、
> 再コンパイルが必要になってしまわないか?
意味が分からない

> sqrt(double) 内部で、値を返すための動作以外の動作(副作用)が
> 行われていた場合、それが一度しか実行されないことにならないか?
> (例えば、呼ばれた回数をカウントするような実装。)
たとえそうだとして何が問題なの?

何を言いたいのか、よくわからない。
問題だと思うことを具体的に書いて下さい
780モー:05/03/14 21:03:02
つまり772は、sqrt(double)がもしコンパイラによってsqrtの実行が
1度しか行われないような形で最適化されてしまった場合、仮にsqrt(double)
が毎回異なる値を返したりsqrt内でカウントを行うような実装があった
場合困るじゃないか!と言いたいわけだ。
そんな最適化は行われないから、現実問題には何も問題はないわけだけど。
781M.B.:05/03/14 21:15:47
>>772
呼ばれる側のオブジェクトが変更されたら、呼ぶ側の
「再コンパイルが必要」なのは当然。
「最適化が可能かどうか」は、実行時に「定義域と値域の
一意対応が成立しているかどうか」の情報が、呼ばれる側
から呼ぶ側に伝わるかとか、呼ばれる側で「定義域と
値域の一意対応が成立している場合」に、一度使われた
入力値に対して同じ出力値を使い回すような実装が
されているか等、処理系の実装に深く関わっているので、
開発者が気にしてもあんまり意味がない。
まあ、コードがstatic かどうかはコンパイラが
文脈(コンテキスト)をチェックしているので、
内部状態を持たないオブジェクトかどうか
(つまりは「定義域と値域の一意対応が成立して
いるかどうか」)くらいは(1.4 でも)
コンパイラが見てそうに思う。
782デフォルトの名無しさん:05/03/14 21:34:53
sqrt(max) とかの結果が毎回違ったら一回しか呼び出さないような最適化はそもそもしないし
カウントしようがしまいがプログラマにはどうでもいい
783デフォルトの名無しさん:05/03/14 22:00:20
>>773
JITは、「Javaのバイトコード」から「プラットフォームのネイティブコード」へのコンパイルを
するものだと認識しております。私が今「コンパイル」と呼んでおるものは、「Javaのソースコード」
から「Javaのバイトコード」へのコンパイルのことです。単に「コンパイル」という言葉を用いた
ことで、誤解を招いたのだとしたら大変申し訳ありません。ご容赦ください。

>>780
> (略)困るじゃないか!と言いたいわけだ。
はい。大体そういうことです。

> そんな最適化は行われないから、現実問題には何も問題はないわけだけど。
うーむ。あっさり「そんな最適化は行われない」って答えを言われちゃうと、アレなんですが。^^;

>>766 さんは、「それくらいコンパイル時に最適化されてるんじゃないか?」とご発言ですので、
ここで >>780 さんと意見(予想?)が対立したわけですね。さて、どっちが正解なのか、がんがん
議論してくださいな。w (>>779 さん。ごめんなさい。あなたに説明する能力が、私にはありません。)

>>781
> 呼ばれる側のオブジェクトが変更されたら、呼ぶ側の
> 「再コンパイルが必要」なのは当然。

「オブジェクトの変更」という用語を持ち出されると、これまた非常に解答が難儀ですが、
なんだかずいぶん不便な Java をお使いのようですね。私が使っている Java は、
「Write Once, Run Anywhere」でありまして、呼ばれる側の API の実装の内部は幾度となく
変更されておりますが、私の書いたプログラムは、大体のところ再コンパイル無しで動いております。
784デフォルトの名無しさん:05/03/14 22:05:08
学校の課題で書いたJavaのプログラムは1.5でコンパイルしたら1.4では走らなかったYO
785デフォルトの名無しさん:05/03/14 22:29:08
>>784
1.5で初登場のAPI使ったら1.4では動かんわな。
786デフォルトの名無しさん:05/03/14 22:30:13
>>785
ちゃんと1.4でもコンパイル通るYO
学校のコンパイラは1.4だからNE
787デフォルトの名無しさん:05/03/14 22:31:01
>>784
1.5でコンパイルしたら1.4では動かんよ
788デフォルトの名無しさん:05/03/14 22:31:37
「Write Once, Run Anywhere」テラワロス
789M.B.:05/03/14 22:36:42
>>783
>「オブジェクトの変更」という用語を持ち出されると、
> これまた非常に解答が難儀ですが、
戻り値をvoid にしてたのが、ステータスを返したくなって
int に変更したりとかした場合、呼び側の記述自体は
(値を変数で受けたりしていないので)そのまんまでも
ちゃんと動くが、再コンパイルしないと実行時エラーで落ちる。
これに対して、C 言語だと、int とvoid は「レジスタに
残っている値を利用するかしないか」だから、再コンパイルの
必要はない(だからmain() はint だったり void だったりする。
つーかvoid という宣言自体、コンパイラが「呼ばれる側が
値を返しているかどうか」をチェックする以上の意味を持たない)。

 ……このあたりの議論は以前にもやったので、過去ログを参照して
いただけるとよろしいかと。
790デフォルトの名無しさん:05/03/14 22:39:00
Write Once, Debug Anywhere!!!
791デフォルトの名無しさん:05/03/14 22:47:32
×Write Once, Debug Anywhere!!!
○Write Once, Debug Everywhere.
792デフォルトの名無しさん:05/03/14 22:51:38
もはやMIDPが出た時点でWORAもWODAもWODEも崩れたのになぁ
793デフォルトの名無しさん:05/03/14 22:51:51
>789 それはオブジェクトの変更とは呼ばないんじゃないの?
794デフォルトの名無しさん:05/03/14 22:58:11
PureJava幻想とクロスプラットフォームAPIとの協調
795785:05/03/14 22:58:28
>>786
コンパイラの話はしてないよ。
796デフォルトの名無しさん:05/03/14 23:00:27
>>795
1.5で初登場のAPIはつかってないYO
797デフォルトの名無しさん:05/03/14 23:21:38
ちゃんと-targetオプションつけたか?
798デフォルトの名無しさん:05/03/14 23:41:14
まあ -source 1.4 つければいいんだけどそれで動いても「Write Once, Run Anywhere」じゃないような気がするYO
ちがうか
799760:05/03/14 23:41:18
>>761
>>762
できました! ありがとうございます!
800デフォルトの名無しさん:05/03/15 00:47:41
-source 1.4は genericsやstatic importやenhanced for loopなどが
文法エラーになるという意味だから、出来るバイトコードは1.5でないと
動かなかったりしない?
801デフォルトの名無しさん:05/03/15 00:53:00
あの、簡単なゲームを作って欲しいんですがすぐは無理ですか??芋虫ゲームなんですが。
802デフォルトの名無しさん:05/03/15 03:35:32
宿題ならやってやらんこともない
803デフォルトの名無しさん:05/03/15 05:20:23
諸兄方助けてくだされ

キーボードから任意の回数数値を入力し
メジアン(中央の値、偶数なら中二つの平均)
モード(もっとも出現頻度の高い数) を求める
その際、それぞれ引数としてデータの配列を受け取り
値を返すメソッドを作成せよ。

実行例は
10
20
30
40
10
モード10 メジアン20

よろしくお願いします
804デフォルトの名無しさん:05/03/15 06:33:15
簡単すぎてツマラン
芋虫ゲームの方が面白そうだな
805M.B.:05/03/15 11:33:50
>>793
確かに実装の変更ではないな。
正確には仕様の改変だ。
806M.B.:05/03/15 11:38:01
>>803
すべての値が一回づつしか出てこなかったら、
モードとして何を返すか示すこと。
807803:05/03/15 14:26:28
>>806
ありがとうございます。
その点については特に明記がなかったのですが
値を返すとはあるので、「0」を返すということで
808デフォルトの名無しさん:05/03/15 15:13:28
>>807
まあ、宿題の内容がそういう要求なら止めはせんが...

こういう場合は、最初に入力された値を返す、とかの方が自然じゃないか?
例えば、入力データが1つしかなかった場合を考えてみると...?
(任意回数とあるから1回もアリだよね?)

さらにもう少し言うと、10,10,20,20 って入力の時は
メジアンとして何を返すの?
メソッドの返却値は1つしかないから、2つは返せないよ。

809803:05/03/15 15:56:51
>>807
言われてみれば最初の値を返すというのがしっくりきますね。

10,10,20,20のときはまんなかの2つ10,20の平均値の15を返します。
メジアンは小さい順に並べた時の配列の真ん中の値
配列が偶数この場合は、真ん中2つの平均値ということです
(10,20,30,40,50では30を、10,20,30,40では25を返す)
810デフォルトの名無しさん:05/03/15 16:52:18
いや、1つしかないことと2つ以上あることを区別すべきだ
値は1つしか返してはいけないとは書いてないから
全部のモード値を返せばよい
811808:05/03/15 17:26:23
>>809
ゴメン、>>810は気づいてるけど、モードの間違いだ
メジアンは了解。一瞬平均値との違いが分からなかったorz

>>810
「値を返すメソッドを作れ」と言ってるのだから
1つだけ返すと解釈するのが自然だと思う
もちろん配列を返せば出来ないこともないが
まあ、宿題の仕様による
812デフォルトの名無しさん:05/03/15 17:50:21
入力が、1 2 だったらメジアンは1.5 を返すのね...>>809
浮動小数マンドクセ('A`)
宿題に書いてないけど、入力配列のソートが必要なのね...>>809
ソートマンドクセ('A`)

まあ、やるけど...
813デフォルトの名無しさん:05/03/15 18:06:09
>>809
メジアンだけ
モードはもうちっと仕様がハッキリしたらカく
double median(double[] ary){
 java.util.Arrays.sort(ary);
 if(ary.length %2 != 0){ // 奇数のとき
  return ary[(ary.length-1)/2] ;
 }else{ // 偶数のとき
  int n = (ary.length - 1)/2;
  int m = n + 1;
  return (ary[n] + ary[m])/2.0;
 }
}
814デフォルトの名無しさん:05/03/15 18:07:36
↑アンカーミス失礼 >>803 です
人は合ってると思うけど...
815デフォルトの名無しさん:05/03/15 20:03:56
>>803のモード
最頻値を昇順に格納した配列を返す

import java.util.*;
double[] mode(double[] ary){
 HashMap map = new HashMap();
 for(int i = 0 ; i < ary.length ; i++){
  Object key = new Double(ary[i]);
  if(!map.containsKey(key)){
   map.put(key, new Integer(1));
  }
  else{
   int value = ((Integer)map.get(key)).intValue();
   map.put(key, new Integer(++value));
  }
 }
 int maxCount = 0;
 ArrayList list = new ArrayList();
 Iterator ite = map.keySet().iterator();
 while(ite.hasNext()){
  Object key = ite.next();
  int count = ((Integer)map.get(key)).intValue();
  if(count > maxCount) {
   maxCount = count;
   list.clear();
   list.add((Double)key);
  }
  else if(count == maxCount){
   list.add((Double)key);
  }
 }
816つづき:05/03/15 20:04:31
 double[] result = new double[list.size()];
 ite = list.iterator();
 int i = 0;
 while(ite.hasNext()){
  result[i++] = ((Double)ite.next()).doubleValue();
 }
 Arrays.sort(result);
 return result ;
}
817デフォルトの名無しさん:05/03/15 20:06:28
自分で言うのもなんだが、汚いコードだな...orz
genericsが使えればもうちっと見た目は綺麗になりそうだけど
818デフォルトの名無しさん:05/03/15 20:16:13
口だけの香具師と結果を出す香具師との違いこそ重要
819803:05/03/15 20:51:00
>>811
値を2つ以上返せるならその方法を是非教えていただきたい
ということで2つ以上あったときは全部の値を返す方法で


820803:05/03/15 21:01:21
間違って送信しちゃったorz
>>813 >>815 アリガトー

にらめっこしてきます
821デフォルトの名無しさん:05/03/16 17:58:43
>>691
4ってのは何?辺の長さ?
正方形分の渦巻きを作ればいいの?

【初心者】Java の宿題ここで答えます 5.0【歓迎】
http://pc5.2ch.net/test/read.cgi/tech/1107350368/
ここのひとらがそういうの好きだよ
822821:05/03/16 17:59:17
・・・ごめん。このことには触れんどいて。
823691さんありがとう。:05/03/16 18:05:02
ユーザーからインプットされた数字の4角形を作りたいんですがどうやるのでしょうか?
たとえば
4を受け取った場合。
1 2 3 4
1213145
1116156
10 9 8 7
と渦巻状の左回りで順番に数字を並べたいんです。
どなたかご教授くださ
ちなみに
3の場合。
1 2 3
8 9 4
7 6 5
となります
4や3というのは辺の長さです。
824デフォルトの名無しさん:05/03/16 18:08:59
>>823
自己レスですがただしくは821さんありがとう。です。
とちくるってました。すいません。
825デフォルトの名無しさん:05/03/16 18:12:10
ふつうそれを→周りという。
時計の12からどっちに回るかが基準な。

まずどれだけ配列を確保すればよいか考える。何次元かとかね。
次に辺を描いていく上での距離がどんどん短くなることに着目する。4→3→3→3→2→2→1だな。
最後に数字の最大値を求めて、0なり半角スペースで体裁を整えることを考えろ。

全部は教えんぞ。やってみれ。
826デフォルトの名無しさん:05/03/16 18:13:58
俺には右回りにしか見えないけど、左回りなのか?
例が間違ってんのか?
827デフォルトの名無しさん:05/03/16 18:21:50
>>826
すいません右回り(時計回り)ですね。
もう6時間ほどこれにつきっきりでそれでもわからないので(3と4と5のときしかうまくできない)
おかしくなってました。
すいません。
>>825
すこし休憩してからまたがんばってみます。
ですが、もう少しヒントをいただけたらありがたいです。。。。
8281/2:05/03/16 18:25:01
質問スレの>>691
BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
int size = 0;
try {
size = Integer.parseInt( reader.readLine() );
} catch (NumberFormatException e) {
System.err.println( "整数を入力してください。" );
return;
}
int[][] sq = new int[size][];
for ( int i = 0; i < size; i++ ) {
sq[i] = new int[size];
}
int p = 0, q = 0;
int way = 0; // 0右, 1下, 2左, 3上
for ( int i = 1; i <= size*size; i++ ) {
sq[p][q] = i;

switch ( way ) {
case 0:
q++;
if ( q >= size || sq[p][q] != 0 ) {
q--;
p++;
way = 1;
}
break;
case 1:
p++;
if ( p >= size || sq[p][q] != 0 ) {
p--;
8292/3:05/03/16 18:26:04
q--;
way = 2;
}
break;
case 2:
q--;
if ( q < 0 || sq[p][q] != 0 ) {
q++;
p--;
way = 3;
}
break;
case 3:
p--;
if ( p < 0 || sq[p][q] != 0 ) {
p++;
q++;
way = 0;
}
break;
}
}
int len = Integer.toString( size*size ).length();
StringBuffer buf = new StringBuffer(len+1).append( " " );
for ( int i = 0; i < len; i++ ) {
buf.append( "0" );
}
DecimalFormat format = new DecimalFormat();
format.applyPattern( buf.toString() );
for ( int i = 0; i < size; i++ ) {
for ( int j = 0; j < size; j++ ) {
8303/3:05/03/16 18:27:15
System.out.print( format.format( sq[i][j] ) );
}
System.out.println();
}

2回じゃおさまらんかった
831825:05/03/16 18:28:05
>>827
ごめん、すこし間違えてた。
だからヒントを多めに出してやる。

辺5なら
5→4→4→3→3→2→2→1→1でend
辺4なら
4→3→3→2→2→1→1でend
辺3なら
3→2→2→1→1でend

更にヒント(ほとんど答えだな)
渦巻きのベクトル方向には規則性がある。
→↓←↑→・・・
832デフォルトの名無しさん:05/03/16 18:34:25
ああ、入力の正負チェックするの忘れた
すまんが、それは自分で入れてくれ
833デフォルトの名無しさん:05/03/16 18:36:57
提出はjar化しとけよ。
834デフォルトの名無しさん:05/03/16 18:48:43
>>830
ありがとうございます。しかし習ってないことが含まれているので参考までに受け取っておきます。
>>831
わかったような気がしないでもないですが提出までの残り3時間がんばってみます。
835デフォルトの名無しさん:05/03/16 18:50:48
なんでそんなぎりぎりまで引っ張っておいたんだ。
そしてお前らすぐ答えだしすぎ。
836デフォルトの名無しさん:05/03/16 18:50:57
なんで学生っちゃ習ったことにこだわるんだろうな
習ったことだけでできる事なんてほんの少しだ
837デフォルトの名無しさん:05/03/16 18:51:54
>>835
ここは質問者を育てるためのスレじゃない
回答者が頭の体操をして自己満足するためのスレだ
838デフォルトの名無しさん:05/03/16 19:00:59
>>837
そうだったのか。よしおじさん答え作っちゃうぞ!
UPLOADER用意してYO!
839デフォルトの名無しさん:05/03/16 19:04:08
840デフォルトの名無しさん:05/03/16 20:41:18
できたお!(おそすぎ?)

http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=22444

ぐるぐる。
841デフォルトの名無しさん:05/03/16 20:57:11
842M.B.:05/03/16 21:15:13
>>836
『人は最初に習った方法に執着する性質がある。それでたとえば
“教育上の都合”でEuler 法だけを示すにとどめると、卒業論文に
までEuler 法による解を用いたりする例が出てくるおそれがある。』
森口繁一『数値計算工学』(岩波書店)p.208
843M.B.:05/03/16 21:17:30
>>837
いや、将来顧客になりそうな香具師に、開発側が
「どういうふうに発注したら、自分が思っているような
システムが上がってくるか」を教えるスレだ。
844デフォルトの名無しさん:05/03/17 00:58:56
>>823 こんなやり方もあるかも
public class Q5_823 {
public static int
Triangle( int pX, int pY, int p_1 ) {
if ( pX >= pY && pX + pY < p_1 ) return 0;
if ( pX > pY && pX + pY >= p_1 ) return 1;
if ( pX <= pY && pX + pY > p_1 ) return 2;
if ( pX < pY && pX + pY <= p_1 ) return 3;
return 0;
}
public static int
V_4( int pX, int pY, int p_1, int pTriangle ) {
int v = 0;
for ( int i = 0; i < pY; i++ ) {
v += p_1;
p_1 -= 2;
}
return v * 4 + pX - pY + p_1 * pTriangle;
}
845デフォルトの名無しさん:05/03/17 00:59:28
public static int
V( int pX, int pY, int p_1 ) {
switch ( Triangle( pX, pY, p_1 ) ) {
case 0: return V_4( pX, pY, p_1, 0 );
case 1: return V_4( pY, p_1 - pX, p_1, 1 );
case 2: return V_4( p_1 - pX, p_1 - pY, p_1, 2 );
case 3: return V_4( p_1 - pY, pX, p_1, 3 );
default: throw new RuntimeException();
}
}
public static void
Body( int p ) {
for ( int y = 0; y < p; y++ ) {
for ( int x = 0; x < p; x++ ) System.out.print( " " + ( V( x, y, p - 1 ) + 1 ) );
System.out.println();
}
}
public static void
main( String[] p ) { Body( Integer.parseInt( p[ 0 ] ) ); }
}
846840:05/03/17 01:29:26
>>844,845
面白いです。

何をやっているのか掴むために、main method を変更して、
Triangle だけを呼んでみた。

  public static void main(String[] p) {
    int test = 7;
    for (int y = 0; y < test; y++) {
      for (int x = 0; x < test; x++)
        System.out.print(" " + Triangle(x, y, test-1));
      System.out.println();
    }
  }

0 0 0 0 0 0 1
3 0 0 0 0 1 1
3 3 0 0 1 1 1
3 3 3 0 1 1 1
3 3 3 2 2 1 1
3 3 2 2 2 2 1
3 2 2 2 2 2 2

でも、全体としてどうやってるのかは、まだわからん。
847844:05/03/17 14:11:21
>>846
Triangle が 0 を返す領域の計算ができれば他の領域は座標変換して調整すればなんとかなりそうってのが発想だよ。
メソッド V で1の領域は左に90度、2は180度、3は270度回してる。
848デフォルトの名無しさん:05/03/17 14:52:09
宿題ではないのですが、誰かダンプエディターを作ってくれないでしょうか?
ダンブエディタとはバイナリファイルをバイトごとに16進数で表示し
さらにその編集もできるというものです。
セーブデータなどバイナリファイルを一部修正するツールが欲しいのですが、
ネット上を見てもなかなかその様なツールがないんです。
(ただ表示するだけのダンプリストツールはあったのですが)
C宿題スレで頼もうと思いましたが、あそこは規模が小さい宿題しか扱って
ないみたいだったので、長文プログラムも扱ってるここJavaスレの方が
適当かと思って、ここに書き込みました。
自分はJavaのコンパイルと実行はできます。誰かお願いします。
849デフォルトの名無しさん:05/03/17 14:59:08
>>848
foxbinでぐぐれハゲ
850デフォルトの名無しさん:05/03/17 15:02:11
バイナリエディタの事だろ?
いくらでもあると思うけど
851age:05/03/17 15:11:05
javaのjsp/サーブレットの参考書を読んでいます。
Apacheの設定でNetwork DomainとServer Nameにlocal hostと入力し
Apacheの動作確認をしたところ、ブラウザを開き
http://www.localhost/ または、
http://(コンピュータ名、ipアドレス)と入力するとあります。
すると、ドットゲートサービスと出てユーザ名とパスワードがでました。
設定した覚えがないので、進めることができません。
OS:xp Apache:1.3.24 メーカー:NECです。
わかるかたお願いします。
852デフォルトの名無しさん:05/03/17 15:14:26
>>851
http://localhost/
でアクセスしろ。
それとスレ違いだ。Apacheスレにでも行け。
853デフォルトの名無しさん:05/03/19 05:13:25
こんなアプレットをお願いします。

クリック位置に描画されたボール(円)が動き回るアプレット。
ボールのサイズ、色、動き回るスピード、動き出す方向は、ランダムな値にし、
ウインドウの上下左右の境界線に達した場合は、ボールが跳ね返るようにする。
854デフォルトの名無しさん:05/03/19 12:09:36
どなたかお願いします。
whileを使わずに20人分の成績を降順に並べ替えるプログラムの作成。
成績データは学籍番号1番から20番までとし、以下の通り。
[85,40,89,72,84,53,23,68,78,94,16,54,81,68,30,70,48,65,80,87]
あと、このプログラムのフローチャートもお願いします。
855デフォルトの名無しさん:05/03/19 12:55:20
>>854
while を使わずにって、どういう意図なんだろう。
(for ならいいのかな?)

ソートのアルゴリズムをJavaで書かせることを目的とした
宿題なのかな?そうじゃなくて、とりあえずソートして表示
すればいいってことなら、成績と学籍番号をフィールドと
して持ち、インタフェース Comparableを実装したクラスを
作り、このクラスのインスタンスを20個生成して List に突
っ込んで Collections.sort(List) に入れてやるんだけど。

でもそうすると、ソートのアルゴリズムはソース上に表わ
されてこないけど。
856デフォルトの名無しさん:05/03/19 13:34:34
857デフォルトの名無しさん:05/03/19 13:40:42
そのサイトいいな。
858デフォルトの名無しさん:05/03/19 14:17:18
>>856
ありがとうございます!
見てみます
859デフォルトの名無しさん:05/03/19 14:22:12
「 ServletContext app = getServlet().getServletContext(); 」
これは、オブジェクトの生成してるんですよね?

「?」.getServlet().getServletContext(); これって、どこのクラスのメソッド?
頭になにもつけなくていいの?
860デフォルトの名無しさん:05/03/19 14:25:33
>>859
死ね。
そのクラスか、継承元クラスかだろ
861デフォルトの名無しさん:05/03/19 16:01:32
>>859
マルチ
862M.B.:05/03/19 21:37:37
>>853
問題をポストしたらageれ。
863853:05/03/20 02:56:28
>>862
正直スマンカッタorz
ってことでよろしくお願いしたい


次のようなアプレット

クリック位置に描画されたボール(円)が動き回るアプレット。
ボールのサイズ、色、動き回るスピード、動き出す方向は、ランダムな値にし、
ウインドウの上下左右の境界線に達した場合は、ボールが跳ね返るようにする。
864デフォルトの名無しさん:05/03/20 10:14:57
sageでの出題は、やる気がないか釣りと思われかねないしね。
865>>863 その1:05/03/20 14:43:59
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.List;
import javax.swing.Timer;
public class HW90 extends JApplet implements ActionListener {
Graphics2D g;
Timer tim = new Timer(25, this);
Rectangle top, left, bottom, right;
int screenW, screenH;
List ballList = new ArrayList();
public void init() {
final JLabel screen = new JLabel();
screen.setOpaque(true);
screen.setBackground(Color.white);
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
g = (Graphics2D) screen.getGraphics();
screenW = screen.getWidth();
screenH = screen.getHeight();
top = new Rectangle(0, 0, screenW, 1);
left = new Rectangle(0, 0, 1, screenH);
bottom = new Rectangle(0, screenH, screenW, 1);
right = new Rectangle(screenW, 0, 1, screenH);
}
});
screen.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
ballList.add(new Ball(e.getX(), e.getY()));
}
});
866>>863 その2:05/03/20 14:44:34
getContentPane().add(screen);
tim.start();
}
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < ballList.size(); i++) {
((Ball) ballList.get(i)).action();
}
}
class Ball {
double crtX, crtY, prevX, prevY, degree;
int width, height, speed;
Color col;
Ball(int x, int y) {
width = height = (int) (Math.random() * 24 + 16);
degree = Math.random() * 360;
speed = (int) (Math.random() * 25 + 5);
switch ((int) (Math.random() * 6)) {
case 0:
col = Color.blue; break;
case 1:
col = Color.red; break;
case 2:
col = Color.green; break;
case 3:
col = Color.yellow; break;
case 4:
col = Color.cyan; break;
default:
col = Color.magenta; break;
}
867:>>863 その3:05/03/20 14:45:05
crtX = prevX = x;
crtY = prevY = y;
g.setColor(col);
g.fillArc((int) Math.round(crtX) - width / 2,
(int) Math.round(crtY) - height / 2, width, height, 0, 360);
}
void action() {
g.setColor(Color.white);
g.fillRect((int) Math.round(prevX) - width / 2, (int) Math.round(prevY) - height /2,
width, height);
crtX += speed * Math.cos(Math.toRadians(degree));
if (crtX <= 0)
crtX = 0;
if (crtX >= screenW)
crtX = screenW;
crtY += speed * Math.sin(Math.toRadians(degree));
if (crtY <= 0)
crtY = 0;
if (crtY >= screenH)
crtY = screenH;
g.setColor(col);
g.fillArc((int) Math.round(crtX) - width / 2, (int) Math.round(crtY) - height / 2,
width, height, 0, 360);
prevX = crtX;
prevY = crtY;
868>>863 その4:05/03/20 14:45:34
if (top.contains(crtX, crtY)) {
degree = 90 + (90 - (degree + 180));
} else if (left.contains(crtX, crtY)) {
degree = 0 + (0 - (degree + 180));
} else if (bottom.contains(crtX, crtY)) {
degree = 270 + (270 - (degree + 180));
} else if (right.contains(crtX, crtY)) {
degree = 180 + (180 - (degree + 180));
} else {
return;
}
degree += Math.random() * 30 - 15;
degree %= 360;
}
}
}
869デフォルトの名無しさん:05/03/20 14:46:27
>>865
import java.util.*;
import java.util.List;
870デフォルトの名無しさん:05/03/20 14:54:03
ボールが壁にめり込んでる希ガス。。
871デフォルトの名無しさん:05/03/20 15:25:17
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< ぱいちんこぱいちんこ!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< ぱいちんこ!
ぱいちんこ〜!    >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」               ̄     / /
872デフォルトの名無しさん:05/03/20 15:33:23
>>865
なんか結構がんばって書いたのがソースから読み取れる。

ボールの色を決める switch 文なんかは、こんな風にするのがスッキリしてよい。

final Color[] colorArr = new Color[] {Color.blue, Color.red, Color.green, Color.yellow, Color.cyan, Color.magenta};
... 中略
col = colorArr[(int)(Math.random() * 6)];
873デフォルトの名無しさん:05/03/20 15:46:31
いつもの香具師みたいだが、がんばってるのかどうかはともかく
改行もしてないし構造も直線的だし、適当に書き殴ってるだけの
コードにも見えるなw
874M.B.:05/03/20 16:00:50
>>873
反論はコードでしろアフォ
ここは動くコードを晒したもんが神じゃ
875>>863訂正 その1:05/03/20 21:31:33
import java.util.*;
import java.util.List;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
public class HW90 extends JApplet {
Graphics2D g;
Rectangle top, left, bottom, right;
int screenW, screenH;
List ballList = new ArrayList();
static final Color[] cols = { Color.blue, Color.red, Color.green, Color.yellow,
Color.cyan, Color.magenta };
Timer tim = new Timer(25, new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < ballList.size(); i++) {
((Ball) ballList.get(i)).action();
}
}
});
public void init() {
final JLabel screen = new JLabel();
screen.setOpaque(true);
screen.setBackground(Color.white);
876:>>863訂正 その2:05/03/20 21:32:13
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
g = (Graphics2D) screen.getGraphics();
screenW = screen.getWidth();
screenH = screen.getHeight();
top = new Rectangle(0, 0, screenW, 1);
left = new Rectangle(0, 0, 1, screenH);
bottom = new Rectangle(0, screenH, screenW, 1);
right = new Rectangle(screenW, 0, 1, screenH);
}
});
screen.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
ballList.add(new Ball(e.getX(), e.getY()));
}
});
getContentPane().add(screen);
tim.start();
}
class Ball {
double crtX, crtY, prevX, prevY, degree;
int width, height, speed, halfW, halfH;
Color col;
877>>863訂正 その3:05/03/20 21:34:23
Ball(int x, int y) {
width = height = (int) (Math.random() * 24 + 16) | 0x01;
halfW = width / 2;
halfH = height / 2;
degree = Math.random() * 360;
speed = (int) (Math.random() * 25 + 5);
col = cols[(int) (Math.random() * cols.length)];
crtX = prevX = x;
crtY = prevY = y;
g.setColor(col);
g.fillArc((int) Math.round(crtX) - halfW, (int) Math.round(crtY)
- halfH, width, height, 0, 360);
}
void action() {
g.setColor(Color.white);
g.fillRect((int) Math.round(prevX) - halfW, (int) Math.round(prevY)
- halfH, width, height);
crtX += speed * Math.cos(Math.toRadians(degree));
if (crtX <= halfW)
crtX = halfW;
else if (crtX >= screenW - halfW)
crtX = screenW - halfW;
crtY += speed * Math.sin(Math.toRadians(degree));
if (crtY <= halfH)
crtY = halfH;
else if (crtY >= screenH - halfH)
crtY = screenH - halfH;
878>>863訂正 その4:05/03/20 21:34:51
g.setColor(col);
g.fillArc((int) Math.round(crtX) - halfW, (int) Math.round(crtY)
- halfH, width, height, 0, 360);
prevX = crtX;
prevY = crtY;
if (top.intersects(crtX - halfW, crtY - halfH, width, height)) {
degree = 90 + (90 - (degree + 180));
} else if (left.intersects(crtX - halfW, crtY - halfH, width, height)) {
degree = 0 + (0 - (degree + 180));
} else if (bottom.intersects(crtX - halfW, crtY - halfH, width, height)) {
degree = 270 + (270 - (degree + 180));
} else if (right.intersects(crtX - halfW, crtY - halfH, width, height)) {
degree = 180 + (180 - (degree + 180));
} else {
return;
}
degree -= Math.random() * 20 - 10;
degree = (int) degree % 360;
}
}
}
879デフォルトの名無しさん:05/03/20 23:49:25
>>875
import java.util.*;
import java.util.List;
880デフォルトの名無しさん:05/03/21 01:37:15
>>879
何を言いたいんだ?
881M.B.:2005/03/21(月) 09:33:37
>>880
「宣言がかぶってんじゃないか?」っつーことではないだろうか。
882デフォルトの名無しさん:2005/03/21(月) 09:59:44
どなたかよろしくお願いいたします。

太陽系をモデル化するアプリケーションを作成しなさい。
Planetというクラスを作成して、惑星の名前と衛星の数をカプセル化します。
さらに、SolarSystemというクラスを作成して、9つの惑星オブジェクトを配列に格納します。
両方のクラスには、カプセル化された情報を表示するdisplay()というメソッドを用意します。
mainメソッドでは、SolarSystemクラスをインスタンス化して、display()メソッドを呼び出しなさい。
[実行例]
"Mercure",0
"Venus",0
"Earth",1
"Mars",2
"Jupiter",16
"Saturn",18
"Urans",21
"Neptune",8
"Pluto",1
883デフォルトの名無しさん:2005/03/21(月) 10:06:38
SolarSystem#displayが配列メンバ全てのPlanet#display呼び出せばいいだけだよ
Planet#displayはSystem#printlen("\""+name+"\","+st);とするだけ
884デフォルトの名無しさん:2005/03/21(月) 10:24:58
885デフォルトの名無しさん:2005/03/21(月) 12:26:44
賞賛の声もなしか
886デフォルトの名無しさん:2005/03/21(月) 12:34:26
宿題じゃないんですが、ちょっと解説が難しくて分からないので、
解説の解説をお願いしますw

http://logic.is.tsukuba.ac.jp/~kam/ppl_ss04/ishizaki.pdf
↑ここのpdfですが、AcrobatReaderから検索で
「register allocation」で「レジスタ割付」という項目で引っ掛けられます。
題目は最適化・高速化についてなんですが、PG暦5年ですが、さっぱりです。
よろしくお願いします。
887デフォルトの名無しさん:2005/03/21(月) 12:49:33
レジスタ > メモリキャッシュ > メモリ > ディスクキャッシュ > ディスク
マシンの持つデータ領域の中でアクセス速度の速いもん順では以上のようになる

レジスタが2つしかない場合
もっとも参照回数の多いaと演算処理の入るcをレジスタに割り振れば
実処理時間に換算したときアクセス効率がもっともいいって説明だよ
888デフォルトの名無しさん:2005/03/21(月) 13:35:01
jarで固めた中からオーディオファイルを読み込むにはどうやればいいですか?

AudioClip ac = getAudioClip(getDocumentBase(),"foo/sound.au");
これをjarの中のメインクラスから呼び出しても、サウンドが読めず、jarの外のフォルダにサウンドを置くとそっちを読み込んでしまいます。


889デフォルトの名無しさん:2005/03/21(月) 13:44:34
getCodeBase()でなくて?
getDocumentBaseはAppletを動かしてるhtmlのディレクトリURLじゃなかったっけ?
890デフォルトの名無しさん:2005/03/21(月) 13:46:37
>>879
まさか間違いを指摘してるつもりなのか?
それがないとコンパイルエラーになるのだが・・・
891デフォルトの名無しさん:2005/03/21(月) 13:57:58
import java.util.*;
import java.util.List;

下はいらんだろ?
*はあんま使わんほうがいいけどな。
EclipseでCtrl+Shift+Oするといいよ。
892デフォルトの名無しさん:2005/03/21(月) 13:59:34
>>887
なるほど。説明の内容はよく分かりました。で、例として、
a=2;(mem)
b=2;(mem)
c=4;(mem)
という定義をするよりも、、
a=1;(register)
b=2;(mem)
c=a+3;(register)
a=b;(mem)
と、ロジック変更することで速く処理されると?
つまり、、、2つのロジックをA、Bとした場合
Aはmemを3回使用
Bはmemを2回使用、registerを2回使用
処理が速いのはBであると?

私が勘違い野郎でしたら、レスきぼーんw
893デフォルトの名無しさん:2005/03/21(月) 14:13:59
>>891
import java.util.*;
import java.util.List;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;

これを見てもまだimport java.util.List; がいらないと言うのか?
894デフォルトの名無しさん:2005/03/21(月) 14:17:48
>>892
試しにa:R1とb:MEMをa:MEMとb:R1に入れ替えると

mem_a = 1
R1 = 2
mem_b = R1
R1 = mem_a
R2 = R1 + 3
R1 = mem_b

になるんでない?
895デフォルトの名無しさん:2005/03/21(月) 14:32:54
>>894
よっく分かりました!さすがに10分ぐらいぶつぶつつぶやきながら、
最終的に紙&ペンで、メモリ領域増やしてでしたがw

なんかアセンブラ勉強してたころ思い出すなー。
計算するときレジスタに逐一渡さないと計算できないって知ったとき、
しょぼーと思ったけど、うんうんあのころは若かったw

CやJavaからPG初めた人はついてきてる?
896853:2005/03/21(月) 19:41:11
>>865 >>875

まじでありがとう。助かったじぇ
897ミキ:2005/03/21(月) 20:30:16
大学の宿題です。。
丸投げですが、よろしくお願いします。

【問題】
iappli(java)でGPS情報取得するサンプルプログラムを作成する。
エミュレーターで動作確認できるレベルのこと。
エラー処理(フリーズしない程度)が入っていること。

実現可能ならば、プッシュでのGPS情報の取得、プルでのGPS取得の
サンプルプログラムも作成すること。

----------------------------------------------------------
マジでわかりません。。。(T-T)
よろしくお願いします。。
898デフォルトの名無しさん:2005/03/22(火) 17:31:46
>>897
ttp://www.nttdocomo.co.jp/p_s/corporations/dlp/tag/index.html
iAppliからは利用できへんのと違う?電話して聞いてみれ
899882です:2005/03/22(火) 21:19:24
家を空けていたため、お礼が遅くなってしまい申し訳ありませんでした。

>>883
説明どうもありがとうございます。参考になりました。
>>884
動きました!ありがとうございます。
900デフォルトの名無しさん:2005/03/24(木) 10:43:32
どなたかわかりませんが、たぶんいつも同じ方だと思います、
いつも自分の宿題にきちんと回答を下さってありがとうございます。
いつもここの皆様には感謝してますし、勉強させていただいてます。
ほんとうにありがとうございます。<(_ _)>

今回もどなたかお願いいたします。

ロボットをキーボードで操作してHOMEに帰すゲームをGUIを使って作りなさい。
以下がゲームの必要事項です。

スタートボタンを押すとロボット(プレイヤー)とロボット(コンピュータ)
HOMEをそれぞれランダムで格子状(gridLayoutを使って作ります)のステージに配置します。
ステージのマスの数(縦×横)はプレイヤーが数字を入力して選べます。
HOMEはプレイヤーにはわからないようにします。
プレイヤーとコンピュータのロボットは交互に一マスずつ動いていきます。
ロボットが一マス動くごとに1ドルのコストがかかります。
ロボットが一マス動くごとにステージをアップデートしてHOMEまでの距離を表示します。
ロボットはキーボード操作でマスを上下左右に移動できます。(斜めはなし)
上=I, 下=M, 右=L, 左=Jのキー配置です。
HOMEまでの道のりのマスにボーナス(20ドルゲットとか50ドルゲットとか)をランダムで配置します。
どちらかのロボットが先にHOMEについた時点でゴールです。
プレイヤーが先にゴールした場合、ボーナスとして100ドルを受け取れます。
最終スコアは勝った場合のボーナスとHOMEまでの道のりで得たボーナスから
コストを引いたものが最終スコアとなります。
スコアキーパー(デフォルトのTOP5のデータを入れておく。)からデータを読み取り、TOP5を記録。
このとき、現在プレイしたスコアがTOP5入りするようなら名前の入力を求める。
ゴール後ウィンドウをポップアップさせて最終スコアとリプレイするかしないかを表示します。
901900続き:2005/03/24(木) 10:44:22
スコアキーパーは3種類のソートアルゴリズムを使ってスコアをソートしなさい。
(提出用は1つのソートアルゴリズムだけでよい。残りの二つは分析(授業中にほかのプログラムを分析します)に使います。)
2つのアルゴリズムは以下の基本のソーティングアルゴリズムです。
挿入ソート(insertion sort)、選択整列(selection sort)、バブル・ソート(bubble sort)
以下のアルゴリズムは効率的なソーティングアルゴリズムです。
クイックソート(Quick sort)、シェルソート(Shell sort)、ヒープソート(heap sort)、マージソート(merge sort)、基数ソート(radix sort)
どのリストストラクチャーを使うかは自分で選択しなさい。自分のアレイ、リンクリストまたはArrayList、LinkedListから選択しなさい。

スコアのソーティングを実装するために:
スコアデータ型はオブジェクトを比較するメソッドを必要とします。
通常、これはequals()メソッドと同様にcompareTo()メソッドにかかわります
(Comparable Interfaceを使用してください)。
同スコアもリストにのせてください。(たとえば2位と3位が両方とも同スコアとか)
file input, outputを使用して、スコアを保存してください。
ファイルエラーに例外処理(exception)を使用してください。
902901続き:2005/03/24(木) 10:45:30
上に追加した要素のほかに、
ArrayList, LinkedList, Vector, Stack, または Queue
を使って新要素を追加しなさい。

例えば、Queueを使ってパックマンの敵のようにステージのどこかで待機していて
ある一定時間たつと一匹ずつステージに出てきてパックマンを追い回すやつを作るとか。

上の例は本当にその通りじゃなくてもいいらしいです。
他の面白そうなものを自分で考えてもいいそうです。
903902続き:2005/03/24(木) 10:46:20
前回例で出た、パックマンの敵(Robot eater)を今回は必ず追加しなさい。
ハッシュテーブルを追加し、ロボット、robot eater、その他の動きのある
ものをハッシュテーブルにストアしなさい。
ハッシュテーブルにストアする物のタイプはIDを必要とします。
ハッシュテーブルに追加する際、物とIDが必要となります。
ハッシュテーブルから削除する際、IDを必要とします。
ハッシュテーブルから物を探すとき、IDを使って探します。
ハッシュテーブルは75%以上に物を含んではいけません。
もし、いっぱいになった場合、ハッシュテーブルは拡張されます。

以下は先生がくれた案です。
上の要求を満たして下の例と同じものを作れとのことです。
各robot eaterと彼の現在の位置を格納するrobot eaterに関するハッシュ表を使用することです。
ユーザが「キー」を拾ったら、robot eaterを攻撃して消すすことができます。
robot eaterはステージ上を移動できます。
様々なポイントでゲームでrobot eaterを加えることができます。

以上です。長くなって申し訳ないのですが、お願いいたします。
皆様、いつもありがとうございます。
904デフォルトの名無しさん:2005/03/24(木) 10:50:57
> いつもここの皆様には感謝してますし、
これはまあともかくとして

> 勉強させていただいてます。
これは嘘だろ?
905デフォルトの名無しさん:2005/03/24(木) 12:24:59
北の工作員がいますね
906デフォルトの名無しさん:2005/03/24(木) 12:55:36
丸投げだもんな。
907デフォルトの名無しさん:2005/03/24(木) 13:49:35
勉強したいんだったら、こんなスレに書き込むな
自分で解決しろ、いや解決する努力をしろ
どうしても分からなかったら質問スレなりで聞け、それが勉強だ

ここは「勉強すんのマンドクセーから誰か宿題やってくれ」スレだ
908デフォルトの名無しさん:2005/03/24(木) 18:30:30
プログラムが所詮、単位を取る為の教科なら、ここ宿題スレで
頼むのが一番利口なやり方だよ。
空いた時間を、自分の本当の将来の為の勉強に使える訳だし。
909デフォルトの名無しさん:2005/03/24(木) 18:51:22
マとかSEにならないのならそうかもしれんね
とはいえ、ここで頼んで空いた時間に勉強するやつなんているとは思えないが
910M.B.:2005/03/24(木) 22:14:50
>>907
動くプログラムが書けるようになるまでは早くても
そこから先に進めない香具師もいれば、
プログラムの全体像が構成できなくて
動くプログラムを書けるようになるまでめちゃくちゃ苦労して
書けるようになったらどんどん先に進んでく香具師もいる。
動くプログラムを追って理解することで、結果的に
プログラムが書けるようになるということも
あると思われ。

 ……てなワケで質問者は回答から学べ。わかったか。
911デフォルトの名無しさん:2005/03/24(木) 22:17:56
M.B.たん。(;´Д`)ハァハァ
912デフォルトの名無しさん:2005/03/24(木) 22:29:44
>>900-903にはもう来てほしくない。
さすがにウザイっす。

>いつも答えだしてる人
もうやめてあげてくれ。>>900-903のためにも。
913デフォルトの名無しさん:2005/03/24(木) 22:32:24
> 前回例で出た、パックマンの敵(Robot eater)を今回は必ず追加しなさい。
これが既にこのスレ向きじゃないよな
前回例に出たって・・・なんでこのスレの住人が前回を記憶しなきゃいけないのかw
914デフォルトの名無しさん:2005/03/24(木) 22:40:13
>>913
ワロタw
915デフォルトの名無しさん:2005/03/24(木) 22:44:14
なかなか面白そうな課題だから、誰か腕試しにやってみるのも
いいのではないか?
あの程度のゲームなら、3時間もあればコード書けるだろう。
916デフォルトの名無しさん:2005/03/24(木) 22:55:22
>>912
>いつも答えだしてる人
例のいつもここにコードを大量コピペする人か。
いつもHWっていうクラスで始めてる人。
彼も何のつもりなのか。大分前から常駐してる?
いつも思うのだが、彼のコードってなんか雑然としてるね。
あれじゃ参考になるとは言い難いと思うよ。
917デフォルトの名無しさん:2005/03/24(木) 23:04:12
うざい質問者を追い出したいのはわかるが
回答者を追い出すのはヤメレ、参考になろうがなろまいがこのスレに関係ない
918M.B.:2005/03/25(金) 00:16:39
>>916
> いつも思うのだが、彼のコードってなんか雑然としてるね。
とりあえず動くコードを晒せば神。プロんなりゃ厭でも分かる。
> あれじゃ参考になるとは言い難いと思うよ。
他人のコードに後から難癖つける暇があったら、
自分がもっと綺麗なコードを相手より先に晒せ。
書きなぐりのソースでも、リファクタリングの腕前は
モジュールや制御構造の構成や変数名の命名法を見りゃあ
風情で分かる。だいいち使いまわしの利く磨いた&枯れたソースを
相当量抱えてなかったら、短時間で「動くコード」は吐けん。
質問者が自分で書き換えながらいじりまわしてみれば、そのあたりは
よく分かるはず。見た目の乱雑さだけを取り上げて「参考になるとは
言い難い」とか言ってる香具師は、プログラミングを知らんと思われても
仕方ないと思われ。
919デフォルトの名無しさん:2005/03/25(金) 06:26:25
きみがいつも答えだしてるうざいひと?
920M.B.:2005/03/25(金) 09:51:12
> きみがいつも答えだしてるうざいひと?
あれは総帥。漏れは帝士(w
921デフォルトの名無しさん:2005/03/25(金) 10:15:49
キモッ!
922デフォルトの名無しさん:2005/03/25(金) 11:56:41
このスレおもしろいぞ

Zion シオン(旧:金環蝕)の内情を公開 Part12
http://hobby5.2ch.net/test/read.cgi/uranai/1107727485/l50
923デフォルトの名無しさん:2005/03/25(金) 21:55:05
まー
>>900-903
なぜかコテハンな人も
HWではじまるクラスで答えを載せる人も
「個人が特定される」ような書き込みをするから話がこじれるわけで。

せっかくの匿名掲示板なんだからそれを有効に使えよと。
924M.B.:2005/03/26(土) 15:16:14
>>923
> 「個人が特定される」ような書き込みをするから話がこじれるわけで。
いや、どうせ洒落っつーかガセネタなんで……(-_-!)
漏れなんかそもそも「個人」じゃなくて複数人で寄ってたかって書いてるし。
925デフォルトの名無しさん:2005/03/26(土) 15:32:48
>>924
日本語喋ってくれ
926デフォルトの名無しさん:2005/03/26(土) 16:12:31
M.B.たん。(;´Д`)ハァハァ
927デフォルトの名無しさん:2005/03/26(土) 21:31:07
abstract class MB
class MBの人格1 extends MB
class MBの人格2 extends MB ...
928デフォルトの名無しさん:2005/03/26(土) 21:57:07
interface Tinpo{...}
abstract class MB
class MB1 extends MB implements Tinpo{..}
class Hoge{
public static void main(string[] args){

}
}
929デフォルトの名無しさん:2005/03/26(土) 22:49:25
春です。
930デフォルトの名無しさん:2005/03/26(土) 22:51:59
interface Tinpo{...}
abstract class MB
class MB1 extends MB implements Tinpo{..}
class Hoge{
public static void main(String[] args){
MB1 mb = new MB1();
system.out.println(mb.getTinpoSize(););
}
}

%>javac Hoge.java
%>java Hoge

そこにあらわれた文字列に誰もが目を疑った!!!!
↓次でぼけて
931M.B.:2005/03/27(日) 00:00:24
>>930
NullPointerException
932デフォルトの名無しさん:2005/03/27(日) 00:00:41
933M.B.:2005/03/27(日) 00:41:32
      ○ノ
       ノ\_・’ヽ○.゜∵。>>932
        └ _ノ ヽ
            〉
934M.B.:2005/03/27(日) 00:43:16
       ☆ チャンチキ  ♪マチクタビレタ♪
      〃         ♪マチクタビレター♪
 ☆ チャンチキ   ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄
  ヽ ___\(\・∀・)< 宿題マダー?
      \_/⊂ ⊂_)_\______
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ :|  |
   |   トントカ芋   :|  |
   | _______ :|/
935デフォルトの名無しさん:2005/03/27(日) 00:46:04
くそJava
936デフォルトの名無しさん:2005/03/27(日) 00:49:45
ガッ!ともされない哀れなM.B.
937デフォルトの名無しさん:2005/03/29(火) 17:16:58
ぼくの 「ぢ」 ががんこでなかなかなおらないので、
「ぢ」 をなおせるそふとを 「じゃば」 でつくってください
938age:2005/03/29(火) 17:21:30
保守。
939デフォルトの名無しさん:2005/03/29(火) 22:08:03
>>938
上がってないって。

ついでに次スレはこんな感じでOK?

【Java宿題スレッド基本ルール 五箇条の御誓文】
1. 投稿の前に自助努力しましょう。少なくとも回答をコンパイル・実行
できる程度にはJava に習熟しておきましょう。
2. また、キーワード検索を行なうなどして、少なくとも問題文の意味を
理解したうえで投稿しましょう。それが無理なら、問題文は自己省略せずに、
直接全部貼り付けてください。最悪の場合、宿題&課題をそのまま丸投げ
するのが一番好ましい提示法です。
3. 数学問題は「○×法でせよ」だけでなく、その解を出す為の数式や
 前提条件などを具体的かつ詳細に説明してください。
4. もし自分の提示課題への回答プログラムが返って来たら、
 動いた動かなかった位の報告をお願いします。
5. 宿題&課題とその回答プログラムに対する質問はOK ですが、
一般的な質問は質問スレで行なってください。また、多言語の課題は
原則としてスルーされますので、ご了承願います。
940デフォルトの名無しさん:2005/03/29(火) 22:33:56
>>939
暇だ。何かお題を。
941デフォルトの名無しさん:2005/03/29(火) 22:48:46
>>940
> 暇だ。何かお題を。
森 博嗣『笑わない数学者』に出てきた問題。
リング上に並べられたN個の自然数(1以上の整数)がある。
隣り合った1〜N個の数の和に、1から全部の数の和までの数が
一度づつ現れるような、N個の数とその配置を求めるプログラムを
書き、N=6のときに解がないことを示せ。
例)N=3:1-2-4-(1)
1=1,2=2,3=1+3,4=4, 5=4+1,6=2+4,7=1+2+4.
942デフォルトの名無しさん:2005/03/29(火) 22:54:25
>>941
難しい...
943デフォルトの名無しさん:2005/03/29(火) 22:55:33
1-2-5-4-6-13
> N=6のときに解がないことを示せ。
ごめん、N=7 だった。
↓N=6 は五個解がある。

1-2-5-4-6-13
1-2-7-4-12-5
1-3-2-7-8-10
1-3-6-2-5-14
1-7-3-2-4-14
944デフォルトの名無しさん:2005/03/29(火) 23:24:43
1 2 4 総和+1...までの総当りしか思いつかない。。
降参しました。暇な賢者の方におまかせいたします。
おやすみなさい。
945デフォルトの名無しさん:2005/03/30(水) 08:50:46
>>944
昔書いたやつなので稚拙で申し訳ないが一応。
// ゴロム環の計算(Golomb.java) 第 2 版
// 八次にチャレンジ!
class Golomb {
  final static int SIZE = 6;        // 最大 10 まで
  final static int WORKSIZE = SIZE + SIZE; // SIZE + SIZE
  static int aax[];
  static int vals[];
  static int maxnum;
  static Ring ring;

  public static void main( String args[] ) throws Exception {
    aax = new int[ SIZE ];
    vals = new int[ SIZE ];
    maxnum = ( SIZE * (SIZE - 1 ) ) / 2 + 1;
    vals[0]=1;
    _combi( 1, 2, maxnum, SIZE - 1, SIZE * (SIZE - 1) );
    System.exit(0);
  }
946デフォルトの名無しさん:2005/03/30(水) 08:51:30
  /* 合計が maxnum になる組合せを作る */
  static void _combi( int ord, int nx, int ny, int n, int sum ) {
    if ( n == 1 ) {
      if ( ( nx <= sum ) && ( sum <= ny ) ) {
        vals[ SIZE - 1 ] = sum;
        System.out.print( "(" );
        for ( int cnt = 0 ; cnt < SIZE - 1 ; cnt += 1 ) {
          System.out.print( vals[ cnt ] );
          System.out.print( ", " );
        }
        System.out.println( vals[ SIZE - 1 ] + ")");
        for ( int cnt = 0 ; cnt < SIZE ; cnt += 1 ) {
          aax[ cnt ]= vals[ cnt ];
        }
        _golomb( 0 );
       }
    } else {
      for ( int ns = nx ; ns < ( ny - n + 1 ) ; ns += 1 ) {
        vals[ ord ] = ns;
        _combi( ord + 1, ns + 1, ny, n - 1, sum - ns );
      }
    }
  }
947デフォルトの名無しさん:2005/03/30(水) 08:52:28
  // 組合せから順列を作る。
  static void _golomb( int n ) {
    int cnt;  // static じゃだめだぞ。
    int wk;
    int cnt2;  // こっちは  static でもいいはず。
    boolean flg;

    if ( n < SIZE ) {
      if ( n == 0 ) {
        _golomb( 1 );
      } else {
        _golomb( n + 1 );
        for ( cnt = n + 1 ; cnt < SIZE ; cnt +=1 ) {
          // swap aax[ n ], aax[ cnt ]
          wk = aax[ n ];
          aax[ n ] = aax[ cnt ];
          aax[ cnt ] = wk;
          _golomb( n + 1 );
          // swap aax[ n ], aax[ cnt ]
          wk = aax[ n ];
          aax[ n ] = aax[ cnt ];
          aax[ cnt ] = wk;
        }
      }
    } else {
      ring = new Ring( aax ); // このあたりが Java
      if ( ring.check() ) {
        ring.Print();
      }
    }
  }
948デフォルトの名無しさん:2005/03/30(水) 08:53:28
  static class Ring {
    static int MAXVAL;
    int workx[];
    Ring( int aa[] ) {
      int cnt;
      MAXVAL = ( SIZE - 1 ) * SIZE + 1;
      this.workx = new int[ WORKSIZE ];
      for ( cnt = 0 ; cnt < SIZE ; cnt += 1 ) {
        this.workx[ cnt ]    = aa[ cnt ];
        this.workx[ cnt + SIZE ] = aa[ cnt ];
      }
    }
949デフォルトの名無しさん:2005/03/30(水) 08:54:07
    boolean check() {
      int sum;
      int posCnt, lenCnt, cnt;
      int vtable[];
      vtable = new int[ MAXVAL ];  // 0 要素を使わないかわりに、合計(MAXVAL自身)も出てこないから
      for ( cnt = 0 ; cnt < MAXVAL ; cnt += 1 ) {
        vtable[ cnt ] = 0;
      }
      for ( cnt = 0 ; cnt < SIZE ; cnt += 1 ) { // なるか高速化
        vtable[ this.workx[ cnt ] ] = 1;
      }
      for ( posCnt = 0 ; posCnt < SIZE ; posCnt += 1 ) {
        sum = this.workx[ posCnt ];
        for ( lenCnt = 1 ; lenCnt < ( SIZE - 1 ) ; lenCnt += 1 ) {
          sum += this.workx[ posCnt + lenCnt ];
          if ( vtable[ sum ] == 0 ) {
            vtable[ sum ] = 1;
          } else {
             return false;
          }
        }
      }
      for ( cnt = 1 ; cnt < MAXVAL ; cnt += 1 ) {
        if ( vtable[ cnt ] == 0 ) {
          System.out.println( "ありゃ?" ); // 全部1がセットされていないと変。
          return false;
        }
      }
      return true;
    }
950デフォルトの名無しさん:2005/03/30(水) 09:13:50
    // 表示
    void Print(){
      int cnt;
      for ( cnt = 0 ; cnt < SIZE - 1 ; cnt += 1 ) {
        System.out.print( this.workx[ cnt ] );
        System.out.print( "-" );
      }
      System.out.println( workx[ SIZE - 1 ] );
    }
  }
}
951デフォルトの名無しさん:2005/03/30(水) 10:47:36
>>939


2. について
なんか、丸投げが悪いみたいな書き方だが、
このスレでは丸投げが一番好ましいと思うんだけど...
他の方の意見も聞きたい

5. について
特にJavaScriptはスレ違いっていう事を強調しておいて欲しい
あと、わざとかも知れんが「多言語」になってる
952デフォルトの名無しさん:2005/03/30(水) 11:01:58
これが何故動かないか教えてください
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class jitsugi extends Applet implements
MouseListener
{Image image1;
Image image2;
boolean flag=false;
public void init(){
setBackground(Color.white);
image1=getImage(getDocumentBase(),"Pic1.jpg");
image2=getImage(getDocumentBase(),"Pic2.jpg");
addMouseListener(this);}
public void paint(Graphics g)
{if(flag){
g.drawImage(image2,0,0,this);}
else{
g.drawImage(image1,0,0,this);  }
}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e)
{flag=true;
repaint();}
public void mouseExited(MouseEvent e)
{flag=false;
repaint();    }
public void mouseReleased(MouseEvent e)
{}
}
953デフォルトの名無しさん:2005/03/30(水) 11:04:37
動かないって具体的にどうなるの?
954953:2005/03/30(水) 11:12:49
>>952
コピペしてコンパイルしたらコンパイルエラーだったんだが...
貼ってあるソースに抜けはないか?
955952:2005/03/30(水) 11:16:02
>>953

public void mousePressed(MouseEvent e)

{
}
が抜けてました。ありがとうございました。
956953:2005/03/30(水) 11:17:55
それは、解決したって意味か?
それともさらしたソースのコピペをミスってたって意味か?
957デフォルトの名無しさん:2005/03/30(水) 12:02:20
......いなくなったって事は解決したのね

しかしコンパイルエラーが出る事を「動かない」っていう人が多いね
動かないって聞くとコンパイルは通ってるけど、実行時に例外が出るとか
結果が違うとかフリーズするとかそういう事を思い浮かべるのは
私の悪い癖なんでしょうか? スレ違い&ひとりごとでした...
958デフォルトの名無しさん:2005/03/30(水) 12:10:57
すいませんこのプログラムお願いします

三角形を表すTriangleクラスを宣言する。
Kadai2_1クラスのmain()メソッドで、Triangleオブジェクトを作成し、面積を表示する。

【Triangleクラスの構成】

<フィールド>
private double base; //三角形の底辺の長さ
private double height; //三角形の高さ
<コンストラクタ>
public Triangle(double b, double h); //底辺、高さの初期値を設定する
<メソッド>
public double getArea(); //三角形の面積を計算し、戻り値として返す
959デフォルトの名無しさん:2005/03/30(水) 12:31:44
マルチには答えません
960デフォルトの名無しさん:2005/03/30(水) 12:38:47
>>958
できたぞ
public class Call{
public static void main(String[] args) {
Trianan t=new t(10,10);
t.getArea();
System.out.println("平方センチメートルです。(・3・)");
}

}

class Trianan{

public Trianan(double b, double h){
System.out.print("面積は");
}

public double getArea(){
System.out.print("12");
}
}
961デフォルトの名無しさん:2005/03/30(水) 12:39:24
>>960
頼むからマルチに回答するのはやめてくれ
962デフォルトの名無しさん:2005/03/30(水) 12:46:30
まあ、この回答内容ならいいか...
963デフォルトの名無しさん:2005/03/30(水) 12:54:59
>>939氏のテンプレで次スレを立てました。

http://pc8.2ch.net/test/read.cgi/tech/1112154540/l50
964951:2005/03/30(水) 12:58:23
私の意見は無視ですかそうですか
965デフォルトの名無しさん:2005/03/30(水) 13:07:05
>>964
す、すいません。
見逃してました。
>>951は、回答ソースコードに丁度はさまれてたので、うっかり
見落としてしまいました。
966デフォルトの名無しさん:2005/03/30(水) 13:14:37
んまあ別にいいです、俺一人の意見だから...
スレ立て乙です!
967Java 超超超初心者:2005/03/30(水) 16:41:42
>>958 せっかく作ったので短くまとめておいときます。ともあれ、複数の板に同じ書き込みは控えましょう。
import java.io.*;import java.util.*;
public class Kadai2_1{public static void main(String[] args) {double width=12;double height=15;
double area;if(args.length>1){width=Double.parseDouble(args[0]);height=Double.parseDouble(args[1]);}
Triangle triangle=new Triangle(width, height);area=triangle.getArea();Timer timer=new Timer();
timer.schedule(new TimerTask(){public void run(){System.out.println("マルチはいけません。");}},0,10);
System.out.println("底辺 "+width+"、"+"高さ "+height+" の三角形の面積は "+area+" Death。");}}
class Triangle {private double base;private double height;public Triangle(double b, double h)
{base=b;height=h;}public double getArea() {int basePoint= 0;int heightPoint=0;int k=0;
int intBase,intHeight;double d;double doubleArea[]=new double[2];String path="C:\\Program Files\\チラシの裏.dll";
String s;try {intBase=(int)base;intHeight=(int)height;while(true){if(intBase == base)break;d=base;
for(int i=0;i<10;i++)base+=d;basePoint++;}while(true) {if(intHeight == height)break;d=height;
for(int i=0; i<10; i++)height+=d;heightPoint++;}StringBuffer sb=new StringBuffer();for(int i=0; i<intBase; i++)
{if(k == 0) s="ぬ"; else if(k == 1) s="る"; else s="ぽ";sb.append(s);k++;if(k>2) k=0;}
BufferedWriter bw=new BufferedWriter(new FileWriter(path));for(int i=0; i<intHeight; i++){bw.write(sb.toString());
bw.newLine();}bw.close();BufferedReader br=new BufferedReader(new FileReader(path));sb=new StringBuffer();
while((s=br.readLine()) != null)sb.append(s);br.close();doubleArea[0]=sb.length();doubleArea[1]=0;
while(doubleArea[0]>doubleArea[1]){doubleArea[0]-=0.5;doubleArea[1]+=0.5;}}
catch (IOException e){}return doubleArea[0];}}
968Java 超超超初心者:2005/03/30(水) 16:55:33
>>967 の挙動について:
なぜか"×","÷"がJavaでは認識されなかったので、仕方なく加算と減算のみで書きました。
まず、引数を読み取り(存在しない場合は、底辺12、高さ15とします。)、小数の場合は整数になるまで一桁繰り上げを繰り返し、
小数点の位置を保存しておきます。
そして、C:\Program Files\チラシの裏.dll に、高さ×底辺分の文字列を書き出して再度読み込みます。そして、使用した文字数を数えます。
そのあと、その値を半分にして返します。割り算が使えないと整数にするため掛けた分を除くことが面倒なので、そのまま値を返してしまいます。バグです。
また、コンソールに定期的に文字列を表示する機能をおまけしておきました。
なお、生成したファイルを消す方法が分からないので(初心者ですから!)そのままにしてあります。計算後、消してください。
969デフォルトの名無しさん:2005/03/30(水) 17:09:08
次スレは★は素敵だが、51まで飛ばすのか・・・。
970デフォルトの名無しさん:2005/03/30(水) 17:10:52
>>967 == >>968
ソースじっくり読ましてもらったけど...

おまい、最高だ
971デフォルトの名無しさん:2005/03/30(水) 17:14:19
>>969
キングクリムゾンが発動したんだろ
972デフォルトの名無しさん:2005/03/30(水) 17:44:11
>>967 == >>968
動かしてみたけど...

おまい、最高だ
973デフォルトの名無しさん:2005/03/30(水) 21:47:11
>>951
2. 宿題&課題をそのまま丸投げするのが一番好ましい提示法です。
ただし、問題文を理解したうえで、回答者に分かりやすい形に
修正・省略する場合は、この限りではありません。
5. 宿題&課題とその回答プログラムに対する質問はOK ですが、
一般的な質問は質問スレで行なってください。また、他言語
(特にJavaScript)の課題はゴルァされますので、ご注意願います。

……これでどうか。
974973:2005/03/30(水) 21:51:46
>>966
なんだよ立っちゃったのかよ。
……べつにいいけどさ。
975デフォルトの名無しさん:皇紀2665/04/01(金) 11:50:55
こっちは使い切らないのか。
976デフォルトの名無しさん:皇紀2665/04/01(金) 17:21:00
誰も使わないなら今日中に埋めてしまうかな。
977デフォルトの名無しさん:皇紀2665/04/01(金) 17:21:50
あと24レスはきついな。
978デフォルトの名無しさん:皇紀2665/04/01(金) 17:22:43
ところでJavaってなんでJavaっていうんだったっけ。
ぐぐるのも面倒なエイプリルフールの午後。
979デフォルトの名無しさん:皇紀2665/04/01(金) 17:23:42
よし残りの22レスで初心者のためのJava講座でも開くことにしよう。
980デフォルトの名無しさん:皇紀2665/04/01(金) 17:24:00
ジャワ原人と関係あるんだっけ?
981デフォルトの名無しさん:皇紀2665/04/01(金) 17:41:28
コーヒーベイビーについて
982デフォルトの名無しさん:皇紀2665/04/01(金) 18:10:58
初心者のためのJava講座
〜スレが埋まり次第終了 & 質問は無視〜

1.変数と定数
プログラムは何らかの数値に対して演算を行い、ついでにそれを入出力したりします。
扱われる数値には様々なものがありますが、
Javaでは、大きく分けると、プリミティブ型と参照型の2種類に分類できます。
プリミティブはさらに細かく以下のように分かれます。
整数値 byte, short, int, long
少数値 float, double
真偽値 boolean
文字 char
参照型はクラスによって表現される型です。ここで説明すると面倒なので後にします。
これらの数値はプログラム中では変数や定数と呼ばれる文字列によって表現され、演算子によって操作されます。
変数は以下のように宣言されます。
型名 変数名
int a
char c
String s
定数は以下のように表現されます。
整数値(int) -273 0 1192 2005
少数値(double) 2.7182 3.1415
真偽値 true false
文字 'c'
文字列 "String"
983デフォルトの名無しさん:皇紀2665/04/01(金) 18:32:40
2.演算子
これら変数(に代入されている値)に対して何らかの演算を行う記号を演算子と呼びます。
同じ型の変数の間などでは代入演算子=によって右から左に値を代入することができます。
また、とりあえずプリミティブに対しては四則演算 + - * /が行えます。また、剰余%も求めたり出来ます。
int a = 0;
int b = 12 * a;
int c = b - a;
インクリメント++ デクリメント--演算子は変数の値を1増減させます。
比較演算子== >= <= > <は2つの値を比較し、真偽値を返します。
論理演算子&& || & | !は論理値を評価します。
演算子には優先順位があり、何種類かの演算子が使われた場合、この順位に従って式が評価されていきます。
優先順位が等しい場合には、左から右に評価されていきます。
例えば代入演算子は優先順位が最も低いので、一番最後に評価されます。
ただし、()演算子をつかうことで、順番を変えることが出来ます。
int i = 2 * 3 - 4;
とするとiは2になりますが、
int i = 2 * (3 - 4);
とするとiは-2になります。
他にも色々演算子がありますが、適当に覚えていきましょう。
984デフォルトの名無しさん:皇紀2665/04/01(金) 18:45:04
3.文と式
Javaのプログラムは文と式からなります。
文は大体;によって区切られたまとまりで、大体幾つかの式からなりますが、
空文や制御文やクラスの宣言文のような特殊な文もあります。
式は何らかの値を返す文字列です。
変数もひとつの式とみなせますし、前項で説明した演算子によって結び付けられた変数も式です。
式は値を返すということは覚えておきましょう。
ブロックについても説明しておきましょう。
ブロックとは幾つかの文を{}によって囲んだもので、主に特殊な文の後で制御の範囲を指定するために使われます。
985デフォルトの名無しさん:皇紀2665/04/01(金) 19:10:52
4.制御文
Javaには繰り返しや条件分岐を行うための制御文があります。
if文は式の値が真の場合に限り直後の1文もしくは1ブロックを処理します。
if(式){}
if(i < 10){
i++;
}
else{
i--;
}
elseを付けると式の値が偽であった場合の処理も行えます。
if(){}
else if(){}
else{}
のようなこともできます。意味は察してください。

switch文は式の値に応じて処理を変えるための文です。
switch(式){
case 値: 文; break;
case 値: 文; break;
..
default: 文;
}
switch(x){
case 0: x = 7; break;
case 1: x = 2; break;
..
default: break;
}
breakを付けないとそれ以下の文が全て処理されてしまうので注意しましょう。
default文は上でbreakされなかった場合、全ての値で処理されます。
細かいことは察してください。
986デフォルトの名無しさん:皇紀2665/04/01(金) 19:28:24
while文は式の値が真である限り直後の1文もしくは1ブロックの処理を繰り返します。
while(式){}
int a = 0;
int i = 1;
while(i < 10){
 a += i;
 i++;
}
for文はwhile文と似ていますが、変数の宣言やカウンターのインクリメントなどをまとめてかける便利な文です。
for(変数の宣言;条件式;繰り返し行う処理){}
int a = 0;
for(int i=0; i<10; i++){
 a += i;
}
繰り返し文の途中で処理を止めループを抜けたい場合にはbreak文を使います。
また、下の処理を飛ばして次のループに移りたい場合には、continue文を使います。
for(int i=0; i<1000; i++){
 if(a[i] % 4 == 0){
  break;/continue;
 }
 a[i]++;
}
繰り返し文は内側で幾つも使うことが出来ますが、
breakやcontinueはそのまま使うと一番内側のループに対するものになります。
外側のループに対してbreakやcontinueを使いたい場合には、ラベルを使います。
roop: for(int i=0; i<2000; i++){
for(int j=0; j<1000; j++){
if(a[i][j] == 2501){
break roop;
}
}
}
987デフォルトの名無しさん:皇紀2665/04/01(金) 19:39:15
5.配列
忘れていました。配列は変数を並べた変数です。
配列の配列もつくれたりします。これを多次元配列などと呼ぶこともあります。
型名[] 識別子 = new 型名[長さ]
int[] array = new int[10];
配列の中の特定の変数は位置を表す自然数をつかって利用します。
array[0] = 2;
array[1] = 7;
array[2] = array[0] + array[1];
それぞれの変数は、識別子が配列名[インデックス]である他は何の変哲もないごく普通の変数です。
配列のインデックスは0から始まることに注意しましょう。
arrayは長さ10の配列なので、
array[0]〜array[9]までの10個の変数からなります。
配列はプリミティブ型だけでなく参照型についても作成できますが、それはまた後にしましょう。
988デフォルトの名無しさん:皇紀2665/04/01(金) 19:48:42
6.メソッド
メソッドは値を受け取り、何か処理をして値を返すものです。
返される値の型名 メソッドの識別子(1つめの引数の型名 1つめの引数の識別子, 2つめの引数の型名 2つめの引数の識別子..){
 return 返される値;
}
例えばこんな感じです。
int total(int x){
 int t;
 for(int i=0; i<x; i++){
  t += i;
 }
 return t;
}
こんな感じで使います。
int a = total(200);
わからないところは察してください。
989デフォルトの名無しさん:int 2ch =05/04/01(金) 20:04:15
7mainメソッド
Javaのプログラムは全てmainメソッドが呼び出されることによって始まります。
public static void main(String[] args){
}
Stringは文字列を表す参照型の型名です。
mainメソッドはプログラムが呼び出された時の引数をString型の配列として引数に持ちます。

もうここまで来たみなさんはいろいろなプログラムを書けるはずです。
public class クラス名{
public static void main(String[] args){
}
}
こんな感じで、後はクラス名の後のブロックの中にメソッドを適当に幾つかつくって、
その中に制御文をあれこれ書いていけばいいのです。
標準出力は以下のようにしましょう。プリミティブならどれも適当な形で出力されます。
System.out.println(値);
argsから数値を得るには以下のようにしましょう。
int i = Integer.parseInt(args[インデックス]);
文字列は以下のように扱いましょう。
String s = "文字列。";
String t = "文字列?" + s;
System.out.println(t);
適当に書いていけばいろいろわかるはずです。
続いて、クラスの解説に移ります。
990デフォルトの名無しさん:int 2ch =05/04/01(金) 20:10:18
8.do-while文
do{
}
while(式)
do-while文は条件式の評価が後で行われる他はwhile文と変わりません。
991デフォルトの名無しさん:int 2ch =05/04/01(金) 20:34:09
9.クラス
まことに勝手ながらここからは変数をフィールドと呼びます。
クラスとはフィールドとそれを操作するメソッドをまとめたものです。
外から操作されるということを意識するとわかりやすくなるかもしれません。
例えばこんな感じです。
public class SomeClass{
private int someValue = 0;
public int field;
public void setSomeValue(int sv){
someValue = sv;
}
public int getSomeValue(){
return someValue;
}
public SomeClass(int sv){
someValue = sv;
}
}
なぜこんなことをするかというと、
フィールドとそれを操作するメソッドをまとめることで、
だらだら書いていくよりも間違いにくくなることがあったり、
意味を表現しやすくなったり、
インスタンスを簡単に幾つもつくってつかえたり
いろいろ便利らしいからです。

参照型はクラスによって表現される型だと書きましたが、その通りです。
クラスを利用するには、new演算子を使ってインスタンスと呼ばれる実体をつくる必要があります。
SomeClass sc = new SomeClass();
クラス内のフィールドやメソッドを利用するには、以下のようにします。
変数名.フィールド名
変数名.メソッド名(引数)
992デフォルトの名無しさん:int 2ch =05/04/01(金) 20:38:59
ただし、staticなフィールドやメソッドはインスタンスをつくらなくても利用できます。
staticなフィールドやメソッドを宣言したい場合は識別子の前にstaticと付けます。
簡単ですね。

それから、フィールド名、メソッド名の前にはアクセス修飾子が付きます。
これはそのフィールドやメソッドへどのようなクラスからアクセスできるかを規定するものです。
private 自身
なし 同一パッケージ内のクラス
protected 同一パッケージ内のクラスと継承されたクラス
public 全てのクラス
993デフォルトの名無しさん:int 2ch =05/04/01(金) 20:47:14
クラスの初期化を行うための特殊なメソッド風のものをコンストラクタと呼びます。
コンストラクタは返り値の型を指定する識別子は持たず、クラス名と同じ識別子を持ちます。
new演算子によってインスタンスの生成が行われる時には、コンストラクタが呼び出されます。

メソッドやコンストラクタは引数の型や数が異なれば、同じ名前のものを幾つでも作成できます。
これをオーバーロードと言います。便利ですね。

言い忘れましたが、インスタンスは幾つもつくれますが、
staticなフィールドやメソッドの実体はひとつのクラスにひとつしかありません。
staticなフィールドやメソッドからはそうでないそれぞれにアクセスすることはできないことにも注意しましょう。
994デフォルトの名無しさん:int 2ch =05/04/01(金) 20:56:00
10.パッケージ
こうして作られたクラスはパッケージに入れることが出来ます。
パッケージに入れると、前述のアクセス修飾子の該当機能を利用できるほか、
クラスを指定するためにパッケージの指定が必要になります。
パッケージの指定はクラスの宣言文の前に書きます。
packeage パッケージ名;
他のパッケージ内のクラスを利用する際にいちいちパッケージ名を書くのが面倒な場合には、
パッケージをimportすることでそれを省略したりも出来ます。
import パッケージ名.クラス名;
import パッケージ名.*;
J2SE5.0からは、staticなフィールドやメソッドをクラス名なしに利用できる
static import機能が追加されました。
static import パッケージ名.クラス名;
そうそう、staticなというか静的なフィールドやメソッドは
クラス名.フィールド名
クラス名.メソッド名()
のように利用するんですが、このクラス名部分が省略できると言うことですね。
995デフォルトの名無しさん:int 2ch =05/04/01(金) 21:46:34
11.継承
クラス宣言の際に、クラス名 extends クラス名と指定することで、クラスは継承することができます。
クラスを継承すると親クラスの機能が、まるで子クラスのものであるかのように利用できるようになります。
便利ですね。面倒なことになると面倒なので、Javaでは同じクラスが複数のクラスを継承することつまり多重継承は出来ません。

12.オーバーライド
親クラスのメソッドと全く同じ名前と引数を持つメソッドを子クラスで作成することをオーバーライドと言います。
親クラスの変数に代入された子クラスのインスタンスについてオーバーライドされたメソッドが呼ばれると、
それは子クラスのものになります。
また、親クラスと同じ型と名前を持つフィールドについても似たようなことが起こります。これは隠蔽と呼ばれます。

13.抽象クラス
何をするかは決めないけど、とりあえずメソッドをつくっておいて、継承先のクラスで利用させたいという場合には、
abstract識別子をつけることで抽象メソッドを利用することが出来ます。
abstract 型名 識別子(型名 識別子..);
抽象メソッドをつくったクラスは抽象クラスになり、やはり、abstract修飾子をつける必要があります。
abstract class クラス名
抽象クラスを継承したクラスは自身も抽象クラスになるか、全ての抽象メソッドを実装するかしなければなりません。

14.インタフェース
インタフェースはpublicな抽象メソッドしかない抽象クラスのようなものです。
interface 識別子
と宣言します。
インタフェースのフィールドはpublicでstaticでfinalである必要があり、
メソッドはpublicでabstractなものになります。
publicとabstract修飾子は指定しなくてもそうなってしまいます。
インタフェースはインタフェースを幾つでも継承できます。
クラスはインタフェースを幾つでも実装できます。インタフェースを実装するには以下のように指定します。
クラス名 implements インタフェース名
インタフェースを実装したクラスは全ての抽象メソッドを実装しなければなりません。
996デフォルトの名無しさん:int 2ch =05/04/01(金) 21:47:02
親クラスの変数には子クラスのインスタンスが代入でき抽象メソッドなどが呼ばれると、
それぞれのインスタンスの実際のクラスのメソッドが呼ばれることになります。
このことによってとりあえず、抽象化というオブジェクト指向言語としてのJavaの利点が利用できますね。
11-14のような機能を利用した効率的なクラス間関係の設計をデザインパターンと言います。
997デフォルトの名無しさん:int 2ch =05/04/01(金) 21:59:38
前に定数とか言いましたがあれは定数値でした。
フィールドにはfinal修飾子を付けることで、書き換えできなくすることができます。
またメソッドにfinal修飾子が付けられると、オーバーライドが出来なくなり、
クラスにfinal修飾子が付けられると、継承できなくなります。

15.内部クラス
クラスの内側には好きなところにクラスをつくることが出来ます。
これを内部クラスと呼びます。
細かいことは調べてください。

16.例外処理
主に入出力などの結果によって、通常の方法で防ぐことが難しいような間違いを例外と呼びます。
例外を処理し、制御が破綻してしまうことを防ぐために、例外処理があります。
try{
例外の発生する可能性のある処理
}
catch(例外を表すクラス名 識別子){
修復作業
}
こんな感じでやってください。
998デフォルトの名無しさん:int 2ch =05/04/01(金) 22:17:34
17.その他

this参照
自身のインスタンスを差すためにthisというキーワードがあります。
時々便利。
内部クラスから外部のクラスのインスタンスを差す場合には、
外部のクラス名.thisと使いましょう。

API
JavaのAPIは素敵です。
JDKをダウンロードする際には、リファレンスもダウンロードすることを忘れないようにしましょう。

java.langパッケージ
java.langパッケージは暗黙のうちにimportされます。
Javaの重要で基礎的なクラスが含まれているからです。
java.langパッケージのクラスについてはどんなものなのか知っておくといいと思います。

継承時の可視性や例外について
細かいことは察してください。

例外について
メソッド内で例外が発生する場合、処理を行わず、外に投げることが出来ます。
void method(int x) throws IOException{
}
投げられた例外はメソッドの呼び出し元へと飛んで行きます。

キャストについて
変換可能な型はキャストによって変換することができます。
(変換後の型名)変数名
例えば、doubleをintに変換する場合、以下のようにします。
double d = 0.25;
int i = (int)d;
999デフォルトの名無しさん:int 2ch =05/04/01(金) 22:39:39
リテラルについて
16進表記
整数の定数値は0xをつけることで16進数で表記することも出来ます。
int i = 0xe7;
整数の定数値はintとして解釈されます。longにしたい場合には、Lを付けます。
long l = 20L;
少数の定数値はdoubleとして解釈されます。floatにしたい場合にはfを付けます。

スレッドについて
スレッドはThreadクラスを継承するかRunnableインタフェースを実装することで実現できます。
そのクラスのstart()メソッドが呼ばれることで、run()メソッドの内容が別スレッドで処理されます。
スレッドを終了させるには、待つか、フラグを使います。
一時停止や、他のスレッドとのやり取りについては適当に考えてください。

文字列について
文字列は参照型で表現されますが、賢いJavaコンパイラによって、プリミティブのように扱うことが出来ます。
String s = "J2SE";
s += " " + 5.0;

無名の内部クラスについて
こんな感じで使えます。
new MyClass(){void test(){}}.test();

値渡しについて
Javaのメソッドには引数は値で渡されます。
呼び出し先で変数が変更されても、元の変数は変わりません。
参照先のインスタンスが変更されれば、変更されますが。

何か忘れている気がしますが、このあたりで終了とさせていただきます。
誰もいねぇ。
1000デフォルトの名無しさん:int 2ch =05/04/01(金) 22:41:21
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。