2 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:35
( 。3。) ぽろチャンが2GETですYOYOYO!!!
3 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:36
( .3.) 3GETですYO
4 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:36
( .3.) 4GETですYO
5 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:37
( .3.)5GETですYO
6 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:38
( .3.) 6GETですYO
7 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:38
( .3.) 7GETですYO
8 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:40
( .3.) 8GETですYO
9 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:41
( .3.) 9GETですYO
10 :
名無しさん@そうだ選挙に行こう :04/07/11 15:42
デタラメに並んだ、学籍番号(アルファベット2字+数字6字)、氏名、年齢(数字2桁)、学年(数字1桁)を、 学籍番号,氏名,年齢,学年の順番に","で区切ってコンソールに出力する方法を教えてください。 デタラメというのは、「EE030475,名無しさん,19,2」だったり「2,名無しさん,EE030475,19」だったりするってことです。
11 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:43
( .3.) 11GETですYO
12 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:43
( .3.) 12GETですYO
13 :
ぽろじょあ ◇niBmDfC40k :04/07/11 15:44
( .3.) 13GETですYO
14 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:45
( .3.) 13GETですYO
15 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:46
>>13 ( .3.)ヌェー これあげるYO!
ぽろじょあ#ぽろっぽ
16 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:48
( .3.) 16GETですYO
17 :
ぽろじょあ ◇niBmDfC40k :04/07/11 15:48
18 :
ぽろじょあ ◆1m8p8g/tU2 :04/07/11 15:49
poroppo?
19 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:50
∧||∧ ( ⌒ ヽ ∪ ノ タイミングが最悪だった・・・ ∪∪
21 :
名無しさん@そうだ選挙に行こう :04/07/11 15:52
22 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:53
( .3.)22GETですYO
23 :
ぽろじょあ ◆Q/8CwyxVqY :04/07/11 15:54
POROPPO?
test
(・3・) エェー この騒ぎは何なんだYO
26 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:56
( .3.)26GETですYO このまま埋めましょう
27 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:57
>>23 ( .3.)ナルェー そのまま「#ぽろっぽ」でOKだZE!
キミも今日から ぽろじょあ ◆niBmDfC40kだYO!
28 :
ぽろじょあ ◆niBmDfC40k :04/07/11 15:58
( .3.) ヌェー ボクがいっぱいいるYO
スレタイ間違えたのが全ての元凶
30 :
名無しさん@そうだ選挙に行こう :04/07/11 15:59
パズルつくりたいんですけどどうやっていいのかさっぱり判りません。 ピースがくっついてて、ずらして絵を合わせるやつです。 提出期限あと三日…タスケテクダサイorz
こっちはぼろじょあに保守させといて、 新規の質問は前スレでやった方がいいかもしれない
34 :
ぽろじょあ ◆niBmDfC40k :04/07/11 16:02
>>30 ( .3.) ヌェー 1週間ぐらい学校休めば、相手も忘れてくれるYO
俺が死ねばいいんだろ どうせ いいよ死ぬから
36 :
ぽろじょあ ◆niBmDfC40k :04/07/11 16:06
( .{{●}}.) ヌォー
37 :
ぽろじょあ ◆niBmDfC40k :04/07/11 16:06
∴∴
( .{{○})三三三三三三●))Д´)) ←
>>35 ∵∴
>>35 ( ゜3゜)ウェー 死んでも生きてもいいけど、おれに迷惑かけるな。
てす
( ゜3゜)ウェー、やっとできたよ。
41 :
ぼろじょあ ◆qCbqICeyTc :04/07/11 16:13
>>40 ( .3.)ノ ヌェー コングラチュレーションズだYO
42 :
ぽろじょあ ◆niBmDfC40k :04/07/11 16:14
(*.3.) マルァー ボクが間違えちゃったYO
・・・・・ 夏休み?
>>10 正規表現の使い方、よく分かってませんのでもっと良い方法があるかもしれません。
名前に数字が入っていると、名前の取得ができません^^;
import java.util.regex.*;
public class Q10 {
private static final Pattern NUMBER = Pattern.compile("(?:.+,)?(\\p{Alpha}{2}\\p{Digit}{6})(?:,.+)?");
private static final Pattern NAME = Pattern.compile("(?:.+,)?([^\\p{Digit}]+)(?:,.+)?");
private static final Pattern AGE = Pattern.compile("(?:.+,)?(\\p{Digit}{2})(?:,.+)?");
private static final Pattern GRADE = Pattern.compile("(?:.+,)?(\\p{Digit}{1})(?:,.+)?");
static void print(String input) {
StringBuffer ret = new StringBuffer();
Matcher m;
m = NUMBER.matcher(input);
ret.append(m.matches()?m.group(1):"不明").append(",");
m = NAME.matcher(input);
ret.append(m.matches()?m.group(1):"不明").append(",");
m = AGE.matcher(input);
ret.append(m.matches()?m.group(1):"不明").append(",");
m = GRADE.matcher(input);
ret.append(m.matches()?m.group(1):"不明");
System.out.println(ret);
}
public static void main(String[] args) {
print("EE030475,名無しさん,19,2");
print("2,名無しさん,EE030475,19");
}
}
46 :
ぽろじょあ ◆niBmDfC40k :04/07/11 17:22
( .3.) マルェー 前スレ1000逝ったYO
>>46 ( .3.)ウィー、マジスレになっちまうんじゃないかと思って、心配したYO
通報しますた。
>>48 ( .3.)ウェー、その前に投票しろYO
50 :
ぽろじょあ ◆niBmDfC40k :04/07/11 18:19
( .3.) エェー 今日ヒマだったのに不在者投票にしちゃったYO
学校の課題で魔方陣が出ました。でも全く説明がなくて・・・。 c 氏名 日付 program pr2 integer a,i,j,k,l parameter(n=3) !n は奇数 dimension a(n,n) print '(1x,a,i2)','pr2 魔方陣 n=',n print *,'学生番号 氏名’ do k=0,n-1 do l=0,n-1 i=(k+l)*2+(n+1)/2+2 j=l-k+(3*n+1)/2 a(mod((i-1),n)+1,mod((j-1),n+1)=n*k+l+1 end do end do do i=1,n print '(9i5)', (a(i,j), j=1,n) end do end これは3×3で、課題はこれを9×9で計算して提出しろ、というものなんですが、 どこをどう変えればいいのかわかりません。 助けてください。
>51 1. まずスレタイを2つ隣の部屋に聞こえるくらいの大声で3回読め。 2. ロープを買ってこい。 3. それでくぶ吊って氏ね
( .3.) マルェー くぶってなぁに?
九分 ほとんど全部ってことじゃない
「マルェー」って どういうイントネーションで発音するの?
>>55 ( ゜3゜)ウェー、「マ」のmはほとんど発音しない感じだYO
57 :
ぽろじょあ ◆niBmDfC40k :04/07/11 22:53
( .3.) ヌェー 「ゥアレー」に近いZE
58 :
ぼろじょあ ◆TUb1f0bpDc :04/07/12 00:29
test
自分でやれよ
62 :
ぽろじょあ ◆niBmDfC40k :04/07/12 13:18
(;.3.) ヌェー 昼休みだYO 暑くてたまンNEー
( ゜3゜)彡ウェー、今日は風が強くて涼しいよ
さすが群体だな
65 :
ぽろじょあ ◆niBmDfC40k :04/07/12 13:56
( .3.) エェー 今日はお昼休みのウキウキウォッチングが出来なかったから 軽く鬱だYO
フレームの左半分に地図があって、右半分に工事の種類が書いてあるチェックボックスがズラリと並んでます。 チェックボックスにチェックを入れ、更新すると工事を行った地点が反映される、というソースを解析中なんですが。 //テンプレートファイル読み込み String usrPath = req.getRequestURI(); System.out.println("usrPath before = " + usrPath); usrPath = usrPath.substring(1); usrPath = usrPath.substring(0, usrPath.indexOf("/")); System.out.println("usrPath after = " + usrPath); Document root = null; という部分なんですが、「この部分はどういう処理をしている、どういう役目をしている部分でしょうか?」 さっぱり分からないのでお教え願います。
>>66 ( ゜3゜) マルェー、さっぱりわからないなら、しかたないYO
68 :
ぽろじょあ ◆niBmDfC40k :04/07/12 14:19
( .3.) ヌェー 九九の出来ない子供に積分を教えるようなものだNE じゃあ仕事行って来るYO
>>66 System.out.println("usrPath before = " + usrPath);
と
System.out.println("usrPath after = " + usrPath);
があるんだから、自ずとわかるだろ。
結局、このスレで続けるの?
別スレ建てることもないだろ
>>66 処理内容は見たままだ。
/abcdefg/hijklmn → abcdefg という変換。
たぶん、フルパスのうちの最初のフォルダ名を調べてるんだろう。
これ以上の類推、何故その処理が必要かは無理。
フレームだのチェックボックスだの、目に見えることだけ書いたってムダ。
スレタイが "Java" から始まってるからスレ違いのアホが少なくなるかと思ってたんだけどな。
はやばやと
>>51 でぶちかましやがった。
結局「宿題」という一語に向かって突っ込んでくるのか。
import java.io* public class Sample52 { public static void main(String[] args) { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String[] lines = new String[10]; int count = ; try { while(ture) { System.out.print("input> "); String str = in.readLine(); if(str.equals("")) break; lines[count] = str; ++count; } for(int i = count-1; i >= 0; --i) { System.out.println(lines[i]); } } catch(Exception e) { System.out.println("error: " + e); } } } これを元にして、配列の最大収容数まできたら、もっと大きな配列を 用意しなおすプログラム それと配列に実数値を読み込み(0が入力されたら終わりとする)、 その中から平均より大きい値のみを選んで、入力に現れたのと同じ順番で 打ち出すプログラム 初歩的なことかもしれないですがよろしくおねがいします
import java.io* public class Sample52 { public static void main(String[] args) { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String[] lines = new String[10]; int count = 0; try { while(ture) { System.out.print("input> "); String str = in.readLine(); if(str.equals("")) break; lines[count] = str; ++count; } for(int i = count-1; i >= 0; --i) { System.out.println(lines[i]); } } catch(Exception e) { System.out.println("error: " + e); } } } ちょっと間違ってました
>>75 import java.io.*;
public class Sample52 {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] lines = new String[10];
int count = 0;
try {
while (true) {
System.out.print("input> ");
String str = in.readLine();
if (str.equals(""))
break;
lines[count++] = str;
if (count == lines.length) {
String[] temp = new String[lines.length * 2];
System.arraycopy(lines, 0, temp, 0, lines.length);
lines = temp;
}
}
for (int i = count - 1; i >= 0; --i)
System.out.println(lines[i]);
}
catch (Exception e) {
System.out.println("error: " + e);
}
}
}
import java.io.*; public class Sample52 { public static void main(String[] args) { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int[] lines = new int[10]; int count = 0, sum = 0; try { while (true) { System.out.print("input> "); int num = Integer.parseInt(in.readLine()); if(num==0) break; lines[count++] = num; sum += num; if (count == lines.length) { int[] temp = new int[lines.length * 2]; System.arraycopy(lines, 0, temp, 0, lines.length); lines = temp; } } for (int i = 0; i < count; i++) if(lines[i]>=(double)sum/count) System.out.println(lines[i]); } catch (Exception e) { System.out.println("error: " + e); e.printStackTrace(); } } }
>>75 String str = in.readLine();
if (str.equals("0"))
ありがとうございました
前スレにあったかもしれんが、 自動販売機をシミュレート(模擬)するクラスVendingMachineを作成しなさい。 お金を入れて、商品を排出する自動販売機をシミュレートする。シミュレートする機能は、お金の投入、商品の選択、商品とおつりの排出。また、管理機能として、商品の在庫、自動販売機内の現金が確認できるようにする。 扱う商品は、ジュース(110円)、お茶(150円)、ビール(250円)の三種類。最初は各商品が10個ずつ入っている。 扱う硬貨は、500円玉、100円玉、10円玉の三種類(50円玉を入れてもよいが、おつりの計算が少し複雑になる)。 最初は、100円玉10枚と、10円玉30枚がおつりのために、入っている。つまり、自販機の中の現金は1300円から始まる。 VendingMachinのクラスは極力ブラックボックス化する。 まず、「いらっしゃいませ」と表示する。 メニューを表示し、お金を入れてもらう。 商品が選択されたら、商品とおつりを排出し、自販機の中の状態を更新する。 import java.io.*; class kadai11 { public static void main(String[] args)n { VendingMachine vm=new VendingMachine(); for(;;) { vm.interact(); } } } class VendingMachine { //ここに埋める 金種まで考慮して釣り銭を計算する。 この問題をおながいします。
こんなの共通科目なのか? 大変だな
84 :
デフォルトの名無しさん :04/07/13 01:22
>>81 なんか見覚えがあるぞ。
それ、独習UMLにのっているクラス図作成サンプルだろ。
それをむりやりソースコード化しているだけじゃないのか?
いやユースケース図だったかな?
for(;;) { vm.interact(); } となっているということはThreadを使うと言うことか。 java.ioを使うと言うことはSystem.inでコンソールから選択したキーを読みとる形式か。 "1"を押すとコーラがでる、"2"を押すとウーロン茶がでる、みたいなものか?
>>81 ( ゜3゜)ウェー、Javaの課題で「{」が単独の行になってるのは、出題者がJava知らない可能性が高いYO
88 :
デフォルトの名無しさん :04/07/13 01:46
まず最初にやることはステートチャート図(状態遷移図)をかくことだろう。 お金をなにも入れていない状態を初期状態として。 10円をいれたらどうなろうだろうか? ここでジュースボタンをおしたらどうなるだろうか?(当然j金が足りないので何も反応しない) で、状態をどうやって表すかだ。 コインが0円状態が初期状態。 10円玉をいれた状態。、100円玉を入れた状態、500円玉を入れた状態、 あるいはそれらを組み合わせて入れた状態、あるいは途中でジュースか何かを買っておつりが いくらか返ってきた状態、これらをステートチャート図で表すってところだろうか。 ってな感じでできそうだな。 東大の大学一年の授業ですらこんな難しいのださないらしいし、 これは共通科目の授業ではない可能性があるな。 ソフトウェア工学の授業か何かか? それともいきなりレベルの高い問題を教授またはTAが出したとか?
>>87 GNUマンセーな人かも知れないな。
最近ではEclipseなどで{}の配置をコードフォーマッタによって
ああいうふうにすることもできるようになっている。
しかし、内容がオブジェクト指向チックに見えてしまうので
以外とJava知ってる人かも。
アプレット内で2種類のキャラクタークラスを作ってキャラクターの描画自体は各クラスに任せてます public class MyApplet extends Applet { MyApplet(){ Character1 c1 = new Character1(this); Character2 c2 = new Character2(this); } public void paint(Graphics g) { c1.draw(g); c2.draw(g); } で2種類のキャラクタークラスは自分の画像を読み込んで表示します。 public class Character1 { Image chara1; Applet applet; Character1(Applet applet) { this.applet = applet; chara1 = applet.getImage(applet.getDocumentBase, "chara1.gif"); } public void draw(Graphics g) { g.drawImage(chara1, 10, 10, applet); } Character2も読み込む画像が違うだけで同じです。 ここで問題が発生したのですが、最初はちゃんと表示されるのですが、ブラウザの更新をかけると、画像が表示されなくなることがあるのです。 そこでMediatrackerを使ってみたのですが、どうもうまくいかず、isErrorID()メソッドを使ったところエラーが発生しているようです。 画像の読み込みエラーが起こる原因として考えられることは何か無いでしょうか?ご教授お願いします。 ちなみにローカル環境で実行してるので通信上のエラーはないと思います。
91 :
デフォルトの名無しさん :04/07/13 02:21
>>90 java.applet.Applet#repaint()
java.awt.image.BufferedImage
92 :
デフォルトの名無しさん :04/07/13 02:33
public class Coin { //コイン情報をStateパターンで記述 toStirng(){//何か } } VendingMachine extends Thread { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Coin ten = new Coin(10); Coin hundred = new Coin(100); //略 public void run(){ if(in.readLine().equals(ten)){ if(もしまだ10円をつかっていないならば){ //10円投入処理を記録 } } else if(in.readLine().equals(hundred)){ if(もしまだ100円をつかっていないならば){ //100円投入処理を記録 } } else if(in.readLine().equals(fiveHundred)){ if(もしまだ500円をつかっていないならば){ //500円投入処理を記録 } } else if(in.readLine() == "ジュース"){ //金があるか釣り銭があるならジュースがでる //釣り銭処理メソッド・クラス実行 } else if(in.readLine() == "お茶"){ //金があるか釣り銭があるならジュースがでる //釣り銭処理メソッド・クラス実行 } else if(in.readLine() == "ビール"){ //金があるか釣り銭があるならジュースがでる //釣り銭処理メソッド・クラス実行 } else if(in.readLine() == "釣り銭"){ //釣り銭を下ろす。初期状態に戻る } } }
>>92 ifの所でreadLine()やると、上手くいかんぞ。
んにゃreadLine()の外部化が必要だな。 if文の外に出してreadLineしたものを変数に突っ込んでそれから if文かswitch文で判定だ。
>>89 > しかし、内容がオブジェクト指向チックに見えてしまうので
> 以外とJava知ってる人かも。
Javaもよく知らず、オブジェクト指向にあこがれている、でもよくわかってない先生が、自分では問題を作りきらないから、独習UMLのサンプルをそのまま使った、という説。
96 :
デフォルトの名無しさん :04/07/13 07:05
【問題】継承、カプセル化、ポリモアフィズムを使ったプログラムを作成しなさい。 題材は何でも構いません。但し、効果的にポリモアフィズムが使用されていること、拡張性があること。 という宿題だ出ているのですが、何か良い例はあえいませんか? ネット上に落ちてないか探しているのですが、良いのが見つかりません。 宜しくお願い致します。
( ゜3゜)ウェー、いっぱいネットに落ちてると思うYO
>>96 デザインパターンの本やサイトそのままつかえばいい
>>90 あんまりアプレットのコンストラクタ書かないよな
動いてるなら良いが
100 :
デフォルトの名無しさん :04/07/13 09:40
class A { } class B extends A { } 上のクラス階層で、次の文においてエラーになるのはどれか。 1) A a = new B(); 2) B b = new A(); また、その理由を継承の観点で述べよ。
102 :
デフォルトの名無しさん :04/07/13 09:42
66と同じプログラムです //表示制限の取得 if (conf.getValue(usrPath + ".basemap.disp.limit").equals("on")) { System.out.println("D*[BaseMapContents].doGet : limit on!"); String scaleStr = ""; if (scale <= 5000) scaleStr = "10k"; else if (scale <= 30000) scaleStr = "50k"; else scaleStr = "200k"; String topY = conf.getValue(usrPath + ".basemap" + scaleStr + ".limit.topY"); String rightX = conf.getValue(usrPath + ".basemap" + scaleStr + ".limit.rightX"); String bottomY = conf.getValue(usrPath + ".basemap" + scaleStr + ".limit.bottomY"); String leftX = conf.getValue(usrPath + ".basemap" + scaleStr + ".limit.leftX"); //制限値のチェック if (topY.equals("") || rightX.equals("") || bottomY.equals("") || leftX.equals("") ) { System.out.println("制限値不正"); } else { //中心座標のチェック System.out.println("cx -> " + cx); System.out.println("cy -> " + cy); if ((cx > Double.parseDouble(rightX)) || (cx < Double.parseDouble(leftX)) || (cy < Double.parseDouble(bottomY)) || (cy > Double.parseDouble(topY))) { try { res.setContentType("image/svg+xml"); GZIPOutputStream gzout = new GZIPOutputStream(res.getOutputStream()); ここまでのソースはどんな処理をしているのか教えてください。
104 :
デフォルトの名無しさん :04/07/13 09:49
>>103 まず最初にconfがどのクラスのオブジェクトなのかわからないことには
>>103 あのな、断片だけ拾ってきてもしょうがないんだよ。
全体を俯瞰しないとなんともいえねっつの。
if も try〜catch も、幾つもが中途半端じゃねーか。そんな引用の仕方があるかぁぼけぇ。
・・・どーもサーブレットくさいのでそういう前提で類推するが、
地図のベースになる画像(工事箇所のデータに関わらず普遍的な地形や道路などのデータ)が縮尺によって数種類用意されており、
GET 時に渡されたパラメータから判断された scale からどれを使うか決める。
conf の位置付けが今ひとつ分からないが、
GET/POST ともに、ユーザがおかしなパラメータ形式を与えることも可能なので、
その点でおかしなことをされてないかチェックし("制限値不正" の前の if)、
中心とする座標が地図データの一端にでもひっかかってれば (cx 云々のあたり)、
地図画像の出力をはじめる。
最後の二行は、出力ファイルの MIME を SVG であると予告し(これは wwwサービス経由でユーザに通知される)、
GZIP 圧縮された SVG 画像(GZIP は SVG の標準圧縮手法)を出力しようとしている。
ちなみに SVG は xml で記述されたベクタ画像形式。ベクタ画像とは座標値データからなる図形の集合。
×普遍的な
○不変な
>>66 の Document (なんの意味があってこの最後の行も持ってきたんだ?) は
javax.swing.text.Document じゃなくて org.w3c.dom.Document なんだろうなぁたぶん。
趣旨が違うけど答えてやるよ。でもせめて { } 単位で貼ってくれよな。
107 :
デフォルトの名無しさん :04/07/13 10:33
abstract class A { void whoami() { print(); } abstract void print(); } class B extends A { void print() { System.out.println("B"); } } class Test extends B { void print() { System.out.println("Test"); } public static void main( String[] args ) { new Test().whoami(); } } コンパイルして実行すると出力は Test なんですが 経緯の解説お願いします。
書いてあるとおり。
public static void main( String[] args ) { //ここからはじまる new Test() // Test のインスタンス作る whoami(); //whoami メソッドを呼ぶ //Test には定義されてないが B を継承しているので B の方を見る //B にも定義されてないが B は A を継承しているので A を探す void whoami() { //A に whoami メソッドがあったので実行する print(); // print メソッドを呼ぶ void print() { //Test に定義されているので Test の print メソッドを呼ぶ System.out.println("Test"); //表示される 「何のクラスのインスタンスか」によって、 何重にもオーバーライドされているうちのどのメソッドが呼ばれるか決まる。 (static メソッドとかフィールドとか、も少しややこしい例もあるが)
110 :
デフォルトの名無しさん :04/07/13 10:59
111 :
デフォルトの名無しさん :04/07/13 11:03
class Test { private String name; Test( String name ) { this.name = name; } void ping( Test test ) { System.out.println( name ); test.ping( this ); } public static void main( String[] args ) { Test x = new Test("x"); Test y = new Test("y"); x.ping( y ); } } 結果、xyxyxyxyxy...でStackOverflowErrorになります。 解説お願いします。
112 :
デフォルトの名無しさん :04/07/13 11:03
c言語は答えてくれますか?
113 :
ぽろじょあ ◆niBmDfC40k :04/07/13 11:16
( .3.) ヌェー スレ検索ぐらいしろYO
>>111 そりゃどっかでif文でbreakする機構をつくらなければ
永久ループになるだろう。
ping()メソッドが再帰呼び出ししているんだからな。
pingメソッド無いにif文で呼び出しているpingを制御しろ。
カウンタでもつけてカウンタがある値に達したら終了するか
キーリスナーからの反応があったら終了するとかに汁
>>103 のことで質問です。CONFに下記の定義がなされていたのですが、
その場合はどう変わりますか?サーブレットの対応ソースなんですが。
public class BaseMapContents extends HttpServlet {
//SystemConfig conf = new SystemConfig();
static SystemConfig conf;
static Document templ;
static Document temp;
static Document uLay;
static File adobeFile;
SVGUtil sutil = new SVGUtil();
教えて君で申し訳ありません。
>>111 インスタンスが二つできているが、それらが交互にメソッドを呼んでいる。
メソッドをひとつ呼ぶ(以外にもいろいろタイミングがあるが)たびに、
VM は、どこまで処理を行ったか、などの情報をスタックというところにためる。
延々メソッドが呼ばれて、一度も「メソッドが完了した」という時点に達しないので、
スタックがぱんぱんになっていく。
VM もしくは OS やマシンによって定まるところのスタック容量に到ってしまい、
VM は Error を出してしまう。
>>116 SystemConfig はたぶんそのソースの開発者が
勝手に作ったかどっかから持ってきたクラスなので、こちとらわかりっこない。
>>99 すみません書き間違えました。
コンストラクタじゃなくinit()内でちゃんとインスタンス化してます
アプレットのpaint()メソッドってだいたい何msぐらい毎に呼び出されてるのでしょうか? 呼び出される頻度を教えてくださいm(_ _)m
>>122 一定時間毎に呼ばれるわけじゃない。
再描画の必要があるときだけ呼ばれる。
>123 答えて頂いてありがとうございます そこでさらにお聞きしたいのですが、その再描画の必要性の判断はどのような基準でされるのですか? あと、paint()メソッドをスレッドのran()メソッドのように使っているプログラムをたまに見かけますが、 そのような使い方は間違っているのでしょうか?
>>124 主に、
1) そのコンポーネントの上に他のコンポーネントが重なり、また退けられたとき
2) TextArea の文字列が変わった、List の構成要素が変わったなど
3) その他諸々プログラマによってしかけられた repaint() が呼ばれたあと
(repaint メソッド内では行われない。参考文献は多いので探すこと)
1)、2) の例は、再描画しなきゃユーザにとって不便なんだから当たり前。
3) もそう思ってプログラマがしかけるんだから当たり前。
(2) もつまりは 3) と同じで、repaint() などで解決している)
>あと、paint()メソッドをスレッドのran()メソッド
run のことか。「〜のように」の意味がサッパリ分からないが、
「間違っている」と答えておくか。
画像インスタンスを用意し、表示内容をことあるごとにそこに更新し、
paint メソッドではその画像をペロンと表示するだけ、てのが、
メモリの使い方が贅沢ではあるが最も理想的な実装。swing は基本的にそうなってる。
例えば・・・星が100,000個表示されるがその位置は滅多に変わらない、なんてなとき。
我がウィンドウの前を別アプリケーションのダイアログがちょろちょろしたとしても、
再描画の度に100,000ヶ所描画しなくて済む。
スレ違いだからこれ以上は相談スレに行ってね。
たぶん
>>122 は時間で変化する動的な表示させたいんでしょう。
それなら、タイマーを使って一定時間ごとにイベントを発生させ、
イベントハンドラの中でAppletのrepaint()を呼んでやればいい。
具体的な方法は何通りかある。調べてくれ。
キーワードはTimer
>swing は基本的にそうなってる。 あ、これは全部が全部じゃないんだったかな? 興味があったら自分で調べてくれ。 swing のそのものはきっと、ソースとか見ても複雑だから参考にならんだろうけど。 "ダブルバッファリング" ちうやっちゃ。
swingではコンポーネントのsetDoubleBafferred(true)を呼べば それでダブルバッファリングしてくれる。
各自の興味がある分野(ゲームでも何でもよい)のプログラムを作成することを考える. その場合,多相性を利用するとうまくいきそうな部分は何であるかについて, 具体的な例を交えて考察せよ. さらに,それを説明するためのプログラムをJavaで作成せよ. おねがいします。
import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; import java.awt.*; public class GUI extends JFrame{ public static void main(String[] args){ GUI test = new GUI("GUITest"); test.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); test.setVisible(true); }
public GUI(String title){ setTitle(title); setBounds(0,0,500,500); JTextArea area1 = new JTextArea(10,7); JTextArea area2 = new JTextArea(5,7); JTextArea area3 = new JTextArea(5,7); JLabel label1 = new JLabel("予約"); JLabel label2 = new JLabel("キャンセル"); JLabel label3 = new JLabel("追加予定"); JLabel label4 = new JLabel("現在飛行中"); JTextField tf1 = new JTextField(10); JTextField tf2 = new JTextField(10); JButton button1 = new JButton("予約",); JButton button2 = new JButton("キャンセル"); GridBagLayout gb = new GridBagLayout(); getContentPane().setLayout(gb); GridBagConstraints c = new GridBagConstraints();
c.weightx = 0; c.weighty = 0; c.anchor = GridBagConstraints.CENTER; c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.gridheight = 6; gb.setConstraints(area1, c); c.gridx = 3; c.gridy = 4; c.gridheight = 2; c.gridwidth = 2; gb.setConstraints(area2,c); c.gridx = 5; c.gridy = 4; c.gridheight = 2; c.gridwidth = 2; gb.setConstraints(area3,c);
c.gridx = 2; c.gridy = 2; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(label1,c); c.gridx = 2; c.gridy = 3; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(label2,c); c.gridx = 3; c.gridy = 4; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(label3,c); c.gridx = 5; c.gridy = 4; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(label4,c);
c.gridx = 3; c.gridy = 2; c.gridheight = 1; c.gridwidth = 2; gb.setConstraints(tf1,c); c.gridx = 3; c.gridy = 3; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(tf2,c); c.gridx = 5; c.gridy = 2; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(button1,c); c.gridx = 5; c.gridy = 3; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(button2,c);
ラウンジって知ってる?
c.gridx = 3; c.gridy = 2; c.gridheight = 1; c.gridwidth = 2; gb.setConstraints(tf1,c); c.gridx = 3; c.gridy = 3; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(tf2,c); c.gridx = 5; c.gridy = 2; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(button1,c); c.gridx = 5; c.gridy = 3; c.gridheight = 1; c.gridwidth = 1; gb.setConstraints(button2,c);
getContentPane().add(area1); getContentPane().add(area2); getContentPane().add(area3); getContentPane().add(label1); getContentPane().add(label2); getContentPane().add(label3); getContentPane().add(label4); getContentPane().add(tf1); getContentPane().add(tf2); getContentPane().add(button1); getContentPane().add(button2); } }
おいおい…
このプログラムで area1に文字列(飛行機の便名)をいくつか列挙して tf1に入れた文字列(飛行機の便名)をbutton1を押すとarea2に文字列が入るようにして tf2に入れた文字列(飛行機の便名)をbutton2を押すとarea2から削除される ようにしたいのですが、actionの使い方がいまいちわからずできません。 これをできるようにしてください。お願いします。 途中重複してしまいもうしわけございません。 長々と書いてしまいましたが、お願いします。
GridBagLayout について聞かれるかと思って身構えていたのに、質問それかよw
すみません。 GridBagLayoutもいまいちよくわかってないんですけど、なんとか不細工ですけどこの形にできたのでいいかと。。。 それで、アクションが。。。
143 :
デフォルトの名無しさん :04/07/13 15:39
F:>java CountA asdfasdfa と、適当なアルファベットの羅列を入力したとき、 a:*** d:** f:** s:** このようにアルファベット順に表示して、 各文字の個数をアスタリスクで表示するモノを… よろしくおながいします。
>>139 >area2から削除される
テキストエリアってのは、あんまりそれ単体で「削除」の表現をサポートするようなもんではないぞ
そういうプログラム見たことあるか? 滅多にないだろ? JList かなんか使えばいいのに。
あと、JTextArea にせよ JList にせよ JScrollPane で包まないといかんよ。
とりあえず俺的には
new JButton(new AddAction(tf1, area2));
new JButton(new RemoveAction(tf2, area2));
class AddAction extends AbstractAction {
//それなりのコンストラクタとメンバと getValue オーバーライド
public void actionPerformed(ActionEvent ev) {
dest.append(src.getText() + "\n");
}
}
class RemoveAction extends AbstractAction {
//それなりのコンストラクタとメンバと getValue オーバーライド
public void actionPerformed(ActionEvent ev) {
String name = src.gettext();
String txt = dest.getTex();
int j = txt.indexOf(name);
if (j != -1) {
dest.setText(txt.substring(0, j) + txt.substring(j + name.length() + 1));
}
}
}
納得いかない実装だけど前提からして好みじゃないからしょうがないな。
便名の集合を別途クラスとして立てて (JList なら ListModel にするといい)、
それにたいして add/remove して、その結果がコンポーネントに反映されるようにするといい。
それと、ツール使わないならレイアウトに凝るのはいっちゃん最後にしたほうがいい。
設計が先にしっかりしてないと、書き直しの時ごちゃごちゃして困る。
>>143 public class CountA {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("単語指定せよ");
System.exit(-1);
}
String word = args[0];
int[] counts = new int[26];
for (int i=0; i<counts.length; i++) {
counts[i] = 0; //要らないけど行儀よく初期化
}
for (int p=0; p<word.length(); p++) {
int i = word.charAt(p) - 'a';
if ((i >= 0) && (i < counts.length)) {
counts[i]++;
}
}
for (int i=0; i<counts.length; i++) {
if (counts[i] != 0) {
char c = (char)('a' + i);
System.out.print(c + ":");
for (int j=0; j<counts[i]; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
}
小文字限定。
>>143 Cの宿題スレでも同じ問題見たような気がする。
同じ学校なのかな?
>>129 最初の3行、できるとこまで自分なりにやれよ。
4行目を実行するにあたって荷が勝ちすぎない程度に題材を絞って。
>>143 import java.util.*;
class CountA{
public static void main(String[] args){
String word = (args.length == 0) ? "" : args[0];
Map w = new TreeMap();
for(int i = 0; i < word.length(); ++i){
String ch = word.substring(i, i + 1);
int num = 0;
if(w.containsKey(ch)){
num = ((Integer)w.get(w)).intValue();
}
w.put(ch, new Integer(num + 1));
}
for(Iterator i = w.entrySet().iterator(); i.hasNext(); ){
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey().toString() + ":");
for(int j = 0; j < ((Integer)me.getValue()).intValue(); ++j) System.out.print("*");
System.out.println();
}
}
}
149 :
デフォルトの名無しさん :04/07/13 16:13
>>145 > System.exit(-1);
この部分を
throw new Error("単語指定せよ");
または
throw new Exception("単語指定せよ");
として
> for (int i=0; i<counts.length; i++) {
> counts[i] = 0; //要らないけど行儀よく初期化
> }
この部分を
java.util.Arrays.fill(counts, 0);
としたくなるのは漏れだけですか?
>>130 に挑戦しているんだけど難しいなぁ。
JTextArea をクリアして、新たに書き直すのがなぜかむずい。
Document駆使しなくちゃ無理なのか?
System.out.println("[BaseMapContents].doGet : File get and parse start");
// proxyサーバを使用するかどうかの判定
String useProxy = "off";
String proxyHost = null;
int proxyPort = 0;
useProxy = conf.getValue("service.use.proxy");
if(useProxy != null && useProxy.equals("on")){
proxyHost = conf.getValue("service.proxy.host");
proxyPort = Integer.parseInt(conf.getValue("service.proxy.port"));
}
// SVGZ,jamarファイルを各Serverから取得
Thread[] thd = new Thread[urls.length];
SVGRequestThread[] rth = new SVGRequestThread[urls.length];
for(int i=0;i<urls.length;i++){
System.out.println("url[" + i + "] = " + urls[i]);
// MapServiceサーバへのリクエストにプロキシを使用するか
rth[i] = new SVGRequestThread(urls[i] + params[i].toString());
System.out.println("params[i]" + params[i].toString());
if(i == 0 && useProxy.equals("on")){
System.out.println("D*[BaseMapContents].doGet: use proxy host["+proxyHost+":"+proxyPort+"]");
rth[0].setProxy(proxyHost, proxyPort);
}
thd[i] = new Thread(rth[i]);
>>103 の、少し飛ばした後の続きです。処理内容と「RTH」について教えてください
コマンドライン引数を受け取って、それが one ならスペイン語の uno 、 two なら dos ・・・と変換するプログラムを作成せよ。 変換処理は静的メソッドを用いること。 というプログラムなんですが、コンパイル・実行可ですが 引数をoneにしてもInvalid argumentのメッセージが帰ってきます。。。 どうぞ宜しくお願いします。 public class OneToUno { String s; OneToUno(String ss) { s = ss; } static void conversion(String s) { if( s == "one" ) System.out.println(s + " is \"uno\""); else if( s == "two" ) System.out.println(s + " is \"dos\""); else if( s == "three" ) System.out.println(s + " is \"tres\""); else if( s == "four" ) System.out.println(s + " is \"quatro\""); else if( s == "five" ) System.out.println(s + " is \"cinco\""); else System.out.println("Invalid argument."); } } class OneToUnoMain { public static void main(String[] args) { OneToUno otu = new OneToUno(args[0]); OneToUno.conversion(otu.s); } }
>>152 もう、読んだままだな。
ある URL で表されるリソースから SVG データを取り出すのであろう。
必要ならプロクシを介するのでサーバとポートの設定をする。
名前が "〜Thread" となっているが、Thread の引数になっているから、
実際は Runnable の実装なだけかもしれない (Thread も Runnable だけど)。
SVGRequestThread の中身がなきゃこれ以上分かるわけない。
もっとロジックっぽいとこ貼ってくれよ。といってもどこがそうだか分かるわけもないか。
映画のワンシーンだけ見せられても、そのシーンの台詞を翻訳するぐらいはできるが、
映画全体のあらすじや、登場人物の位置付け、全体に対してそのシーンが担う役割までは説明できない。できっこない。
そういう話なんだが。やったとしても憶測。ほとんど口から出任せ。
新人研修で「読んで来い」って言われて読んでるの?
>>153 s == "one"の部分をsequals( "one" )と言った風に全部変えろ
>>153 == は同じインスタンスかどうかを判定する。
実行時にコマンドラインからやってくるものと、
ソースにはじめから書いてあるもの(リテラルという)は、違うインスタンス。だから false になる。
文字の並び方が同じかどうか調べるには、equals メソッドを使うこと。
例:
new String("one") == new String("one") // false
new String("one").equals(new String("one")) // true
new String("one").equals("one") //true
"one".equals("one") // true
"one" == "one" // true. まったく同じリテラルは、
//コンパイル・実行時に効率化が図られ、同じインスタンスを表すから。
なお、オブジェクト型の変数で == を用いるメリットはあんまりない。
各クラスの equals メソッドの中では、最低限 == 判定もやってて、
かつ上記の例のように「中身」も同じかどうかの判定をする、ってのが常。
だからとりあえず equals 呼んどけばいい。
== は「メソッド呼ぶわけじゃないから計算がはやい」ってなくらいのもの。
いかにもMapをつかってくれという問題だがな。 import java.util.HashMap; public class OneToUno { HashMap hashMap = new HashMap(); public OneToUno() { hashMap.put("one", "uno"); hashMap.put("two", "dos"); hashMap.put("three", "tres"); hashMap.put("four", "quatro"); hashMap.put("five", "cinco"); } public void conversion(String s) { String ans = (String)hashMap.get(s); if(ans == null) System.out.println("Invalid argument."); else System.out.println(s + " is \"" + ans + "\""); } public static void main(String[] args) { OneToUno otu = new OneToUno(); otu.conversion(args[0]); } }
いろいろありがとうございました。 runのスペルを間違ってしまうなんて情けないです…。 paint()の呼び出し頻度を尋ねたかといいますと、 うまく表せなかったのですが、先ほど書きましたように、run()メソッド内で行うべきであるような 内容を、paint()メソッド内に書き込んで、一定間隔(?)で実行させてるようなソースを見かけたので そういうやり方もあるのかと思い質問しました。
>>159 paintが一定間隔で呼ばれるような仕組みを自分で作れってこった。
161 :
ぽろじょあ ◆niBmDfC40k :04/07/13 22:30
( .3.) ヌェー 梅雨明け宣言だYO
>>155 ,
>>156 ,
>>158 どうもありがとうございます。
特に
>>156 さんの回答は明快で非常に参考になりました。
まだHashもMapも勉強してないので
>>158 さんの方法は無理ぽです。。。
ありがとうございました。
またよろしくお願いします。
163 :
デフォルトの名無しさん :04/07/13 23:21
import java.io.*; public class mondai { public static void main(String[] args) throws Exception { BufferedReadwe in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("input> "); int i = (new Integer(in.readLine())).intValue(); while(i > 1) { i = i - 2; } if (i == 0) { System.out.println("Even."); } else { System.out.println("Odd."); } } } これを利用して 正の整数値x、yを入力し、「乗算演算子*を使わないで」xとyの積を計算し 出力させるプログラム よろしくおねがいします
>>163 import java.io.*;
import java.math.*;
public class Mondai {
public static void main(String[] args) throws Exception {
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("input x> ");
BigInteger x = new BigInteger(in.readLine());
System.out.print("input y> ");
BigInteger y = new BigInteger(in.readLine());
System.out.println("result:" + x.multiply(y));
}
}
165 :
デフォルトの名無しさん :04/07/13 23:39
import java.io.*; public class reidai { public static void main(String[] args) throws Exception { BufferedReadwe in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("x> "); int x = (new Integer(in.readLine())).intValue(); System.out.print("y> "); int y = (new Integer(in.readLine())).intValue(); System.out.print("z> "); int z = (new Integer(in.readLine())).intValue(); if(x > y) { if(x > z) { System.out.println("largest value = " + x); } else { System.out.println("largest value = " + z);} } else { if(y > z) { System.out.println("largest value = " + y); } else { System.out.println("largest value = " + z);}}} } xとyの中で、大きい方の値を持つint型のメソッドmaxを作成し、それを用いた プログラムに変更しなさい(等しい場合は、先の引数値とする) メソッドの定義記述は int max(int x,int y){} お願いします
>>165 > 大きい方の値を持つint型のメソッドmaxを作成し
問題が不適切です。
ということを指摘するのが正解だとみた。 問題は適当に解釈しちゃだめだからな。
>>163 > int i = (new Integer(in.readLine())).intValue();
こんなん利用したくないよな。
parseInt使えよ、と。
すみません。。切羽詰っちゃってるので 連続投稿します;; import java.io.*; public class toi { public static void main(String[] args) throws Exception { BufferedReadwe in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("x> "); int x = (new Integer(in.readLine())).intValue(); int y = x - 1; boolean sose = true; while(y > 1) { if(x % y ==0) {sosu = false;} y = y - 1; } System.out.println("sosu: " + sosu); } } これを利用して xが素数ならば、「素数です」そうでなければ「素数ではありません」と 画面に出力するメソッドsosuを作成し、それを用いたプログラムに変更しなさい メソッドの定義記述は void sosu(int x){}
import java.io.*; public class toi2 { public static void main(String[] args) throws Exception { BufferedReadwe in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("x> "); double x = (new Double(in.readLine())).doubleValue(); double a = 0.0; double b = x + 1.0; while(b - a > 0.0000001) { double c = 0.5 * (a + b); if(c*c < x) { a = c; } else { b = c; } } System.out.println("value = " + a); } } Mathクラスのメソッドを用いず、xの平方根を実数型で持つメソッドMysqrtを作成し、 それを用いたプログラムに変更しなさい メソッドの定義記述は double Mysqrt(int x){}
>>169 import java.io.*;
public class Sosu {
public static void main(String[] args) throws Exception {
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("x> ");
sosu(Integer.parseInt(in.readLine()));
}
static void sosu(int x){
int y = x - 1;
for(; y > 1 && x % y != 0; --y);
String msg = "素数" + ((x % y) == 0 && y > 1 ? "ではありません" : "です");
System.out.println(msg);
}
}
ちなみに、ここの回答を利用する場合には、先生に 「あなたはもう少しJavaを勉強してください」 と付け加えること。
>>172 > xの平方根を実数型で持つメソッドMysqrtを作成し
問題が不適切です。
という指摘が正解のはずだ。
import java.io.*; public class toi2 { public static void main(String[] args) throws Exception { Mysqrt(0); } double Mysqrt(int x){ BufferedReadwe in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("x> "); double x = (new Double(in.readLine())).doubleValue(); double a = 0.0; double b = x + 1.0; while(b - a > 0.0000001) { double c = 0.5 * (a + b); if(c*c < x) { a = c; } else { b = c; } } System.out.println("value = " + a); } return 0; } Mysqrtの中に平方根持つからOKのはずだ。
しかし、明らかにJavaわかってない出題だなぁ。 やらされるほうも可哀想だ。
命名規則すら知らない時点でDQN教官。 東大にもいて困る。
出題がこれだから、授業内容もおそらくダメダメで、これではプログラムがどういうことかわかるはずがない。
質問なんですが まずボタンを配置しまして、そのボタンをクリックすると それまでイベントが全て初期状態にもどる、なんてのをやりたいんですが どうすればよいでしょう? ちなみに僕は物凄い初心者です 質問の意味がわからなかったらすみません よろしくお願いします
>>180 > イベントが全て初期状態にもどる
わけわからん。
ボタンがどうの、はNetBeans使ってやれ。
>>181 ああ、やっぱわけ分かりませんか
何かが動いていて、その動きが最初からやり直しになるっていう・・・・
なんか日本語下手ですいません
NetBeansですね、調べてみます
レスありがとうございました
>>182 > 何かが動いていて、その動きが最初からやり直しになるっていう・・・・
そんなもん、やることによる。
ボタンの処理とかActionListerとか、自力で書くな。
ツールがやってくれる。
184 :
デフォルトの名無しさん :04/07/14 01:13
>>153 > コマンドライン引数を受け取って、それが one ならスペイン語の uno 、
> two なら dos ・・・と変換するプログラムを作成せよ。
> 変換処理は静的メソッドを用いること。
それ「独習Java」まんまの問題じゃないか。
>>172 import java.io.*;
public class Toi2 {
public static void main(String[] args) throws Exception {
BufferedReadwe in =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("x> ");
int x = Integer.parseInt(in.readLine());
System.out.println("value = " + Mysqrt(x));
}
double Mysqrt(int x){
return StrictMath.sqrt(x);
}
}
これが一番シンプルだな。たぶん正解。
皆様ありがとうございました なんとかんりそうです;; 助かりました
>>182 やり直す前に、その「動き」を完結させるとこまで行ってるのか?
それが先だろ
それができたら、やり直せるような設計かどうか検討して、
必要ならなおして、そのあとで「やり直ししろ」の部分を設計
>>154 ありがとうございました。
「このソースを解析しろ」との命令が下っていまして。知識については名前どおりなものですから
何がなんだかサッパリです。
189 :
デフォルトの名無しさん :04/07/14 09:52
3つの数字(int型)を入力し、大きい順に表示する プログラムを作りなさい。ただし、途中で必ずfor文を使うこと。 すいません、これ教えてください!!
> コマンドライン引数を受け取って、それが one ならスペイン語の uno 、
> two なら dos ・・・と変換するプログラムを作成せよ。
> 変換処理は静的メソッドを用いること。
それ「独習Java」まんまの問題じゃないか。
>>184 そうです。独習Javaの課題です。
>>189 int size = 3;
ArrayList list = new ArrayList();
BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
for ( int i = 0; i < size; i++ ) {
System.out.print("number"+i+":");
String num = reader.readLine();
list.add( new Integer( num ) );
}
Collections.sort( list );
Collections.reverse( list );
for ( int i = 0; i < size; i++ ) {
System.out.println( list.get( i ) );
}
どもです!助かりまっす!
「式」を表す抽象クラスに,次のクラスを追加せよ. 乗算演算子を表すクラス. 除算演算子を表すクラス. 階乗(n! = 1 * 2 * ... n)演算子を表すクラス. ただし,不正な計算(ゼロ除算や負の階乗)を含む式については, エラーメッセージを表示して実行を停止するようにせよ. // 「式」を表す抽象クラス abstract class Exp { abstract public int eval(); // 式の値を求めるメソッド } // 整定数 class Con extends Exp { private int value; public Con(int value) { this.value = value; } public int eval() { return value; } } // 単項演算子のマイナス class Neg extends Exp { private Exp e; public Neg(Exp e) { this.e = e; } public int eval() { return -e.eval(); } }
// 加算 class Add extends Exp { private Exp e1, e2; public Add(Exp e1, Exp e2) { this.e1 = e1; this.e2 = e2; } public int eval() { return e1.eval() + e2.eval(); } } // 減算 class Sub extends Exp { private Exp e1, e2; public Sub(Exp e1, Exp e2) { this.e1 = e1; this.e2 = e2; } public int eval() { return e1.eval() - e2.eval(); } }
「式」を表す抽象クラスで定義した各クラスでは,toString メソッドが定義されていない. 読みやすい形で式を表示できるように、「式」を表す抽象クラス及び追加した各クラスで, toString メソッドを定義せよ.たとえば,次のようなテストプログラムに対して // テストプログラム class Test1 { public static void main(String[] args) { // (1+2) + 3 Exp e1 = new Add(new Add(new Con(1), new Con(2)), new Con(3)); System.out.println(e1 + " = " + e1.eval()); // -(1-2)-3 Exp e2 = new Sub( new Neg( new Sub( new Con(1), new Con(2))), new Con(3)); System.out.println(e2 + " = " + e2.eval()); // (2 + 3)! Exp e3 = new Fact(new Add(new Con(2), new Con(3))); System.out.println(e3 + " = " + e3.eval()); // (5 / (3 - 3)) Exp e4 = new Div(new Con(5), new Sub(new Con(3), new Con(3))); System.out.println(e4 + " = " + e4.eval()); } }
次のような結果が得られるようにせよ. ((1 + 2) + 3) = 6 (-(1 - 2) - 3) = -2 (2 + 3)! = 120 Error: zero division
197 :
デフォルトの名無しさん :04/07/14 15:48
とりあえず Div 。出力結果を見る限り・・・これでいいのかなぁ。 それとも演算実行時かなぁ。わからん。 class Div extends Exp { private Exp e1, e2; public Div(Exp e1, Exp e2) { if (e2.eval() == 0) { System.err.println("Error: zero division"); System.exit(0); } this.e1 = e1; this.e2 = e2; } public int eval() { return e1.eval()/e2.eval(); } public String toString() { return "(" + e1 + " / " + e2 + ")"; } }
Fact。 class Fact extends Exp { private Exp e1; public Fact(Exp e1) { this.e1 = e1; if (e1.eval() < 0) { System.err.println("Error: 負の階乗"); System.exit(0); } } public int eval() { int f = 1; for (int i=2; i<=e1.eval(); i++) { f *= i; } return f; } public String toString() { return e1 + "!"; } } Con, Neg, Add, Sub の toString は、Div の例を参考にして自分でやってみそ。 ただし Con のメンバは int なので、"" + value などとして String に変換すること。
年月を入力させ、指定した月のカレンダーを表示するプログラムを作成せよ。 というのをお願いします。
>>200 BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
System.out.print( "年を入力しる:" );
int year = Integer.parseInt( reader.readLine() );
System.out.print( "月も入力しる:");
int month = Integer.parseInt( reader.readLine() )-1;
Calendar cal = Calendar.getInstance();
cal.set( Calendar.YEAR, year );
cal.set( Calendar.MONTH, month );
cal.set( Calendar.DAY_OF_MONTH, 1 );
System.out.println( year + "年" + (month+1) +"月" );
System.out.println( "Su Mo Tu We Th Fr St" );
Calendar c = Calendar.getInstance();
c.set( Calendar.DAY_OF_WEEK, Calendar.SUNDAY );
for ( ; c.get( Calendar.DAY_OF_WEEK ) != cal.get( Calendar.DAY_OF_WEEK ); c.add( Calendar.DAY_OF_WEEK, 1 ) ) {
System.out.print( " " );
}
while ( cal.get( Calendar.MONTH ) == month ) {
if ( cal.get( Calendar.DAY_OF_WEEK ) == Calendar.SUNDAY ) {
System.out.println();
}
if ( cal.get( Calendar.DAY_OF_MONTH ) < 10 ) {
System.out.print( " " );
}
System.out.print( cal.get( Calendar.DAY_OF_MONTH ) );
System.out.print( " " );
cal.add( Calendar.DAY_OF_MONTH, 1 );
}
System.out.println();
ハノイの塔の解法を表示するプログラムを作成しなさい。 ハノイの塔とは、一番左の棒をA、真ん中の棒をB、一番右の棒をCとし、Aにはn枚の円盤が置いてあり、 棒Bを利用して全ての円盤をAからCに移すパズルである。 ・一回に一枚の円盤しか動かしてはいけない。 ・移動の途中で円盤の大小を逆に積んではいけない。常に大きい方の円盤が下になるようにする。 ・棒以外のところに円盤を置いてはいけない。 これをお願いします。
204 :
デフォルトの名無しさん :04/07/15 00:21
ハノイって、普通にプログラムすると再帰になるから、Javaだと スタック消費しまくっちゃうな。まあループにすりゃいいんだけど。 出題したセンセイは、綺麗な再帰で書かせたい? それとも、ベタに状態変数変更しながらループで書かせたい? メリットデメリットの説明くっつけて両方書いたら点数上がるかもよ。
n枚の円盤をBに移すとき、(n-1)枚の円盤を移動する方法が分かっていたとすれば、(n-1)枚の円盤をAからCに移動しておいて、n番目の円盤をAからBに移動し、 Cにおいてあった(n-1)枚の円盤をBに移せばよい。 nが1の時には、そのままその円盤を移動すればよい。 移動の手順を表示するメソッドをhanoi(n,From,To,Via)とする。nは円盤の枚数、 FromからToへ移動し、もうひとつの場所をViaとするとき、 Hanoi(n,From,To,Via)は n>1のとき Hanoi(n-1,From,Via,To) n番目の円盤をFromからToへ移動する。 Hanoi(n-1,Via,To,From) n=1のとき 1番目の円盤をFromからToへ移動する。 とすればよい。 ここでは、nをキーボードから入力し、n枚をAからBへCを利用して移動するステップを表示するプログラムを作成せよ。 こんな感じなんですが…。
アウトプットが美しくないから、この問題やりたくない。
二次元のひし形はどうやってつくるんでしょうか?
chatとチェスが2PC間でできるserver とclientを使ったプログラムコードをjavaでかいてください><;
>・GUI 関係などは基本的に放置
簡単なトランプゲームの課題です。どうかよろしくお願いしますm(_ _)m ランプのカードのクラスCardを定義せよ。インスタンスフィールドとしてはスーツ(Clubs, Diamonds, Hearts, Spades) を表すint型の変数suitと1から13までの数を表すint型の変数numberを持つものとする。スーツと数を指定して Cardのインスタンスを作るコンストラクタを書け。"スペードの5"のような形の文字列を返すメソッドtoString()を書け。 ただし、1、11、12、13はそれぞれ、エース、ジャック、クイーン、キングという文字列にすることとする。 一組のカード(52枚)を表すクラスCardDeckを定義せよ。インスタンスフィールドとしては、Card型の配列deckを持つものとする。 コンストラクタで52枚のカードを作ってその配列に入れることにする。 カードデックから1枚のカードを引くメソッドdealを作れ(乱数を使って52枚から1枚を選ぶ。
一度引かれたカードがまた引かれないように、引かれたカードの後にはnullを入れておく。 nullはそこにないも入っていないことを表す。変数aにnullを代入するには a = null; とし、aがnullであるか調べるには if ( a == null) ... とすればよい。 一度引かれたカードがまた引かれないようにするもう一つの方法はカードデックを 作ったときにそれをシャッフルしておくことである。引くときには、それから順番に出していけばよい。 シャッフルはたとえば、0 <= i < 52に対して乱数で整数0 <= j < 52を作り、 i番目とj番目のカードを交換すればよい。) mainメソッドでカードを5枚引いてそれをプリントしてみよ。 ポーカーの役はできているか。(mainメソッドはもうひとつ別のクラスを作ってそこに書いてもよいし、 クラスCardDeckの中に書いてもよい。)
ポーカーでは、5枚のうち何枚かを1度だけ引きなおすことができる。 最初に引いた5枚はCardの長さ5の配列に入れておき、そのうちの何枚かを 引きなおすことができるようにせよ。 (5枚のそれぞれについて、引きなおすかどうかを聞き、イエスと答えたカードだけ引きなおし、 最後に5枚をプリントする。) 長文失礼しました。どうかよろしくお願いします。
>>216 ありがとうございます 助かりました〜。
参考にさせてもらいますm(_ _)m
むむむ〜、C言語ですが似たような課題ですね;
>>195 のConの toString の仕方だけがわからないです、お願いします教えてください。
>>218 自明。というか
>>198 でもまぁ。
public String toString() { return(""+value);}
>>218 // 整定数
class Con extends Exp {
private int value;
public Con(int value) { this.value = value; }
public int eval() { return value; }
public String toString() { return (""+value);}
}
でコンパイルしようとすると、変な文字化けが出てコンパイルできないのです。
他のNeg、Add、SubなどのtoStringはコンパイルできたのですが・・・、
自分のJava環境によるものなのでしょうか?
ここ見てると、クソみたいな出題がおおいんだが、「これは」という良い問題、あったら晒して欲しい。
>>218 Windows 環境かな?
Windows 上からだと Con.* というファイル名は作れません。
他の環境だったら作れますけが・・・・・。
別の環境でコンパイルするか、別名にしてみましょう。
>>222 別の名前にしたら出来ました!ありがとうございます。
問題つくった先生のPCがMacだったのを思い出しました。
>>223 めずらしい問題にぶちあたったね。
俺、DOS 時代からのユーザのくせにわかんなかった。
次のうち継承の関係にあるのはどれか 1家ードア 2人間-学生 3学生ー教員 4車ータイヤ よろしく御願いします。
>225 一つも無い。 一見、2がそうであるように見せているが、人間でない学生(例:マルチ)が 十分考えられるためこれは違う。
学生というのは単なる属性だからな。 学生としてうまれて、一生学生のままでいる人間はいない。
228 :
デフォルトの名無しさん :04/07/16 13:29
定期試験の問題なんですが… intx[]=[50,150,221];inty[]=[50,60,90]; drawPolyline(x,y,3);で描く折れ線の長さの値を0.1%以内の 誤差で書け
もう1問あって a0=a1=1,ak=a(k-1)+0.5a(k-2),k=2,3,…,101 としたとき、a101の値を0.1%以内の誤差で書け よろしくお願いします。授業ではjBuilder使うんですが、 教官が一人で勝手に授業進めて全然わからないんです(つД`)
↑ どっちも単純な数式をJavaで書き直すだけなんですけど・・・
>>230 すいません。それすらわからんのですよ・・・
( .3.) ヌェー 2chやる以前にやることがありそうだNE
授業でわからなかったら、質問して聞けよ。 質問に答えない教官はクズ。 「おら、みんなの前で質問するのはんずかしいだ」ってんなら授業終わった後聞きに行けよ。
jBuilderで色々手引き通りやってみるんですが エラーばっかりで答えが出ないんですよ。 もう授業終わってるし、定期試験の問題を質問しにいくわけには いかないかと思いまして・・・
>229 import java.math.*; public class Q229 { private static final BigInteger TWO = new BigInteger("2"); public static void main( String args[] ) { BigInteger ak1Numer, ak2Numer, akNumer, denom; int i; for( i = 2, akNumer=BigInteger.ONE, ak1Numer = BigInteger.ONE, ak2Numer = BigInteger.ONE, den\ om = BigInteger.ONE; i <= 4; ++i ) { // a(k) = a(k-1) + 0.5a(k-2) // 2ak = 2a() + a() akNumer = ak1Numer.multiply(TWO).add( ak2Numer ); denom = denom.multiply(TWO); ak2Numer = ak1Numer.multiply(TWO); ak1Numer = akNumer; } System.out.println( akNumer + "/" + denom ); } }
どんなコードでどんなエラーよ?
おっと、muleからコピペした時にちょっとミスった。 ×for(..., den\ om=... ○for(..., denom=...
早速コピペさせてもらいました。ありがとうございます。 for( i = 2, akNumer=BigInteger.ONE, ak1Numer = BigInteger.ONE, ak2Numer = BigInteger.ONE, deno この行の部分でですね、「ステートメントではありません」というエラーと 「,が必要です」というエラーが出るんですが・・・ ご教授できればよろしくお願いします
ただで単位が取れるほど世の中甘くない。 自分で考えろボケ
こんぐらいも直せないようじゃ(ry またはそのままコピペ丸出しで提出しる
RPGのキャラクタークラスを考えよう.いま,このゲームには,次のような4種類のキャラクターがいるとする. 普通の人間 戦士:武器が使える 魔法使い:魔法が使える 魔法戦士:武器と魔法の両方が使える このようなキャラクターを持つゲームプログラムをJavaで作成する場合, クラス階層及びインタフェース間の関係をどのようにすればよいだろうか? 各自が考えたクラス及びインタフェースの構造について,そのようにした理由を説明すると共に, 簡単なサンプルプログラムを作ってみよ.
ほんとは235が間違っただけだろうけどね
>>241 ほんとうにわからないの?
考えてない&調べてないだけじゃない?
わかったとこまで書いてみてよ。
class Human{} interface WeaponUser{} interface MagicUser{} class Warrior extends Human implements WeaponUser{} class Mage extends Human implements MagicUser{} class MagicWarrior extends Human implements WeaponUser,MagicUser{}
できてんじゃん
この顔文字→( ゜3゜)の人、見なくなったな
>>244 それだと中身が無いから実際には、こんな感じかな?
魔法が使える人に関しては自分で考えてみ。
class Human{
int hp;
int mp;
int maxhp;
int maxmp;
Human(int mhp,int mmp){
maxhp=mhp;
hp=mhp;
maxmp=mmp;
mp=mmp;
}
void damage(int d){
hp-=d;
if(hp<0)hp=0;
}
void heal(int h){
hp+=h;
if(hp>maxhp)hp=maxhp;
}
}
interface WeaponUser{ public int useWeapon(); } interface MagicUser{} class Warrior extends Human implements WeaponUser{ Warrior(int mhp){ super(mhp,0); } public int useWeapon(){ return(10); } } class Mage extends Human implements MagicUser{ Mage(int mhp,int mmp){ super(mhp,mmp); } } class MagicWarrior extends Human implements WeaponUser,MagicUser{ MagicWarrior(int mhp,int mmp){ super(mhp,mmp); } public int useWeapon(){ return(5); } }
『継承とポリモアフィズムを効果的に使ったプログラムを作成しなさい。 内容は何でも構いません。但し、拡張性を考慮しなさい。(とってつけたようなポリモアフィズム はいけません)』 という課題が出ていて、ネットで探しているんですが、いまいち見つかりません。 拡張性というのが分からず、苦戦しています。 どうか宜しくお願い致します。
なんつーか、ネットで探しているという時点でもう・・・ね。
継承とポリモルフィズムについては理解しているのか?
ちょっとぐぐってみたんだが、 ポリモーフィズム の検索結果 約 2,180 件 ポリモルフィズム の検索結果 約 849 件 ポリモフィズム の検索結果 約 1,070 件 ポリモアフィズム の検索結果 約 42 件 "ポリモアフィズム"ってどこの用語だ?
>>249 のセンセーか
>>249 自身のオレ用語でしょ。
polymorphism → ポリモアフィズム
ほかにも constructor → コンストラクトア compiler → コンパイレア
とか書いてるんだろうよ
finalizer → ファイナライゼア NullPointerException → ぬるぽインテアエクセプチオン
256 :
デフォルトの名無しさん :04/07/22 16:35
それぞれJava言語を用いてプログラムすること. 課題1 約10000個の値を格納するハッシュ表を作りたい.オープンアドレス指定法を 用いてハッシュ表を構成し,ハッシュ関数の違いによって実行時間が どのように変わるのか,性能を比較せよ.それぞれの値は乱数で 発生させた自然数とし,ハッシュ表への挿入と探索のみを考え, 削除は考えなくてよい. 課題2 与えられた要素の中のi番目の数を求めたい. クイックソートを用いた場合と,10.2節の平均線形時間の選択法, または10.3節の最悪線形時間の選択法を用いた場合とで, 性能を比較せよ.(10.2節,10.3節のどちらか一方で構わない.) 課題3 ポインタを用いずに連結リストを実現し,簡単な使用例を示せ. お願いしますm(_ _)m
麻雀の4人打ちで、ネットワーク対戦のできるようなものつくれませんか?
258 :
デフォルトの名無しさん :04/07/22 17:54
>>256 Javaの問題なのに「ポインタを用いずに」というところがクソだな。
そりゃそうだ。
>>258 class Factory{
int x;
void int(){
}
}
class Concrereclass{
void set( int x) {
}
}
これでいいですか?
・・・
258の問題教えてください。御願いします。
268 :
デフォルトの名無しさん :04/07/23 01:22
3次間数を表示するプログラムを作成してください
System.out.print("3次間数");
>>256 課題1
class myhash{
Object[] list;
int size;
myhash(){
size=20000;
list=new Object[size];
Arrays.fill(list,null);
}
void add(Object o){
int index=Math.abs(o.hashCode())%size;
while(list[index]!=null){
index++;
if(index>=size)index=0;
}
list[index]=o;
}
Object search(Object o){
int index=Math.abs(o.hashCode())%size;
while(list[index]!=null){
if(list[index].equals(o))return(list[index]);
index++;
if(index>=size)index=0;
}
return(null);
}
}
>>256 デバッグしてないからよろしく
10.2 節と10.3 節のアルゴリズムをざっとでいいから書いてよ。
話はそれから。
課題3 は 260 じゃないけど、やる気がしない。
まぁ領域を配列に確保し、次の要素へのインデックスも格納しておく。
とかでやればいいんだけど。ねぇ。
>>271 結局、配列からインスタンスへの参照はポインタだしな。
(正確にはポインタじゃないけど出題者の"ツモリ"から言えば)
リスト構造そのものを構築せよということであってそれ以外は不問ということなのかもしれないが、
舌足らずもいいとこだな。
こーゆーダメな教育者がダメプログラマを育てるんですか? でもこんな教育受けてちゃプログラマになんかならないか。 いやしかし2ちゃん見てるとそれでもやっていけるっぽいし・・・
274 :
デフォルトの名無しさん :04/07/23 13:50
<クイックソート> /* * 軸要素の選択 * 順に見て、最初に見つかった異なる2つの要素のうち、 * 大きいほうの番号を返します。 * 全部同じ要素の場合は -1 を返します。 */ int pivot(int[] a,int i,int j){ int k=i+1; while(k<=j && a[i]==a[k]) k++; if(k>j) return -1; if(a[i]>=a[k]) return i; return k; } /* * パーティション分割 * a[i]〜a[j]の間で、x を軸として分割します。 * x より小さい要素は前に、大きい要素はうしろに来ます。 * 大きい要素の開始番号を返します。 */ int partition(int[] a,int i,int j,int x){ int l=i,r=j; // 検索が交差するまで繰り返します while(l<=r){ // 軸要素以上のデータを探します while(l<=j && a[l]<x) l++; // 軸要素未満のデータを探します while(r>=i && a[r]>=x) r--;
<続き> if(l>r) break; int t=a[l]; a[l]=a[r]; a[r]=t; l++; r--; } return l; } /* * クイックソート(再帰用) * 配列aの、a[i]からa[j]を並べ替えます。 */ public void quickSort(int[] a,int i,int j){ if(i==j) return; int p=pivot(a,i,j); if(p!=-1){ int k=partition(a,i,j,a[p]); quickSort(a,i,k-1); quickSort(a,k,j); } } /* * ソート */ public void sort(int[] a){ quickSort(a,0,a.length-1); }
で?
すまん、質問かとオモタ。
279 :
デフォルトの名無しさん :04/07/23 22:10
教えて下さい優しい人! javaのMath.random()を使って10.0〜190.0の値をランダムで出したいのですがどうすればよろしいでしょうか?
それ以外の値が出たら取り直す
>>256 10.2
pivot , partition は自分で書いたの使ってね。
public int find(int[] a,int i,int j,int rank){
if(i==j) return(a[i]);
int p=pivot(a,i,j);
if(p!=-1){
int k=partition(a,i,j,a[p]);
if(k-i>rank){
return(find(a,i,k-1,rank));
}
else{
return(find(a,k,j,rank-k+i));
}
}
else{
return(a[i]);
}
}
>>279 180.0*Math.random()+10.0
(´Д⊂ ありがとうございました
そりゃ無限ループだもんな
ワロタ
286 :
デフォルトの名無しさん :04/07/24 00:11
Webページに公開されてるアルゴリズムコピペする馬鹿発見。
287 :
デフォルトの名無しさん :04/07/24 00:19
誰かportletやjsr168について詳しい方いますか?
288 :
デフォルトの名無しさん :04/07/24 00:21
どうやったらportletで開発すればいいかわかんないっす。
289 :
デフォルトの名無しさん :04/07/24 00:27
「portletで開発」っていう日本語があってるかどうかもよくわからんのですけどね tomcatみたいなサーブレットコンテナがあるのでしょうか? apache plutoってのがそれなんですかねえ… ウェブスフィアやウェブロジックみたいな統合開発環境ではすでにjsr168のをとりこんでみるみたいなんですけど…
290 :
デフォルトの名無しさん :04/07/24 02:06
JBoss3.2.0が使っているJetty4.2.9は、HttpServletRequest#setCharacterEncoding()に 問題があって、日本語が文字化けする、というのを本で見かけたのだが、 具体的にどの文字が化けるかとか、知りませんか。 いわゆる、Web系でNGな丸付き数字とかは別として。 「このサイトを見ろ」でもいいので・・・ 教えてくんで、すまそ。
291 :
デフォルトの名無しさん :04/07/24 17:46
課題がわからないので質問します public class Ripple { public static void main(String args[]) { int ncell=75 ; int i,j,k,left,right ; int dcell[]=new int [ncell] ; int odcell[]=new int [ncell] ; for(i=0;i<ncell;i++) { dcell[i]=0 ; odcell[i]=0 ; } int ngeneration=ncell ; dcell[0]=1; dcell[1]=2 ; dcell[ncell-2]=2 ; dcell[ncell-1]=1 ; for (i=0;i<ncell;i++) { if(dcell[i]==0) System.out.print(' ') ; if(dcell[i]==1) System.out.print('#') ; if(dcell[i]==2) System.out.print('*') ; } System.out.println(); for(i=0;i<ncell;i++) { odcell[i]=dcell[i] ; } } }
292 :
デフォルトの名無しさん :04/07/24 17:48
(続き) さてこのプログラムに続きを作ります。最後ののfor文のあとに(つまり下から2行目と3行目の間に)以下のシナリオで示す通りのプログラムを付け加えてください。 1. 以下のことをngeneration-1回繰り返す 1. 以下のことをi=0からi<ncell繰り返す 1. 1世代(generation)前のdcell[i]を参照する。その左の(i-1)のcell値(left)と右の(i+1)cell値(right)を足す。もしi=0なら左のcell値は0(left=0), 同じようにもしi=ncell-1であるなら右のcell値は0(right=0)とする。 2. そのときの中央の(i)のcell値に応じて(それをpivotと呼ぼう)、以下のように次の世代のcell値(i)を決める。 pivot値が0で、 left+right値が2以上なら、それは2とする、そうでなければ(left+right値が 2より小なら)0とする。 pivot値が1ならどんな場合でも次世代cell値は0、 pivot値が2でleft値あるいはright値が0である限り次世代cell値は1、そうでなければ(pivot値が2であっても)次世代cell値は2 2. 上の例のようにcell値に応じて文字を出力(i=0,i<ncell)、行末に改行を挿入。 3. cell配列の世代交代をする。 2. なにも後始末せずに終了。
自分なりに考えたつけたしの部分です。 実際起動してみると、空白の行ばかりになってしまいます。 初めて半年も経っていないので、あまり分かってない上 おかしな部分もありますし、全然スマートにできていませんがすみません。 どこがおかしいか教えていただきたいです。 for (j=0;j<ngeneration;j++) { for(i=0;i<ncell;i++) { right=0 ; left=0 ; if(i==0) { left=0 ; } else if(i==ncell-1) { right=0 ; } else { dcell[i-1]=left ; dcell[i+1]=right ; } (続く)
294 :
デフォルトの名無しさん :04/07/24 17:55
(続き) if(dcell[i]==0 && left+right>=2) { odcell[i]=2 ; } else if(dcell[i]==0 && left+right<2) { odcell[i]=0 ; } else if(dcell[i]==1) { odcell[i]=0 ; } else if(dcell[i]==2 && left==0 || right==0) { odcell[i]=1 ; } else { odcell[i]=2 ; } } for (i=0;i<ncell;i++) { if(odcell[i]==0) System.out.print(' ') ; if(odcell[i]==1) System.out.print('#') ; if(odcell[i]==2) System.out.print('*') ; } System.out.println(); for(i=0;i<ncell;i++) { odcell[i]=dcell[i] ; }
解決しました 長文で汚してすみませんでした
219から295はぜんぶ同一人物の長文って解釈でOK?
297 :
デフォルトの名無しさん :04/07/24 20:47
Yahoo!オークションの詳細な残り時間アプレットのそすクレ
クラスファイルを盗ってきて逆コンパイル
最後の方の授業に出てなかったのでJAVAの問題が全く分かりません…。 どなたかご教授願えないものでしょうか(;´Д`) @<input>要素を2つ作成する。 A 作成した<input>要素に「onClick」イベントハンドラー名を追加する。 イベントハンドラーとして関数を用いる。 B関数を用いて「Liquid Layout」のヘッダー部のスタイルを変更する。 <input>要素をクリックすることにより、次のスタイルを変更する。 background-colorを変更する。 borderにスタイルを与える(border-style, border-colorなど) Cもう一方の<input>要素をクリックすることにより、 ヘッダー部のスタイルを元に戻す。
問2 @ メニュー部の<div>要素に「onMouseOver」と「onMouseOut」 イベントハンドラー名を追加し、イベントハンドラーとして関数を用いる。 なお、関数へのオブジェクトの引渡しは「this」を用いる。 A カーソルがメニュー部に乗るとメニュー部の「background-color」 と「color」を変更する。 B カーソルがメニュー部を離れるとスタイルを元に戻す。
このHTMLに↑のJAVAを組み込めとのことなのですが…。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd ">
<html xmlns="
http://www.w3.org/1999/xhtml " xml:lang="ja" lang="ja">
<head>
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>Three Column Layout</title>
<link rel="stylesheet" href="../sample.css" type="text/css" />
<style type="text/css">
<!--
#header { width: 100%; height: 5%; text-align:center;
background-color: #eeeeee; color: #333333;
}
#menu-col { width: 25%; height: 95%; float: left;
background-color: #c0c0c0; color: #333333;
margin-top: 5px; margin-right: 5px;
padding: 1em;; border: 0;
}
#content-col { height: 95%; border-width: 0 0 0 0;
margin-top: 5px; padding: 1em;
background-color: #fffabc; color: #333333;
}
-->
</style>
</head>
<body>
<div id="header"><h1 class="h1pos">サンプル番号(sample110)</h1></div>
<!-- Begin the menu Column -->
<div id="menu-col">
<h2 class="h2color">サーチエンジン</h3>
<div>
<ul>
<li><a href="
http://www.google.co.jp/ "/>Google</a></li>
<li><a href="
http://www.google.co.jp/ "/>Yahoo</a></li>
<li><a href="
http://www.infoseek.co.jp/ "/>Infoseek</a></li>
</ul>
</div>
</div>
<!-- Begin the Content Column -->
<div id="content-col">
<h2 class="h2color">内容の表示</h2>
<div>
<p>Liquid Layout Exampe</p>
</div>
</div>
</body>
</html>
えっと、これをJAVAといってしまっている以上は > 最後の方の授業に出てなかったので ではなくて、最初の方の授業も、真中あたりの授業も出てなかったとしか思えない。 とりあえず、スレ違い。 再履修せろ。
こういうことを授業で(しかも最後のほうで)やるっていうのもどうかなぁ デザイン学科ででもやってるのかな? こんな半端なレベルなら いっそやらない方がよろしい
どうしようもないですな
また Java と JavaScript の区別がつかないヤシが出てきたな
308 :
デフォルトの名無しさん :04/07/25 22:09
53の階乗を正確に計算して出力するjavaプログラムを作りたいのですが、 教えてくれる友人がいないので助けてください。 アルゴリズムは、一桁分の数を記憶するオブジェクトを多数作り、それらの協調で 計算を進めていきます。 例題のプログラムをラウンジのソースを置くスレ268に置きましたので参考にしてください。
ラウンジとか行くのマンドクセ
BigInteger使ったらあかんの?
import java.math.*; public class Q304{ public static void main(String args[]){ BigInteger bi=new BigInteger("1"); for(int i=1;i<=53;i++)bi=bi.multiply(new BigInteger(""+i)); System.out.println(bi); } }
>>312 BigInteger#valueOf使え。
314 :
デフォルトの名無しさん :04/07/25 23:39
入力値が全角カナかそれ以外かを判断するソースの書き方を教えてください。
boolen manaKana(入力値 n) { return (n == 全角カナ); }
>>314 boolean hoge(String str){
for(int i = 0; i < str.length(); ++i){
if( "アイウエオ・・・".indexOf(str.substring(i,i + 1)) >= 0) return true;
}
return false;
}
public static final String zenkakukana = "アイウエオ(ry"; public boolean isZenkakuKana(String str) { for (int i = 0; i < str.length(); i++) { if (zenkakukana.indexOf(""+str.charAt(i)) < 0) { return false; } } return true; } /* かなりの糞コードかもしれんが */
static忘れた
319 :
デフォルトの名無しさん :04/07/25 23:56
>>かなりの糞コードかもしれんが クールなコードってどんなのですか? 全然想像できないので、宜しくおねがいします。
検索に対数オーダーなら cool
>>320 それそれ。
317書くのにStringのAPIマニュアル見てる漏れじゃ手に負えん。
マジレスすれば、Map使う。 もっとマジレスすれば、IBMのライブラリ使う。
return str.matches(".*[アイウエオ(ry].*");
マジレスすれば,全角カナとか使わない.
return str.matches(".*[ア-ョ].*"); 最初と最後の文字が分からんけど、こんなんはできへんのか?
return str.matches(".*[ァ-ヶ゛゜].*");
>>326 判定だけならSetだった。
Set kana = new HashSet();
kana.add("あ");
kana.add("い");
以下略
for(int i = 0; i < str.length(); ++i){
if( kana.contains(.str.substring(i,i + 1))) return true;
}
return false;
実際には、全角→半角変換用にMap使っておくんだけど。
OTZ
kana.add("あ"); kana.add("い"); 以下略 ↑これはめちゃくちゃダルい気がするのだが、どうかね。 文字列の方がエレガントな気がしないわけではないと言えなくもない。
kanas = "アイウ(ry"; kana = new HashSet(); for (char c : kanas.toCharArray()) { kana.add(Character.toString(c)); }
>>332 とりあえず、実行効率考えれば、単純な比較は やってられん。
Setの用意は、好きにすれ。
っていうか、自分で組まずに、IBMのライブラリ使え。
java.lang.Character.UnicodeBlock.KATAKANA.of(対象文字c) は使えないのん?
なんか間違えまくってるな。(実は板も一度間違えた) Character.UnicodeBlock.of(対象文字) == Character.UnicodeBlock.KATAKANA で。
スレだろ
>>336 いろいろなことを考えると、使えなかった。
結局変換がからんだりするし。
すみません、BigIntegerまだ習ってないので、使わないでください。
習ってないからって、またアホな物言いだな。 小学生が鶴亀算を連立方程式で解いたら「まだそんなの習ってないでしょ」って先生に怒られるみたいな感じか?
53! を求めるのが目的じゃなくて、 多倍長整数計算を実装するのが目的でしょ? BigInteger使ったら簡単過ぎて問題にならないし。 習ってないからじゃなくて、知ってても使うべきじゃない。
>>339 1桁の数を記憶するクラスを作ることまでわかってるのに
なんでその先がわからないんだ?
掛け算の筆算をするときに各「桁オブジェクト」で起こりうる現象を列挙してみなさい。
たとえば、ある桁オブジェクトの数に他の桁オブジェクトの数を掛けたとき、
10以上になったら「繰り上がり」を考えなきゃいけないよな?
3桁の数 a3a2a1 と1桁の数 b1 を掛けて数 c4c3c2c1 が得られる手順を考えると。 まず a1 * b1 を計算して「一の位」と「それ以上の位」に分解すると a1 * b1 の「一の位」は c1 の値(c1 が確定) a1 * b1 の「それ以上の位」は c2 への繰り上がり 次に a2 * b1 を計算して「一の位」と「それ以上の位」に分解すると a2 * b1 の「一の位」+「c2 への繰り上がり」は c2 の値(c2 が確定) a2 * b1 の「それ以上の位」は c3 への繰り上がり 次に a3 * b1 を以下略 上の処理を一般化すると1桁の数を掛ける処理がわかるので、 それをさらに一般化して何桁の数を掛けてもちゃんと処理できるようにする。
ちなみに、複数桁の数を掛けた場合、 「○○への繰り上がり」自体が10より大きくなることがあることに注意。 実際に下からの繰り上がりとしてプラスする数は、その繰り上がりの一の位の数だけだからな。 ここまで言えばもうコーディングするだけだね。
345 :
デフォルトの名無しさん :04/07/27 13:57
>一桁分の数を記憶するオブジェクトを多数作り、それらの協調で 強調でってのが分からんナァ import java.util.*; import java.math.*; public class MyNumber { public static void main(String[] args) { MyNumber num = new MyNumber(1); BigInteger bin = new BigInteger("1"); System.out.println(num); System.out.println(bin); for (int i=2; i<=53; i++) { num = num.mul(new MyNumber(i)); bin = bin.multiply(new BigInteger("" + i)); System.out.println(i + "! = " + num); System.out.println(i + "! = " + bin); } } private List digits; public MyNumber(int num) { digits = new ArrayList(); do { digits.add(new Integer(num%10)); num /= 10; } while (num > 0); }
public MyNumber(List digits) { this.digits = digits; } public String toString() { String str = ""; for (int i=0; i<getOrder(); i++) { str = digit(i) + str; } return str; } private int getOrder() { return digits.size(); } private int digit(int index) { if (index < getOrder()) { return ((Integer)digits.get(index)).intValue(); } else { return 0; } } private void shift() { digits.add(0, new Integer(0)); }
public MyNumber add(MyNumber num) { int index = 0; int carry = 0; List tmp = new ArrayList(); while ((index < getOrder()) || (index < num.getOrder())) { int x = digit(index) + num.digit(index) + carry; carry = x/10; tmp.add(new Integer(x%10)); index++; } if (carry != 0) { tmp.add(new Integer(carry)); } return new MyNumber(tmp); } private MyNumber mul(int num) { // < 10 であるぞよ int carry = 0; List tmp = new ArrayList(); for (int i=0; i<getOrder(); i++) { int x = num*digit(i) + carry; carry = x/10; tmp.add(new Integer(x%10)); } if (carry != 0) { tmp.add(new Integer(carry)); } return new MyNumber(tmp); }
public MyNumber mul(MyNumber num) { MyNumber base = new MyNumber(0); for (int i=0; i<num.getOrder(); i++) { //一桁かける MyNumber numtmp = mul(num.digit(i)); //オーダーずらす for (int j=0; j<i; j++) { numtmp.shift(); } //ベースに足す base = base.add(numtmp); } return base; } } 一桁って digit でよかったのかな
教えてください。 テキストファイルから文字を読み込んでint型の変数に 格納したいのですが、文字列の最初の5文字だけを取り出すのって どうやったらいいんしょうか?? お願いします。
すみません。 public class y{ public static void main(String args[]){ int a[]=new int[10]; for(int i=0;i<10;i++){ int rnd=(int)(Math.random()*20+1); a[i]=rnd; System.out.println(a); } } } このようなコーディングをして実行すると [I@5224ee が、10回表示されるのですがどうして 整数が出てこないのでしょうか?
>351 あなたがそう表示するようにプログラムを書いたからです。
ひとめで分かれよそれくらい。 表示で不都合が出たんだから、まず表示のとこから穴が開くほど見れ。
>>351 int配列オブジェクトのtoString()出力ですよそれ。
System.out.println(new int[0]);とかして味噌。
>>351 System.out.println(a);
この行を
System.out.println(a[i]);
こうする。
もう夏休みで課題は出ないのかね
2chで聞いてでもやろうという人は、すでに出尽くしました。 あとは8/25くらいからガンガン
どれ、仕事一段落したし、ゲームでも作るか・・・RMI で軍人将棋かな そうだイラクとアメリカのにしよう イラクは覆面つけさせられて自軍のコマすら見えない 対CPU戦は自軍イラク、対人は双方イラク 戦争って悲惨だねということを(ry
359 :
デフォルトの名無しさん :04/08/01 16:16
>>359 とりあえず一見して
1) 小文字からはじめるクラス名かよ!
2) ソース、全然参考なってねぇよ! そんなの改造したってただの回り道だよ!
という突っ込みの入るクソ課題だが、とりあえず作ってあげよう。
361 :
デフォルトの名無しさん :04/08/01 17:15
まず一問め。 最近、質問スレでまんまなQ&Aがあった(Aのひとつはオレ)ので参考になるかも import java.io.*; import java.net.*; public class SimpleGet { public static void main(String[] argv) throws Exception { URL url = new URL(argv[0]); String filename = url.toString(); filename = filename.substring(filename.lastIndexOf("/") + 1); // 最後の '/' よりあと InputStream in = new BufferedInputStream(url.openStream()); // 入力は URL が示すリソース File file = new File(filename); OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); //出力はファイル byte[] buf = new byte[1024]; //最大1024文字ずつを読み書き while (true) { int readlen = in.read(buf); if (readlen == -1) break; //読めなくなるまで繰り返す out.write(buf, 0, readlen); //毎度毎度 1024 bytes とも限らないんでこうする } in.close(); //双方閉めてお終い out.close(); } } 「HTTPサーバと交信し」を HTTP そのものの実装でやるより、URL クラスを活用した方が早い。 課題で言ってる事には反してない。しかし「習ってないのになぜできた」という疑惑は向けられる、かも知れない。 (君が何を習ったかわしゃ知らん) 2問めは・・・・スレッド使っていいのかな。それとも出力して入力してお終い、でいいのかな。 とりあえず後者でやってみるけれども。
import java.io.*; import java.net.*; public class MyProxy { public static void main(String args[]){ String hostname = args[0]; int port = Integer.parseInt(args[1]); //中継先のホスト, ポート。同じ番号で localhost に開く。 ServerSocket servsock = null; Socket clientsock, hostsock; BufferedReader clientin; //クライアントから文字で要求を受け、 PrintStream hostout; //中継先に文字で送り、 InputStream hostin; //中継先からコンテンツをバイナリで受け、 OutputStream clientout; //クライアントにバイナリで送る。 try { servsock = new ServerSocket(port); while(true){ clientsock = servsock.accept(); clientin = new BufferedReader(new InputStreamReader(clientsock.getInputStream())); clientout = new BufferedOutputStream(clientsock.getOutputStream()); hostsock = new Socket(hostname, port); hostin = new BufferedInputStream(hostsock.getInputStream()); hostout = new PrintStream(hostsock.getOutputStream());
//HTTP では空行が来るまでがクライアントの要求。 while (true) { String line = clientin.readLine(); System.out.println(line); hostout.println(line); if (line.equals("")) break; } //空行がきた後はクライアントは待ち状態。 //中継先からデータを取り出して返す(画像などのバイナリかもしれないので Reader/Writerなどは使えない) byte[] buf = new byte[1024]; while (true) { int readlen = hostin.read(buf); clientout.write(buf, 0, readlen); clientout.flush(); if (readlen < 1024) break; } hostsock.close(); clientsock.close(); } } catch (Exception e){ e.printStackTrace(); System.exit(1) ; } } }
java MyProxy www.google.co.jp 80 などとして起ち上げて、
同じマシンのブラウザから
http://localhost/ に接続してみよ。それっぽく受信できる。
オレはいまいち素人なのでアレだが、
本当は keep-alive への対応とか、Contents-Length を読んでいいところで入力を切るとか、しないといけない。
でもたぶんそこまでは要求されてないと思う。このスレの暗黙の限界的にもアレだし。
上記の問い2の実装では、毎度毎度必ず 1024byte ずつ受け取るものとして、
そうでない半端なサイズ受け取ったらもうデータの終端だとして接続を切ってしまっている。
繰り返すがオレの HTTP の理解度がいまいちなので、
お手軽にもっとそれらしく対応できるお作法があるのかもしれない。
待てるものならエライ人の突っ込みでも待っててくれ。
366 :
デフォルトの名無しさん :04/08/01 19:06
367 :
デフォルトの名無しさん :04/08/01 23:33
>>362 おまいはいいヤシだ。
丁寧に教えてあげても何のリアクションもない場合が多いが、めげるな。
>>366 さすがにそれぐらいはぐぐれ。
山のように解説サイトがあるぞ。
>>367 自分にはどこまでできるか/どこからができないのかをまず説明しろ。
丸投げに答えてくれる暇人はどこにもいない。
>>366-367 (の出題者)は同じ奴?
一般的アルゴリズムと GUI 特有のコードのまざったものを課題にするってのもまた・・
「おまじない」だらけで何が主眼だかわからんね
最近プログラムが組めるようになってうれしい出題者です。
>>370 このお人好しめ! ( ´∀`)σ)゚Д゚)
374 :
デフォルトの名無しさん :04/08/02 18:46
質問したいのですが 440000より大きい最小の素数を計算して求めるようなプログラムをJava言語で 作りたいのですが public class c { public static void main( String[ ] args ) { outer; for( int i=440000; i=i+1; i++ ) inner: for( int j=2; j<=i-1; j++ ) { if( i % j ==0 ) { continue outer; } } System.out.println( i + "is prime" ); } } というプログラムではできません、どうしたらいいでしょうか? どなたか教えてください
>>374 ラベル付きcontinueとかやる前に、forの基本的な使い方勉強せい。
376 :
デフォルトの名無しさん :04/08/02 18:56
>>374 とりあえず
public class c{
public static void main(String args[]){
for(int i=440000;true;i++){
int j;
for(j=2;j<i;j++){
if(i%j==0){
break;
}
}
if(i==j){
System.out.println(""+i+"is prime.");
return;
}
}
}
}
378 :
デフォルトの名無しさん :04/08/02 19:07
>>377 ありがとうございます!おかげで課題が終了しました。
本当にありがとうございます!
379 :
デフォルトの名無しさん :04/08/02 19:49
i が i 未満の何か(素因数)で割り切れるかどうか調べる for(j=2;j<i;j++){ 割り切れたら途中で素因数探しをやめる if(i%j==0){ break; } for 構文のルールにより、素因数が見つからなければ j は i になってしまっている j == i なら i が素数だとして終了 そうでなければ i に 1足してまた同じことをやる
なんか無駄が多いよね
382 :
デフォルトの名無しさん :04/08/02 20:15
>>380 すごくよくわかりました、どうもありがとうございます。
せめて既に素数ではないと分かった数では割り算しないように改良希望
素数と判明した数をVectorに入れてそれで割るのはどうか。 時間かかりそうだがコーディングが手軽でコストパフォーマンスよくね?
>>270 シンボルを解決できません。
シンボル: 変数 Arrays
場所 : myhash の クラス
Arrays.fill(list,null);
とコンパイルエラーが出てしまったのですが,解決方法を教えてもらえないでしょうか.
ソースの先頭に、 import java.util.Arrays; を追加 万一それでも解決できなかったら、その一行まるまる消しても一応問題なし
>>387 コンパイルできました.ありがとうございました.
さらにアホな質問で申し訳ないのですが…
これはmainメソッドが無いのでこのファイルだけでは実行できませんよね.
どのようにしてこのファイルを読み込むようにすれば良いのでしょうか.
java半月以上触れてもいなかったのでまったく覚えてなくて.
もしお暇ありましたら教えてください.
2週間で忘れるのか 教えても、また忘れそうだな。 「このファイル」は意識せず、そこで定義するクラスを利用するコード書けばいい。
public class ForTest { public static void main(String[] args) { myhash hash = new myhash(); //乱数生成して Integer かなんかのインスタンスを山ほどつくって hash に add //とかまぁいろいろやって "性能比較" をする } } ForTest.java は myhash.java と同じフォルダに。
>>389 ,390
親切にどうもありがとうございました.
半月でなく半年でした.
392 :
デフォルトの名無しさん :04/08/05 18:22
正の整数xを入力して xが素数なら「素数」 素数でなければ「素数でない」 と書き出すプログラム お願いします
import java.io.*; import java.util.*; public class Q392 { public static void main(String[] args) throws IOException { Q392 checker = new Q392(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { String line = br.readLine(); if (line.equals("end")) break; try { int num = Integer.parseInt(line); if (checker.isPrime(num)) { System.out.println("素数"); } else { System.out.println("素数でない"); } } catch (NumberFormatException ex) { System.out.println("数字でない"); } } }
private Set primes; public Q392() { primes = new TreeSet(); } public boolean isPrime(int num) { if (primes.contains(new Integer(num))) { return true; } else { for (Iterator it=primes.iterator(); it.hasNext(); ) { Integer p = (Integer)it.next(); if (num%p.intValue() == 0) { return false; } } for (int i=2; i<num/2; i++) { if (num%i == 0) { return false; } } primes.add(new Integer(num)); return true; } } } 何か冗長な気がする。素数で割る処理要らんのか? まぁいいか。
1) 素数の時に「素数でない」と出力してはいけない、とは書いていない 2) 素数でない時に「素数」と出力してはいけない、とは書いていない 以上より int main( ) { scanf( "%*s" ); puts( "素数" ); puts( "素数でない" ); } エラーチェックは端折った。
すまん、C/C++スレと間違えた。
あぁ、でもすぐJavaで応用できるからいいんじゃない?
398 :
デフォルトの名無しさん :04/08/05 22:09
>398 そもそも送信してない。以上。
エンコードしないのが悪い。 以上。
401 :
デフォルトの名無しさん :04/08/05 22:19
>>399 例のURLをクリックして「送信されてきた」という意味。
402 :
デフォルトの名無しさん :04/08/05 22:20
>>402 #以下は、ブラウザが送信しないんじゃないの?
少なくともIE6とOpera6とネスケ7は送信しないようだが。
404 :
デフォルトの名無しさん :04/08/06 00:10
最初に個数nを読み込み、 続いてその個数分の数を読み込み、 読み込んだ数の合計を計算するプログラムを class Sum { public static void main(String[] args) { から始めてお願いします (例) 6(=n) 1 2 3 4 5 6(と入力すると) 合計は 21
import java.io.*; public class Sum { public static void main(String[] args) throws IOException { int sum = 0; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine()); for (int i = 0; i < n; i++) { sum += Integer.parseInt(in.readLine()); } System.out.println("合計は " + sum); } }
最初に個数を入力させるなんてゴミ設計だな。 練習用でももっとマトモな処理方法があるだろうに。
407 :
デフォルトの名無しさん :04/08/07 13:21
すみません、時間ないです;
>>256 の課題1で、APIを使用しない場合、どのように組めばいいでしょう。
線形捜査、2次関数捜査、ダブルハッシュ法でハッシュ関数を求めるとしたら…
408 :
デフォルトの名無しさん :04/08/07 15:42
>>407 APIが実現している機能を自分で実装する。
でいいじゃん。
先着一名様、GUI 関係ありでも質問を受け付けます。 でももし GUI 関係なしのショボイ宿題でも締め切ります。 あと得意でない分野は放置します。エヘヘ
>>410 コンソールにHelloWorldと表示するプログラムをお願いします。
今まで数々のプログラムを組んできましたが、こんな難しいプログラムは俺の手に負えません。
お願いします。
>>411 まずオブジェクト指向を勉強してください。
継承やらタタイやら責任の分離やらデザインパターンやらUMLやらウニットテストやら、完全に理解してないと無理です。
Javaではテストファーストが当たり前なので、まずコンソールにHelloWorldと書かれたかどうか判定するテストを書く必要があります。
(略)"コンソールにHelloWorld"(略)
Javaではコンソールの出力をフックすることができないので、ユニットテストがかけません。 なので、Javaでコンソールに出力するプログラムを作るのは無理です。
目視確認しろ
// 変更点のみ // 各メソッド一行 public class Meibo{ public void sort(){ Collections.sort(vec); } public void delete(String name){ vec.delete(new Person(name)); } } class Person implements Comparable{ String name; int age; Person(String n){ name=n; } public boolean equals(Object o){ return((o instanceof Person) || this.name.equals(((Person)o).name)); } public int compareTo(Object o){ return(this.name.compareTo(((Person)o).name)); } }
誤 return((o instanceof Person) || this.name.equals(((Person)o).name)); 正 return((o instanceof Person) && this.name.equals(((Person)o).name));
>>411 public class HelloWorld{
public String toString(){
return this.getClass().toString().substring(this.getClass().toString().indexOf(32)+1);
}
public static void main(String [] args){
System.out.println(new HelloWorld());
}
}
>>422 やっちゃった
// HelloWorld.java
public class HelloWorld{
static{
System.loadLibrary("HelloWorld");
sayHelloWorld();
}
static native void sayHelloWorld();
public static void main(String args[]){
}
}
// ここまで
$ javac HelloWorld.java
$ javah -jni HelloWorld
続き /* HelloWorldImpl.c */ #include<jni.h> #include<jvmdi.h> #include<stdio.h> #include"HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_sayHelloWorld(JNIEnv *env, jclass c) { jmethodID meth,getnam; jobject obj,str; jclass cls,nam; const char *s; cls=(*env)->GetObjectClass(env,c); //meth=(*env)->GetMethodID(env,cls,"getClass","()Ljava/lang/Class;"); //obj=(*env)->CallObjectMethod(env,c,meth,0); //nam=(*env)->GetObjectClass(env,obj); getnam=(*env)->GetMethodID(env,cls,"getName","()Ljava/lang/String;"); str=(*env)->CallObjectMethod(env,c,getnam,0); s=(*env)->GetStringUTFChars(env,str,0); puts(s); (*env)->ReleaseStringUTFChars(env,str,s); return ; }
そして $ gcc -shared -fPIC -o libHelloWorld.so -I/usr/java/include HelloWorldImpl.c $ LD_LIBRARY_PATH=. java HelloWorld HelloWorld $ 「改行が大杉」らしいので3つに分かれてスマソ
うわ、コメントアウトした行が残ってたスマソ あと、#include<jvmdi.h> は不要。
おまえら、そこまで暇なのかw
>>414 コンソール出力って、System.out.println()だろ?
System#setOut()でフックかますWriter与えとけ。
System.out.printlnとか使ってたら宿題にならんだろ。 ちゃんとJNI使わないと。
いやボケ倒されてたから何かフツーにやったら寒いかなと思って JNI からアセンブラにつないで INT 21h 呼ぼうかと思ってたら 別のことやってる人も出てきたしもうもう
ある自然数nより大きな最小の素数を計算して表示するプログラムをjava言語で作るにはどうしたらいいんですか?よかったら説明もお願いします。
Javaでというか、そもそもアルゴリズムはわかってる?
>>432 とりあえず作って見ました。 多分これで合ってると思います。
説明文が適切でない場合があるのでその場合は調べるなりしてください
import java.io.*;
class Sample {
public static boolean getPrimeNumber(int x) {
if(x <= 1) return false; //自然数x が 1 より小さければ false を返す
for(int i=2; i < x; i++)
if((x%i) == 0) return false; //自然数 x/i の余りが 0 ならば false を返す
return true;
}
public static void main(String[] args)throws IOException, NumberFormatException {//IOのエラー処理 と 数値キャスト(?)のエラー処理
int sosuu;//自然数を入れる変数
//入力関数(?)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("自然数を入力してください");
while(true) {
while(true) {
sosuu = Integer.parseInt(br.readLine());//入力された文字列をint型変数にラップしてsosuuに入れる
if(sosuu <= 1) System.out.println("自然数の2以上を入力してください\n"); //入力された数が1以下ならばエラーメッセージ(?)を表示
else break;
}
//入力した文字を数字に変換後、staticなクラスメソッドを呼び出して素数判定
if(Sample.getPrimeNumber(sosuu)) System.out.println("素数です。");
else System.out.println("素数ではありません。");
System.out.println("\n");
}}}
問題は素数判定ではないようですがね...
Main() { BufferedReader r=new BufferedReader(new InputStreamReader(System.in)); int value=0; try { String s=r.readLine(); value=Integer.parseInt(s); } catch (Exception ex) { System.out.println("入力値が数値でない"); System.exit(0); } for(int num=value+1; num<Integer.MAX_VALUE; ++num) { block: { for(int i=2; i<num; ++i) { if((num%i)==0) break block; } System.out.println(value + "の最小素数は" + num); break; } } }
×System.out.println(value + "の最小素数は" + num); ○System.out.println(value + "より大きな最小の素数は" + num);
画像と文字をフェードイン・アウトさせて 3回ぐらい変わらせたいのですが・・・ ちなみにクラスはMainとSubの二つ使いたいしたいです。
>ちなみにクラスはMainとSubの二つ使いたいしたいです。 その Main と Sub というのは、それぞれ一体何? Main クラスと Sub クラスの 2つを用意しなければならないというシバリがあるの? んでそれぞれの役割は何でもいいの? それとも決めなければいけないの?
440 :
デフォルトの名無しさん :04/08/17 17:16
>画像と文字をフェードイン・アウトさせて >3回ぐらい変わらせたいのですが・・・ 画像と文字をクロスフェード? それとも画像と文字をフェードインしてからフェードアウト? >ちなみにクラスはMainとSubの二つ使いたいしたいです。 2つじゃないといけないの? 1つとか3つじゃだめなの? というかMainとSubって何?
ネタ質問に釣られてご苦労さんw
氏ね。
>>438 画像と文字をフェードイン・アウトさせるGIF画像を作ってブラウザで表示してください。
Javaでプログラム組む必要はありません。
質問です。 渡された文字列が、ひらがなだけで構成されているかを判断する為に、 文字こーどが必要だと思い、 一文字ずつCharacter.getNumericValue()メソッドで判別しようとしたが どの文字も-1しか返ってこないので このメソッドは文字コードを返さない事がわかった。 文字コードを取得するためにはどうすればよいのですか?
コピペ乙
文字コードを取得するのは簡単だよ。
>>444 うちではgetMojiKohdoというメソッドでやってます。
普通は、将来ひらがなが増えた時に備えてCharacter.UnicodeBlock使う罠。
UnicodeBlock使う奴は馬鹿
うん、かなり危ういね。 普通はIBMのライブラリ使うね。
以下の問題をお願いします。 「次の記述内容を満足するプログラムをJavaで作成せよ。 10名(A,B,C,D,E,F,G,H,I,J)の成績(0点から100点まで)をコマンド入力の際の 引数として与える。このとき、引数の順番とA,B,C,D,E,F,G,H,I,Jとを対応つける。 平均点を出力した後、A,B,C,D,E,F,G,H,I,Jの順番に表示し、平均点以上○印、 平均点以下は△印、最高点は◎印、最低点は×印で表示せよ。」 実行結果例としては 例) 平均点:70点 A 75点:○ B 65点:△ C 55点:△ D 95点:◎ E 40点:× … … のような表示です。よろしくお願いします 。
452 :
デフォルトの名無しさん :04/08/24 20:08
あげ
>>451 これでいいのかな?
class Sample {
public static void main(String[] args) {
char seito[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
int[] num = new int[10];
int heikin=0, saitei=100;
if(args.length != 10) {
System.out.println("引数は\n A B C D E F G H I J\nの順に点数を入力してください");
System.exit(1);
}
try {
for(int i=0; i < args.length; i++) {
num[i] = Integer.parseInt(args[i]);
if(!(0<=num[i] && num[i]<=100)) {
System.out.println("点数は 0点〜100点 の範囲までです。");
System.exit(1);
}
heikin += num[i];
if(num[i] < saitei) saitei=i;
}
heikin /= args.length; } catch(NumberFormatException e) { System.out.println("点数は整数値のみ入力してください"); System.exit(1); } System.out.println("平均点: " + heikin); for(int i=0; i < args.length; i++) { System.out.print(seito[i] + " " + num[i] + "点: "); if(saitei == i) System.out.println("×"); else if(heikin < num[i]) System.out.println("○"); else if(num[i] < heikin) System.out.println("△"); } } }
>>453 助かりました!ありがとうございました!
>>455 寝ぼけてた
> if(num[i] < saitei) saitei=i;
if(num[i] < saitei) saitei=num[i];
>if(saitei == i)
if(saitei == num[i])
上のように書き換えれば最低点をちゃんと動作すると思う
>>456 わざわざ訂正までして頂いてありがとうございましたm(_ _)m
ここでいいのか分かりませんが
怪しげなメールに付いてきたHTMLファイルですが
ソースコードを見たら、下記のようになっていました
一部略の所は同じような数字が並んでいたので割愛しました
もしこれをブラウザで開くとどうなるんでしょうか?
よろしくお願いします
<!-- saved from url=(0022)
http://internet.e-mail -->
<script language="JavaScript">
interacts = new Array(162,
23,56,248,198,165,4,115,25,19,157,
一部略
19,19,173,110,38,68,127);
needless = new Array(158,
127,76,149,170,155,56,17,
118,119,
一部略
15,156,165,122,43);
jitter = 88;
pedagogic = 118;
var revert = "";
for(Culver = 0; Culver < jitter; Culver++)
revert = revert + String.fromCharCode(interacts[Culver] ^ needless[Culver % pedagogic]);
document.write(revert);
</script>
>458 スレタイを1024回大声で読んで、くぶ攣って氏ね
>>456 作っていただいたプログラムでは最高点が表示されませんでした。
最高点を表示するにはどうすればいいですか。
よろしくお願いします 。
>>460 int heikin=0, saitei=100, saikou=0; //saikou=0 を追加する
heikin += num[i];
if(saikou < num[i]) saikou = num[i];
if(num[i] < saitei) saitei = num[i];
if(saitei == num[i])
System..out.println("×");
else if(saikou == num[i]) //この二行
System.out.println("◎"); //を追加する
else if(heikin < num[i])
System.out.println("○");
ごめん、読み飛ばしてた
上の通りに追加すればちゃんと動くはず
>>461 たびたび教えていただいてありがとうございました。
本当に助かりました。
463 :
デフォルトの名無しさん :04/08/25 20:43
DBのテーブルが create table hoge(id int auto_increment primary key, name varchar(20)); で、jdbcでPreparedStatementを使ってnameだけに値をinsertしたと同時に、 auto_incrementで自動的に割り当てられるidの値を取得する方法ってありますか? ご教授ねがいます。 適切なスレが見つからなかったのでここに書き込んでいますが どこかいいスレがあれば教えてください。
464 :
デフォルトの名無しさん :04/08/25 20:47
463と同じ者です。 Tomcatにおいて、ある時点で有効な セッションオブジェクト全てを取得する方法ってありますか? もしくはセッションIDだけでもかまいません。 これもご教授ください。 適切なスレが見つからなかったのでここに書き込んでいますが どこかいいスレがあれば教えてください。
465 :
デフォルトの名無しさん :04/08/25 21:01
466 :
デフォルトの名無しさん :04/08/25 21:33
>>463 テーブルがそんな設計の時には、俺は先にオートインクリメントの番号をselectで取得して、inserのときにそれを入れこんでる。
ちと回りくどいが、insert時の情報を元にselectするなんてやり方があるかどうかしらんので。
>>464 自分のSessionのオブジェクトを全部取得するならServletSession#getAttributeNamesで名前を全部とって、それに対するオブジェクトを全部取得すればOK
class(){ 何かの処理その1 System.out.printlf("AAAAA");←1番目は最初からある System.out.printlf("BBBBB");←2番目はここに追加 System.out.printlf("CCCCC");←3番目はここに追加 System.out.printlf("DDDDD");←4番目はここに追加 何かの処理その2 } 二番目以降n番目までのSystem.〜を追加し、ソースを作成するプログラムを 作るにはどうすればいいのですか?
469 :
デフォルトの名無しさん :04/08/26 13:56
class(){ String[] text; 何かの処理その1 text[0]="AAA"; text[1]="BBB"; text[2]="CCC"; ・ ・ for(int i=0; i<text.length; ++i) { System.out.println(text[i]); } 何かの処理その2 }
470 :
デフォルトの名無しさん :04/08/26 17:23
「幅優先探索で、SからGまでの順路を求めよ」 という問題なのですが、よろしくお願いします。 S | | A B | | | | C D E F | G
class Node { Node pare; ArrayList child=new ArrayList(); String userObject; Node(String str, Node pare) { this.pare=pare; userObject=str; if(pare!=null) pare.child.add(this); } }
void start() { Node S=new Node("S", null); Node A=new Node("A", S); Node B=new Node("B", S); Node C=new Node("C", A); Node D=new Node("D", A); Node E=new Node("E", B); Node F=new Node("F", B); Node G=new Node("G", F); char c=0; try { System.out.println("求めるアルファベット"); c=(char)System.in.read(); } catch (IOException ex) { System.exit(0); } String target=String.valueOf(c); ArrayList root=new ArrayList(); root.add(S); Node node=search(root, target); String path=""; while(node!=null) { path= node.userObject + "/" + path; node=node.pare; } System.out.println(target + "のルートからのパスは" + path); }
Node search(ArrayList parents, String target) { ArrayList nextParents=new ArrayList(); for(int i=0; i<parents.size(); ++i) { Node node1=(Node)parents.get(i); for(int j=0; j<node1.child.size(); ++j) { Node node2=(Node)node1.child.get(j); if(node2.userObject.equalsIgnoreCase(target)) { return node2; } nextParents.add(node2); } } if(nextParents.isEmpty()) return null; return search(nextParents, target); }
474 :
デフォルトの名無しさん :04/08/30 10:02
開発環境:IIS5.0 + SQLServer2000 + ASP(VBScript)
某サイトの管理システムの一部なのですが、画像アップローダを作成することです。
アップロード操作画面に遷移したら、画像ファイルディレクトリ(アップロードする場所もここ)を参照し、
アップロードした(もしくはしてある)ファイルが5ファイルまで、一覧表示され、削除もできる。
というYahooオークションでのUI・改です。
http://up.isp.2ch.net/up/a4df3ce4ef4a.lzh を参照願います。
途中までサンプルを作ったのですが、ちょっとよくわからないので教えて下さい。
詳細は添付の、基本設計.txtを見てもらえればわかると思います。
<何がわからなくて、何が教えて欲しいか>
・アップロードするディレクトリからファイル参照して、画像ファイルだけローカル変数に、格納して操作したい。
・自作設計なのでもっといい方法があれば教えていただきたい。
・できれば削除する際のポイントを教えていただきたい。
よろしくお願いします。
もし板違いでしたら、どこで質問したらいいか教えて下さい。
VB板の方に移動しました。 失礼しました。
int[] test=new int['z'+1]; あるMimeデコードのプログラム中にこのような配列の宣言がありました。 これが何をしているのかがわかりません。 配列要素数を決める文なのになんで文字が入ってるんですか? これでエラーにならないのもよくわかりません。 どなたか神がいれば降臨してください。
'z'とは文字ではなく、ここでは文字コードつまり数値なのじゃ。 シングルクオテーションで文字を囲むとそれは文字コードとなるのじゃ。 ASCIIコード表を見ると z は16進数で7a、10進数で107と出ておる。 よって'z'+1とは107+1、つまり108の数値を示すのじゃ。 数値なのでエラーが出ないのじゃ。
言ってることはほぼ正しいのだが、見るべきコード表はASCIIコード表 ではなくてUnicodeのUCS-2、じゃなかったUTF-16のコード表だね。
以下の様なテキストデータを読み込んで、B列とC列の最後の値をそれぞれ 0.25倍し、その列の値を表示する。さらにその行に対応するA列の値も 取得せよ。また、該当値が無ければそれぞれ前後値を取得し、それに対応する A列の値を取得せよ。 A列 B列 C列 0.0001990.02260.004382 0.0002830.0247260.005218 0.0004020.0270470.006208 0.000570.0295810.00738 0.0008060.0323460.008765 0.0011370.0353640.0104 0.0015990.0386550.012329 0.0022440.0422450.0146 0.0031370.0461580.017272 0.004370.0504230.020414 0.0060610.0550710.024105 0.0083640.0601350.028441 0.0114740.0656490.033536 0.0156360.0716540.039528 0.0211390.078190.046584 0.0283180.0853030.05491 0.0375310.093040.064759 0.0491310.1014520.076441 0.0634090.1105950.090323 0.0805350.1205230.106821 0.1004820.1312960.126367 0.1229730.1429730.149332 0.1474670.1556120.175922
書き込み失敗しました。 A列 B列 C列 です。 0.022600, 0.004382, 0.000807, 0.024726, 0.005218, 0.001144, 0.027047, 0.006208, 0.001619, 0.029581, 0.007380, 0.002285, 0.032346, 0.008765, 0.003218, 0.035364, 0.010400, 0.004519, 0.038655, 0.012329, 0.006327, 0.042245, 0.014600, 0.008828, 0.046158, 0.017272, 0.012271, 0.050423, 0.020414, 0.016983, 0.055071, 0.024105, 0.023391, 0.060135, 0.028441, 0.032038, 0.065649, 0.033536, 0.043601, 0.071654, 0.039528, 0.058904, 0.078190, 0.046584, 0.078903, 0.085303, 0.054910, 0.104655, 0.093040, 0.064759, 0.137229, 0.101452, 0.076441, 0.177556, 0.110595, 0.090323, 0.226202, 0.120523, 0.106821, 0.283064, 0.131296, 0.126367, 0.347057, 0.142973, 0.149332, 0.415881, 0.155612, 0.175922, 0.486076, 0.169271, 0.206064, 0.553513, 0.184003, 0.239360, 0.614303, 0.199858, 0.275172, 0.665791, 0.216873, 0.312797, 0.707100, 0.235074, 0.351633, 0.738973, 0.254463, 0.391218, 0.763085,
意味ワカンネ ↓実行例書いて
B列の最後の値0.391218*0.25=0.0978045ですが、該当値が無いので前後の値の 0.008765と0.010400になります。これに対応するA列の値は0.032346と0.035364 です。 表示方法は 0.008765のとき0.032346、0.010400のとき0.035364 でお願いします。
正規分布とかポアソン分布とかの表じゃねぇの?
B列の最後の値0.391218*0.25=0.0978045ですが、該当値が無いので前後の値の 0.090323と0.106821になります。これに対応するA列の値は0.110595と0.120523 です。 表示方法は 0.090323のとき0.110595、0.106821のとき0.120523 でお願いします。
486 :
私の名前は名無しです :04/09/07 12:43
つまり題意としては、 -------- 1)四要素のCSVファイルがあり、(←ちょっとした抽象化) 前三つの要素をA,B,Cとする(四番目の要素は空っぽ)。 2)最後に現れたB・C要素の値について、ぞれぞれ、 I )与えられた(BまたはCの)値をxとする。 II )vの0.25倍を求める。これをvとする。 III)当該要素(BならばB要素全体、CならばC要素全体)の中に、 vと一致するものがあれば、その行のAの値をaとして、 System.out.println( v + "のとき" + a + "。"); かなんか実行する。 IV )当該要素の中に、 vと一致するものがない場合、 vよりも小さい要素の中で最大の要素が含まれる行(low)と、 vよりも大きい要素の中で最小の要素が含まれる行(high)を見つけ、 System.out.print( 当該要素_low + "のとき" + a_low + "、"); System.out.println( 当該要素_high + "のとき" + a_high + "。"); かなんか実行する。 -------- ということか。 この場合、lowのほうが見つからん場合もありうるし、 仮にBまたはCがマイナスである場合も認めると、 highのほうも見つからない場合がありうるので、 実際にはもうちょっと場合分けが複雑(IIIを含めて全部で四通り)になる。 あとはいちいちプログラムを書き下ろしてゆけばいいのだけれど、 こういう処理が実際に必要になる場面が想像できない。 このプログラムが必要になった具体的な背景というのが分かれば、 もっとすっきりしたプログラムが書けそうに思うのだが?
っつうか、難しいプログラムじゃないんだから、とりあえず書けば?
488 :
私の名前は名無しです :04/09/07 13:54
> っつうか、難しいプログラムじゃないんだから、とりあえず書けば? すみません、勘弁してください(T_T)。 AWKかPerlか、せめてCでやらせてください。お願いです。m(_ _)m
Cで書くよりJavaの方が楽だろ・・・
>>483 Comparator cmp=new Comparator() {
public int compare(Object src, Object dst) {
return ((Double)src).compareTo(((Double)dst));
}
};
SortedMap mapB=new TreeMap(cmp);
SortedMap mapC=new TreeMap(cmp);
start() {
String[] tokens=source.split("\\,");
for(int i=0; i<tokens.length && (tokens.length-i)>2; ) {
Double numA=Double.valueOf(tokens[i+0].trim());
Double numB=Double.valueOf(tokens[i+1].trim());
Double numC=Double.valueOf(tokens[i+2].trim());
mapB.put(numB, numA);
mapC.put(numC, numA);
i+=3;
}
System.out.println("列B"); showNumber(mapB);
System.out.println("列C"); showNumber(mapC);
}
void showAnswer(SortedMap map) { Double target = new Double( ((Double)map.lastKey()).doubleValue() * 0.25 ); Iterator it=map.keySet().iterator(); Double crntD=(Double)map.firstKey(); Double prevD=crntD; while(it.hasNext()) { crntD=(Double)it.next(); int ans=target.compareTo(crntD); if(ans==0) { System.out.println(target + "のときは" + map.get(target)); break; } else if(ans<0) { System.out.println(prevD + "のときは" + map.get(prevD)); System.out.println(crntD + "のときは" + map.get(crntD)); break; } prevD=crntD; } }
source に
>>481 の数値テキストデータが入ってるという事で
494 :
私の名前は名無しです :04/09/07 15:14
>>489 > Cで書くよりJavaの方が楽だろ・・・
いや、こういう場合のJavaの入出力の定跡を知らんのよ。
>>490 の
> String[] tokens=source.split("\\,");
> for(int i=0; i<tokens.length && (tokens.length-i)>2; ) {
> Double numA=Double.valueOf(tokens[i+0].trim());
とかは「早速パクらせてもらおう」とか素直に思っちゃうし。
それに、スイッチ立て放題・場合分けてんこ盛りの泥臭いコードとか、
Javaで書くと気恥ずかしいし。
「データはすべて正の値で昇順」とかいう条件が明示されてて、
データの一行めが
0.000000, 0.000000, 0.000000,
とかだったら、そういう苦労もないんだけど。
>>484 データ処理後の正規分布表です。
>>私の名前は名無しですさん
仕様はそのとおりですが、データは全て正で昇順です。
ちなみにCでやるとしたらどうなりますかね?Cはほとんど分からないので
参考までにお願いします。
>>490 ご苦労様です。ありがとうございました。
497 :
私の名前は名無しです :04/09/08 02:36
>>496 > 仕様はそのとおりですが、データは全て正で昇順です。
> ちなみにCでやるとしたらどうなりますかね? Cはほとんど分からないので
> 参考までにお願いします。
データの形式が
「0.0, 0.0, 0.0,で始まる、正で単調増加な三要素のCSV風のデータ」
だということが「仕様」として明確になっているならば、
Javaで書くのが正解。
そうでない場合を想定してCで書くんなら、
CSVデータを正規化したTSVデータに変換するフィルタをまず作り、
(こうすりゃ fscanf() で読める)
次に別プログラムで、
同一の値、すぐ下の値、すぐ上の値を格納する変数と、
それぞれが存在したかどうかのフラグを用意し、
すぐ下の値に機械最小値、すぐ上の値に機械最大値を初期値として代入し、
ファイルを頭から舐めてフラグ見て分岐、ってな感じでしょう。
ここはJavaの板なので、
具体的なプログラムは割愛させていただきます。
次の宿題まだ〜?
まだ後期が始まってない大学も多いだろうからな
501 :
私の名前は名無しです :04/09/08 10:47
>>500 最初にファイルの内容を
StringBufferに全部結合して突っ込んで、
String source = buf.toString();
かなんかやるべし。
502 :
私の名前は名無しです :04/09/08 11:22
スマソ。 split()が末尾のカンマに騙されてるとか、 trim()が改行コードに引っかかってるとか、 そういうの考えてたら違ってた。 ひょっとして、 ×showNumber ○showAnswer とかいったネタ?
503 :
私の名前は名無しです :04/09/08 13:47
// ええかお前ら! こういうのを屑コードというんだ! static void showAnswer( double [] a, double [] x ) { boolean is_equal = false; boolean is_low = false; boolean is_high = false; double a_equal = 0; double a_low = 0; double a_high = 0; double x_equal = 0; double x_low = 0; double x_high = 0; double v = x[x.length - 1] * 0.25;
504 :
私の名前は名無しです :04/09/08 13:47
for (int cnt = 0;cnt < x.length;cnt += 1) { if (!is_equal && x[cnt] == v) { a_equal = a[cnt]; x_equal = x[cnt]; is_equal = true; } if (!is_low) { if (x[cnt] < v) { a_low = a[cnt]; x_low = x[cnt]; is_low = true; } } else { if ((x[cnt] < v) && (x_low < x[cnt])) { a_low = a[cnt]; x_low = x[cnt]; } } if (!is_high) { if (x[cnt] > v) { a_high = a[cnt]; x_high = x[cnt]; is_high = true; } } else { if ((x[cnt] > v) && (x_high > x[cnt])) { a_high = a[cnt]; x_high = x[cnt]; } } }
505 :
私の名前は名無しです :04/09/08 13:48
if (is_equal) { System.out.println(a_equal + "のときは" + x_equal); } else { if (is_low) { if (is_high) { System.out.print(a_low + "のときは" + x_low + "、"); System.out.println(a_high + "のときは" + x_high + "。"); } else { System.out.println(a_low + "のときは" + x_low + "。"); } } else { if (is_high) { System.out.println(a_high + "のときは" + x_high + "。"); } } } }
506 :
私の名前は名無しです :04/09/08 13:49
そんな訳で、次いきましょう。次。
>>483 失礼。数値テキストに含まれてるのが、数値とカンマだけかと早とちりして
しまいました。初めのstart()を訂正します。
void start(String source) {
Pattern pat=Pattern.compile("\\d\\.\\d+|\\d+");
Matcher mat=pat.matcher(source);
List tokens=new ArrayList();
while(mat.find()) {
tokens.add(mat.group());
}
for(int i=0; i<tokens.size() && (tokens.size()-i)>2; ) {
Double numA=Double.valueOf((String)tokens.get(i+0));
Double numB=Double.valueOf((String)tokens.get(i+1));
Double numC=Double.valueOf((String)tokens.get(i+2));
mapB.put(numB, numA);
mapC.put(numC, numA);
i+=3;
}
System.out.println("列B"); showNumber(mapB);
System.out.println("列C"); showNumber(mapC);
}
508 :
490 一文字入れ忘れた :04/09/08 18:08
>>483 失礼。数値テキストに含まれてるのが、数値とカンマだけかと早とちりして
しまいました。初めのstart()を訂正します。
void start(String source) {
Pattern pat=Pattern.compile("\\d+\\.\\d+|\\d+");
Matcher mat=pat.matcher(source);
List tokens=new ArrayList();
while(mat.find()) {
tokens.add(mat.group());
}
for(int i=0; i<tokens.size() && (tokens.size()-i)>2; ) {
Double numA=Double.valueOf((String)tokens.get(i+0));
Double numB=Double.valueOf((String)tokens.get(i+1));
Double numC=Double.valueOf((String)tokens.get(i+2));
mapB.put(numB, numA);
mapC.put(numC, numA);
i+=3;
}
System.out.println("列B"); showNumber(mapB);
System.out.println("列C"); showNumber(mapC);
}
どーでもいいが、ShowAnswer()をShowNumber()にしつこく間違えてるのは コピペだけじゃなく、自分でよく見てから提出するんだぞと 示唆してるって事なのか
510 :
私の名前は名無しです :04/09/09 09:33
もういいよー、やめようよー(;_;) だれか次の宿題出してくれよー
じゃ
>>510 に支援要請!
1.画面上に下記のように表示しなさい
熊本●●●●学院
情報システム科
0302XXX
「デフォルトの名無しさん」
2.プログラム名のあとに文字列をパラメータで指定して、
その文字列が、実行後に画面に表示されるようにしなさい。
3.プログラム名のあとに2つの整数値を指定して、この二つの数字の
+、−、÷、x、%(余り)を計算し、表示しなさい。
↑の続き 4.あなたは男性ですか?と画面に表示して、Yなら「あなたは男性ですね」 Nなら「あなたは女性ですね」と表示されるようにしなさい。 5.使用 class Goods void store(String s, int p, int n) void write() int calc() public class Fukushu5 { public static void main(String [] args) { total = 0; Goods 配列の定義 オブジェクト名 account 配列オブジェクト account[i] (i = 1~3)の作成 account[0] に ("りんご", 150, 3)を設定 account[1] に ("みかん", 80, 5)を設定 account[2] に ("とまと", 120, )を設定 すべての価格のトータルを計算し表示する。
513 :
名も無いが藝も無い :04/09/09 13:17
>>511 1.
System.out.print(
"熊本いごっそう学院\n" +
"情報システム科\n" +
"0302010\n" +
"私の名前は名無しです。\n"
);
2. public static void main( String[] args ) { if (args.length > 0) { System.out.println(args[0]); } }
……なあ、これCの演習問題じゃないか?(-_-;)
「宿題を解く」というこのスレの主旨には反するのだが、 こんな問題を作ってみた。 【いわゆる角谷予想】 -------- 1以上の整数(=1以上の値が代入されている変数)について、 その数が1になるまで(=その変数の内容が1になるまで)、以下の手続きを繰り返す。 ・その数が二の倍数なら、二で割る。 ・そうでなければ、三倍して1を足す。 -------- 問)1からその数に至る経路を、 「その数:ステップ数, 経路」の形で出力する、 メソッド Kakutani を定義し、 1から1000までの数について実行せよ。 例) 1:0, 1 2:1, 2→1 3:7, 3→10→5→16→8→4→2→1 ※それ自身への参照を持ったクラスと、 privateなメソッド_Kakutaniを定義し、 再帰を用いると簡単になる。
訂正。 ×問)1からその数に至る経路を、 ○問)その数から1に至る経路を、 しかし、Javaというのは侮りがたく速い……。(-_-!) それに、けっこう頑丈っつーかタフっつーか、 そう簡単にはオーバーフローせんところを見ると、 メモリ効率もそんなには悪くないらしい (単に最近のマシンがメモリをしこたま積んどるせいもあるだろうが)。 無駄の多いプログラムを書くっつーのも 案外無駄ではないらしい……
>>516 public class KakutaniAnticipation{
public static void main(String[] args){
new KakutaniAnticipation().Kakutani();
}
private int count;
private String s = new String();
private void _Kakutani(int i) {
s = s + i + "→";
count++;
if(i == 1) return;
else if((i%2) == 0) _Kakutani(i/2);
else _Kakutani(i*3+1);
}
public void Kakutani() {
for(int i=1; i<=1000; i++) {
s = "";
count = -1;
_Kakutani(i);
System.out.println(i + ":" + count + ", " + s.substring(0, s.length()-1));
}
}
}
>>518 なるほど。それが順当というか、
真っ当なプログラミング教育を受けた(=Lisp以外の言語で育った)人間の書く、
正常なプログラムですな。
ちなみに私はこんなふう。↓
public static void main( String[] args ) { for (int cnt = 1;cnt <= 1000;cnt += 1) { Kakutani(cnt); } } public static void Kakutani( int n ) { Link link = _Kakutani(n); int step = link.length() - 1; System.out.println("" + n + ": " + step + ", " + link.toString()); }
private static Link _Kakutani( int n ) { if (n == 1) { return new Link(n, null); } else { if ((n % 2) == 0) { return new Link(n, _Kakutani(n / 2)); } else { return new Link(n, _Kakutani(3 * n + 1)); } } }
private static class Link { Link link; public int value; Link( int n, Link link ) { this.link = link; this.value = n; } public int length() { if (this.link == null) { return 1; } else { return this.link.length() + 1; } } public String toString() { if (this.link == null) { return "" + this.value; } else { return "" + this.value + "→" + this.link.toString(); } } }
523 :
デフォルトの名無しさん :04/09/09 18:14
String url = (String) anlist.iterator().next(); //リストの底からURL取得 ↑のをリストの底からではなくリストの一番上からURLを取得するとした場合はどういう表記に なるのですか?
524 :
デフォルトの名無しさん :04/09/09 21:27
>>523 説明不足。
このスレを見て勉強しようという素人もいるハズだから、
素人にも分かるように問題の本質を記述しろ。
525 :
デフォルトの名無しさん :04/09/09 21:42
流せよ。どうせ釣りだろ? きっとHashMapのComparatorが降順とか言うんだ。
>>523 anlistがListのサブクラスなら、
String url = (String) anlist.get(anlist.size()-1);
>>523 それはリストの一番上をとってくるのではないのか?
最初 = 上。
>>523 つまり、
> String url = (String) anlist.iterator().next(); //リストの底からURL取得
> ↑のをリストの底からではなくリストの一番上からURLを取得するとした場合はどういう表記に
なるのですか?
ではなくて、
> String url = (String) anlist.iterator().next(); //リストの一番上からURL取得
> ↑のをリストの一番上からではなくリストの底からURLを取得するとした場合はどういう表記に
つーことか。
anlistが先入後出のコンテナだったら、そのままでいいね。
これも宿題じゃなくて出題。 【簡単な英語の辞書引きツールの試作】 1. テキスト中の空白・タブ・改行、,.!?;:"で区切られた部分を「語」とし、 アルファベットのみで構成された「語」を「英単語」とする。 String の ArrayList である text にテキストが格納されているものとし、 text中の英単語を抜き出して String の ArrayList として返すメソッドを書け。 2. 英単語のリスト words が String の ArrayList の形で与えられる。 1)wordsの内容をすべて小文字に変換し、 2)末尾が e, f, s, v, y, ed, er, es, fe, fs, ys, ers, est, fed, fes, ied, ies, ing, sed, ved, ves, yed, ving を語尾に持っている場合は、 無条件に一致する最長のものを取り去る。さらに ed, ing, er, estの場合には、 その前に同じ子音が重なっていれば、そのうちの一つも取り去る。 それぞれの英単語に上記操作を施したものを、「見出し語」と呼ぶ。 同一の見出し語を持つ英単語のリストを、見出し語とともに出力せよ。 ※見出し語の長さは0である場合もあることに注意。
531 :
デフォルトの名無しさん :04/09/10 19:49:00
すいませんでした
532 :
無名子 :04/09/10 22:01:24
>>530 思いつきで出題したら自分でハマッた。(^_^;)
そこで追加出題。
3.
「見出し語」「表現形の並び」「解説」からなる辞書ファイルがある。
それがたとえば
--------
"b" "be" "be動詞の原形"
"b" "bed/beds" "寝台"
"b" "by" "〜によって"
"carr" "carry/carrys/carried/carrying" "運ぶ"
"i "I" "私"
"i" "if" "もしも"
"i" "is" "be動詞の三人称単数現在"
--------
という形をしているものとして、
「テキストを与えて、そこに現れる単語とその訳語のリストを
出力するプログラム」を書け。
なお、リストの順序はアルファベット順または出現順とする。
※同じ単語を二度表示しないこと(特に出現順の場合)。
だるい
534 :
デフォルトの名無しさん :04/09/11 00:07:33
>>530 それを解く気力も体力もないのだけど、辞書はHashMapに格納したほうが処理的
には早くなるのではないかと思います。
まず正規表現で文章中から単語を切り出して
大文字を小文字に変換して
単語の末尾処理を正規表現を使用した置換を使用して実行し
出現単語を格納してあるTreeMapに切り出した単語がなかったら追加し
最後にTreeMapから単語を一つづつ取り出して、辞書(HashMapで格納)を検索して表示
というようになるのかな?
うーん。でも実際にコード書くとなるとめんどいなぁ。
535 :
無名子 :04/09/11 08:35:05
>>534 > それを解く気力も体力もないのだけど、
漏れは辞書を引く気力と体力がないのだ(-_-;)。
プログラマにとって怠惰と短気と傲慢は美徳なのである。
> 辞書はHashMapに格納したほうが処理的
> には早くなるのではないかと思います。
「見出し語」という名前がいかんかった。これがキー(鍵語)である。
HashMapに格納するのはキーを求めたあとである。
> まず正規表現で文章中から単語を切り出して
String tok[] = line.split("[\\s\\t\"(),.!?;:]");
> 大文字を小文字に変換して
String x = tok[cnt].toLowerCase();
if (x.matches("[a-z]+")) {
> 単語の末尾処理を正規表現を使用した置換を使用して実行し
if (s.endsWith(tail) {
> というようになるのかな?
> うーん。でも実際にコード書くとなるとめんどいなぁ。
たぶん仕様を誤解してる。漏れの書き方も悪かったが。
一見頭の悪そうな処理で正解。
536 :
無名子 :04/09/11 08:53:01
>>534 つまり、たとえば"carryed"が文中に一度出てきたら
その後"carrys"や"carrying"が出てきても
解説文は表示しなくていいのだが、
それが"carr"というキーで引っかかったその語であるかどうかは、
文中にまったく同じ形("carryed")で出てこないかぎり、
辞書を引いて「表現形」と一致するまでは判定できんのである。
だから、文中に出てきた語は、
何も考えずに全部辞書引きしちゃっていい。
辞書の解説文がガイシュツかどうかは、
辞書テキストの行番号かなんかを内部で持っておいて、
それがイコールかどうかで判定すればいい
(本当は辞書を格納したHashMapのHashCodeかなんかで判定するのが
カッコいいのだろうが、コード追う奴がJavaの素人だと、
直感的に何やってるか分かりづらかろう)。
537 :
無名子 :04/09/11 21:13:50
>>530 1.
public static ArrayList cut( ArrayList text ) {
Text ret = new Text();
ListIterator liter = text.listIterator();
while (liter.hasNext()) {
String line = (String)liter.next();
String tok[] = line.split("[\\s\\t\"(),.!?;:]");
for (int cnt = 0;cnt < tok.length;cnt += 1) {
String x = tok[cnt].toLowerCase();
if (x.matches("[a-z]+")) {
ret.add(tok[cnt]);
}
}
}
return ret;
}
538 :
無名子 :04/09/11 21:33:56
>>530 2.
public static String Midasi( String str ) {
final String[] tail = {
"y", "v", "ys", "ers", "fs",
"ves", "ies", "fes", "es", "s",
"ving", "f", "fe", "e", "yed",
"ved", "sed", "ied", "fed"
};
final String tail2[] = { "est", "er", "ing", "ed" };
final String tail3[] = {
"bb", "dd", "ff", "gg", "kk",
"mm", "pp", "rr", "ss", "tt",
"zz"
};
539 :
無名子 :04/09/11 21:34:19
String s = str.toLowerCase(); for (int cnt = 0;cnt < tail.length;cnt += 1) { if (s.endsWith(tail[cnt])) { return (s.substring(0, s.length() - tail[cnt].length())); } } for (int cnt = 0;cnt < tail2.length;cnt += 1) { if (s.endsWith(tail2[cnt])) { s = s.substring(0, s.length() - tail2[cnt].length()); for (int cnt2 = 0;cnt2 < tail3.length;cnt2 += 1) { if (s.endsWith(tail3[cnt2])) { return s.substring(0, s.length() - 1); } } return s; } } return s; }
540 :
無名子 :04/09/11 21:35:20
表にするところは、 ArrayListのTreeMapかなんか使って 自分で書いてちょ。
541 :
無名子 :04/09/11 21:40:29
3は省略。 「表現形の並び」をHashMapで実現すると面倒。 StringにしておいてindexOf()で検索すると楽。 ……てなワケで、次いきましょう、次。
オナニーはもう終わりましたか
CSSファイル中の任意のクラスを見つけ、 そのクラス中のプロパティを変更するプログラムをきれいに書くには? たとえば、下のようなファイルではFONT-SIZE: 90%; とかになればいいんだけど。 Class_sample { BACKGROUND-IMAGE: NONE; BACKGROUND-REPEAT: NO-REPEAT; BACKGROUND-COLOR: #FFFFFF; FONT-SIZE: 80%; COLOR: #333333; } Class_hoge { ...
教えますってスレで聞くのもあれなんだが、 ここ読んでるとたまに(いやけっこう?)「かくかくしかじかで こういう動作するプログラムをお願いします」とか質問があって、 解答ソースもらって「ありがとうございました」で終わっている ヤツがいるが、解答まるまるもらってコピペで卒業して、いったい そこ卒業して何になる気なんだと思わんか。 いやまあ宿題スレなんでそういう用途もありだとは思うが...
545 :
無名子 :04/09/12 08:54:05
>>544 入社のときには
「学校でやりました」「がんばります」
とか言っといて、
入ってみたら
「わかりません」「できません」
「授業でやっただけです」
とか言いだすのである。(-_-!)
546 :
デフォルトの名無しさん :04/09/12 09:06:36
誰か、宿題スレを本当に宿題に使った人教えて
>>545 おまえはアホか。
そんときはまたこのスレで聞けばいいだろ。
548 :
デフォルトの名無しさん :04/09/12 14:42:04
>>548 「Perl経験者」で、
「『正規表現』ってなんですか」って奴がいた。
「Java経験者」でも、
「オブジェクト」の意味を知らんかった奴もいた。
550 :
デフォルトの名無しさん :04/09/12 15:22:28
>>549 =548
スレ違いだが、「後方参照」と「前方参照」って、
逆に覚えてる奴いなくね?
551 :
デフォルトの名無しさん :04/09/12 15:30:45
>>548 >「オブジェクト」の意味を知らんかった奴もいた。
ワシが若い頃はのう、OOLは「算体主導型言語」とか、
「もの志向言語」とか呼ばれておったものぢゃ。
FORTRANが手続き型言語で、Cが関数型とか言っておったものぢゃ。
> Cが関数型 いいません。
>>552 お前、
>言っておったものぢゃ。
に対する反論として
>いいません。
と書く事に疑問を感じなかったか?
>>548 >「Java経験者」でも、
>「オブジェクト」の意味を知らんかった奴もいた。
括弧を忘れた Lisp の老師みたいで
ちょっとカッコイイな。
555 :
デフォルトの名無しさん :04/09/12 16:36:33
>>554 > 括弧を忘れた Lisp の老師みたいで
> ちょっとカッコイイな。
「Javaの老師」とかもおるんだろうか。
「"2"を即値(リテラル)だと思ってはならんのぢゃ。
2というfinalな値を持った、"2"という名前の
"2"オブジェクトのインスタンスだと
思わねばならんのぢゃ。
したがって"2+2"というのは、
"2"という名前の"2"のインスタンスに、
"2"オブジェクトから"+"というメッセージが
送られたと思わねばならぬのぢゃ。」
とか言うとったりするんだろうか。
556 :
デフォルトの名無しさん :04/09/12 16:47:09
すいません、勉強します。 でもこれ、教えてください。
>>555 それ、老師じゃないじゃん。
老師ってのは、弟子から
「師匠!どうやったら貴方みたいに
自由自在にオブジェクトを使いこなせるんですか?」
って尋ねられたときに、
「オブジェクト? ああ、そういえばそんなものもあったな。
すっかり忘れていた」
って言う人だろ?
559 :
デフォルトの名無しさん :04/09/12 19:25:16
>>557 1)sedを使う。
2)『ソフトウェア作法』("SOFTWARE TOOLS")を読み、
互換の汎用ツールをJavaで書く。
3)岩谷宏『Javaによるテキスト処理』を読み、
専用のツールを書く。
4)Perlで専用ツールを使う。
5)別スレで助けを求める。
561 :
デフォルトの名無しさん :04/09/12 19:51:49
>>560 つーかJavaっつーよりZetaLispとかだろ?
OO的にいえば、
べつに"2"という名前の変数があっても変じゃないし、
"2"というメッセージを与えて整数オブジェクトから自動的に
"2"という名前を持ったvalueOf()が2に一致するインスタンスが生成されても
OO的にいうと当然だし。
>>557 それってJavaでもできんこともないけど、559のいうとおりsedを
使うか、awkなりperlでも使った方が速いように思う。sed, awk, perlなら
他スレってことになるが、Javaでやれって宿題なわけ?
563 :
daigakusei :04/09/12 22:37:35
RSA方式によって暗号文を作り,さらにそれを自分自身で復号化する. 文字について: 使用する文字については ・ ASCII code の0x20 (Space) から0x7a (z) までの91文字 とする.従って,改行やタブ,DEL などの制御コードは含まれないことに注意. 文字に対応した数字について: これらの文字に対応する数字は, ・ (文字のASCII code)−0x20 とする. 従って,Space は0x20 − 0x20=0 であり,最後のz は0x7a − 0x20=0x5a=90 となる. 文字を数字の集合と見なすと,(10進数で) 0〜 90という91-個の文字を使うことになる. 文の自然数化: これらの文字を使って,文を自然数に変換する方法は以下のようにする. ・ 7文字を1ブロックとする. ・ そのブロックをt = t0t1t2t3t4t5t6 とする.t の自然数化Nt を次の ように定義する. Nt = t0*91^6 + t1*91^5 + t2*91^4 + t3*91^3 + t4*91^2 + t5*91+t6 ・ 例えば,「t=Let’s g」(Let’s go の最初の7文字) なら, L= 0x4c-0x20 = 0x2c = 44 e= 0x65-0x20 = 0x45 = 69 t= 0x74-0x20 = 0x54 = 84 '= 0x27-0x20 = 0x07 = 7 s= 0x73-0x20 = 0x53 = 83 Space = 0x20-0x20=0 g= 0x67 ! 0x20 = 0x47 = 71 であるので, Nt = 44*91^6 + 69*91^5 + 84*91^4 + 7*91^3 + 83*91^2 + 0*91 + 71 = 25422595529038 となる.
564 :
daigakusei :04/09/12 22:41:05
続き 素数の選び方: RSA方式によって暗号化を行うためには,2つの素数p, q を選ばなければならない.この2つの素数については,指定されたも のを使用すること.どの素数を使うのかは,各人によって異なる.に対応して, RSA暗号においては,n = pq という数が重要である.指定されたp, q に関しては,必ず, 91^7 = 51676101935731 < n < 4702525276151521 = 91^8 となるように選んである. e の選び方: RSA暗号においては,公開鍵で使われるe という数として, 何を使うべきかが問題となる.これは公開される数なので,特にラン ダムに選ぶ必要はないが,実際には,解読を回避するために大きな数が使われる. ここでは,e としては,全員同じ一つの数を使用するものとする.それは,フェルマー数の一つで素数の, e = 2^2^4 + 1 = 65537 e の条件としては,1 < e < Φ(n) = (p - 1)(q - 1) であって,Φ(n) と 互いに素でなければならないが,指定されたn に対しては,このe は, 必ずΦ(n) と互いに素となるようになっている.
565 :
daigakusei :04/09/12 22:42:24
その3 プログラミングについて: 計算の途中では,30桁を超える数が現れるので,64bit を超える数値 データの計算,すなわわち多倍長計算を行わなければならない. Java の場合には,BigInteger というクラスを使う。メソッドとして,四則演算add, subtract, multiply, divide などの他に,以下の計算で必要となるmod があり,さらに, ab mod n を計算してしまうmodPow と, mod m での積の逆元を計算してし まうmodInverse というものが含まれている. これらを使えば,RSA暗号の主要部分のプログラムがほとんど不要 となり,極めて簡単に暗号化ができてしまう.あとは,文字列と数字と の対応を与える部分だけ作れば良い. なお,a^b を計算するためのメソッドpow というものもあるが,これは b がint でなければならず,この場合は使えない. d の計算: 公開鍵となる(n; e) は上で述べたように決められたわけだが, 「レポートとして提出してもらうのは,指定された文章を,それぞ れの秘密鍵によって暗号化することにより得られた暗号文である.」 その暗号文を,こちらで公開鍵(n; e) により復号化することにより,そ れぞれの秘密鍵で暗号化したものであるかどうかを確認する. 各人の秘密鍵は(n; d) であり,これによって暗号化するためには,Z(Φ(n)) におけるe の逆元d を計算しなけらばならない.すなわち, ed∽1 mod Φ(n) = (p - 1)(q - 1)を満たすd を求めるわけだが,これは,拡張ユークリッド・アルゴリ ズムによって計算できる. しかし,Java のBigInteger class を使えば,上記のように,modInverse で簡単に得られる. ブロックの暗号化: 上で得られたNt をRSAの秘密鍵により暗号化する. 秘密鍵は,上で求めたd なので, ct = Nt^d mod n が暗号化された数字となる.
566 :
daigakusei :04/09/12 22:45:05
上記のように,Java であれば,BigInteger class のmodPow を使えば, すぐに計算できる. 暗号数の文字列への変換: この操作によってできた数ct を再び文字列に変 換しなければならない.これは次のように行う. 0≦ct < n であり,91^7 < n < 91^8 であるので,ct を上の91個の文 字列に直した時には,7個ではなく,8個の文字列になる場合がある. そこで, ctは常に8個の文字列に直すと決める! ct < n < 91^8 となっているので,ct は必ず, ct = s0*91^7 +s1*91^6 +s2*91^5 +s3*91^4 +s4*91^3 +s5*91^2 +s6*91+s7 と表すことができる.そこで,ct に対応した数字列を st = s0s1s2s3s4s5s6s7とする. 各si を再び0x20 〜 0x7a の文字に直してできる長さ8の文字列が, t=t0t1t2t3t4t5t6 の暗号化文となる. 注意: si+32 がsi に対応した文字のASCII code となることに注意. 課題となるメッセージ: このレポートでは,次のような文章を暗号化して提出する. ・ 最初に「Hi! I am」という文が来て,その次に自分の名前を書く .例えば, Hi! I am Taro Yamada. となる. ・ その後に20文字以上,100文字以下の英文を入れる.例えば, Hi! I am Taro Yamada. baseball is exciting ! など.これを暗号化する. ・ これを7文字ずつ区切って暗号化し,それによってできた8文字 のブロックを並べることにより,暗号文ができる. ・注意: 元の文の全体の文字数が7の倍数ではない時,7文字ず つ区切ると,最後が7文字にならない.このような時は,文の最 後に, Space やピリオドなどを付け加えて,全てを7文字のブ ロックとなるようにする. こんな感じのレポートが出たのですがさっぱり分かりません。 何かヒントのようなものでも教えていただければありがたいです。 長すぎてすいません
この問題も問題だとは思うが(フェルマー数とか出されてもなあ...)、 「さっぱりわかりません」と来られると、RSAとはなにか、なんでRSAと 素数が関係あんのか、公開鍵暗号システムというのはどういう仕組みなのか をいちいち説明せんといかんことになる予感。 なんか問題にある程度やりかた書いてあるし... しかしへたくそな文章の 問題だな。
perl、sed、awkは実行系がないため、Javaで書かねばなりません。 今のところ、クラス名を検索し、マッチした箇所の { から、 } までの間のプロパティを Replacer クラスの replacePattern メソッドを使って置換しようかと考えています。 もっときれいに書けないでしょうか。
>>568 きれいに書くという意味が、perl並に少ない記述量で書くこと、という話
なら、絶対無理。
ああ、一つ方法があったよ。 君が望む文法を所有する、JVM上で動作するスクリプト言語を作ればいい。 …あれ?JVM上で動くPerlってなかったっけ?
JPerl
>>568 そこまで頭の中ででき上がってるなら、宿題としては出来たも同然
だろう。おれもたぶんそんな感じに書くと思う。書いてからあまりに
遅かったら考え直すかもしれんけど、一番素直なやり方だよね。
ちなみにどのへんが醜いと思う?
573 :
デフォルトの名無しさん :04/09/13 01:37:49
Javaの基礎をやってswingもかじった。 OOPをふんだんに使ったJavaの宿題をください。GUIも絡めてね。 ちなみに参考書籍はBlackbookとやさしいJava、あとJavaGUIプログラミングVol.1 です。お願いします。
そうですか、安心しました。 while ループの中でフラグを使っているところがスマートではないかなと。 この辺りです。 while ((str=br.readLine()) != null) { if (patternMatcher("\\p{Space}*BODY\\p{Space}*\\{", str)) { flag = true; } if (flag) { if (patternMatcher("\\p{Space}*FONT-SIZE:.*", str)) { str = replaceFirst("\\p{Digit}+%", "replace", str); } if (patternMatcher("\\p{Space}*\\}\\p{Space}*", str)) { flag = false; } } }
>>573 iアプリで、画像が貼り付けれるボタンと文字入力コンポーネントを持ったツールキットを作れ。
コンポーネントの場所と大きさは座標で指定するものとする。
576 :
デフォルトの名無しさん :04/09/13 10:00:48
大きさを指定して正方形または円を描く(TextFieldを用いる) たのんだ。
577 :
デフォルトの名無しさん :04/09/13 11:12:13
>>573 > GUIも絡めてね。
>>1 > ・GUI 関係などは基本的に放置
578 :
デフォルトの名無しさん :04/09/13 11:57:43
>>563 問題は、
>>565 のここんとこ
> 各人の秘密鍵は(n; d) であり,これによって暗号化するためには,Z(Φ(n))
> におけるe の逆元d を計算しなけらばならない.すなわち,
> ed∽1 mod Φ(n) = (p - 1)(q - 1)を満たすd を求めるわけだが,これは,
> 拡張ユークリッド・アルゴリズムによって計算できる.
> しかし,Java のBigInteger class を使えば,上記のように,
> modInverseで簡単に得られる.
と、「Nt^e mod n」「Ct^e mod n」の計算。ただし、
> 秘密鍵は,上で求めたd なので,
> ct = Nt^d mod n
> が暗号化された数字となる.
は、
> Ct = Nt^e mod n
> が暗号化された数字(暗号文)であり、.
> 秘密鍵は,上で求めた d なので,
> Nt = Ct^d mod n
> によって、復号が行なえる。
が正。
そんでもって、dを求めるのと、
Ct←Nt^e mod n
Nt←Ct^d mod n
の計算を行なえばよし。
579 :
デフォルトの名無しさん :04/09/13 12:17:33
>>567 > この問題も問題だとは思うが(フェルマー数とか出されてもなあ...)、
> 「さっぱりわかりません」と来られると、RSAとはなにか、なんでRSAと
> 素数が関係あんのか、公開鍵暗号システムというのはどういう仕組みなのか
> をいちいち説明せんといかんことになる予感。
問題文を読んだ感じだと、出題者自身が解ってない模様。
> 必ず,
> 91^7 = 51676101935731 < n < 4702525276151521 = 91^8
> となるように選んである.
とか書いてあるが、
「91^7 = 51676101935731 < n」は必須だが、
「n < 4702525276151521 = 91^8」に関しては、
暗号文の長さを8バイトに制限するだけの理由。
> ct = Nt^d mod n
> が暗号化された数字となる.
というのも初歩的なミス。
単に「BigInteger を使って数論アルゴリズムを書く」だけの課題と思われ。
580 :
daigakusei :04/09/13 21:39:51
BigIntegerを使ったことがないのに問題出されたもので、みんなお手上げなんです。 文字をどうやって暗号にすればいいのか分かりません。RSAについては授業で やったので理屈はわかるんですが、javaでやれとなるとどうやったらいいものか。
581 :
デフォルトの名無しさん :04/09/13 22:14:21
> BigIntegerを使ったことがないのに問題出されたもので、 いや、漏れも使ったことない(^_^!) > 文字をどうやって暗号にすればいいのか分かりません。 原理の問題と効率の問題をごっちゃにして出題されとるから分からんのだよな。 単純に8バイトづつに切って符号なし整数データとして解釈しちまえば簡単なのだ (なまじ91進数データとかだと思うから分かりづらい)。 なお、8ビット8バイト符号なし整数は64ビットだから 十進数20桁くらいになるので、pおよびqとして それぞれ十進10桁くらいの整数を用意しなければならず、 そのためには百万以下の素数の表くらいは あらかじめ作っておいたほうがいい。 ちなみに題意に沿って文字を数値化すると、 0〜nバイトめをb[n]で表すとして、 Nt = (((((((b[0]-0x20)*91+(b[1]-0x20))*91+(b[2]-0x20))*91+(b[3]-0x20))*91+ (b[4]-0x20))*91+(b[5]-0x20))*91+(b[6]-0x20))*91+b[7]-0x20; かなんかの形になるハズである。 逆にCtから求めたNtからbを求めるときには、 for (int cnt = 7;cnt >= 0;cnt -= 1) { b[cnt] = Nt % 91 + 0x20; Nt = (Nt - (b[cnt] - 0x20)) / 91; // 汚ねぇコードだな。 } かなんかの形になる。 後は任せた。がんばれ。
582 :
daigakusei :04/09/13 22:47:02
p=15486181,q=4256261というのが与えられているんです。 こんな早くの反応すごいですね。どうもです。
583 :
初学者 :04/09/14 15:53:05
下記のようなロトくじの番号をランダムに6つ (白は1-49から5つ、赤は1-42から1)取り出す問題なんですが、 For文で下記のWhite1-5の処理を簡潔に書き換えようとして つまづいてます。いいやり方があれば教えてください。
584 :
583 :04/09/14 15:53:43
public class Powerball{ public static void main(String [] args){ int white1, white2, white3, white4, white5, red; red = (int) (Math.random() * 42 + 1); white1 = (int) (Math.random() * 49 + 1); do { white2 = (int) (Math.random() * 49 + 1); }while(white1 == white2); do{ white3 = (int) (Math.random() * 49 + 1); }while(white1 == white3 || white2 == white3); do{ white4 = (int) (Math.random() * 49 + 1); }while(white1 == white4 || white2 == white4 || white3 == white4); do { white5 = (int) (Math.random() * 49 + 1); }while(white1 == white5 || white2 == white5 || white3 == white5 || white4 == white5); System.out.println("White balls: " + white1 + " " + white2 + " " + white3 + " " + white4 + " " + white5); System.out.println("Red ball: " + red); } }
585 :
デフォルトの名無しさん :04/09/14 17:00:29
>>583 Set whites=new TreeSet();
while(whites.size()<5) {
Integer value=new Integer((int)(Math.random()*49+1));
whites.add(value);
}
Iterator it=whites.iterator();
System.out.println("White balls: " + it.next() + " " + it.next() + " " + it.next() + " " + it.next() + " " + it.next());
586 :
デフォルトの名無しさん :04/09/14 17:06:43
その初学者というネーミングからして、釣り質問のようにも 思うのですが。。。。
587 :
daigakusei :04/09/14 17:24:25
RSAの秘密鍵(n,d)のdはどういうソースになるんでしょうか?
588 :
デフォルトの名無しさん :04/09/14 17:24:52
>>586 > その初学者というネーミングからして、釣り質問のようにも
> 思うのですが……
黙って釣られてあげましょう(^_^)v
>>583 「生成して、すでにあった値と一致したら捨てる」という発想に問題あり。
1)49要素の配列 int v[] に、1から49までの値をセットする。
2)以下を実行。
for (int x = 0;x < 48;x += 1) {
int pos = x 以上 48 以下のランダムな数;
v[x] と v[pos] の値を入れ替え。 // x == pos の場合もあるが気にするな。
}
これで v[] の中身がシャッフルされる。
3) v[0] から v[4] までの五個の値を使う。
カードゲームなんかのプログラムでは定跡。統計プログラム(検定とか)
にも使えるので覚えておこうね。
589 :
デフォルトの名無しさん :04/09/14 17:25:28
【問題】 たとえば、SEND + MORE = MONEYのように、各文字に数字を割り当てて 計算結果が合うような、文字と数字の割り当てを求めるJavaアプレットを作成せよ。 違う文字には違 う数字を当てる。また、各行の左端の文字は0ではないとする。 こんな宿題がでました。どなたか、お教えください。
590 :
デフォルトの名無しさん :04/09/14 17:47:53
> RSAの秘密鍵(n,d)のdはどういうソースになるんでしょうか?
おいおい、「RSAについては授業でやったので
理屈はわかるんですが」てぇ割には頼りないな。(-_-!)
n のオイラー関数φ(n)(問題文ではΦ(n)と書いてある。普通は小文字だ)は、
n が素数 pq の積で表されるときφ(n)=(p-1)(q-1) となる。
ここでφ(n)を法として ed = 1 となる d(ただし 0 <= d < φ(n)。
e との積が単位元である 1 になるわけだから、d は mod φ(n)における
e の逆元)を求める必要があるわけだが、問題文に
>>565 > mod m での積の逆元を計算してしまうmodInverse というものが含まれている.
(中略)
> しかし,Java のBigInteger class を使えば,上記のように,modInverse
> で簡単に得られる.
と書いてあるわけで、BigIntegerクラスの modInverse()メソッドの
使い方を調べろ、ということ。
591 :
589 :04/09/14 17:50:10
書き忘れましたが、提出期限が今週の金曜です。勝手ですいませんがお願いします。
592 :
daigakusei :04/09/14 17:55:42
>590 できました。
593 :
デフォルトの名無しさん :04/09/14 19:59:50
困ってます。 TreeSetにd2クラスのxの値が同じものが追加されませんどうしてでしょう? 教えてくさい。 public class tTree { public static void main(String[] args) { TreeSet ts = new TreeSet(new cmpD2()); d2[][] d = new d2[5][5]; Iterator itr; d2 tmp; for ( int i = 0; i < 5; i++ ){ for ( int j = 0; j < 5; j ++ ){ d[i][j] = new d2(i,j); ts.add(d[i][j]); } } itr = ts.iterator(); while(itr.hasNext()){ tmp = (d2)(itr.next()); System.out.println(tmp.x + "," + tmp.y); } } }
594 :
デフォルトの名無しさん :04/09/14 20:01:45
続き --d2----------- public class d2 { int x,y; d2(int x, int y){ this.x = x; this.y = y; } } --cmpd2---------- public class cmpD2 implements Comparator { public int compare(Object arg0, Object arg1) { return ((d2)arg0).x - ((d2)arg1).x; } }
>>593 return ((d2)arg0).x - ((d2)arg1).x;
↓
int sub = ((d2)arg0).x - ((d2)arg1).x;
return sub == 0 ? 1 : sub;
596 :
デフォルトの名無しさん :04/09/14 20:26:04
でもそうすると sgn(compare(x, y)) == -sgn(compare(y, x)) が保障できなくなってしまうような気がします。 どうして、compareで同じになるとTreeSetに追加されないのでしょう? そのような仕様には思えないのですが。。。
>>596 仕様は Set と List インタフェースの違いを調べてみて。
あー、Set は TreeSet が実装しているインタフェースね。
compare で 0 を返さないように書いたのは少しトリッキー。
598 :
デフォルトの名無しさん :04/09/14 20:49:22
>>597 ありがとうございました。
しかし、Setインターフェースのaddのところを見てもどうしても
compare関数の戻り値によってTreeSetに格納するかしないかを
決めるようには考えられず困ってます。
--Setインターフェースのadd抜粋-------------
(o==null ? e==null : o.equals(e)) に該当する要素 e が
なかった場合は、指定された要素 o をセットに追加します。
-------------
599 :
デフォルトの名無しさん :04/09/14 21:01:28
>>589 こりゃまた古臭い問題だな。(-_-!)
二十年前ならけっこう苦労させられただろうが、
今は計算機環境がぜんぜん違う。
マシンパワーを活用しろ。それがJava的な解決法だ。
出題者の意図とはたぶん違うだろうが、以下の方法が簡単。
1)まず、文字列の形で数式を読み込んで計算し、正しいかどうか判定する
電卓プログラムを書け。
2)次に、「SEND+MORE=MONEY」みたいな形の式を読んで、各数字のすべての
組合せについて、(変数を含まない)数式を生成するプログラムを書け。
虫食算の場合、数字は0を含めても10個しかないので、10の階乗通りだから、
百万行かそこらだ。たかだか数十MB程度である。
3)(2)で生成したデータを(1)のプログラムでチェックし、合っているものだけを
出力せよ。
以上。
>>598 きっちりした香具師だな。
Comparator の説明
たとえば、(a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0) である 2 つのキー
a と b をコンパレータ c を持つソートセットに追加する場合、2 回目の add オペレーションは
false を返し、ソートセットのサイズは増加しません。
具体的には TreeSet#add は内部に保持する TreeMap#put を呼び出し、containesKey
メソッドの結果が true であれば重複とみなされる。TreeMap の containesKey 実装は
comparator が指定されていれば compare メソッドを使用し、Compareble が要素に
実装されていれば compareTo メソッドが使用されるように動作する。
601 :
デフォルトの名無しさん :04/09/14 21:31:22
>>599 忘れてた。
1)原数式(「SEND+MORE=MONEY」)は、
逆ポーランド記法(「SEND MORE+MONEY=」)で入力する。
2)最初に各文字を出現順に 0 〜最大 9 までの数字で置き換え
(「SEND MORE+MONEY=」→「0123 4561+45217=」)、
生成した組合せを配列にぶち込んだら、
その数字を配列の添字とみて置換を行なう。
上記二点でプログラムは相当に簡単になるはず。
602 :
583 :04/09/14 21:40:08
>> 586 釣りじゃなくてマジです。すんません。 >> 585, 588 参考になりました。ありがとうございます。
603 :
デフォルトの名無しさん :04/09/14 22:44:51
>>600 釣りとかじゃなくてほんとに分からないんです。
c.compare((Object)a, (Object)b) が0
で
a.equals((Object)b)がfalse
の時
(a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0)
は
false && false で false になりますよね。
つまりtrueではないということでaとbは追加されると思うのです。
!(a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0)
の時にaの次にbを追加しようとするとbは追加できないというのが正しいような気
がします。
ともあれ、とりあえず動かせるようにがんばってみます。
ありがとうございました。
>>603 TreeSet は compare(compareTo)メソッドしか見てないから。
605 :
デフォルトの名無しさん :04/09/14 23:30:34
>>605 ねーねー、冬もちゃんと授業あるの?
雪がいっぱいで通えないっていう風説を聞いたことがあるんだけど…
608 :
デフォルトの名無しさん :04/09/15 00:00:13
>>604 書き直してうまくいきましたので、ソースアップします。
public class tTree {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new cmpD2());
d2[][] d = new d2[5][5];
Iterator itr;
d2 tmp2;
d2 tmp;
for ( int i = 0; i < 5; i++ ){
for ( int j = 0; j < 5; j ++ ){
d[i][j] = new d2(i,j);
ts.add(d[i][j]);
}
}
tmp2 = new d2(0,0);
ts.add(tmp2);
itr = ts.iterator();
while(itr.hasNext()){
tmp = (d2)(itr.next());
System.out.println(tmp.x + "," + tmp.y);
}
}
}
609 :
デフォルトの名無しさん :04/09/15 00:02:13
public class d2 { int x,y; d2(int x, int y){ this.x = x; this.y = y; } public int hashCode() {return x << 16 + y;} public boolean equals(Object o) { System.out.println("equal passed"); if(x == ((d2)o).x && y == ((d2)o).y) {return true;} else{return false;} } }
610 :
デフォルトの名無しさん :04/09/15 00:03:36
public class cmpD2 implements Comparator { public int compare(Object arg0, Object arg1) { int tmp = ((d2)arg0).x - ((d2)arg1).x; if( tmp != 0 ){return tmp;} else if (((d2)arg0).equals(arg1)){return 0;} else{return ((d2)arg0).hashCode() - ((d2)arg1).hashCode();} } }
>>608 要素に hashCode、equals メソッドも追加されて綺麗になったね。
if(x == ((d2)o).x && y == ((d2)o).y)
{return true;}
else{return false;}
は冗長だから、このほうが普通の書き方では?
return x == ((d2)o).x && y == ((d2)o).y;
で、d2 クラスも提供されているクラスじゃなくて自分で作成するクラスだと
思うので Comparator の別クラスやめて d2 に Compareble インタフェース
実装して compareTo メソッドのほうが綺麗では?
んで、慣例的に Java のクラス名は大文字で始まる。
612 :
デフォルトの名無しさん :04/09/15 00:24:42
ごめん、間違い見つけてしまいました。 d2は以下のようにしないとhashCode()が同じになる可能性があるので だめっぽいです。どうすればいいんだろう? compareしか見ないんじゃjavaのTreeSet使えないぞ!!SUN!! ※どうしてComparebleインターフェースを使わないかというと クラスはそのままで、Comparatorだけでいろいろとソートの仕方を 変えたいからです。オブジェクトにDBの1カラムのデータを格納し、 TreeSetでインデックスを実現したいと考えてます。
>>612 ん? だから compare をそのように実装すればいいのでは?
実装の契約は破るかもしれんが、Javadoc コメントに契約を
破っていることを明記すればいい。少なくとも俺はそうしてる。
614 :
デフォルトの名無しさん :04/09/15 01:05:37
多分こうすればよいような気がします。 バグがあったら教えてください。 public class d2 { int x,y; d2(int x, int y){ this.x = x; this.y = y; } public int hashCode() {return x << 16 + y;} public boolean equals(Object o) { if(x == ((d2)o).x && y == ((d2)o).y){return true;} return false; } public int subObj(d2 o){ int sub; if(x > o.x){return 1;} else if(x < o.x){return -1;} else if(y > o.y){return 1;} else if(y < o.y){return -1;} return 0; } }
615 :
デフォルトの名無しさん :04/09/15 01:06:38
public class cmpD2 implements Comparator { public int compare(Object arg0, Object arg1) { int tmp = ((d2)arg0).x - ((d2)arg1).x; if( tmp != 0 ){return tmp;} return ((d2)arg0).subObj((d2)arg1); } }
616 :
デフォルトの名無しさん :04/09/15 01:46:32
>607 冬もちゃんと授業ありますよ。今年の冬は雪降り過ぎて都市機能が麻痺したけど。 誰かできないですかねー、バカなもんで。
これは....代数の問題なんだよな? プログラミング講座じゃなくて。 なんか問題の最後の方がプログラミング講座っぽいよなあ
618 :
デフォルトの名無しさん :04/09/15 07:24:41
>>617 > なんか問題の最後の方がプログラミング講座っぽいよなあ
ひょっとして、
>>589 の
> Javaアプレットを作成せよ。
か?
「代数の問題」つーか、有限組合せ数学の問題。
組合せ生成とバックトラックを用いた、
わりと標準的なプログラミングの例題だな。
「8-Queen」とか「ナイトの巡回」とか、
昔はよくやったもんだ(^_^)b。
619 :
デフォルトの名無しさん :04/09/15 09:45:13
=618 スマソ。勘違い。 「代数系」つーのとはちょっと違うような…… 整数論だろ?
620 :
デフォルトの名無しさん :04/09/15 10:25:00
>>601 // 「SEND MORE+MONEY=」→「0123 4561+45217=」の部分。
final String kigou = "+-*/= ";
final String numeric = "0123456789";
String form = "SEND MORE+MONEY=";
String charlist = new String();
for (int cnt = 0;cnt < form.length();cnt += 1) {
if (kigou.indexOf(form.charAt(cnt)) < 0) {
if (charlist.indexOf(form.charAt(cnt)) < 0) {
charlist += form.charAt(cnt);
}
}
}
String form2 = new String();
for (int cnt = 0;cnt < form.length();cnt += 1) {
int pos = charlist.indexOf(form.charAt(cnt));
if (pos < 0) {
form2 += form.charAt(cnt);
} else {
form2 += numeric.charAt(pos);
}
}
621 :
デフォルトの名無しさん :04/09/15 10:25:25
// 英数字並びと各英数字にあてはまる値から、英数字並び全体の値を求める。 public static int val( int combi[], String str ) { final String numeric = "0123456789"; int ret = 0; for (int cnt = 0;cnt < str.length();cnt += 1) { ret = ret * 10 + combi[numeric.indexOf(str.charAt(cnt))]; } return ret; } あとは int combi[] = new int(charlist.length()); を用意して、ここにすべての組合せを生成し、 val(combi, "0123") + val(combi, "4561") == val(combi, "45217") となるcombi[]の内容を出力すればよし。
問題と少し。。。。
623 :
割り当てアプレットその1 :04/09/15 12:58:36
>>589 public void init() {
final JTextField tfd=new JTextField("SEND + MORE = MONEY");
final JTextArea tarea=new JTextArea();
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(tfd, BorderLayout.NORTH);
this.getContentPane().add(tarea);
tfd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tarea.setText( start(tfd.getText()) );
}
});
setVisible(true);
}
624 :
割り当てアプレットその2 :04/09/15 12:59:55
String start(String text) { StringTokenizer st=new StringTokenizer(text, "+=", true); if(st.countTokens()!=5) return "式が不正"; if(!st.nextToken().trim().matches("[A-Za-z]+")) return "式が不正"; if(!st.nextToken().trim().matches("\\+")) return "式が不正"; if(!st.nextToken().trim().matches("[A-Za-z]+")) return "式が不正"; if(!st.nextToken().trim().matches("\\=")) return "式が不正"; if(!st.nextToken().trim().matches("[A-Za-z]+")) return "式が不正"; List charas=new ArrayList(); for(int i=0; i<text.length(); ++i) { char c=text.charAt(i); if(!Character.isLetter(c)) continue; Character obj=new Character(c); if(charas.contains(obj)) continue; charas.add(obj); } int count=charas.size(); if(count>10) return "文字が十種類以上で割り当てオーバー"; return allocate(text, charas, count); }
625 :
割り当てアプレットその3 :04/09/15 13:03:31
String allocate(String text, List charas, int count) { loop: for(long figures=1023456789L; figures<9876543210L; figures += Math.pow(10,(double)(10-count))) { char[] digit=new char[count]; long number=figures; long ptr=1000000000L; int bitmap=0; for(int i=0; i<count; ++i) { int num=(int)(number/ptr); int bit=0x01<<num; if((bitmap&bit)!=0) continue loop; bitmap|=bit; digit[i]=Character.forDigit(num, 10); number%=ptr; ptr/=10; } StringBuffer expres=new StringBuffer(text); for(int i=0; i<text.length(); ++i) { int index=charas.indexOf(new Character(text.charAt(i))); if(index==-1) continue; expres.setCharAt(i, digit[index]); } StringTokenizer pick=new StringTokenizer(expres.toString(), "+=", false); int num1=Integer.parseInt(pick.nextToken().trim()); int num2=Integer.parseInt(pick.nextToken().trim()); int num3=Integer.parseInt(pick.nextToken().trim()); if(num1+num2==num3) { StringBuffer sb2=new StringBuffer(); sb2.append("割り当て式 " + expres.toString() + "\n"); sb2.append("文字への数字割り当て表\n"); for(int i=0; i<charas.size(); ++i) { sb2.append(charas.get(i) + "=" + digit[i] + " "); } return sb2.toString(); } } return "正しい割り当ては無い"; }
626 :
その4 :04/09/15 13:06:55
>>589 問題文通りに、各『行』の左端の文字が0でなく
A+B=Cの形式の式のみに対応した文字数字割り当てのアプレットプログラム
627 :
デフォルトの名無しさん :04/09/15 14:57:32
>>617 代数のレポートなんです。
>>619 代数系の授業なんですけど、整数論をやってました。
このプログラム誰かできないですかねー??
628 :
javaわかんない :04/09/15 15:26:49
お願いします! javaAppletで数当てゲームの作り方教えて下さい。 内容は 当てる数字は、ランダムに選び出された4つの数字(1〜9)までとします。 3385や2582みたいに 同じ数字を2つ以上使った答えはダメ。 入力した数字と答えの数字の 桁 数の両方がすべて合ったら4H0Bと表示 入力した数字と答えの数字の 数はすべて合って桁がすべて違ったら 0H4Bと表示 以上です。 ずっと考えているんですけど???です。(泣) なるべく 簡単目な回答教えて下さい
629 :
589 :04/09/15 15:39:11
627は別人
>>617 情報処理のレポートです。
今、620-621を参考にさせてもらってます。
あと、623の「JTextField」ってTextFieldですか?
そのままだとエラーがでるので。
>>628 ロジックの部分のコードがあればAppletに
仕立てるのは自分で出来るのか?
631 :
javaわかんない :04/09/15 16:01:32
632 :
デフォルトの名無しさん :04/09/15 16:26:47
633 :
javaわかんない :04/09/15 16:39:08
ありがとう すっごく嬉しいです。 変なサイトに飛んだんで ちょっと焦りましたけど・・・
634 :
デフォルトの名無しさん :04/09/15 16:43:11
ここってサーブレットとかはどうなの?
宿題? だれか機嫌がよければ答えるんじゃないの?
GUIはNGだが、サーブレットは有りなのかな、とちょっと疑問に思っただけ。
638 :
デフォルトの名無しさん :04/09/15 17:32:29
>>634 参照してもわかんないんです。友達に聞いてもみんな全滅で、どうしよもない。
誰かやってください。
1に書いてはあるんだが。
642 :
デフォルトの名無しさん :04/09/15 18:19:59
>>638 BigInteger p = new BigInteger("15486181");
BigInteger q = new BigInteger("4256261");
BigInteger e = new BigInteger("65537");
BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
BigInteger d = e.modInverse(phi);
BigInteger n = p.multiply(q);
/* ちょっと急いでいる。 */
/* 文字列を8文字づつに切って数値Ntに直すところは自分で何とかしろ。 */
BigInteger Nt = new BigInteger("12345"); // ここだ。
BigInteger Ct = Nt.modPow(e, n);
Nt = Ct.modPow(d, n);
/* Ntを文字列に戻すところも自分で何とかしろ。 */
643 :
デフォルトの名無しさん :04/09/15 19:15:32
>>629 エラーが出る?
JAppletなんですが。。。
今はAWTではなくSwingを使うべきでしょう。
644 :
デフォルトの名無しさん :04/09/15 19:41:16
>>629 と言うか、
>>623-625 のコードを
public class MyApp extends JApplet {
・
・
・
}
の中に入れてくれ。JAppletクラスだと分かってくれても。。。
645 :
デフォルトの名無しさん :04/09/15 23:14:14
>>642 >/* 文字列を8文字づつに切って数値Ntに直すところは自分で何とかしろ。 */
>/* Ntを文字列に戻すところも自分で何とかしろ。 */
ここが一番問題なんです。どこまでもすんませんが。
ホントバカなんです、みんな。北大生ならできんのかなぁ・・・
646 :
589 :04/09/15 23:16:57
すみません。初心者なもので。 今、そのようにしてコンパイルしてみたのですが、 「List」が曖昧だと弾かれています。ちなみにインポートしているのは javax.swing.* java.awt.Container.* java.util.* java.awt.event.* です。どうすればよいでしょうか?
647 :
589 :04/09/15 23:22:44
すみません java.awt.Container.* は java.awt.* のまちがいです。
java.awt.Container.* ってありなのか?
>>647 インポートしてる内容をみせるってことは、そこが原因だと
気づいてるんだろ?
じゃあなんでjava.utilとjava.awtの両方にListというクラスが
あることに気づかないんだ。
ソース上でListをつかってるとこ全部、java.util.Listかjava.awt.Listの
どっちかに書き換えろ。
あるいは * 使ってまるごとimportするのをやめろ。
650 :
デフォルトの名無しさん :04/09/16 00:33:18
>>646 import java.util.List; ← こうする。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
インポートはこうしてください。
あと
>>623-625 のアプレットの操作法ですが、テキストフィールドに
A+B=C形式の好きな文字式をインプットして(初期文字列はある)
リターンキーを押してください。
しばらく待ってると下のテキストエリアに結果が出ます。
文字数が多いほど解析時間がかかります。
A,B,Cいずれも大文字小文字のアルファベットだけです。
あと、一旦データエリアに全ての組み合わせを格納してってやり方は 事実上不可能です。 90億のlong値をストックしなければならないのですから。
人任せで優をもらおうとしてるやつに誰が教えるか
653 :
589 :04/09/16 08:21:28
>>649 どちらにもListがあるのは気づいたんですが、どうすればいいかが
わからなかったんです。
>>650 ありがとうございました。動きました。
654 :
デフォルトの名無しさん :04/09/16 10:28:49
>>645 public static void main( String[] args ) {
BigInteger p = new BigInteger("15486181");
BigInteger q = new BigInteger("4256261");
BigInteger n = p.multiply(q);
BigInteger e = new BigInteger("65537");
/* 文字列を7文字づつに切って数値Ntに直す。 */
final int width = 7;
String str = "quick brown fox jumps over the lazy dog.";
655 :
デフォルトの名無しさん :04/09/16 10:29:13
byte [] target = str.getBytes(); for (int pos = 0;pos < target.length;pos += width) { byte [] bufx = new byte[width]; for (int cnt = 0;cnt < width;cnt += 1) { bufx[cnt] = 0x20; } for (int cnt = 0;(cnt < width) && ((pos + cnt) < target.length);cnt += 1) { bufx[cnt] = target[pos + cnt]; } BigInteger Nt = BigInteger.ZERO; BigInteger C91 = new BigInteger("91"); for (int cnt = 0;cnt < width;cnt += 1) { Nt = Nt.multiply(C91).add(new BigInteger("" + (bufx[cnt] - 0x20))); } BigInteger Ct = Nt.modPow(e, n); BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); BigInteger d = e.modInverse(phi); Nt = Ct.modPow(d, n);
656 :
デフォルトの名無しさん :04/09/16 10:29:46
/* Ntを文字列に戻す。 */ BigInteger C32 = new BigInteger("32"); // == 0x20 byte [] bufy = new byte[width]; for (int cnt = width - 1;cnt >= 0;cnt -= 1) { bufy[cnt] = Byte.parseByte(Nt.remainder(C91).add(C32).toString()); Nt = Nt.divide(C91); } String s = new String(bufy); System.out.print(s); } System.out.println(); }
657 :
デフォルトの名無しさん :04/09/16 10:58:40
学校の課題なんですが、分からないので是非解答してください、お願いします。 問題 入力されたテキストの内容を操作するjavaアプレットを作成せよ。ここでいう操作とは、文字列の置換を指す。 javaアプレットは以下の機能を兼ね備えているものとする。 1.テキストは、テキストボックスに入力される。 2.被置換文字列、置換文字列はテキストとは別のテキストボックスに入力される。 3.置換結果は、別のウィンドウに表示される。
658 :
デフォルトの名無しさん :04/09/16 11:30:41
>>651 > あと、一旦データエリアに全ての組み合わせを格納してってやり方は
> 事実上不可能です。
> 90億のlong値をストックしなければならないのですから。
っつーのが、
>>625 > loop: for(long figures=1023456789L; figures<9876543210L; figures += Math.pow(10,(double)(10-count))) {
のこと(9876543210-1023456789)を指しているのなら、
組合せの生成のやりかたがまずいはず。
10!は362万とちょっとだから、
「左端に0が来ない」という条件で絞り込めば、
数十万くらいには減らせるのでは。
659 :
デフォルトの名無しさん :04/09/16 11:41:06
>>657 GUI部分は略。
文字列 s1 の patx とマッチした部分を paty で置き換えてs2に格納する場合は、
StringBuffer sb = new StringBuffer(s1);
while((int pos = sb.indexOf(patx)) >= 0) {
sb.replace(pos, pos + patx.length(), paty);
}
String s2 = new String(sb);
かなんかで可能。動作確認はしていないので、注意すること。
660 :
デフォルトの名無しさん :04/09/16 12:11:39
657の方に便乗なのですが私も学校の課題でNーQueenの問題が出されたのですがさっぱりです。 どなたか分かる方プログラムを教えていただけませんか?
661 :
デフォルトの名無しさん :04/09/16 12:52:10
>>658 0から9までの数字から7個の数字を選ぶ順列は、
604800個あった。
662 :
デフォルトの名無しさん :04/09/16 12:54:13
>>660 回転・鏡像のチェックはあるのかないのか?
663 :
デフォルトの名無しさん :04/09/16 14:28:19
>>659 それ、replaceのあとでpos+=patx.lengthしないと
"a"を"aa"で置換するってときにはまらないかな。
665 :
デフォルトの名無しさん :04/09/16 15:24:25
663の方レスありがとうございます。ためしにその「8クイーン問題」を添付してみたのですが動いてくれませんでしたTwT N×Nのチェス盤面にクイーンをN駒ならべ、どの2つの駒も互いに張り合わない配置を全て求めるJava アプレットを作成せよ。 という問題なのですがいまのところWeb上で公開しているソースで動いてくれませんでした困っています
666 :
デフォルトの名無しさん :04/09/16 15:59:33
663=662
>>665 > ためしにその「8クイーン問題」を添付してみたのですが動いてくれませんでしたTwT
たぶん画像が要るはずだ。ソースだけでは動かん。
> N×Nのチェス盤面にクイーンをN駒ならべ、どの2つの駒も互いに張り合わない
> 配置を全て求めるJava アプレットを作成せよ。
N=8(いわゆる8-Queen)でも、たしか(回転・鏡像を区別して)92個だか解があり、
アプレットだとファイルに吐くわけにいかないので出力形式を工夫しなければならず、
ここでコードを示すのは無理。
解を求めるロジックだけを示すにしても、
1)回転・鏡像を区別するのかしないのか。回転・鏡像によって重なるものを示すのか。
2)生成しながらバックトラックを使うか、全部生成してから篩うのか。
によってプログラムは変わってくる。
具体的に何をやりたいのか示してくれ。
667 :
デフォルトの名無しさん :04/09/16 16:01:47
>>664 盛大にはまります(^_^!)
indexOf()の引数(探索開始点)も含めて改修しないとダメ。
668 :
デフォルトの名無しさん :04/09/16 16:15:16
>>654 ありがとございます。
Ctを常に8個の文字列に直すにはどうすればいいのでしょう??
669 :
デフォルトの名無しさん :04/09/16 16:24:12
=668 できました。
670 :
Nクイーン その1 :04/09/16 17:57:28
>>660 static int size=9; ←ここにマス目の個数(縦横同じ)
public void init() {
List pointList=new ArrayList();
Table table=new Table(size);
int hiera=0;
for(int i=0; i<table.square.length; ++i) {
int[] idxs=putQueen(i, (Table)table.clone(), 0);
block: {
if(idxs==null) break block;
Arrays.sort(idxs);
Iterator it=pointList.iterator();
while(it.hasNext()) {
if(Arrays.equals((int[])it.next(), idxs)) break block;
}
pointList.add(idxs);
}
}
Iterator it=pointList.iterator();
int count=0;
while(it.hasNext()) {
System.out.print("パターン"+(++count)+"=");
int[] array=(int[])it.next();
for(int i=0; i<array.length; ++i) {
System.out.print("("+(array[i]%size)+" , "+(array[i]/size)+") ");
}
System.out.println("");
}
}
671 :
Nクイーン その2 :04/09/16 17:58:28
int[] putQueen(int index, Table table, int hiera) { table.put(index, size, hiera); if(hiera==size-1) return table.putIdxs; for(int i=0; i<table.square.length; ++i) { if(!table.isPut(i)) { int[] idxs=putQueen(i, (Table)table.clone(), hiera+1); if(idxs!=null) return idxs; } } return null; }
672 :
Nクイーン その3 :04/09/16 18:01:35
class Table implements Cloneable { boolean[] square; int[] putIdxs; Table() { } Table(int size) { square=new boolean[size*size]; putIdxs=new int[size]; } void put(int index, int size, int hiera) { putIdxs[hiera]=index; int posX=index%size, posY=index/size; int x=0, y=posY; while(x<size) { square[y*size+x]=true; ++x; } x=posX; y=0; while(y<size) { square[y*size+x]=true; ++y; } x=posX; y=posY; while(x>0 && y>0) { --x; --y;} while(x<size && y<size) { square[y*size+x]=true; ++x; ++y; } x=posX; y=posY; while(x<size && y>0) { ++x; --y; } while(x>=0 && y<size) { square[y*size+x]=true; --x; ++y; } } boolean isPut(int index) { return square[index]; } public Object clone() { Table newTable=new Table(); newTable.square=new boolean[square.length]; System.arraycopy(square, 0, newTable.square, 0, square.length); newTable.putIdxs=new int[putIdxs.length]; System.arraycopy(putIdxs, 0, newTable.putIdxs, 0, putIdxs.length); return newTable; } }
>>680 import java.util.*;
import javax.swing.*;
public class MyApp extends JApplet {
・
・
・
}
上の3つのコードを上記のカッコ内に入れてください。
アプレットですが出力はコンソールですので。。。。
>>665 あと、普通のアプレットソフトなら、
>>670 のpublic void init()の中身を
下記
>>675 以下のコードに変更してください。
このアプレットの操作法は、下の段にあるテキストフィールドに
半角で数字を記入して、エンターキーを押すと(数字以外を書くと何もしない)
演算が始まって、しばらく待つと上段のコンボボックスに存在するだけの数の
組み合わせパターンが登録されます。(アイテムの名前は意味不明な文字列に
なりますが)、どれかのアイテムを選ぶと真ん中のエリアに
正しいクイーン配置図が表示されます。テキストフィールドの数値を変更して
エンターキーを押すと再度演算を開始します。
static int size=9; //←ここに縦横共通のマス目の数を入れる public void init() { final List pointList=new ArrayList(); final JPanel panel=new JPanel(); final JComboBox box=new JComboBox(); final JTextField tfd=new JTextField("9"); getContentPane().add(panel); getContentPane().add(box, BorderLayout.NORTH); getContentPane().add(tfd, BorderLayout.SOUTH);
676 :
Nクイーンその1の訂正 その2 :04/09/16 18:20:18
tfd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { size=Integer.parseInt(tfd.getText()); if(size<0) throw new Exception(); } catch (Exception ex) { tfd.setText(""); return; } pointList.clear(); Table table=new Table(size); int hiera=0; for(int i=0; i<table.square.length; ++i) { int[] idxs=putQueen(i, (Table)table.clone(), 0); block: { if(idxs==null) break block; Arrays.sort(idxs); Iterator it=pointList.iterator(); while(it.hasNext()) { if(Arrays.equals((int[])it.next(), idxs)) break block; } pointList.add(idxs); } } box.setModel(new DefaultComboBoxModel(pointList.toArray())); panel.removeAll(); panel.setLayout(new GridLayout(size,size)); } });
box.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int[] points=(int[])box.getSelectedItem(); panel.removeAll(); for(int y=0; y<size; ++y) { for(int x=0; x<size; ++x) { int value=y*size+x; int index=Arrays.binarySearch(points, value); JLabel label=new JLabel(); label.setBorder(BorderFactory.createLineBorder(Color.black)); label.setOpaque(true); if(index<0) label.setBackground(Color.white); else label.setBackground(Color.blue); panel.add(label); } } panel.validate(); } }); }
import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.List; import javax.swing.*; public class MyApp extends JApplet { ・ ・ } このインポート文はこうです。
679 :
デフォルトの名無しさん :04/09/16 20:07:40
680 :
javaわかんない :04/09/16 20:22:50
>>628 で javaAppletでの数当てゲームの作り方教えてってお願いしたんですけど・・・
一応 教えてくれた親切な方もいて 嬉しかったんですけど・・・
入力する数字は、ボタンではなく textFieldから出来る物が良いです。
どなたか また 教えて下さい お願いします。
681 :
デフォルトの名無しさん :04/09/16 20:49:28
はじめまして、学校の課題でつまってしまい、困っています。 「町1.2.3.・・・nがあり、町iから町jへ直行する道の長さWijが各i、jについて与えられているとする。 (直行する道がない場合はWij=∞とする)このとき、町1から町xまでの最短距離を求めるjavaアプレット を作成せよ。町の数、町の間の道の長さは自由に変えられるようにする。」 以上が問題文なのですが、わかる方がおりましたら、ご解答お願いします。
683 :
デフォルトの名無しさん :04/09/16 21:14:39
>>681 時間があれば作ってやってもいいけど、ヒントだけ。
経路が堂々回りにならないようにするには、
一度通った町は除外していけばいいよ。
あとは普通の探索。
しかし、めんどくさそうな宿題出すね。
>>680 あんたロジックだけあればGUIは自分でどうにかするって言ってただろう。
685 :
デフォルトの名無しさん :04/09/16 21:20:31
>>680 >>681 1)済まぬが基本的なロジックの部分&実装面で困っているのか、
2)awtだとかSwingだとかアプレットだとかいったインタフェース周りで困っているのか、
そこんとこだけでも明確にしてくれんか。
>>1 で
> ・丸投げOK
> ・前提条件も全部出しておくれよ 数学関係は数式も出しておくれよ
> ・GUI 関係などは基本的に放置
つーことになってるので、なるべくなら(1)に絞って、
(2)の部分はJava言語の質問スレに持ってってほしいのだが。
686 :
デフォルトの名無しさん :04/09/16 21:25:49
最短経路 アプレット Java とかで検索するといっぱい出てくるのにな。
688 :
javaわかんない :04/09/16 21:30:58
>>680 それが・・・とりあえず自分なりに、いじってみたんですけど 結果が追て
来ないんですよ(泣)
689 :
デフォルトの名無しさん :04/09/16 21:42:31
>>683 > しかし、めんどくさそうな宿題出すね。
これはこれで実装上の工夫があって、仕事で書くなら面白いネタだと思う。
町オブジェクトのコンストラクタでデータベース・キーを生成して
「すでに通ったかどうか」を判定する方法は、
経路スタックの中を舐めなきゃいけないんで効率が悪いが、
幅優先探索の場合に複数プロセスで探索が走る場合にも使える。
そうじゃなくて町に「この先を探索中」フラグを持たせると、
効率はいいものの深さ優先になっちゃうので、
探索範囲が広いときにはターンアラウンドが遅くなってしまい、
途中で打ち切ったりして効率を稼ごうとしたあげく、
最短経路を見落として恥をかいたりする。
とはいえ「プロのプログラマーを養成する」ってんじゃなければ、
あんまり学生向けじゃないかもしれん。
企業の新人研修向けかな?
>>689 めんどくさいけど、ロジックは難しくないよね。
私ならGAかCAでやるかも。
探索アルゴリズムとか数値計算とかって基本的なアルゴリズムは 情報系の講義があるとこなら普通にやらされるでしょ。特に 最短経路なんてメジャーな問題だし。
692 :
デフォルトの名無しさん :04/09/16 22:07:42
=689 >> 私ならGAかCAでやるかも。 あ、分からん。GAとかCAって何? おれはJavaでチャート法使った汎用のツール作って使ってる。 もっとも基本的に「全領域を探索」だからできる話で、 交通路(鉄道とか)の最短距離探索とかだったら とてもじゃないけど使えないんだけど。
>>688 import java.applet.Applet;import java.awt.*;import java.awt.event.*;
import java.util.*;public class HBApplet extends Applet {
TextField textField = new TextField("ここに答えを入力しる。");
Label label = new Label("結果");String answer;
final static int NUM = 4;public void init() {
ArrayList list = new ArrayList();for (int i = 1; i < 10; i++) {
list.add(Integer.toString(i));}
Collections.shuffle(list);StringBuffer buffer = new StringBuffer();
for (int i = 0; i < NUM; i++) {buffer.append(list.get(i));
}answer = buffer.toString();
System.err.println(answer);setLayout(new BorderLayout());
add(textField, "South");add(label, "Center");
textField.addTextListener(new TextListener() {public void textValueChanged(TextEvent e) {
String str = textField.getText();if (str.length() == NUM) {
label.setText(test(str));}
}});}
private String test(String str) {
int h = 0;int b = 0;
for (int i = 0; i < NUM; i++) {char ch = str.charAt(i);
if (answer.charAt(i) == ch) {h++;
} else if (str.indexOf(answer.charAt(i)) != -1) {b++;
}}return h + "H" + b + "b";
}}
>>692 GA = Genetic Algorithm
CA = Cellular Automatom
695 :
javaわかんない :04/09/16 22:17:11
>>693 わざわざありがとうございます
でも・・・なんかtextFieldじゃなくてjtextFieldとかいうやつ
らしいんです・・・
すみません、どなたか また お願いします
696 :
javaわかんない :04/09/16 22:18:41
>>693 ありがとうございました。
すごいですね もう出来ちゃうんですね!何日も考えていたんですけど・・・
勉強不足です。
ほんとに ありがとうです
697 :
デフォルトの名無しさん :04/09/16 22:33:01
>>694 > GA = Genetic Algorithm
> CA = Cellular Automaton
マシン貧乏にはツラい話だな。
まあ、Java使ってる時点でリソース貧乏にはツラいんだが。
とはいえマシンパワーを活用するという点では、
セル・オートマトンなんかは定跡と謂えるだろうが。
(現時点ではともかくも、超並列が一般化したら。
けっきょくおれもチャート法で擬似超並列を実現しとるわけだし)
698 :
デフォルトの名無しさん :04/09/17 09:37:53
>>681 その問題は、町の地図が抽象的でしかも「アプレット」と書いてる辺り
ありがちな経路探索問題と見せかけて、実はその前の、任意の数の町を
ランダムな経路で結ぶ地図を作成させる、非重複の図面配置の問題だな。
699 :
nullpoint :04/09/17 11:02:02
下記のプログラムを実行すると、当然文字列aaaが表示されます。 このaaaをキーにして文字列zzzを表示するには、 System.out.println(test);をどのように変えたらいいですか? System.out.println(test = aaa);とするのではなく、 文字列変数(test)の中に格納されている文字列(aaa)を変数とみなし、 その変数の中にある値を抜き出すということです。 よろしくお願いします。 public class StringValue { public static void main(String[] args) { String test = "aaa"; String aaa = "zzz"; System.out.println(test); } }
>>699 そういうことをしたくなった場合は、たいてい設計が間違ってる
HashMapでもつかえ
701 :
デフォルトの名無しさん :04/09/17 11:30:31
>>699 String test = "aaa";
String aaa = "zzz";
Map textMap = new TreeMap();
textMap.put(test, aaa);
System.out.println( textMap.get(test) );
702 :
デフォルトの名無しさん :04/09/17 11:41:33
>>700 設計が間違ってるってのはないのでは?
リソースバンドルみたいなのをやりたいんだよ。
>>699 値を取得したい変数というのがクラスのインスタンス変数なら
Class.getDeclardField で取得できる。戻り値は java.reflect.Field なので
値を取り出すにはもう1ステップ必要。
//---
class Sample{
String aaa;
String bbb;
String ccc;
Sample(String a, String b, String c){
aaa=a;bbb=b;ccc=c;
}
Sample(){
this("","","");
}
Sample(int i){
this(Integer.toString(i),Integer.toString(i+1),Integer.toString(
i+2));
}
}
// 改行大杉らしいので分割
//続き public class StringValue{ public static void main(String args[]){ Sample s=new Sample(1); String test="aaa";String x=""; System.out.println(s.aaa); try{ x=(String)s.getClass().getDeclaredField(test).get(s); }catch(NoSuchFieldException nsfe){ System.err.println("Field "+test+" does not exists."); System.exit(1); }catch(IllegalAccessException iae){ System.err.println("IllegalAccessException:"+iae); System.exit(1); } System.out.println(x); } } //以上 上のtestに"aaa","bbb","ccc"としてみればそれぞれ s.aaa, s.bbb, s.ccc を得る。
705 :
nullpoint :04/09/17 13:18:08
おいおい。
>>681 は巡回セールスマンじゃなくて単なる最短経路問題だぞ。
遺伝的アルゴリズムが云々とか言ってる奴は知ったかだろ。
>>706 巡回セールスマンと最短経路問題って、どう違うのですが?
あ、全部の町をとおる必要がない、っていうのは違うけど、GAが出る幕がなさそうな書き方だから、その点について。 確定的に求めれるんだよね?
709 :
デフォルトの名無しさん :04/09/17 20:37:36
っていうかGAって真の最短経路を必ず出せるわけじゃないでしょ? 地図情報システムとかならまだしも、この課題に適用しても仕方ないんじゃない?
>>709 求められる解が厳密解ではない。
しかし、対象が十分複雑であれば、厳密解が求まらないこともあるので、
そういった場合にあたえられた時間内に最適解を求める、などといった用途
に使える。
>>710 違うかな?
あまりかわらない気がするんだけど。
713 :
デフォルトの名無しさん :04/09/17 21:08:33
>>711 それは分かってるが、今回の課題は厳密解の探索を求めてんじゃないの?という話。
>>711 今回は規模が小さいから普通にやった方がいいね
オーダぐらし調べりゃでてくんだから調べろよ。 ダイクストラのアルゴリズムを使った場合、最短経路の探索は O( l log N) 但し l はネットワーク上の枝の数。 巡回セールスマン問題は総当りで解いた場合 O( N ! )
717 :
697 :04/09/17 21:44:57
>>706 > 遺伝的アルゴリズムが云々とか言ってる奴は知ったかだろ。
漏れは言ってない(^_^!)。誰か言ってる?
>>708 > あ、全部の町をとおる必要がない、っていうのは違うけど、GAが出る幕が
> なさそうな書き方だから、その点について。
漏れは書いてない(^_^!)。誰か書いてる?
>>711 > 求められる解が厳密解ではない。
> しかし、対象が十分複雑であれば、厳密解が求まらないこともあるので、
> そういった場合にあたえられた時間内に最適解を求める、などといった用途
> に使える。
漏れもそう思うし、
>>689 でそう言ってる。
>>714 >>今回は規模が小さいから普通にやった方がいいね
漏れもそう思う。
>>715 >> 両方ほぼO(n^n)じゃないの?
この問題に関していえば、もっと少ない。n!よりもっと少ない。
実用上は、たぶん n^3とか、そんなもん。
なんかキモイのが出てきた。
>>719 今回の件に関してGAを使う意義を教えてくれ。マジで。
721 :
経路探索 :04/09/17 21:55:15
>>681 下に一つの例を示しますが、経路探索の部分だけ。
Tonwは町で、Pathは町と町を結ぶルート。new Town()した後に町の番号を
Town#numberに入れて、Town#pathのPath[]配列に町の数だけのPathインスタンスを
入れる。new Path()した後に、Path#destinationには他の町の番号で、Path#distanseには、
その町とつながってるなら距離をint値で入れ、つながってないなら(つまり距離∞なら)-1を
入れる。このPathコンストラクタ作業を町の数だけ繰り返して一つのTownコンストラクタは
終了。その後も、このTownコンストラクタ作業を町の数だけ繰り返す。
その後にstartにスタートTown、goalに目的地Townを入れる。それでコード開始。
class Town { int number; Path[] path; public boolean equals(Object obj) { if(!(obj instanceof Town)) return false; return number==((Town)obj).number; } } class Path { int distance; Town destination; } Town start; Town goal; SortedMap pathList=new TreeMap();
>>720 カーナビのデータの様にわりと巨大なものを探索するように発展できたらなぁ
と思った。
724 :
経路探索 その2 :04/09/17 22:00:17
void starts() { for(int i=0; i<start.path.length; ++i) { if(start.path[i].distance!=-1) { List visited=new ArrayList(); visited.add(start); move(start.path[i].destination, start.path[i].distance, visited); } } Integer key=(Integer)pathList.firstKey(); List shortestPath=(List)pathList.get(key); //shortestPathにTown(町)が移動順で格納されてる。 } void move(Town town, int distanse, List visited) { visited.add(town); if(town.equals(goal)) { pathList.put(new Integer(distanse), visited); return; } for(int i=0; i<town.path.length; ++i) { if(town.path[i].distance!=-1 && !visited.contains(town.path[i].destination)) { move(town.path[i].destination, distanse+town.path[i].distance, new ArrayList(visited)); } } return; }
725 :
デフォルトの名無しさん :04/09/17 22:03:01
>>718 > なんかキモイのが出てきた。
いや、「出てきた」んじゃなくて、前から出てる。(^_^!)
>719
>> おれおれ
いや、本人。(^_^!)
726 :
デフォルトの名無しさん :04/09/17 22:14:58
727 :
デフォルトの名無しさん :04/09/17 22:17:30
728 :
デフォルトの名無しさん :04/09/17 22:21:28
>>727 おれおれ?
GAって何なんですか?
いいものなんですか?
729 :
デフォルトの名無しさん :04/09/17 22:22:13
=727 > 認める。粘着質だし、自閉だし。 あ、念のため。「認める」は「したためる」ではなく、「みとめる」。 「自閉」というのは、いわゆる「統合失調症」の症状としての「自閉」や 「自閉的性格」の省略表現としての「自閉」ではなく、 広汎性発達障碍(障礙)としての「自閉」 (=いわゆる自閉性障礙、すなわち「自閉圏」の人間としての「自閉」)。
730 :
デフォルトの名無しさん :04/09/17 22:25:00
731 :
デフォルトの名無しさん :04/09/17 22:30:13
>>728 > おれおれ?
私は「オレオレ詐欺」=「騙り」と解釈したが。
> GAって何なんですか?
適当な訳語がないが、「派生的アルゴリズム」っつーのが
近いかな? つまるところ将棋倒し的に解探索が走るような、
ネットワーク探索アルゴリズムだ。
> いいものなんですか?
知らん。いいなら教えてくれ。
732 :
デフォルトの名無しさん :04/09/17 22:32:39
GAは遺伝的アルゴリズムって訳語が定着してると思うけど...
733 :
デフォルトの名無しさん :04/09/17 22:33:21
>>730 あんたがキモイんなら仕方あるまい(^_^;)。あんたの感性にまで
口を挟む気はない。
>>731 適当な訳語はないが、「遺伝的アルゴリズム」で通っている。
ぬるぽに対するがっとは関係ない。
>>728 例えば、
ある関数の最大値を求めたいとき、入力のベクトルxをビット列Xで表すようにする。
遺伝的アルゴリズム=GAではこれを染色体と呼ぶ。
個体は染色体Xを持ち、初期のXはランダムな値とする。
複数の個体を用意して、それぞれの染色体に対して突然変異・交叉・選別を繰り返し、
最終的に最も優秀な染色体をもつ個体を解とする手法。
最も優秀な個体とは、関数の出力ベクトルから求まるある値が最大である個体。
736 :
デフォルトの名無しさん :04/09/17 22:44:01
で? 何に使えるのですか? ある値とは何を基準に決めるのですか? その値とはひとつですか?複数ですか?
737 :
デフォルトの名無しさん :04/09/17 22:46:56
>>732 それは知らんかった。漏れは「生成的アルゴリズム」とか、
そのまんま「ジェネリック・アルゴリズム」とか、
そういう言葉で知ってた。
α―β枝刈りとかそんな感じで、解を生成しちゃあ評価関数で
篩っては見込みのある枝を追ってゆくという……
「遺伝的アルゴリズム」っつーと、そのつど結果が出て、
評価関数っつーものが帰納的かつ局所的に決まる感じが
するのだが。
738 :
デフォルトの名無しさん :04/09/17 22:49:25
ガソリンの値段が上がったことと関係ありますか?
>>736 まじめに解くと時間がかかりすぎる問題を解く。
現実的によくあるのは、スケジュールの自動割当とか、カーナビの最短ルート探索。
>>735 の「ある値」は、文脈的に適切ではない気がする。
740 :
デフォルトの名無しさん :04/09/17 22:51:54
>>738 はスレにGAを導入する試みです。
こうするといい結果が得られる可能性があるのですよね?
違いますか?
>>738 それは関係ないが、おまえがモテないこととは関係ある。
遺伝アルゴリズムだからな。
742 :
デフォルトの名無しさん :04/09/17 22:53:28
>>741 数年前まではもてたんです・・・
何でだめになったんでしょうか?
744 :
デフォルトの名無しさん :04/09/17 22:56:16
745 :
デフォルトの名無しさん :04/09/17 23:00:10
ここまでの実験結果をまとめます。 GAはまったく無関係な方向に向かって走り出す可能性がある。 あまり使えそうにない。 違いますか?
746 :
デフォルトの名無しさん :04/09/17 23:02:24
747 :
デフォルトの名無しさん :04/09/17 23:03:05
748 :
デフォルトの名無しさん :04/09/17 23:04:17
>>745 > GAはまったく無関係な方向に向かって走り出す可能性がある。
それはスレ住人の性質だから、GAとは関係ない。
> あまり使えそうにない。
どんな問題に使うかによるから、あまり使えそうにないというのは正しくない。
そもそも、君は何も実験していないんじゃないか?
751 :
デフォルトの名無しさん :04/09/17 23:15:05
>>749 そう。恐竜じゃないけど、大絶滅が起きる可能性があるわけだからね。
素っ頓狂な奴が細々と生きてゆける程度にバリエーションが豊富でないと、
局所解に引っかかって、最適解が見つからない。
752 :
デフォルトの名無しさん :04/09/17 23:16:26
>>751 というか、固体の数と選択肢の数が同じになるので、やってもしょうがない。
JAVAやめてC#しによっと
756 :
前レスの質問者 :04/09/18 10:16:06
700前半代で、知ったか討論してる人達。 遺伝あるごりずむだとか生成的なんたらとか、机上の空論をもてあそんで ないで、具体的なコードの一つでも書いたらどうですか。 全然回答になってないんですよ。 バカの一つ覚えみたいな小難しい用語wばかり述べないで、じゃあそれを 実際のコードにしてみてください。どうせ、えーと、ifの次はelseで いいんだよなーとかのレベルなんでしょうがw プゲラ
MessageDigestクラスを使って、入力された8桁の文字列を MD5でコード化しようと思ってるんですが、コードの取り方が判りません。 MD5だと英数8桁で32桁のコードが帰るって聞いたんですけど… どなたか、知っている方ご教授ください。 今書いているソースです*************** String pwd = "password"; byte bys[] = pwd.getBytes(); try{ MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(bys); byte[] mdb = md5.digest(); } catch(Exception e){ e.printStackTrace(); } ***********************************
>>756 は私ではありません。
いろいろ情報を下さった皆さんありがとうございます。
残念ながら一向に分かっておりませんが、、、w
Googleで課題に似たようなAppletをみつけたので
友人に頼んで直してもらいました。
2chを頼りにした私が馬鹿でした。
>>758 バカなりに自分がバカなことは分かってるんだな。
763 :
デフォルトの名無しさん :04/09/18 20:24:10
genetic と generic を間違えとった……(-_-!)
765 :
デフォルトの名無しさん :04/09/18 21:02:08
>>756 > 具体的なコードの一つでも書いたらどうですか。
すでに三本以上書いてますが何か?
> 小難しい用語wばかり述べないで、
べつに難しくねえって(-_-;)
766 :
デフォルトの名無しさん :04/09/18 21:11:15
>>753 >> というか、固体の数と選択肢の数が同じになるので、
固体→個体
遺伝的アルゴリズムって、べつに「全ての変異」を個体として
生成するわけじゃないだろう。
狭い世界の最適解が、真の最適解と一致しない場合も多いだろうという話。
狭い世界の在来種が、外来種に駆逐されちゃうみたいなもんで。
>>765 私の2chディレクトリ内のファイルがtest053.ccまで来てしまった。
768 :
デフォルトの名無しさん :04/09/18 22:21:17
>>765 >>すでに三本以上書いてますが何か?
どこに書いてあるんですか?
>>べつに難しくねえって(-_-;)
ぷぷ、典型的な返し言葉。得意気に使ってて何を言ってるのかwプゲラ
言語はあるが意味はない、バカの一つ覚えを証明してますなwホルホル
769 :
デフォルトの名無しさん :04/09/18 22:26:01
>>765 大体、経路探索如きに遺伝的だとか生成的だとかを無理に持ち出す事自体が、
バカの一つ覚えを証明してるんですよ。
一言、再帰を使うですむんですがね。 基本的アルゴリズムも理解して
ないんじゃないですか。言葉だけ暗記しても意味ないですよ。
今までのやり取りを読みましたけど抽象的な内容ばかりで、まさに知ったか
会話そのままですね。
>>769 再帰プ
まだまだあまちゃんだね。
世の中にはお前の分からないことがたくさんあるのよ。
>>770 おやおや、反論のお早いことで。図星つかれて口惜しさの余り
レスせずにはいられないようですねw
怒りの感情にだけまかせないで、もっと具体的に反論してはどうですか?
ま、無理なんだろうけど
Java厨ってつまらないことでずいぶんレスが延びるんだね。 なんていうか…厨房臭い。
>>771 ばーか
再帰なんて基本中の基本だろう。
再帰では解決しないことがたくさんあんだよ。
探索範囲がある程度以上複雑な時には
単純な再帰ではまずスタックオーバーフローする。
次にリソースがいくらあっても足りない。
そして時間がかかり過ぎる。
そのくらい理解しろよ。
もっと説明してほしいかい、おばかちゃん。
最短経路問題ごときでこんなに盛り上がるのがすげーふしぎだ。 情報系の講義だと学部レベルの初歩的で定番の宿題だよね、これ。 最短経路問題のダイキストラ、微分方程式のルンゲ・クッタ、 連立方程式のガウス・ジョルダン... おっさんになった今ではなんか懐かしい。
このテーマのもともとの発端は、学校から出た宿題への質問からだろう。 学校の宿題の最短経路問題にGAを持ち出すってのは、お遊びで わざと複雑にして質問者を煙に巻こうとしてるとしか思えんな。 しかし773の必死の反論さを見るとマジで言ってたのか? なんか理屈倒れと言うか、簡単なコーディングにまでやたら技巧を持ち込んで 開発工程をわざわざ上げそうで、絶対に雇いたくないタイプだな。 知識におぼれて知恵がないって感じ。まだ学生かな。
>>775 プププ
煽り厨が煽り負けてやんのw
771=772=776 いい加減にしろ
778 :
デフォルトの名無しさん :04/09/18 23:39:27
>>773 > 再帰なんて基本中の基本だろう。
漏れもそう思うが知らん奴が多く、使えん奴も厭んなるくらい多い。
> 再帰では解決しないことがたくさんあんだよ。
漏れもそう思うが、セル・オートマトンや遺伝的アルゴリズムを知ってても
あんまり役立たない(セル・オートマトンを使ったアプリケーションを
書いて、そこそこ儲けたことのある漏れが言うのも変だが)。
> 探索範囲がある程度以上複雑な時には
> 単純な再帰ではまずスタックオーバーフローする。
安心しろ、実データだと大抵大丈夫だ。
でなきゃJavaなんか実用にならん。
> 次にリソースがいくらあっても足りない。
安心しろ。メモリはどんどん安くなってる。
そのへんのおばちゃんが使ってるマシンでも512MBとか積んでるから、
よほど屑なコードを書かなきゃだいたい間に合う。
でなきゃJavaなんか実用にならん。
> そして時間がかかり過ぎる。
安心しろ。最近のマシンはどんどん速くなってる。
でなきゃJavaなんか実用にならん(^_^!)。
というわけで、結論はJavaは実用にならんということでした。 〜終了〜
781 :
デフォルトの名無しさん :04/09/18 23:59:52
>>779 > というわけで、結論はJavaは実用にならんということでした。
読解力のない香具師には何言っても無駄かも知れんが、
Javaのメリットは一にも二にも開発のしやすさだと思っている漏れとしては、
リソースの心配をする以前にまず「動く」プログラムを書いて、
めちゃくちゃ遅かったりめちゃくちゃ重かったりしたら、
チューニングをかけるなり、Cに移植するなりすりゃあいいと思ってる。
だからJavaで処理系依存だとか言語依存だとかのコードは
(仕事でどうしてもその環境で動かさにゃならんときを除き)
書きたくないわけで、だからGUIだのアプレットだのといった話は
なるべくなら避けたいのである。
>>781 おぬしちょっと変わってて面白い香具師だな
意外と気が合うかもしれん
でもGUIなしじゃ商売にならんだろ?
>>781 Javaで遅かったらアルゴリズムを考え直して、それでも遅かったらCで書くけどね。
それでも遅かったらアセンブリ。
それでもダメなら来るべき時が来るまで封印。
784 :
デフォルトの名無しさん :04/09/19 04:03:02
C++よりはスタック使わない気がするけど、そうでもないですか? どっちにしろ再帰使いたがるのは気が狂ってる感じがするけど。
>>784 そこで関数型言語ですよ。
何にせよ、Tail recursion を最適化すればスタック消費は減らせる
(只のループなら消費0になる)。
もうJavaやめよ。なんか人間として駄目になりそう。
787 :
デフォルトの名無しさん :04/09/19 06:49:10
>>786 もう人間やめれば。なんかJavaが駄目になりそう。
788 :
デフォルトの名無しさん :04/09/19 07:26:56
>>782 > でもGUIなしじゃ商売にならんだろ?
元々アルゴリズム開発が仕事なのでさほど問題がない。
最近はHTMLで吐いてブラウザ任せ。
なにせ今の仕事が自然言語処理なんで、
ルビ振り表示なんかはIEに任せたほうがぜってー楽。
789 :
デフォルトの名無しさん :04/09/19 07:45:11
> どっちにしろ再帰使いたがるのは気が狂ってる感じがするけど。 漏れが狂ってるのは別にして、再帰が特別な手法だと思うのは、 再帰を使いこなしてないか、再帰に向いてない問題に むりやり再帰を適用して誤解してるかのどっちか。 非数値処理では再帰を使うと楽に書けるケースは多い。
790 :
デフォルトの名無しさん :04/09/19 07:56:28
>>781 現時点におけるJavaの(アルゴリズム記述言語としての)弱点としては、
swapがない
(loop-until-do-whileみたいな)途中からループを抜ける制御構造がない
配列やListは結局ポインタと一緒だから、引数として渡したときに副作用がある
くらいだから、アルゴリズムの検証にはけっこう便利。
>>784 「再帰」と聞いてその程度の連想しか出来ないって時点で、
当人のレベルが分かるってもんだ。
GAの適用性も理解していないらしいですなw
つーかダイクストラって普通再起無しで書かないっけ? 深さ優先探索でもする気なのかオマイラ。
794 :
デフォルトの名無しさん :04/09/19 11:59:58
真面目な人はフィボナッチヒープで書くんかな。 でも、普通はただのヒープで済ませるだろう。
もういいって、君達がいろいろ知っていうことにしてやるから、 頼むからつまらないことでその必死な発言の数々はやめてくれ。
796 :
デフォルトの名無しさん :04/09/19 12:21:18
Java に関するスレなんだから アルゴリズムの質問は別のところでやってくれ
797 :
デフォルトの名無しさん :04/09/19 13:03:11
> Java に関するスレなんだから > アルゴリズムの質問は別のところでやってくれ それより、訊きたいことがあるならさっさと訊きゃあいいじゃん。 ↑上でごちゃごちゃ言ってる連中だって、それなりに 思うところがあるんだろうからさ、 なんか問題出して、 それが実際のコードにどう反映されるかを見りゃあいい。 そのコードが屑なら方法論も屑だし、 それでcoolなコードが上がってくりゃあ、 方法論だって間違ってないってこった。
798 :
デフォルトの名無しさん :04/09/19 13:23:16
間違った方法論で素晴らしいコードを生み出すcoolな俺。 Javaで使えるアプリを生み出すcoolな俺。 ある意味天才。 ある意味神。 素晴らしい俺。
799 :
デフォルトの名無しさん :04/09/19 13:35:52
ぶっちゃけた話、 繰り返し型で書こうとしても 結局は再帰でやってるのと同じことを書く破目になるケースは多い。 たとえば以下の問題。 1.int の配列 x[n] から、m個の要素を取り出す組合せを尽くし、 int 配列のArrayListの形で返せ。 2.int の配列 x[n] から、n個の要素を取り出す順列を尽くし、 int 配列のArrayListの形で返せ。 再帰の呼びの深さは1で m、2で n だから、 リソースを気にして繰り返し型で書くより あっさり再帰を使っちゃったほうが楽。
800 :
デフォルトの名無しさん :04/09/19 13:42:57
>>799 あなたも素晴らしい俺ですね。
感動です。
801 :
デフォルトの名無しさん :04/09/19 15:30:51
プログラムを実行すると abcdefghijk 1234567890a という二行からなる文字列が行の先頭から5文字までと、7文字めから行の最後までと 分かれるというプログラムを作れといわれましたがどうのようにしたらいいかわかりません。 わかる方、ご教授お願いします。
>>801 String line="abdcefghijk";
String head=line.subString(0,5);
String tail=line.subString(6);
の繰り返し。。。
806 :
デフォルトの名無しさん :04/09/19 20:00:19
int a=1; int b=3; int c=a/b*b; これで実行するとcは0になってしまいます doubleやfloatを使わずにcを1にすることは可能でしょうか? c=a/b*bの式の変数の順番や演算子は変えずにお願いします
なぞなぞですか? int a=1; int b=1; int c=a/b*b;
808 :
806 :04/09/19 20:28:04
いや違います 1を3で割ってしまうと0.〜になってしまいintでは0になってしまいます そこに3をかけても0になってしまいありえない答えになってしまうわけです やはり式を変えないと無理ですかね
何を言ってんですかあなたは?
byteが扱える整数の値の範囲は-128から127ですけど なんで、-127から128までではないんですか?
>>810 最上位ビットで負数かどうか判断するため
>>803 for文で繰り返す場合に
String line="abdcefghijk";
の文字列部分が行ごとに違う場合
どうやって書けばいいの?
814 :
デフォルトの名無しさん :04/09/19 21:11:41
>>804 public static void main( String[] args ) {
if (args.length < 1) {
System.err.println("usage: java ch2 文字列");
System.exit(1);
}
String s = args[0];
int len = s.length();
Cell [] xx = new Cell[len];
xx[0] = new Cell(0, 0);
for (int pos = 1;pos < (len - 1);pos += 1) {
xx[pos] = new Cell(pos, 1000);
}
xx[len - 1] = new Cell(len - 1, 0);
815 :
デフォルトの名無しさん :04/09/19 21:12:29
Cell [] yy = new Cell[len]; while(!found) { found = true; for (int pos = 1;pos < (len - 1);pos += 1) { if ((xx[pos - 1].dist < xx[pos + 1].dist)) { int dist = xx[pos - 1].dist + 1; if (xx[pos].dist != dist) { yy[pos] = new Cell(pos, dist); found = false; continue; } } if ((xx[pos - 1].dist > xx[pos + 1].dist)) { int dist = xx[pos + 1].dist + 1; if (xx[pos].dist != dist) { yy[pos] = new Cell(pos, dist); found = false; continue; } }
816 :
デフォルトの名無しさん :04/09/19 21:12:54
if ((xx[pos - 1].dist == xx[pos + 1].dist)) { int dist = xx[pos + 1].dist + 1; if (xx[pos].dist != dist) { yy[pos] = new Cell(pos, dist); found = false; continue; } } yy[pos] = xx[pos]; } yy[0] = xx[0]; yy[len - 1] = xx[len - 1]; for (int pos = 0;pos < len;pos += 1) { xx[pos] = yy[pos]; } }
817 :
デフォルトの名無しさん :04/09/19 21:13:16
int maxdist = 0; for (int pos = 0;pos < len;pos += 1) { if (xx[pos].dist > maxdist) { maxdist = xx[pos].dist; } } int end_of_head = len; int top_of_tail = 0; for (int pos = 0;pos < len;pos += 1) { if (xx[pos].dist == maxdist) { if (pos < end_of_head) end_of_head = pos; if (pos > top_of_tail) top_of_tail = pos; } } String head = s.substring(0, end_of_head); String tail = s.substring(top_of_tail + 1, len); System.out.println(head); System.out.println(tail); }
818 :
デフォルトの名無しさん :04/09/19 21:13:39
private static class Cell { int pos; public int dist; Cell(int pos, int dist) { this.pos = pos; this.dist = dist; } }
セル厨キタ━━━━(゚∀゚)━━━━!!!!!
>>819 厨厨いってるとねずみさんになっちゃうぞー
JAVAで文字列(数字が入ってるって想定)の前ゼロ部分を捨てる簡単な方法を教えてください。 一端数字にしてもう一度文字ですかね?(型)ちなみにJAVA超初心者なのでJAVAの作法すら知りません。 よろしくお願いします。
822 :
デフォルトの名無しさん :04/09/20 09:21:35
>>821 > 簡単な方法を教えてください。
「簡単な」方法はたぶんない。
> 一端数字にしてもう一度文字
それがたぶん正解だが、文字列が数字と解釈して意味がなかった場合に
例外を飛ばすか飛ばさないかで二通りの方法がある。(>誰か教えてくれ)
処理の前に String の matches()で数字の形式を
チェックしたほうがいいと思う。
そうすれば、整数とか小数とか分数とか、いろんな形式の「数字」に対し、
一つのコードで対応できるし、引数で区分を示すこともできる。
823 :
デフォルトの名無しさん :04/09/20 10:34:21
>>821 String num="023568 008365";
num=num.replaceAll("^0+|\\b0+", "");
//num → 23568 8365
>>822 どもです。何の言語でも例外処理って面倒ですね。
>>823 まだ調べてないんですけど たぶん正規表現での置換ってことですね。
821書き込んでから 正規表現のが簡単かな?と思ってました。
どちらがいいか、、、823さんのほうが簡潔ですみそうな気がするので
822さんには・・・・ゴメンナサイ!
お二方ともありがとうございました。
つーか、
>>822 はいつもの人だろ。
わざと話を別方向にわざわざ複雑な方向に持ってくいつもの人。
おそらくお遊びでやってるんだろうが、文章はマジっぽいので
余計悪質だ。
826 :
デフォルトの名無しさん :04/09/20 16:11:16
>825
> つーか、
>>822 はいつもの人だろ。
あたりです(^_^)v
> わざと話を別方向にわざわざ複雑な方向に持ってくいつもの人。
「宿題に答える」という観点から言えば、
「出題者がマイナス点をつけにくい解答」というのが正しい方向であり、
「望ましい解答」というのは確かに別方向だな。
この場合も「数字」というのが「整数」だというのがはっきり示されてれば、
「0.1」を「.1」に変えちゃっても「前ゼロ部分を捨てる」という意味では
もちろん正しいと言える。
あるいは「とにかく言われた通り(仕様書の通りに)プログラムが
書ければいいのであって、それが発注側の意図と食い違っていたとしても、
それは正しいプログラムなのである」と考えれば、それは正しいと言える。
なお、
>>823 のプログラムにいちゃもんをつける気はさらさらない。
「正規表現を使う」というアイディア自体にはおれも賛成だからだ。
ただ、Javaで本格的に正規表現を駆使しようとすると苦労が多いので、
sedかPerlを使ったほうがたぶん楽だ。
わたし長文は読めません
828 :
デフォルトの名無しさん :04/09/20 19:01:13
>>827 長文読めなくてもJavaプログラムは書ける。
すばらしい。
>>826 ははは
>>824 でやんわりと ごめんなさいなんて書いたけど
もともと小数だったらどうすべきとかロジック的なものは
人に聞く気も無いからその辺は聞き流させてもらってました。
もっとも前提として俺が書かなかったから そこまで考えてくれたんだろうけど。
Perlでいいなら俺も 質問しないよw
とにかく回答してくれたことに感謝してることは変わりない ありがとう。
830 :
デフォルトの名無しさん :04/09/21 12:50:03
>>821 > とにかく回答してくれたことに感謝してることは変わりない ありがとう。
どういたしまして。m(_ _)m
ついでながら正規表現を扱うクラスはjava.util.regex.*
サンプルプログラムは岩谷宏『Javaによるテキスト処理入門』(ソフトバンク)
にあり。
> ちなみにJAVA超初心者なのでJAVAの作法すら知りません。
とのことなので、僭越ながら。
>>830 わーん ますます 感謝です。
できれば俺のとこにきて教えて欲しいです。(←マジにw)
832 :
830 :04/09/22 11:30:58
n = Integer.parseInt(str); は例外NumberFormatExceptionを投げるのでうざったい。 たしか例外を投げない方法が あったはずなんだが……
>>832 標準では無いよ。
Commons Langあたり使うか。
しかし、岩谷というだけで、読む気がしないのは気のせいか?
いやもちろん、他の実績もあって読む気がしないんだけど。
著作で読むべき本は、ぶっちゃけありえない。 訳本は著名本もあるので、原書にあたるのが吉。 わざわざ金払って不快な気持ちになる必要は無いよ。
835 :
830 :04/09/22 14:23:10
>>834 漏れはJVMのソースを読めと言われた。
(((;゚Д゚)))
APIのソースは読まんとやってられないが VMまで要求するのか。
つうか、VMのソースってあるの? ま、彼こそJava厨の名にふさわしい人だね。 翻訳で知った気になってるんだけど、実際には使ったことがない、という。
839 :
デフォルトの名無しさん :04/09/22 21:25:45
>>838 去年、派遣の仕事で行った職場の上司なのだが、
なんでもJavaで書かれた暗号化プログラムを、
鍵部分が生成される一瞬を捕まえて停止させるために、
JVMをハックしたのだそうだ。
「効率に関しては、ずいぶん勉強になった」
とのこと。
840 :
デフォルトの名無しさん :04/09/22 22:00:46
>>837 APIのソース読んだって肝心な部分が無いじゃん。
APIリファレンス読めば良いだけだと思った。
842 :
デフォルトの名無しさん :04/09/22 23:22:20
>>841 いや、凄いには凄いのだが、
「正規表現の鬼」を自称しながらJavaの1.4以降で
正規表現がサポートされているのを知らなかったり、
漏れに「コーディングスタイルが甘い」とか言われて
落ちこんでいたりしたので(いや、設計の腕は確かだったのだが)、
Javaでも漏れのような(いわば正統派の)マターリ系の開発スタイルと、
(あんまりJavaらしくない)Hackishな開発スタイルが
あるっちゅー事だと思われ。
硬派だなあ
844 :
デフォルトの名無しさん :04/09/23 20:55:17
>>843 その上司が答えを聞いて爆笑した問題。
「四つの一桁の数を加減乗除して十を作る遊びがある。
このとき、四つの数がすべて異なり、その中に0が含まれていないとき、
必ず十が作れることを証明せよ。」
これを「どうやったら証明できるか」を聞いて憤慨し、
具体的にどうやって証明するかで考え込み、
実際にどうやって証明したかを聞いて爆笑していた。
SEクラスの研修用問題として、適当かと思われ。
解答は後日。
>844 四つの数がすべて異なり、その中に0が含まれていないとき なので4数の組合せは126通り。 これくらいなら後は人力でも力押しで証明可能かと。
846 :
デフォルトの名無しさん :04/09/23 22:11:14
>>845 「全部試すんだ」と言うと、大抵の人は「真面目に考えて損した」と
憤慨します(^_^!)。
ただ、中にはけっこう難しい組合せがあって、
「あるはずの解がどうしても見つからない」みたいな事態がしばしば起きます
(詰め将棋なんかもそうです。コンピュータで人間が予想しなかった
余詰が見つかる場合がしばしばあります)。
そこでコンピュータで網羅的に探索する必要が出てくるんですが、
式を網羅的に生成するところと、=10になるかどうかの判定のところで
大抵考え込んじゃうんですよ。
で、どうしたらいいか、と。
847 :
デフォルトの名無しさん :04/09/23 23:01:57
いろいろと調べましたが見つからないので教えて下さい。 readlineでユーザからのキーボード入力をさせていたのですが パスワードもreadlineで行うと画面に表示されるので危険です。 そこで入力した文字を*で埋めるようにしたいのですが、 どうすれば出来るかが分かりません。 お手数ですがどなたか助言をお願い致します。
850 :
デフォルトの名無しさん :04/09/24 01:00:12
>>847 コンソール入力だといろいろ設定が面倒なので、GUIでの入力に移行してください。
javax.swing.JPasswordFieldを使えば簡単です。
851 :
デフォルトの名無しさん :04/09/24 01:40:32
すみませんコンソールの奴でおながいします。
852 :
デフォルトの名無しさん :04/09/24 08:43:50
853 :
デフォルトの名無しさん :04/09/24 09:18:03
>>848 「人力であらかじめ組合せを尽くしておく」という方針だと、
たぶんそのプログラムがマル。
ただ、4/(3-2-1)とかいうのが出てきたら0による除算で落ちないかとか、
途中に分数が出てくる場合があったとき丸め誤差が生じて
==10が成立しないんじゃないかとか、
そういった心配をしだすともうちょっと凝りたくなるのだな。
>853 ん?ゼロ除算はevalでトラップされてるし、 ==10でないものが引っかかる可能性はないし、 ==10になるはずのものが引っかからないのであればそこだけ手処理すればいい。 (今回はたまたま問題なかったのだからそれはそれでいい)
855 :
デフォルトの名無しさん :04/09/24 12:23:22
>>854 > ゼロ除算はevalでトラップされてるし、
> そこだけ手処理すればいい。
まあ、Perlっちゅー言語がそういう言語だしな。(-_-;)
漏れもJavaではなくLispで書くんなら「簡単だな」と
思うんだが、CやJavaで「自分で式作って評価して……」とか
やってると、けっこう(インタプリタ作るのと変わんない
程度の)大騒動になるんで。
857 :
デフォルトの名無しさん :04/09/24 20:09:59
DATE型の二つの変数の大小比較をしたいのですがどう行えばいいでしょうか?
解決しました
>>856 おー。できたできた。
次はこのCUIアプリをApplet化してみます。ありがとーー。
Javaの関数の引数をオプション(無くても動く) として定義することはできますか? できるとしたら、どうしたらよいでしょうか。
few-sdd abcde-kjfes aa-mmk azasdjws-dhjles fjp-jgf という五行からなる文字列が プログラムを実行すると 各行の"-"より右側と左に分かれると言う プログラムを作りたいんですがどうしたらよいでしょうか?
862 :
デフォルトの名無しさん :04/09/25 22:54:36
キーボードから秒単位の時間を表す整数値を入力させ ○時間○分○秒という形式で出力するプログラムをするには どうすればよろしいのでしょうか?
もちろん漢数字です
class FixedTriangle { static float height = 3.0f; static float bottomSide = 4.0f; static float weight(float density) { float weight; weight = 0.5f * height * bottomSide * density; return weight; } } class OutputWeight { public static void main(String args[]) { float d0 = 2.5f; float d1 = 3.5f; System.out.println("Weight(d0) = " + FixedTriangle.weight(d0)); System.out.println("Weight(d1) = " + FixedTriangle.weight(d1)); } } 上のを書き換えて、任意の形状の三角形の重さを計算するプログラムを作りたいのですが、 どうすればよいでしょうか? 本のヒントでは、 FixedTriangleクラスを変更してTriangleクラスとし、 フィールドbottomSideとheightをインスタンス変数に変更する。 bottomSideとheightを設定するインスタンスメソッドsetDimension()を作成する。 setDimension()で底辺と高さをセットし、それらの値から重さを計算する。 とあります。
865 :
デフォルトの名無しさん :04/09/26 08:43:39
class Triangle { float height = 3.0f; float bottomSide = 4.0f; void setDimension(float h, float b) { height=h; bottomSide=b; } float weight(float density) { float weight; weight = 0.5f * height * bottomSide * density; return weight; } } class OutputWeight { public static void main(String args[]) { float d0 = 2.5f; float d1 = 3.5f; Triangle tgl=new Triangle(); tgl.setDimension(任意F, 任意F); System.out.println("Weight(d0) = " + tgl.weight(d0)); System.out.println("Weight(d1) = " + tgl.weight(d1)); } }
866 :
デフォルトの名無しさん :04/09/26 09:23:07
>>861 String txt="few-sdd\nabcde-kjfes\naa-mmk\nazasdjws-dhjles\nfip-igf";
List left=new ArrayList();
List right=new ArrayList();
Pattern pat=Pattern.compile("\\b[^\\-&&\\S]+|-.+");
Matcher mat=pat.matcher(txt);
while(mat.find()) {
String word=mat.group();
if(word.charAt(0)=='-') right.add(word.substring(1));
else left.add(word);
}
System.out.print("左:"); Iterator it=left.iterator();
while(it.hasNext()) System.out.print(it.next()+" ");
System.out.print("\n右:"); it=right.iterator();
while(it.hasNext()) System.out.print(it.next()+" ");
>>862 void translate() {
InputStreamReader inR=new InputStreamReader(System.in);
BufferedReader bufR=new BufferedReader(inR);
int sec=0;
try { sec=Integer.parseInt(bufR.readLine()); }
catch (Exception ex) { System.exit(0); }
int hour=sec/3600; if(hour>1000) System.exit(0);
int minu=(sec%3600)/60;
sec=sec%3600%60;
System.out.println( (hour!=0?format(hour)+"時間":"") +
(minu!=0?format(minu)+"分":"") + (sec!=0?format(sec)+"秒":"") );
}
String format(int num) {
String chara1="零一二三四五六七八九";
String chara2="千百十 ";
StringBuffer figures=new StringBuffer();
int digit=1000, count=0;
while(digit>1) {
if(num/digit==1) figures.append(chara2.charAt(count));
else if(num/digit>1) {
figures.append(chara1.charAt(num/digit));
figures.append(chara2.charAt(count));
}
num%=digit; digit/=10; ++count;
}
if(num!=0) figures.append(chara1.charAt(num));
return figures.toString();
}
>>860 基本的にできない。ただし、引数がないメソッドを用意しておき、その中からデフォルト値
を引数として元のメソッドを呼び出すことで、似たようなことはできる。
public void foo() {
foo(null);
}
public void foo(String arg) {
System.out.println("arg:" + arg);
}
Tigerからはできるようになるんだっけ?
870 :
デフォルトの名無しさん :04/09/26 23:51:50
自分のパソコンから複数行あるテキストファイルを 読み込ませてstringに入れるプログラムを 作りたいのですがどのようにしたらいいですか?
871 :
デフォルトの名無しさん :04/09/27 00:05:21
質問です。 Javaアプリでゲーム作ってますが、どうしても逆コンパイルかけられて ソースを覗かれるのがいやなのです。 何か良い方法はありませんか?
872 :
デフォルトの名無しさん :04/09/27 00:15:52
>>872 >>871 とある参考書から引用したっす。よければご参考に。
------- Main.java -------
import java.io.*;
public class Main{
public static void main( String[] args ){
try{
String strTextData = BBSText.readFromFile( "C:\\aaa.txt" );
System.out.println( strTextData );
} catch( IOException ioe ){
System.out.println( "ファイルが無いよ!! C:\\aaa.txt" );
}
}
}
------- ここまで ---------
873 :
デフォルトの名無しさん :04/09/27 00:17:16
>>871 続き
-------- BBSText.java ---------
import java.io.*;
public class BBSText {
public static String readFromFile( String strBBSFilePath )
throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
transport( new FileInputStream( strBBSFilePath ), outputStream, System.getProperty( "file.encoding" ) );
return outputStream.toString();
}
public static void transport( InputStream inputStream, OutputStream outputStream, String strEncode )
throws IOException {
BufferedReader in = new BufferedReader(
new InputStreamReader(
inputStream,
"JISAutoDetect" ) );
PrintWriter out = new PrintWriter(
new OutputStreamWriter( outputStream, strEncode ) );
String line = "";
while( ( line = in.readLine() ) != null ){
out.println( line );
}
out.close();
in.close();
}
}
------- ここまで ---------
874 :
デフォルトの名無しさん :04/09/27 00:18:55
>>870 まちがえた。
872と873は、870へのレスです。
875 :
デフォルトの名無しさん :04/09/27 00:41:07
>871 曖昧化でもしとけ てか、そんな宿題が出たのか?
876 :
デフォルトの名無しさん :04/09/27 03:48:17
1、画面に自分の名前を表示するプログラムを作成してください。 2、次のように画面に出力するプログラムをfor文を2回使って作成してください。 * ** *** **** ***** どうかお願いします。
public class Sample2{ public static void main(String[] args){ for(int i = 0; i < 1; ++i){ for(int j = 0; j < 1; ++j){ System.out.println("*"); System.out.println("**"); System.out.println("***"); System.out.println("****"); System.out.println("*****"); } } } }
878 :
876 :04/09/27 04:25:21
877さんありがとうございます。
>>877 おいおいネタで書くなや。
確かに糞宿題だが、、、、、。
せめてこのくらいの回答にしてくれや。
public class Sample2{
public static void main(String[] args){
for(int i = 0; i < 5; ++i){
String s = "";
for(int j = 0; j < i; ++j){
s += "*";
}
System.out.println(s);
}
}
}
880 :
デフォルトの名無しさん :04/09/27 09:40:33
>>870 public class Text extends ArrayList {
public Text( String filename ) {
try {
BufferedReader bufRdr = new BufferedReader(new FileReader(filename));
String line;
while ((line = bufRdr.readLine()) != null) {
this.add(line);
}
bufRdr.close();
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
881 :
デフォルトの名無しさん :04/09/27 09:42:03
こうやっといて、 Text text = new Text("aaa.txt"); とかやって、あとはイテレータで中身を取ってく。 けっこう楽。
882 :
デフォルトの名無しさん :04/09/27 15:36:36
<プログラムの概要>:バブルソート 配列に格納された7個の数値を、バブルソートを使用して降順で並べ替える。 <プログラム名> Bubble <使用> (1)int型の配列aを宣言し、値「8,45,15,90,62,73,22」を格納する。 以下の説明では、配列の要素数(ここでは7)をNとしている。 (2)a[N-1]とa[N-2]を比較し、a[N-1]がa[N-2]より大きい場合は、a[N-1]とa[N-2]を 入れ替える。同様にa[j]がa[j-1]より大きければa[j]とa[j-1]を入れ替える。こ の操作を、j=N-1からiまで繰り返す。ただし、iは(2)の処理回数を表す値で ある。(初回を0とする) (3)(2)をi=0からN-2まで繰り返す。 (4)以下の<実行例>を参考にして、配列aの要素の各値を標準出力へ出力する。 <実行例> >java Bubble 90 73 62 45 22 15 8
883 :
882 :04/09/27 18:06:04
↑誰かお願いします
↓誰かどうぞ
ていうかぐぐるとかできないのかねえ
>>882 なんだ。質問だったのか。
それならはっきり質問と書いてくれ。
誰かが誤爆したか、暗記のメモ帳代わりに書いたのかと思ったよ。
887 :
デフォルトの名無しさん :04/09/27 20:26:52
>>882 Bubble() {
int[] a={8,45,15,90,62,73,22};
int N=a.length;
for(int i=0; i<N; ++i) {
int num=a[N-1];
for(int j=N-2; j>=i; --j) {
if(a[j]>num) {
int swap=num;
num=a[j];
a[j]=swap;
}
}
if(num!=a[i]) {
a[N-1]=a[i];
a[i]=num;
}
}
for(int i=0; i<a.length; ++i) System.out.print(a[i]+" ");
}
↑エラーが出ます。
889 :
j だと見にくいので k で :04/09/27 20:30:01
>>882 Bubble() {
int[] a={8,45,15,90,62,73,22};
int N=a.length;
for(int i=0; i<N; ++i) {
int num=a[N-1];
for(int k=N-2; k>=i; --k) {
if(a[k]>num) {
int swap=num;
num=a[k];
a[k]=swap;
}
}
if(num!=a[i]) {
a[N-1]=a[i];
a[i]=num;
}
}
for(int i=0; i<a.length; ++i) System.out.print(a[i]+" ");
}
>>889 Bubble.java:1: 'class' または 'interface' がありません。
Bubble() {
^
Bubble.java:2: \12288 は不正な文字です。
int[] a={8,45,15,90,62,73,22};
^
(中略)
^
Bubble.java:18: \12288 は不正な文字です。
for(int i=0; i<a.length; ++i) System.out.print(a[i]+" ");
エラー79個
>>888 public static void main(String[] args)つけてないんじゃ・・・。
hello worldは出せるよね?
コピペするときは全角スペースに注意。
少しはぐぐれ。
893 :
882 :04/09/27 21:15:49
どうもありがとうございました
>>892 エラーが出るわけないと書いたからコンパイルしてみただけ
895 :
デフォルトの名無しさん :04/09/27 21:54:43
>>894 素人は黙っててください。
フツーは皆分かるもんなんです。
そもそもなんでコンストラクタでやってるのかさっぱりわからん
はげどう
898 :
デフォルトの名無しさん :04/09/28 03:59:50
1〜50までの素数を表示するプログラムをお願いします
public class Sosu{ public static void main(String[] a){ int[] a = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}; for(int i = 0; i < a.length; ++i) System.out.println(a[i]); } }
900 :
デフォルトの名無しさん :04/09/28 09:08:15
for (int n = 2;n <= 50;n += 1) { boolean isprime = true; for (int cnt = 2;cnt < n;cnt += 1) { if (n % cnt == 0) { isprime = false; } } if (isprime) { System.out.println("" + n); } }
なにゆえ+=1?
フラグもいらないね。
>>903 フラグはあってもいいけど、すぐにbreakしたほうがいいね。
それからcntの上限は、n/2まででいいのでは?
まあ、仕様をみたすので899のコードでじゅうぶん。
906 :
デフォルトの名無しさん :04/09/28 16:54:58
> なにゆえ+=1? C 出身者としては、++ というのはポインタに対してsizeof()だけインクリメントするものであって、ポインタでないものに対して ++ するのは生理的に厭なり。 > フラグはあってもいいけど、すぐにbreakしたほうがいいね。 > まあ、仕様をみたすので899のコードでじゅうぶん。 899は外延的プログラムなり。こちらは「1とそれ自身以外に約数を持たない数」という、内包的定義に忠実なプログラムなり。本当は1で割り切れることと、それ自身で割り切れることのチェックを入れたかったところなのだけれど、くどいので省いたなり。 > それからcntの上限は、n/2まででいいのでは? n / cnt >= cntでよいなり。
>>C 出身者としては、++ というのはポインタに対してsizeof()だけ インクリメントするものであって C以前の問題ではないですか?
すこしはアルゴリズムの効率を考えろと言いたい
909 :
デフォルトの名無しさん :04/09/28 17:40:34
charでA(\u0041) に1を足してprintlnしたときにBと表示するにはどうしたらいいですか? お願いします。
Aに1足してBになるって保障されてたっけ?
Javaのcharに限っては、文字集合もコードポイントの意味も言語仕様で 決まってて、Aの次はBだからいいんじゃね?
素数は素数で割れなきゃ素数なんだよ。 もっとループ回数減らせよ。
偶数を調べてる時点でバカ決定
914 :
デフォルトの名無しさん :04/09/28 22:38:02
指摘されたことが恥ずかしいからって かってにスレの趣旨とか決めないでよw
うるせえよ3流プログラマー
そーすうっすね
総合すると、だいたいこんな感じだろ。 int N = 50; int[] primes = new int[N/2]; int primeCount = 1; primes[0] = 2; for (int i = 3; i <= N; i += 2) { boolean isPrime = true; for (int j = 1; j < primeCount; j++) { if ((i % primes[j]) == 0) { isPrime = false; break; } } if (isPrime) { primes[primeCount] = i; primeCount++; } } System.out.println(primes);
919 :
質問です :04/09/29 00:35:39
パズルゲームを作る問題です。 「パズルピースをクリックしてから、ピースを起きたい位置で もう一度クリックする」というやり方です。(ピースの数は4ピース) どうぞよろしくお願いします。 image = new Array(); for(i=0; i<4; i++){ //パズルピースを画像配列imageに格納 image[i]=new Image(); image[i].src="a"+(i+1)+".gif"; } image1=new Image(); var n,m; //var cnt=10; function funk(n)//クリックしたパズルピースをテーブルのクリックした場所に表示 { } function funk1(m)//クリックしたパズルピースをimage1.srcに代入 { }
>>919 MyApp() throws HeadlessException {
Image[] img=new Image[4];
for(int i=0; i<img.length; ++i) img[i]=new Piece(i);
getContentPane().setLayout(new GridLayout(1,2,32,0));
JPanel[] table=new JPanel[2];
for(int i=0; i<table.length; ++i) {
table[i]=new JPanel(new GridLayout(2,2));
table[i].setBackground(Color.lightGray);
table[i].setPreferredSize(new Dimension(300,300));
table[i].setBorder(BorderFactory.createLoweredBevelBorder());
for(int k=0; k<4; ++k) {
JLabel lab=new JLabel();
lab.setBorder(BorderFactory.createLoweredBevelBorder());
lab.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) { setPiece(e); }
});
table[i].add(lab);
}
getContentPane().add(table[i]);
}
Component[] lab=table[1].getComponents();
for(int i=0; i<lab.length; ++i) {
((JLabel)lab[i]).setIcon(new ImageIcon(img[i]));
((JLabel)lab[i]).setBorder(BorderFactory.createRaisedBevelBorder());
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
void setPiece(MouseEvent e) { JLabel lab=(JLabel)e.getComponent(); if(lab.getIcon()==null) { if(stock==null) return; lab.setIcon(stock); stock=null; lab.setBorder(BorderFactory.createRaisedBevelBorder()); } else { if(stock!=null) return; stock=lab.getIcon(); lab.setIcon(null); lab.setBorder(BorderFactory.createLoweredBevelBorder()); } }
private class Piece extends BufferedImage { Piece(int num) { super(150,150,BufferedImage.TYPE_INT_ARGB); Graphics2D g=createGraphics(); switch(num) { case 0: g.setColor(Color.blue); break; case 1: g.setColor(Color.red); break; case 2: g.setColor(Color.green); break; case 3: g.setColor(Color.yellow); } g.fillRect(0,0,150,150); g.setColor(Color.black); g.setFont(new Font("Dialog", Font.BOLD, 60)); g.drawString(String.valueOf(num), 50,100); g.dispose(); } }
923 :
ピーズその4 :04/09/29 02:03:36
上の3つを下のクラス内にいれる。 package untitled; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; public class MyApp extends JFrame { Icon stock; ・ ・ ・ public static void main(String[] args) throws HeadlessException { new MyApp(); } }
924 :
デフォルトの名無しさん :04/09/29 02:13:27
>>919 は、テーブルタグはhtmlで用意してるってことか?
・GUI 関係などは基本的に放置
ふつうに質問スレ行きだな。
927 :
デフォルトの名無しさん :04/09/29 08:48:17
>>919 それ以前に、これJAVAの質問じゃないよ
ぱっと見JavaScriptっぽいんですが
CASLの簡単なコンパイラをjava言語でおねがいします。 コードの生成速度が速いコンパイラ, 誤入力への対処、表示の工夫など
932 :
デフォルトの名無しさん :04/10/01 21:03:09
-- AAA.java -- public class AAA { public AAA(){ System.out.println( "OUT" ); new BBB(); } } -- BBB.java -- public class BBB { public BBB(){ System.out.println( "OUT" ); new AAA(); } } -- Main.java -- public class Main{ public static void main( String[] args ){ new AAA(); } } C:\>java Main いくつOUTが出力されますか? また、その理由も述べなさい。
答え:1つ。 Out Of Memory Errorと出る。
☆ 基本的なJavaアプリケーションプログラムの作成 引数から指定した5つの小数について、大きい順に並べ替えた結果 を出力するプログラムを作成して下さい。 [実行例] % java MySortDouble 8.75 4.1 6.32 3.0 16.9 [出力結果] ------------------------------------------------------------- 16.9 8.75 6.32 4.1 3.0 ------------------------------------------------------------- という宿題が出されました。はっきり言ってさっぱりです。誰かお願いします
>>934 例外処理適当だけど。
降順となると Arrays.sort もとたんに使いづらくなるね
import java.util.*;
public class MySortDouble {
public static void main(String[] args) {
Double[] array = new Double[args.length];
for (int i = 0; i < array.length; i++) {
try {
array[i] = new Double(Double.parseDouble(args[i]));
} catch (NumberFormatException e) {
System.err.println(e.toString() + "(at " + i + "th artument)");
array[i] = new Double(Double.NaN);
}
}
Arrays.sort(array, new Comparator() {
public int compare(Object lhs, Object rhs) {
return -((Double)lhs).compareTo(rhs);
}
});
for (int i = 0; i < array.length; i++)
System.out.println(array[i]);
}
}
936 :
デフォルトの名無しさん :04/10/02 05:18:06
普通にソートした後、逆順にすればいいんでないかい
ていうか学校の宿題にArrays.sort()使っても、なんのためにもならんな。 それでいいのか?
えー
ページ内のURLだけを表示するようする また、リンクをたどって次々にページを取得 リンクが見つかるたびに次のページを取得する方法と リンクを見つけたらそれを記憶しておいて、ページの解析が終わってから、次のページ群にとりかかる方法 が考えられる 下にソース張ります
import java.io.*;
import java.net.*;
public class URL {
private BufferedReader in = null;
public URL(String string, String encoding) {
if(string.startsWith("
http:// ")){
try{
URL url = new URL(string);
URLConnection urlConnection;
urlConnection = url.openConnection();
urlConnection.connect();
in = new BufferedReader(
new InputStreamReader(
urlConnection.getInputStream(),encoding));
}
catch(MalformedURLException e){
System.err.println("Wrong URL.");
}
catch(IOException e){
System.err.println("Cannot open connection.");
}
}
else{ try { in = new BufferedReader( new InputStreamReader( new FileInputStream(string), encoding)); } catch (IOException e) { System.err.println("ファイルが開けません: " + string); System.exit(1); } } } public void print() { try { String line; int count = 0; while(true) { line = in.readLine(); count++; if (line == null) break; System.out.println(count + ": " + line); } } catch (IOException e) { System.err.println("ファイルの読み込み途中でエラーが発生しました。"); }
try { in.close(); } catch (IOException e) { System.err.println("ファイルを閉じるときにエラーが発生しました。"); } } public static void main(String args[]) { TextViewer viewer = new TextViewer(args[0], "JISAutoDetect"); viewer.print(); } }
>> URL viewer = new URL(args[0], "JISAutoDetect"); スマソ 訂正
初めて書き込みさせていただきます。 学校の課題でボタンを押したら文字を表示という風にしたいのですが、さっぱり分かりません… しかも課題の提出期限が今週の火曜日なのです・・・ 以下(下の書き込み)のソースを利用しろとのことです。 背景の色を変える処理を文字を変える処理にするんだとおもいますが、 drawStringをどう利用して良いのか分かりません。 どなたかお願いします。
import java.awt.*; import java.awt.event.*; public class Rei24 extends Frame { public Rei24 () { setSize(300,200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
setLayout(new FlowLayout()); Button b1=new Button("青"); add(b1); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ setBackground(Color.blue); repaint(); } }); Button b2=new Button("黄"); add(b2); b2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ setBackground(Color.yellow); repaint(); } }); } public static void main(String[] args){ Frame w=new Rei24(); w.show(); } }
一つだけ書き忘れました。 表示させる文字は青のボタンを押したときは「あお」、黄のボタンを押したときは「き」です。 それではよろしくお願いします。
ageとsageを掛けたり割ったりするにはどうすればいいのですか? double age(double a1, double a2){ return 0.5*a1 + a2; } と double sage(double b1, double b2, double b3){ return -7*b1 + 8*b2 + b3; }
>>949 戻り値を掛けたり割ったりすればいいじゃない
951 :
デフォルトの名無しさん :04/10/04 10:48:21
配列num に格納された値のうち 「7 以上」の値を全て表示する プログラムを教えてください。 public static void main(String argv[]){ int num[] = {2,11,23,5,6,7}; num.length を使うらしいのですがわかりません。
952 :
デフォルトの名無しさん :04/10/04 10:55:21
>>951 int num[] = {2,11,23,5,6,7};
for(int i=0; i<num.length; ++i) {
if(num[i]>=7) System.out.println(num[i]);
}
953 :
951 :04/10/04 11:00:15
>>949 double x = age(a1, a2);
double y = sage(b1, b2, b3);
double kakezan = x*y; //age(a1, a2) * sage(b1, b2, b3) でもいい
double warizan = x/y; //age(a1, a2) / sage(b1, b2, b3) でもいい
956 :
955 :04/10/04 11:26:53
class Rei24 extends Frame { private String text; Rei24 () { setSize(300,200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setLayout(new FlowLayout()); Button b1=new Button("青"); add(b1); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ text="あお"; setBackground(Color.blue); repaint(); } }); Button b2=new Button("黄"); add(b2); b2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ text="き"; setBackground(Color.yellow); repaint(); } }); } public void paint(Graphics g) { super.paint(g); if(text==null) return; g.setFont(new Font("Dialog", Font.BOLD, 30)); int x=(getWidth()-g.getFontMetrics().stringWidth(text))/2; int y=(getHeight()-g.getFontMetrics().getHeight())/2 + g.getFontMetrics().getAscent(); g.drawString(text, x,y); } }
>>945 コンストラクタ中のsetLayout(...);のすぐうしろに
Label label = new Label();
add(label);
を追加して、さらにb1とb2のsetBackground(...);のかわりに
label.setText("xxx");
と書く。「xxx」は「あお」とか「き」とか表示したい文字。
>>955 わざと難しいこと教えて混乱させるなってw
959 :
デフォルトの名無しさん :04/10/04 11:40:49
>>958 おお、以前の難しい&シフト論争の人か。何故ワタクシだと分かったんだ?
君は千里眼か?
しかし難しい事っつーよりも、
>>955 の方が明らかに問題の趣旨に
沿ってるだろ。キーポイントはdrawString()を使うのと、あと
setBackground()は、この出題者の意図からすれば外しちゃダメだ。
>>955 を実行してみれば、こっちの方が点数が高いのは分かるはず。
それ以前に君のやり方だと、ボタンの左側に小さく文字が出るだけで
明らかに手抜きで、確実に点数は低いな。
960 :
デフォルトの名無しさん :04/10/04 12:36:20
String aaa_w = "00"; while(rs.next()) { String aaa_o = rs.getString("データベース項目"); if ( aaa_o != aaa_w ) このようなソースで aaa_w, aaa_oが同値であるにもかかわらず、if文の != 内に 処理が入ってしまうのはどこに原因が???
961 :
デフォルトの名無しさん :04/10/04 12:57:02
以下の実行結果になるように○を埋めてください。 ↓ public class Bubble { public static void main(String[] args) { // 変数宣言 int[] a = {8, 45, 15, 90, 62, 73, 22}; // バブルソートするデータ int t,i,j; // データを降順でバブルソート for (i = 0; j < a.length-1; i++) { for(○){ if(a[j] > a[j-1]){ t = a[j]; ○ = ○; a[j-1] = t; } } } // 結果を標準出力へ出力 for(i = 0; i < a.length; i++) { System.out.print(○); } } } <実行結果> > java Bubble 90 73 62 45 22 15 8
>>960 文字列としては同じだが、インスタンスとしては別物だから。
963 :
960 :04/10/04 14:40:11
>>962 ありがと、解決したよ。 !aaa_w.equals(aaa_o) とすればよかったんだねえ。
964 :
デフォルトの名無しさん :04/10/04 15:25:09
>>961 public class Bubble {
public static void main(String[] args) {
// 変数宣言
int[] a = {8, 45, 15, 90, 62, 73, 22}; // バブルソートするデータ
int t,i,j;
// データを降順でバブルソート
for (i = 0; i < a.length-1; i++) { //←ここが一文字間違ってる。jをiに訂正
for(int j = a.length-1; j > i; j--){
if(a[j] > a[j-1]){
t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
// 結果を標準出力へ出力
for(i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
}
}
>>955 氏
レスありがとうございます。
わざわざ難しい(のかどうか分からないですが)プログラムを書いてもらって非常に申し訳ないのですが、実際にコンパイルしてみるとエラーメッセーがどわぁっと…
自分ではどうやっても直せそうにないので、お気持ちだけということで。
どうもありがとうございました。
>>957 氏
レスありがとうございます。
書いてある通りに変更してコンパイルしてみたのですが、以下のエラーが出てしまいました。
JAVAの基本も分かっていないので正直このエラーメッセージの指すことが良く分からないです…OTL
「l」が小文字だからいけないのかな?と思って大文字にしてもまた別のエラーメッセージが出るので自分の手には負えないみたいです…
Rei24.java:20: ローカル変数 label は内部クラスからアクセスされます。final で宣言される必要があります。
label.setText("あお");
^
(黄色の場合も同様)
よろしければ、引き続きアドバイスお願いします!
966 :
955 :04/10/04 19:38:15
>>965 うう、なるほど。
一部抜粋という形で書いたのですが。。。
では、下に「完全版」のコードを書きますので、これを全てコピペして
コンパイルしてください。必ず動きますので。
>>955 氏=959氏?
すみません、959の方を読み飛ばしてしまいました。
問題の趣旨としましては、目的を達成すればいいので得点はあまり関係なさそうなんです。
ですので、setBackground()は外しても問題なさそうです。
drawString()を使って〜、と書いたのは文字を表示する方法をそれぐらいしか知らなかったので…
自分の説明不足でした。どうも申し訳ありませんでした。
968 :
945のプログラム その1 :04/10/04 19:39:35
package untitled56; import java.awt.*; import java.awt.event.*; public class Rei24 extends Frame { private String text; public static void main(String[] args){ Frame w=new Rei24(); w.show(); } Rei24 () { setSize(300,200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setLayout(new FlowLayout()); Button b1=new Button("青"); add(b1); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ text="あお"; setBackground(Color.blue); repaint(); } }); Button b2=new Button("黄"); add(b2); b2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ text="き"; setBackground(Color.yellow); repaint(); } }); }
969 :
945のプログラム その2 :04/10/04 19:40:08
public void paint(Graphics g) { super.paint(g); if(text==null) return; g.setFont(new Font("Dialog", Font.BOLD, 30)); int x=(getWidth()-g.getFontMetrics().stringWidth(text))/2; int y=(getHeight()-g.getFontMetrics().getHeight())/2 + g.getFontMetrics().getAscent(); g.drawString(text, x,y); } }
正直フォントメトリクスとか使うのはアレだと思う
>>965 メソッドの外側に
Label label;
と書いて、Label label = new Label();を
label = new Label();
に変更してください。
FontMetricsなんかいつもばりばり使ってますが何か。
>>945 import java.awt.*;
import java.awt.event.*;
public class Rei24 extends Frame {
Label label;
public Rei24() {
setSize(300, 200);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setLayout(null);
//ラベルを作って --> フレームに貼って --> 大きさを整えて --> 文字を中央に揃えて
// --> 文字の大きさを整える
label = new Label("('A`)");
add(label);
label.setBounds(10, 100, 280, 50);
label.setAlignment(Label.CENTER);
label.setFont(new Font("Dialog", Font.BOLD, 30));
//ボタンを作って --> フレームに貼って --> 大きさを整えて --> 動作を定義 Button b1 = new Button("青"); add(b1); b1.setBounds(10, 160, 130, 20); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { label.setText("BLUE!"); } }); //ボタンを作って --> フレームに貼って --> 大きさを整えて --> 動作を定義 Button b2 = new Button("黄"); add(b2); b2.setBounds(160, 160, 130, 20); b2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { label.setText("YELLOW!"); } }); } public static void main(String[] args) { Frame w = new Rei24(); w.show(); } }
たぶんこの宿題はボタンとかイベントとかの練習だろうね。 いきなり paint(Graphics g) とか getFontMetrics() とか高度なことすると いかにも人に書かせました臭がプンプンするのでやめたほうが・・・。
>>955 氏
見事に動きました!ただ、やはり言われているように自分のレベルでこれを提出すると講師に色々と言われそうなので…
お手数かけました。もっと深くJavaを使うようになったらまたよろしくお願いします。
どうもありがとうございました。
>>973 氏
レスどうもありがとうございます。
沢山の方からレスを頂いて非常に嬉しい限りです。
今まで頂いたレスの中で氏のものが一番分かりやすかったので(といっても理解はしていないが)それを使わせてもらうことにしました。
どうもありがとうございました。
このスレの住民の皆様、お世話になりました。
また機会があればよろしくお願いします。
>沢山の方からレスを頂いて非常に嬉しい限りです。 じつは2人という罠w バグだらけのアドバイスしちゃってごめん。 はじめから動作確認してから書き込めばよかった。
978 :
デフォルトの名無しさん :04/10/04 22:59:05
あまり関係ない話だけどさ J2SE5.0を導入したらEclipse3.0でプログラムが実行できなくなりました。 解決方法を教えてください
β版だしね
981 :
961 :04/10/04 23:29:50
982 :
デフォルトの名無しさん :04/10/05 00:57:20
5と入力すると * * * * * * * * こういうの出力するには どうしたらいいんですか?
>>982 おいおい....条件くらい書いてくれよ。
そんな感じのものが表示できればなんでもいいのか?
それとも「5」と入力したら最初と最後だけはアスタリスクが一つ、
それ以外は二つってことなのか?
訊くんなら、答えが得られるように訊けよ。
ぬるぽ
>>983 教本に必ず載ってるので書かなくてもわかると思うが・・・
>>982 って微妙じゃないか?
ピラミッド型になる問題はよくみるけど…
987 :
デフォルトの名無しさん :04/10/05 10:08:06
>>985 Cでそんな問題みたことあるけど、俺が見たのは5と入力すると
*
**
***
****
*****
と表示されるやつだった。5段の半三角ね。
よって、
>>983 は一般的ではない希ガス。
つか、普通に条件を明記したらええんちゃう?
>>980 もうβ取れてるけど・・・。
まあ実質まだβ版なわけだが。
991 :
デフォルトの名無しさん :04/10/05 11:06:02
Java初心者スレに行ったらこっちに行けと言われたので移動しました。 Javaの勉強をはじめて1週間↓の超初心者です。SoftBank社の「やさしいJava第2版」のLesson6練習問題の 2の答えを教えてください…ヒントでもいいです… ちなみに「キーボードからテストの点数を入力させ、その合計点を出力するコードを記述せよ」という問題です。 最後の答えを出力させる場合に0を入力しろ。ということでした。 import java.io.*; class Rensyu2 { public static void main(String args[]) throws IOException { System.out.println("テストの点数を入力してください(0で終了)"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); do{ String nyuryoku = br.readLine(); res = Integer.parseInt(nyuryoku); for(goukei = 1; goukei <= res; goukei++) goukei += res; }while(res > 0); if(res == 0){ System.out.println("テストの合計点は" + goukei + "点です"); } }} 自分でも「明らかに違う」と思うのですけどどこをどう直したらいいのかわかりません… 繰り返しと、入力した数値を合計する方法がわからないです…お願いします。
>>991 まず合計点数goukeiの宣言と、何もせずにそれを出力する文を作ろう。
その宣言と出力の間に入力部分を作ろう。ここは
>>991 のソースから転用でOK。
ただし、do文の中のfor文及びその中身はいらないので削除しておこう。
resは入力された点数なので、それをgoukeiに足す文をresを取得した文のあとに追加しよう。
あとはマイナスの時はエラーを表示して合計しないとか、0以外の場合はdo文を出ないようにするとかすればいいんでないかな。
993 :
デフォルトの名無しさん :04/10/05 11:34:48
>992 ありがとうございます。 それと更にすみませんが、 do{ String nyuryoku = br.readLine(); int res = Integer.parseInt(nyuryoku); }while(res > 0); の部分の }while(res > 0); なのですが、ここでいつも「シンボルを解決できません」と出ます… でも、0と入力されたら終了するプログラムなのでこう入力するんじゃないのでしょうか?
>>993 resがdo文の{}の中で宣言されてるのに、その外(whileはdo文の{}の外にある)で使用されてるのでシンボルが解決できないとエラーが出る。
あと、それだと0以外のマイナス値でも終了してしまうので変更すべし。
>994 ありがとうございます!あとは何とか 自分でがんばってみようと思います!!
996 :
デフォルトの名無しさん :04/10/05 15:12:49
まちがえた。 5とユーザが入力すると ひし形になるやつです。 つまり はじめに >数値を入力してください。 と出力して >5 と入力すると。 □□*□□ □*□*□ *□□□* □*□*□ □□*□□ (□は空白すぺースです。) と出力する。 どうかよろしくお願いします。
997
998
999?
1000ゲッツ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。