2getしたらJava壊滅
次スレがなかったから立てたのに。酷い話だよ。
5 :
古代帝國富士皇朝総帥・伯壬旭:04/10/05 20:08:47
なんだ、このふざけたタイトルは!!
これじゃ何のスレなのか分からないではないか!
ネタスレに間違えられて、質問者の多くが宿題スレと気付かない恐れもある。
世界帝国神聖皇帝ならびに宇宙神ザインの名のもとに命ずる。
即刻立て直せ。
タイトルは「JAVAの宿題はここで答えます」だ。
さもないと、この1を霊斬し、魂を消滅させる。
くだらない宿題でもいいんですか?
宿題やってほしいんですがいいですか?
9 :
デフォルトの名無しさん:04/10/05 20:30:01
どうか、これをお願いします。
5とユーザが入力すると
ひし形になるやつです。
つまり
はじめに
>数値を入力してください。
と出力して
>5
と入力すると。
□□*□□
□*□*□
*□□□*
□*□*□
□□*□□
(□は空白すぺースです。)
と出力する。
どうかよろしくお願いします。
11 :
デフォルトの名無しさん:04/10/05 20:45:51
12 :
M.B.:04/10/05 21:08:56
>>9 すみません。
□□*
□*□*
*□□□*
□*□*
□□*
じゃいけませんか?
13 :
デフォルトの名無しさん:04/10/05 21:16:47
>>12 それです。
ちょっと分りやすく書きました。
それでOKです。
Date型のオブジェクトdに対して、
d.after(n);としたときにdのn日後の日付を持ったDate型のオブジェクトを返すインスタンスメソッドを
Dateクラスに付け加えよ。
ただし、nは30以下とし、30以下でなかったらエラーメッセージをプリントするようにせよ。
また、d自身の日付は変わらないものとする。
(d自身の日付を変更し値は返さないメソッド(void型)、
d自身の日付を変更してからそれ自身を返すメソッドなども考えてみよ)
↑こんな宿題が出ました。
ご教授お願いします。
ちなみに分野は「アクセス制御 と コンストラクタの多重化」です。
もうサッパリですorz
// Date クラスの宣言.
public class Date {
private int month; // 1-12
private int day; // 1-31 based on month
private int year; // any year
// コンストラクタ.
public Date( int mn, int dy, int yr )
{
if ( mn > 0 && mn <= 12 ) // 月の妥当性チェック
month = mn;
else {
month = 1;
System.out.println( "Month " + mn +
" invalid. Set to month 1." );
}
year = yr; // 年の妥当性チェックも可能だが
day = checkDay( dy ); // 日の妥当性チェック
System.out.println(
"Date object constructor for date " + toString() );
}
//日の妥当性チェックのメソッド。他のクラスからは使えない。
private int checkDay( int testDay )
{
int daysPerMonth[] = { 0, 31, 28, 31, 30,
31, 30, 31, 31, 30,
31, 30, 31 };
if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
return testDay;
if ( month == 2 && // 2月: うるう年のチェック
testDay == 29 &&
( year % 400 == 0 ||
( year % 4 == 0 && year % 100 != 0 ) ) )
return testDay;
System.out.println( "Day " + testDay +
" invalid. Set to day 1." );
return 1; // leave object in consistent state
}
// month/day/yearの形のStringを返すメソッド
public String toString()
{ return month + "/" + day + "/" + year; }
}
17 :
デフォルトの名無しさん:04/10/05 22:30:39
では、宿題を出します。
↓
18 :
デフォルトの名無しさん:04/10/05 23:13:00
>>1 スレタイが短すぎます。さっさと立て直してこい!!
>>9 もっとまともにできると思うんだけど、とりあえず、、、、。
import java.io.*;
class Lesson {
public static void main(String args[]) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (execute(in));
}
public static boolean execute(BufferedReader in) {
try {
System.out.print("数値を入力してください。(終了はq): ");
String input = in.readLine();
if (input.equals("q")) return false;
int num = new Integer(input).intValue();
int a = num / 2; int b = num % 2;
int ix1 = a; int ix2 = num - (a + b);
if (b == 0) { ix1--; }
for (; ix2 < num; ix1--, ix2++) printLine(num, ix1, ix2);
ix1 = 0; ix2 = num - 1;
if (b == 1) { ix1++; ix2--; } else { a--; }
for (; ix1 <= a; ix1++, ix2--) printLine(num, ix1, ix2);
return true;
} catch (Exception ex) {
System.out.println("無効な入力値です。"); return true;
}
}
static private void printLine(int n, int ix1, int ix2) {
for (int i = 0; i < n; i++) { if (i == ix1 || i == ix2) System.out.print("*"); else System.out.print(" "); }
System.out.print("¥n");
}
}
20 :
デフォルトの名無しさん:04/10/05 23:31:10
>>14 public final class MyDate extends Date {
// n日後の日付を返す。
public Date after(int n){
if(n > 30){
System.err.println("エラーメッセージ");
}
// 足し算
Calendar cal = Calendar.getInstance();
cal.setTime(this);
cal.add(Calendar.DATE, n);
return cal.getTime();
}
// n日進める。
public void add(int n){
setTime(after(n).getTime());
}
// n日進めて返す。
public Date append(int n){
add(n);
return this;
}
}
アクセス制御 と コンストラクタの多重化に全く絡まない答えで申し訳ないけど
21 :
デフォルトの名無しさん:04/10/05 23:34:44
>>15-16のDateクラスにメソッド付け加えろっていう問題だったのか... スマソ
22 :
デフォルトの名無しさん:04/10/05 23:39:21
>>19 ありがとうございます。
僕ももっといろいろ
考えてみます。
23 :
デフォルトの名無しさん:04/10/06 00:13:19
>>9 蛇足だけど、違うやり方をひとつ。入力のところは省略
int n = 999; // ←入力してもらった数字が入る
boolean[][] canvas = new boolean[n][n];
int k = n % 2;
if(n == 1){
System.out.println("●");
return;
}
for(int i=0;i<n/2;i++){
int x = i, y = n/2-i-1;
canvas[y][x+k] = true;
canvas[y+k][n-1-x] = true;
canvas[n-1-y-k][x] = true;
canvas[n-1-y][n-1-x-k] = true;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(canvas[i][j] ? "●" : "□");
}
System.out.println();
}
四角形を四つ切りにして、そのうちの一枚に対角線を引いて、それをコピーするような感じ
24 :
デフォルトの名無しさん:04/10/06 01:52:20
>>23 おおコレわかりやすい。
恩に着ます。
ありがとうございます。
25 :
デフォルトの名無しさん:04/10/06 13:17:46
どうか
この問題↓をよろしくお願いします。
問題
[数字を入力して計算する]
条件
@ 40文字以内で入力40字を越えたらエラー表示を出す。
A 小数点以下の計算はしない。
入力例
80X5+2=
出力例
402
二分木と逆ポーランド記法の練習ですね。
つまり二分木とドンラーポ記法の練習か
>>20 ありがとうございました。
できればどなたかDateクラスにメソッド付け加えた答えをお願いします。
29 :
デフォルトの名無しさん:04/10/06 15:28:51
質問です。お恥ずかしいのですが…
・nまでの整数の中から、素数を拾い出して表示するプログラムを作れ。
(n=100とする)
エラトステネスのふるいでおググりなさい。
31 :
その1:04/10/06 16:30:09
>>29 //Nまでの整数の中から素数を拾い出して表示するプログラム。
public class MyClass1 {
public static final int N = 100;
public static void main(String[] args) {
int[] primes = new int[N]; //判明した素数のリスト
int numberOfPrimes = 1; //判明した素数の数
int candidate = 1; //素数の候補
//単純に3以上のすべての奇数に対して素数であるかテスト。
primes[0] = 2;
for (int i = 0; i < N; i++) {
candidate += 2;
boolean isPrime = true;
//候補が判明しているすべての素数で割り切れないなら、その候補は素数。
for (int j = 0; j < numberOfPrimes; j++) {
if (candidate % primes[j] == 0) {
isPrime = false;
break;
}
}
32 :
その2:04/10/06 16:30:31
//素数だと判明した候補をリストに追加。
if (isPrime) {
primes[numberOfPrimes] = candidate;
numberOfPrimes++;
}
}
//判明した素数を表示。
for (int i = 0; i < numberOfPrimes; i++) {
System.out.print(primes[i]+" ");
}
System.out.println();
}
}
public static void prime(int N) {
boolean prime[] = new boolean[N + 1];
for (int i = 2; i <= N; i++) { prime[i] = true; }
for (int i = 2; i <= N; i++) { if (prime[i]) { for (int j = 2; i * j <= N; j++) { prime[i * j] = false; } } }
for (int i = 2; i <= N; i++) { if (prime[i]) { System.out.print(i + " "); } }
System.out.print("\n");
}
わかりにくー
35 :
デフォルトの名無しさん:04/10/06 17:41:17
>>9 適当にアルゴリズムだけ
しかも Perl で w
$i=$ARGV[0];
for($a=0;$a<=$i;$a++){
for($s=0;$s<=$i;$s++){
$a[$a][$s]=' ';
if($a==$s or ($a+$s)==$i){$a[$a][$s]='Q';}
}}
for($a=$i/2;$a>=0;$a--){
for($s=0;$s<=$i;$s++){
print"$a[$a][$s]"; }
print"\n"; }
for($a=0;$a<=$i/2;$a++){
for($s=0;$s<=$i;$s++){
print"$a[$a][$s]"; }
print"\n"; }
>>19 これ重すぎ、、
真面目に JAVA で書くの めんどっちかったのな
38 :
デフォルトの名無しさん:04/10/06 18:44:47
>36
ばーか
>>37 ループの終了条件とStringBufferを使うだけで劇的に改善するよな。
40 :
デフォルトの名無しさん:04/10/06 21:38:06
>>1 スレタイださすぎ。0点
----------------------終了----------------------
www.smg.co.jp/seminar/java/J_lecture09-02.html
ここのサイトを見ながら勉強していたのですが、
この例題が実行できません。
無知な私には何が違うのかわかりません…お願いします…
42 :
デフォルトの名無しさん:04/10/07 12:02:46
すいませんage忘れ…
43 :
デフォルトの名無しさん:04/10/07 12:27:08
44 :
デフォルトの名無しさん:04/10/07 12:27:36
何がどう駄目なのかを書いてください。
>43
それをやってもダメでした。
>44
以下、エラー内容です
piggyBank.java:8: メソッド本体がないか、abstract として宣言されています。
void putCoin(int money); //3
^
piggyBank.java:10: シンボルを解決できません。
シンボル: 変数 money
場所 : PiggyBank の クラス
totalMoney = totalMoney + money; //4
^
piggyBank.java:10: 互換性のない型
検出値 : java.lang.String
期待値 : int
totalMoney = totalMoney + money; //4
^
piggyBank.java:11: シンボルを解決できません。
シンボル: 変数 money
場所 : PiggyBank の クラス
System.out.println("貯金箱に" + money + "円をいれました");
>>45 8行目にあるセミコロンはなんだよ?
コピペすらまともにできねーのかよ。
>>46 ああ失礼と言いたいところだが、本文の方が間違ってたんだから
仕方ないだろ。
大体、なんだよ、その言い方は。
ったく世間じゃよくJAVA厨なんて言われるけど、本当に常識知らずの
香具師が多いな。
お前面白いな。
絵に描いたような逆切れですね
こんな最低限の知識すらないのに宿題だけ出してどうするの?
どうせテストで現実を思い知らされるだけだよ?
51 :
デフォルトの名無しさん:04/10/07 22:47:34
>>47 あのな、宿題スレだからといってやさしく教えてくれるとは限らんぞ。
そもそも自分の宿題を「たのむやってくれ」ってスレで、相手に紳士的な対応を頼むおまえは
何様だ? すみませんメソッド宣言にセミコロンがついててもおかしいとも思わずそのまま
入力しちゃいました、と謝ったっていいくらいだ。
さっぱりわからんで宿題やってほしいなら、罵られようがバカにされようが利用してやる、
くらいの心意気でこい。
クイックソートでdoSortの内容がこの宿題の形式にあうように書けません。
このプログラム完成させてもらえませんか?
お願いします。
public QuickSortAlgorithm() {
}
public static void main(String[] args) {
int[] array = new int[ELEMENT_NUMBER];
QuickSortAlgorithm quickSort = new QuickSortAlgorithm();
array = quickSort.makeRandomInteger(ELEMENT_NUMBER, MAX_NUMBER);
quickSort.doPrint(array);
quickSort.doSort(array, 0, array.length - 1);
quickSort.doPrint(array);
}
public void doSort(int[] array, int left, int right) {
int pivot;
if ( doSortの終了する条件 ) {
return;
} else {
// doSortがすべき処理を書く
pivot = array[ right ];// 一番右端をpivotに設定する
つづき
// pivotより小さい場合左からサーチを続ける
while (array[leftNumber] < pivot) {
leftNumber++;
}
// pivotより大きい場合右からサーチを続ける
while (pivot < array[rightNumber]) {
rightNumber--;
}
// 入れ替えの処理
// doSortのすべき処理として、このサーチと入れ替え作業をいつまで繰り返せばいいのかを考える
doPrint(array);// これを記述すると現在のソート状況がわかる
doSort( array, ????????, ???????? );
doSort( array, ????????, ???????? );
}
}
public void doPrint(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println("");
}
public int[] makeRandomInteger(int number, int max) {
int[] array = new int[number];
for (int i = 0; i < number; i++) {
array[i] = (int)(max * Math.random());
}
return array;
}
}
55 :
デフォルトの名無しさん:04/10/08 00:24:50
56 :
クイックソート:04/10/08 11:20:45
public void doSort(int[] array, int left, int right) {
int pivot;
if ( left==right/*doSortの終了する条件*/ ) {
return;
} else {
// doSortがすべき処理を書く
int leftNumber=left;
int rightNumber=right-1;
pivot = array[ right ];// 一番右端をpivotに設定する
// pivotより小さい場合左からサーチを続ける
while (array[leftNumber] < pivot) {
leftNumber++;
}
// pivotより大きい場合右からサーチを続ける
//問題の↓下の行がおかしいので ”&& left<rightNumber”の一文を追加
while (pivot < array[rightNumber] && left<rightNumber) {
rightNumber--;
}
// 入れ替えの処理
// doSortのすべき処理として、このサーチと入れ替え作業をいつまで繰り返せばいいのかを考える
array[right]=array[leftNumber];
array[leftNumber]=pivot;
doPrint(array);// これを記述すると現在のソート状況がわかる
doSort( array, left, rightNumber );
doSort( array, rightNumber+1, right );
}
}
57 :
>>53への回答 クイックソート:04/10/08 11:23:53
>>53 上に回答を書きましたが、この問題文のコードのクイックソートの
やり方は、ちょっと効率が悪いように思います。
それを穴埋めさせるとは、何と言いますか。。。
58 :
デフォルトの名無しさん:04/10/08 11:34:53
>>52 何だよ、その屁理屈は?
大体、「できねーのかよ」なんて言い草は、優しく教えるだとか
紳士的な対応以前の、あまりに非常識な礼儀知らずの言動じゃないか。
そっちこそ何様だよ。それに何で問題文の方が間違ってたのに
この自分が謝罪しなきゃならないんだよ。どう考えてもおかしいだろが。
罵られようが来いなんてのは、アンタだけの理屈じゃないか。
勝手に押し付けるな。世間じゃJAVA厨なんて言葉があるが、そうやって
JAVAを貶めてるのは自分だって事に気付くべきじゃないのか?
JAVA以前に礼儀を学ぶべきだね。
>>57 大変有難う御座います。
とても感謝してます。
形に当てはめられるとやりずらいですね。
自分でも調べては見たんですが、
やはりもっとスマートプログラムばかりでした。
こんどはリファクタリングしろとかいう宿題がでるのかな?
60 :
デフォルトの名無しさん:04/10/08 12:55:03
public class Search {
public static void main(String[] args) {
// 変数宣言
int[] menber_id = {5289,3328,2576,4981,8341,3496,6755}; // 会員番号データの定義
int comp = Integer.parseInt(args[0]);
boolean flg=true;
int i = 0;
// 会員番号の検索
while (i != menber_id.length-1){
if (menber_id[i] == comp){
System.out.println((i+1) + "番目の会員:" + menber_id[i]);
flg = false;
break;
}
i++;
}
// エラーメッセージの表示
if (flg) {
System.out.println("指定された会員番号はありません");
}
}
}
52じゃないが、
>>58 普通に本読んでれば、変なセミコロンくらい気づくと思うが
コンパイラが「そこがおかしい」って言ってるんだから、
一歩立ち止まって考えろ
自分で考えられないなら、プログラミングなんてできねーぞ
一生コピペ元に責任押し付けて、コンパイルできないってわめいてたいのか?
62 :
dotkansai:04/10/08 15:38:36
質問です。
javaのfor文の例で以下のように一部だけ掲載されていたのですが、
これを軽く説明していただけませんでしょうか?
for(Node n = listHead; n = null ; n = n.nextNode( ))
process(n);
です。よろしくお願いします。
>>62 そのfor文間違ってるな。
n=nullじゃ条件式になってないし。
64 :
デフォルトの名無しさん:04/10/08 16:17:57
>>62 for文の第2引数は、n == null だと思いますが、
初めのlistHeadがnullだった場合にループを開始して、process(n)メソッド内で
nにNode型オブジェクトを代入して、n.NextNode()でnの子Nodeを取得して
それがnull、つまり子Nodeが存在しなかったら、またprocess(n)を呼び出して
nに新しいNode型オブジェクトを代入する、の繰り返しでしょう。
つまり最初の指定Nodeである、ListHeadが無効だったら、
外のツリーリストの頭ノードを、precessメソッドで見つけてきて
その頭ノードが一つも子ノードを所持していなかったら、またprocessメソッドで
外の頭ノードを見つけてくる。1個以上の子ノードを持つ頭ノードが
見つかったらループを終了して、次の処理に行くとそんな感じだと思います。
ああ、あとNode nはforブロックで消滅してしまいますので
おそらくprocessメソッド内で引数として渡されたnにNodeオブジェクトを
代入すると同時に、listHeadにも同じNodeオブジェクトを代入してると
思います。
つまり、このfor文の目的は、listHeadが無効=nullだった場合に
他のツリーリストの1個以上の子ノードを所持する頭ノードを
processメソッドで見つけてきて、それをlistHeadに代入させる事
だと思います。
66 :
M.B.:04/10/08 16:46:17
>>65 ポインタをたぐりながらnullが来るまでprocess()を繰り返すCプログラムを、
Javaに移植しようとして失敗しているように思われ。
元はたぶんこんな感じ(listHeadが構造体へのポインタ。nextNodeは要素)。
for(n = listHead;n = n.nextNode;) process(n);
while文を使ったほうが綺麗になるのとちゃうん?
67 :
M.B.:04/10/08 16:53:06
つまりはこういうことではないだろうかないだろうかないだろうか。
Node node = listHead;
while (node != null) {
process(node);
node = node.nextNode();
}
68 :
M.B.:04/10/08 17:07:29
>>65 > おそらくprocessメソッド内で引数として渡されたnにNodeオブジェクトを
代入する
そういう方法があるんなら教えてくれ。
swap(x, y)とかいうメソッドが書けそうに思うので。
69 :
デフォルトの名無しさん:04/10/08 19:07:27
>>68 64の文章で1行目の後に
「おそらくprocess(n)は、process(new Node[]{n})だと思いますが」
の一文を加えるのを忘れてた。
70 :
64の訂正:04/10/08 19:10:17
>>62 おそらくprocess(n)は正しくは、process(new Node[]{n})で
for文の第2引数は、n == null だと思いますが、
初めのlistHeadがnullだった場合にループを開始して、process(n)メソッド内で
nにNode型オブジェクトを代入して、n.NextNode()でnの子Nodeを取得して
それがnull、つまり子Nodeが存在しなかったら、またprocess(n)を呼び出して
nに新しいNode型オブジェクトを代入する、の繰り返しでしょう。
71 :
デフォルトの名無しさん:04/10/08 19:29:06
72 :
M.B.:04/10/08 22:13:48
>>62 「これを軽く説明していただけませんでしょうか?」つーのがよくわからん。
「ザッと教えていただけないでしょうか?」つーのもどっかにあったが、
その時も前提条件が部分的にしか提示されてなくて、背景をあれこれ想像しながら
レスを書いた覚えがある(「どうだ解るまい」みたいな挑戦的な臭いがしたので、
ついムキになった)。
こういう言い回し(つーか下手に出ながら相手の力量を試すような
挑戦的な態度)は最近の流行りなのか?
教科書のような至れり尽くせりの説明でなくていいから教えてくれってことじゃん
それよりおれは
「なにぶん初心者ですので」
「まだ基本もわかっていませんが」
みたいな自分の努力不足を言い訳にするセリフとか、
「どなたかご回答願います」
みたいな暗にさっさと答えろヴォケと言いたげなセリフがムカつく。
75 :
デフォルトの名無しさん:04/10/09 00:35:26
>>74 努力不足っつーのは、無茶苦茶だ。
はじめたばかりじゃ努力のしようがないからな。
代弁者乙。
77 :
M.B.:04/10/09 09:27:55
> 努力不足っつーのは、無茶苦茶だ。
> はじめたばかりじゃ努力のしようがないからな。
事前に問題文のキーワードを元にググるくらいの努力はしろっつーか、
コンパイルエラーの原因を考えるくらいの努力はしろっつーか、
"Hello world!"くらい動かしておけとか、
その程度の意味だろ。
「クラスライブラリのソースは全部読め」とか、
「オブジェクトの意味が分かるまで山に篭って滝に打たれろ」とか、
そういうのまで要求はせん。
努力したくないからこのスレに来てんだよ
なんか文句あるかコノヤロー
79 :
M.B.:04/10/09 10:56:58
>>78 べつに文句はないが、
適切な回答が得られる努力と、
ネタにされて馬鹿を見るのを避ける努力は、
したほうがいいと思うぞ。
というか、わざわざ人を不快にさせる努力はしなくていいと思うぞ。
最近発見した
2chのプログラム関係板で質問するとき、頭低いとなぜか余計に叩かれる。
質問がわかりにくいとかは実は2の次。
>>81 目の付け所がいいな。確かにそうだ。
プログラミングマニアの本質が分かるってもんだな。
つまり、礼儀正しい人には尊大に接し、強そうな香具師には
卑屈に振舞う、現実世界そのままの卑劣な姿がここネット内の
書き込みだと余計に出てしまうんだろうな。情けないね。
普通は逆なんだがな。礼儀には礼儀で接し、強そうなのにはこっちも
横暴に接する。しかしここのプログラミングマニアときたら
強きにへつらい弱気をいじめる、人間として最低の事をしてる。
んなだから世の中から蔑まれるんだよ。
そういうのを卑怯の極みっていうんだよ。
83 :
デフォルトの名無しさん:04/10/09 19:19:18
import java.util.Date;
import java.text.DateFormat;
のみで
現在の年、月、日
のみを取得したいのですがどうすればいいでしょうか?
年、月、日、00:00でもいいですが
コマンドラインからYYYY/MM/DDを取得して現在の年月日と比較するプログラムなのですが
Date now = new Date();
だと時間も取得してしまって比較になりません。
DataFormat format = new SimpleDateFormat("yyyy/MM/dd");
String today = format(new Date());
条件を同じくしたからあとはできるだろ?
format.format(new Date());だった、、、
86 :
デフォルトの名無しさん:04/10/09 21:20:37
空白埋める問題なので一行でお願いいたします。
Date now = 【ここを埋める】 ;
87 :
M.B.:04/10/09 21:33:50
>>81 >>82 単に、「腰の低い香具師に限って『説明の切り口』とかいった説明する側の都合を考えてない」だけの話だと思われ。
「考えるだけ考えたがここがどうしても分からん。漏れの知りたいのはこれだ!」というのを示せば、ポイントを突いた回答が返ってくるなり。
そろそろ釣りはスルーしないか
89 :
M.B.:04/10/09 22:26:07
禿同
90 :
デフォルトの名無しさん:04/10/09 23:41:27
JAVAにポーインターみたいな物って
あるんですか?
Stringクラス
やたら便利なキーワードだと思ってたよ
( ´_ゝ`)フーン
>>86 Calendar.getInstance().getTime();
というかちょっと前の発言くらい読め....
93 :
83=86です:04/10/10 01:34:52
>>92 うーんわかりにくいかったかな
import java.util.Date;
import java.text.DateFormat;
で一行で書きたいんですが
>>93 比較の部分ってどうなってるの?
日付だけを比較すれば時間が入っても問題ない気もするけど
邪道?
>>93 Date now = DateFormat.getDateInstance().parse(DateFormat.getDateInstance().format(new Date()));
>>93 むしゃくしゃしてやった。
83だとは思わなかった。
今は反省している。
97 :
83=86:04/10/10 11:40:53
>>94 !
実は比較の部分も空白です。比較で年月日だけで比較は可能なのでしょうか?
argDate.compareTo(now)<0
の比較では時間も考慮してしまいます
比較をいじるとは検討もしてなかった…
>>95 長いけどサンクス
それでいけました
でも少し
>>93さんに期待age
>>96 いえいえ
お気にせずに
ド・モルガンの法則をJAVAで表現しなさいっていわれましたけど
どのように書いたらいいんでしょうか?
>>99 public class MyClass {
public static void main(String[] args) {
hoge(true, true);
hoge(true, false);
hoge(false, true);
hoge(false, false);
System.out.println("以上より、やっぱりド・モルガンは正しかった。Q.E.D");
}
static void hoge(boolean p, boolean q) {
System.out.print("p=="+p+", q=="+q+"のとき、");
if ( (!(p&&q) == (!p || !q)) && (!(p || q) == (!p && !q)) ) { //←ド・モルガンの法則
System.out.println("ド・モルガンは正しい。");
}
else {
System.out.println("ド・モルガンは嘘つき。死ね。");
}
}
}
101 :
デフォルトの名無しさん:04/10/11 00:30:32
パネルに裏表の判断をさせるもので
省略
class GameTile{
boolean tileStat;
boolean getStat(){
if(com.compareTo("表")==0){
return true; }
else if(com.compareTo("裏")==0){
return false; } }
void setStat(boolean){
tileStat=boolean; }
void reverseStat(){
if(tileStat == true){
tileStat=false; }
else if(tileStat == false){
tileStat=true; }}
String toString(){
if(tileStat == true){
System.out.println("*"); }
else if(tileStat == false){
System.out.println("."); } }
GameTile(){
tileStat=false; }
}
で実行すると
void setStat(boolean){
の )と{の間に矢印が出て<identifier>がない
最後の}のところで ) がないといわれ
この2つのエラーだけがどうしても消せません
お助けください!
void setStat(boolean junk){
とでもすれば。
>>101 勘弁して....
void setStat(boolean) {
tileStat=boolean;
}
このメソッド宣言をみてどう思う? え、わからんって?
booleanの後ろに変数名が必要だろ!
しかも tileStat=boolean; って、booleanはキーワードですってな
エラーが出ないか?
もしこれ読んでも分からんかったら、教科書みて、「引数」ってところを
10回読み直せ。できれば「キーワード」も。
ありがとうございます!
なんとかそこを解決できたと思ったら
また新たなエラーが出ました;;
勉強し直します
105 :
デフォルトの名無しさん:04/10/11 11:28:47
try{
処理
}catch(IOException e){
System.err.println(e.toString());
この場合の(e.toString())の意味を教えてください
>>105 System.err.println(e);
と書くのと同じ。内部的に
System.err.println(e.toString());
に変換されるだけ。
ちなみにtoString()はオブジェクトを人間が読めるように表現した
Stringクラスの文字列を返すメソッドね。
107 :
デフォルトの名無しさん:04/10/11 12:06:16
108 :
dotkansai:04/10/11 14:27:57
馬鹿な質問ですいません。
オブジェクトリテラルの例で、nullとはどういうことなんですか?教えてください。
String s = null;
109 :
デフォルトの名無しさん:04/10/11 14:43:09
クリア
null: 参照型変数がいかなる参照も保持していないことを示す印。
つ111
>>108 簡単に言うと「中身が空っぽ」ということを表す値で、単に
String s;
とだけ書いて何も代入しない状態では null が入ってる。
これを空っぽだと明示したいときや、入ってるものを除いて空っぽにしたいときに
String s = null; //空っぽだと明示
hoge = null; //何か入ってたけどこの時点で空っぽ
みたいに書く。
ちなみに、ほんとうに null が値かどうかは知らないけど、値だと考えると
if (s == null) ...
みたいな使い方も納得できる。
>112
ありゃ? メソッドローカルに
String s;
ってしてもsがnullとは限らないんじゃなかったっけ?
ぬるぽとからっぽ
タートルクラスってなんですか?
>>113 nullとは限らないというよりも
ローカルでそのまま使ったらコンパイル通らないね。
>117
ですよね。ちょいと混乱した。
さんくーです。
122 :
デフォルトの名無しさん:04/10/12 01:45:03
プライベートコンストラクタしか持ってないクラスを生成したいんですけどどうすればいいのですか?
123 :
デフォルトの名無しさん:04/10/12 01:48:47
プライベートコンストラクタを含めればいいのです。
124 :
デフォルトの名無しさん:04/10/12 01:56:36
生成というか
mainクラスでプライベートコンストラクタしかもたいないクラスのメソッドを利用したいのですが
そのメソッドはstaticじゃないので使えません。
よってmainクラスででそのクラスをなんかするのだと思うんですけど
どなたか教えてください
>122
リフレクション
>>124 それってたぶんSingletonパターンのクラスだから、生成用のstaticメソッドが別にあるはず
getDefaultXXX()とか、getInstance()とか、getCurrentInstance()とか、、、。
staticメソッドのAPIを調べて、そのクラスのインスタンスを返すメソッドを探してみな。
つーかここまで書いてあったら自分で作れるだろ?
Servletスレから流れて来ましたがよろしいでしょうか。
ServletでURLを指定してそのソースを取得・ブラウザで表示したいんですが、
ソースのUnicodeへのエンコードが上手くいかず、文字化けします。
取得したソースに
return new String(s.getBytes("ISO8859_1"), "JISAutoDetect");
を通しても駄目でした。JAVAアプリとして作った時はこれでうまくいったのですが。
ページによってエンコードが違うのが原因かと思っています。
response.setContentType("text/html; charset=Shift_JIS");
で、シフトJISのページは正しく表示されるのですが、EUC(Yahooニュースなど)
とかは駄目 なんです。
Tomcat5.0を使用です。
どうすればいいかわかりますか?
131 :
デフォルトの名無しさん:04/10/12 11:38:51
>>127 すごいサンクス
getInstanceがありました
こういう風に使うんですね^^;
数式のコンパイラでいい。制御構造や入出力文はなくてもよい
ターゲットマシン、CASLまたはJVM
・取り扱える数値は整数値のみでよい(実数なら最高)
・演算は加減乗除のみでよい(それ以外あってもいい)
・演算子の優先順位を考慮し、括弧も扱えること
数値と演算子の区切り文字は特に設けず、トークンは
4桁固定とする。
_は空白一文字を意味する
簡単化のためにトークンの文字数を4桁に固定する。
例
入力A =(2+8)/(2+3)
B =A+3
出力 AAA STRAT
LD GR3,=2
LD GR1,=8
・
・
・
みたいになればいいんです。
よろしくおねがいします。遅れてすいませぬ
続き
AAA START
LD GR3,=2
LD GR1,=8
ADDA GR3,GR1
LD GR4,=2
LD GR1,=3
ADDA GR4,GR1
LD GR1,GR3
LD GR2,GR4
CALL DIV
LD GR5,GR1
ST GR5,A
LD GR3,A
LD GR1,=3
ADDA GR3,GR1
ST GR3,B
LD GR0,A
CALL NUMOUT
LD GR0,B
CALL NUMOUT
RET
A DS 1
B DS 1
END
135 :
M.B.:04/10/12 16:44:38
javacc とか使ったんじゃ駄目なの?
136 :
デフォルトの名無しさん:04/10/12 21:59:06
Sayというプログラムを作れ。
このプログラムは、java Say helloと入力するとhelloと表示する。
java Say somethingと入力するとsomethingと表示するものである
(つまり最後の文字をオウム返しするだけのプログラム)。
[ヒント]Sayの後の文字をコマンドライン引数という。
この文字はmain(String [] argv)中でargv[0]として参照できる。
っていう課題が講義で出たんですが、まだ勉強を始めたばかりで
ヒントの意味すらわかりません。助けてください。
137 :
デフォルトの名無しさん:04/10/12 22:14:57
>>136 public class Say {
public static void main(String[] args) {
if (args.length != 1) { System.err.println("usage: java Say [string]"); }
else { System.out.println(args[0]); }
}
}
>>137 ペポ。仕様エラーがでますたー。引っ掛けです!
>(つまり最後の文字をオウム返しするだけのプログラム)。
なので、例とこの文章が一致していません。解なしです。
最後の「文字列」をオウム返しするプログラムは次の通り
public class Say {
public static void main(String[] args) {
if (args.length == 0) { System.err.println("usage: java Say [string]..."); }
else { System.out.println(args[args.length-1]); }
}
}
だな。
誰か3*3マスのTic Tac Toeを作ってくれ・・・
アフォな俺には何がなんだか orz
>>139 J2MEのSunによるリファレンス実装の中にサンプルがある。
>>136 say helloって、REXXみたいだな
>>140 昔見たときはなんかビット演算みたいの使ってたのでわけわからんかった
>>140 あれ、変態的なコーディングだよな。
初めて見た時、ワロタ。
>>139 とりあえず、有名なアルゴリズムを一つ授けておく。
実装も簡単だ。
コンピュータ側は、今までに戦った手順を全て覚えておき、
負けた手順 "だけ" は打たないようにする。
あとは適当。ランダムに打つ。
人間と戦っているうちに、コンピュータが
段々強くなっていくのが面白い。
盤面をすべて配列で持っとくのはどうだ?
9*8*7*6*5*4*3*2/8 通りより少ないくらいしかないし。
>>145 ゲームの局面を考えなければ 3^9 通り
148 :
M.B.:04/10/14 12:33:52
>>147 要は「全部×」とか「全部○」とかも含めちゃってるワケ。
最初が○、っていうのが決まってるわけだから、9!通りのうち、
勝負がついた時点で枝刈りした残りが総数。
>>145 の「/8」っていうのは、たぶん回転・鏡像を考慮した場合と思われ。
new Reciprocal(n) によって生成した オブジェクトに対して next() メソッドを起動するたびに、
1/n (n は2以上の整数) の十進小数展開の小数点以下の各桁の値(0〜9)が順に返ってくるように、
クラス Reciprocal を定義する。
next() が呼ばれつづける限り、何百万桁でも正しい値が返るようにすること。
という課題が出ました。
が、さっぱりわかりません。
どなたか助けてください。
ニュートン法で近似計算して、
求まった有効数字より大きい桁が要求されるたびに
さらに近似計算を進めていくというのはどう?
任意精度の十進数はjava.math.BigDecimalを使えばいいかと。
つかニュートン法は方程式を解くやつでした。スマソ
別に1/nの答えが直接必要なわけじゃないんだから、BigDecimalつかう
までもないよね。余りだけ内部状態として持っておけばいいわけだから。
ふつうの筆算のように1桁ずつ出していけばいいのか。
Javaの、RDF対応な、拡張、Jeneのことをわかる人っています??
Jeneじゃなくて、Jenaでした。自分で定義したRDFスキーマの、
取り込み方がわからないのですが。。。
>>149 public class Reciprocal {
private int current = 1;
private int n;
public Reciprocal(int n) {
this.n = n;
}
public int next() {
int ret = current * 10 / n;
current = current * 10 % n;
return ret;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
Reciprocal obj = new Reciprocal(n);
for(int i = 0; i < 100; i++) {
System.out.println(obj.next());
}
}
}
Sierpinski曲線を描きなさい。
おねがいします、
158 :
デフォルトの名無しさん:04/10/15 00:02:55
class Perfect {
public static void main (String[] args) {
int i = 1;
int n = 2;
int t = 0;
boolean isPrime =false;
while(n <=10000){
while(n >= i-1){
if(n % i == 0){
t = t + i;
}
i++;
}
if(n == t)
isPrime = true;
if(isPrime)
System.out.println(n);
n++;
}
}
}
完全数を求める宿題ですが、以上のようなプログラムを作りました。
しかし、うまく行きません。どこがおかしいのでしょうか?
159 :
これでOK:04/10/15 00:27:50
>>158 class Perfect {
public static void main (String[] args) {
int n = 2;
while(n <=10000){
int i = 1;
int t = 0;
boolean isPrime =false;
while(n > i){
if(n % i == 0){
t = t + i;
}
i++;
}
if(n == t)
isPrime = true;
if(isPrime)
System.out.println(n);
n++;
}
}
}
160 :
又はこれでOK:04/10/15 00:31:07
>>158 class Perfect {
public static void main (String[] args) {
int n = 2;
while(n <=10000){
int i = 1;
int t = 0;
while(n > i){
if(n % i == 0){
t += i;
}
i++;
}
if(n == t)
System.out.println(n);
n++;
}
}
}
161 :
デフォルトの名無しさん:04/10/15 02:39:26
Stringの比較でequalsがありますが=ならfalse返すようにできますでしょうか?
言ってる意味がよくわからんのだが・・・
ちょっと英語で言ってくれんか?
>>156 ありがとうございました!
きっちり動いてくれました。
165 :
デフォルトの名無しさん:04/10/15 10:43:50
166 :
161:04/10/15 10:55:12
>>162 equalsは ==みたいなものじゃないですか
ってことは!=に変わるやつもあるかと思って
>>165 教えてください
167 :
デフォルトの名無しさん:04/10/15 11:05:39
equalsメソッドをオーバーライドして、その中の処理で
イコールだったらfalseを返すようにすればいいのです。
しかし、混乱を生むだけだと思います。
>>166 !str.equals( str2 );
169 :
デフォルトの名無しさん:04/10/15 23:53:05
main関数でstaticなメソッドを使いたいのですがどうすればいいでしょうか
>>169 使えばいいじゃんとしか。
class MyClass {
public static void main(String[] args) {
MyClass.hoge();
}
static void hoge() {
・・・
}
}
171 :
デフォルトの名無しさん:04/10/16 00:20:24
あー説明不足でした
main関数で他のクラスのstaticなメソッドを(ry
>>171 使えばいいじゃんとしか。
class MyClass {
public static void main(String[] args) {
OtherClass.hage();
}
}
other より another のほうがよかったか・・・orz
174 :
デフォルトの名無しさん:04/10/16 00:25:47
すみません
staticじゃなくてpublicでしたorz
>>174 使えばいいじゃんとしか。
class MyClass {
public static void main(String[] args) {
AnotherClass ac = new AnotherClass();
ac.hige();
}
}
176 :
デフォルトの名無しさん:04/10/16 00:55:07
Stack.java:12: missing return statement
}
^
というエラーが出て何度か数え直したんですが原因の所が見つかりません。
お願いします。
class Stack{
private int index=-1;
private Object a[]=new Object[1000];
public void push(Object o){
index++;
a[index] = o; /* 受け取ったったデータを配列に入れる*/
}
public Object pop(){
index--;
System.out.println(a[index+1]); // 配列の中身を出力
}
}
class StackTest {
public static void main(String[] args) {
int i;
if(args.length < 1){
System.out.println("Put a word as the argument!");
System.exit(1);
}
Stack s = new Stack();
for(i=0;i<args.length;i++){
s.push(args[i]);
}
s.pop();//コマンドライン引数を順番にpopして1ずつ表示
}
}
|>176
|
|
ぱくっ|
/V\
/◎;;;,;,,,,ヽ
_ ム::::(,,゚Д゚)::| そんなネタで俺さまが釣られると思ってんのか!
ヽツ.(ノ:::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
とりあえず
> public Object pop()
ってのが何を意味してるのか分かるまで入門書を全編音読。
くらす、はろーわーるど、ぱぶりっく、すたてぃっく、ぼいど、めいん、すとりんぐ、あーぐす、・・・
179 :
デフォルトの名無しさん:04/10/16 01:14:34
>>176 public Object pop(){
index--;
System.out.println(a[index+1]); // 配列の中身を出力
}
を
public Object pop(){
index--;
System.out.println(a[index+1]); // 配列の中身を出力
return a[index+1];
}
とすればOK
180 :
デフォルトの名無しさん:04/10/16 01:22:23
181 :
デフォルトの名無しさん:04/10/16 01:35:29
使えばいいじゃんとしか。シリーズ
ワロタ
182 :
デフォルトの名無しさん:04/10/16 02:57:12
クラスの生成とクラスの宣言って何が違うでしょうか?
>>182 クラスの宣言→金型の作成
クラスの生成→金型をつかって成型(モノをつくる)
無理やり当てはめるとこんな感じ
184 :
デフォルトの名無しさん:04/10/16 03:07:56
>>183 クラスの生成はオブジェクト作成とみてFA?
>>183 でもクラスのキャスト(鋳造)という用語があるから生成はちょと違う言い方したほうがいいような・・・
引数にクラスを保たせるにはどうすればいいのでしょうか。
例えば、A・Bという2つのクラスがあったとして、
new A(new B)
とさせたいのです。
>>186 何がやりたいのかわからん。
例通りのことなら B を引数にとる A のコンストラクタを定義すれば可能だが
それとここは宿題スレな
188 :
デフォルトの名無しさん:04/10/16 21:24:02
private Date a;
SimpleDateFormat b;
cは?
try{
a = b.parse(c);
}
catch(ParseException e){
System.out.println("err");
throw e;
}
メインクラスにある、日付をチェックするコードなのですがこれを抜き出して他のクラスのメソッドにしたい
(つまりチェックのコードだけを抜き出してチェック専用のクラスを作成)のですが
うまくメソッドにできません
どうか手助け願いますorz
>>186 B型の引数をもつコンストラクタを設定する
>186=189
いいから問題文全部を一字一句変えることなくそのまんまカキコしる。
すいませんでした。
問題は
>>149の続きで、
new ReciprocalSum(new Reciprocal(m), new Reciprocal(n)) によって生成したオブジェクトの next() メソッドを
呼ぶたびに、 1/m + 1/n の十進小数展開の各桁の値(0〜9)が順に返ってくるように、クラス ReciproalSum を定義する。
注: ReciprocalSum は、もらってきた二つの Reciprocal オブジェクトのフィールド(インスタンス変数)に
直接アクセスして分母の値を読んではいけないものとします。
つまり、観測手段としては next() メソッドの呼出しだけを使って下さい。
という物なのです。
聞いてばかりで申し訳ないのですが、私にはいくら考えてもわかりませんでした。
よろしくお願いします。
>>193 public class ReciprocalSum {
private Reciprocal reciprocal1, reciprocal2;
public ReciprocalSum(Reciprocal reciprocal1, Reciprocal reciprocal2) {
this.reciprocal1 = reciprocal1;
this.reciprocal2 = reciprocal2;
}
public int next() {
return reciprocal1.next() + reciprocal2.next();
}
}
でいいんじゃないの?
あ、一の位の処理が必要か。
m, n は2以上の整数だから一の位が0でなくなるのは m = n = 2 のときだけで、このとき一の位は1。
それ以外のときは一の位は0。
199 :
M.B.:04/10/17 10:37:19
>>193 数値計算の問題なのか、プログラミングの問題なのかがちと微妙。
『プログラミング・セミナー』(共立出版)の「定跡を拾う」の章に、
1/nの小数展開の話があって、(「番兵」とか「生贄」とかの)コーディング技法の話が詳しく解説されてた。
コーディング技法を問われているのなら、ちょっと調べてみそ。
>>198 桁上がりが発生するのは一の位だけじゃないよ。
1/13 + 1/17とか考えてみな。
循環小数同士の加算では連続して数桁の桁上がりも考えられるしな。
この課題では分子が1だから適切な例ではないが、0.004444445 + 0.005555555とかな。
・Itedratorパターンをしらない。(ゆえに内部状態を初期化できない)
・ReciprocalSumを想定している。(まともなら、Reciprocal.add(Reciprocal r)だろ)
この二つだけで、この課題は糞。
こんな糞課題を出す講師からはまともなプログラマは生まれんな。
202 :
デフォルトの名無しさん:04/10/17 11:22:34
StringTokenizer型の変数で現在位置するトークンをString型で取り出すにはどうしたらいいでしょうか
>>202 201に対するささやかな反論のつもりかもしれないが、
StringTokenizerはトークン化の目的にしか使用されていない。
対象の文字列値は、別に存在するわけだ。
いわば、ユーティリティとしての設計になっている。
String→]StringTokenizer[→String[]
ゆえに、StringTokenizerは再初期化はせず、一回ごとに
インスタンス化するという設計になっている。
イテレータを外部化した形だね。
ゆえにStringTokenizerの挙動は元の文字列の動作に何の影響も与えない。
一方、Reciprocalは分数という数値としての実体をもちつつ、
イテレータとしても動くという馬鹿な設計になっている。
next()を既に呼び出したReciprocalのオブジェクトを別な場所に送ると、
次にnext()を呼び出した人は誤った値を受け取ることになる。
これはオブジェクトとして不完全であり、これを回避するには、
Iteratorパターン(内部化)や、StringTokenizer(外部化)のように
イテレータを別なオブジェクトとして独立させることになる。
204 :
デフォルトの名無しさん:04/10/17 14:34:19
>>193 ReciprocalSumクラスをこうすればOK
class ReciprocalSum {
Reciprocal r1, r2;
LinkedList stack=new LinkedList();
static int MAX_SIZE=100;
ReciprocalSum(Reciprocal r1, Reciprocal r2) {
this.r1=r1;
this.r2=r2;
}
int next() {
if(stack.size()<=1) {
do {
stack.addLast(new Integer(r1.next()+r2.next()));
} while(((Integer)stack.getLast()).intValue()<=8 && stack.size()<MAX_SIZE);
int ka=0;
for(int i=stack.size()-1; i>=0; --i) {
int value=((Integer)stack.get(i)).intValue() + ka;
stack.set(i, new Integer(value%10));
ka=value/10;
}
}
return ((Integer)stack.removeFirst()).intValue();
}
}
よく見たら、LinkedList stackは、queueの方が良かった。
あとMAX_SIZEは任意の数値で。
>>201 たまたまJava使ってるだけで、別にオブジェクト指向の勉強じゃないから。
207 :
見直したら間違えてた訂正:04/10/17 17:58:24
>>193 ReciprocalSumクラスをこうすればOK
class ReciprocalSum {
Reciprocal r1, r2;
LinkedList queue=new LinkedList();
static final int MAX_SIZE=100;
ReciprocalSum(Reciprocal r1, Reciprocal r2) {
this.r1=r1;
this.r2=r2;
}
int next() {
if(queue.size()<=1) {
if(queue.isEmpty()) {
queue.addLast(new Integer(r1.next()+r2.next()));
}
do {
queue.addLast(new Integer(r1.next()+r2.next()));
} while(((Integer)queue.getLast()).intValue()>8 && queue.size()<MAX_SIZE);
int ka=0;
for(int i=queue.size()-1; i>=0; --i) {
int value=((Integer)queue.get(i)).intValue() + ka;
queue.set(i, new Integer(value%10));
ka=value/10;
}
}
return ((Integer)queue.removeFirst()).intValue();
}
}
>>206 それはよくない。何でJavaなんだよぅ。そんなことするから
訳わかんないJavaコード書くやつが増えるんじゃないか・・・
やっぱ文法がわかりやすいからじゃない?
Javaとしてマトモかどうかはともかく。
Javaに関しては学校の先生なんて大学レベルでも糞コードしか書けない香具師ばっかだよ。
表面的なとこからして平気でクラス名を小文字で書いたり変数名は1〜3文字ばっかだったり。
とてもJava(というか現代プログラミング言語)の理念を理解しているとは思えん。
211 :
デフォルトの名無しさん:04/10/17 20:43:56
f(x)=x-cosx=0
の解をニュートン法or逐次代入法で
求めるプログラムを教えて下さい。
初期値は0.5
収束判定は10^-10
です。
>>210 それは学生にわかりやすくしているだけだろう。
それにJavaを使っているからといって、SUNのコーディングスタイルに従わないと
いけないわけでもない。
君はSUNのコーディングスタイルが全ての人から共通の理解を得ているとでも勘違い
しているのか?
どうももう少し他の言語や思想を勉強してみる必要がありそうだね。
>>213 その程度なら JavaじゃなくてCでいいんじゃないの?
さっきの話だと、クラス構成も何だか無理やりな感じだったから
その辺りが、「理念」っていうことになったのかと。
常々思うのは、学生には負担になるがアルゴリズムの勉強とかを
複数言語を使って教えるっていうのはできないのかなぁ?
「アルゴリズムの勉強なんだから・・・」という話もでるだろうけど、純粋にアルゴリズムが
学びたければ、特定の実在(?)言語に依存して教えないで
psudo languageを作って、それで教えたほうが言語の癖がなくていいと思ってるし。
>>214の反論を無視して言った言葉は「つまり、反論がないということか。」
おもしろい馬鹿ですね
部外者(工房)だが、
オブジェクト指向がさっぱりわからん。
例を示されてもよけい混乱する。JAVA歴4ヵ月独学じゃ無理なのか?
そんな漏れがオブジェクト指向が何か、理解できるいい手段を知っていたら教えてくださいです。。。
>>218 Java以外の言語歴は?Javaだけではよさが分かりにくいですよ。
もしかすると構造体の拡張みたいに考えたほうがとっつきがいいかもしれん(もちろんこの理解のまま止まるのはマズい)
なにか勘違いしているようだけど、
>>231書き込みはこの議論では始めての
書き込みだよ。
>>214の「JavaじゃなくてCでいいんじゃないの?」はJavaスレから逸脱するもので、
スレ違い。
そもそも
>>210の講師はJavaで講義することが前提にある。
>>214後半については、アルゴリズムの重要性は確かに納得できるが、
疑似言語での講義は具体性を欠くことからあまり推奨すべきではないと思う。
多くの場合、それは座学に終わると思う。
プログラミングは実学である。
>>221 煽るわけじゃないんだけど、アルゴリズムの授業で使う言語の特性(性質?)で
アルゴリズムの本質の理解が妨げられるといやだな、と思ったもので。
何らかのプログラム言語を知っていたら、コードの意味がアルゴリズムのエッセンスかどうか
わかるような気はするんですが・・・
>>218 本を読む。
概念自体は全然難しくない・・・ていうかむしろ自然なはずだけど。
Javaスレはレベルが低いのか?
>219
C 9ヵ月(やっとポインタが分かった程度)
Perl 半年(ゲストブック程度,オブジェクト指向サパーリ)
PHP 1ヵ月
Visual〜 買ったばかり
です。言語の違いは…処理がC,PHP,Perlの準に早いということぐらいしか…
といっても、CはWebProgではやっていません。
>225
多分理解できればすごく簡単なことだろう、とは思うのですが… ちなみに入門書は持っています。
でもクラスやらインスタンスやら言われると分からなくなります。。。
>>227 オブジェクト指向の理解でつまづいてる場合じゃないよ。
これからは、オブジェクト指向をさらに発展させたアスペクト指向が
メインになるのだから。
アスペクト指向の方も力を入れて勉強しないと。
若いプログラマーほど、どんどん先に進んでるからね。
>220
そういえば何度か聞いたあります。オブジェクト指向が余計分からなくなるとか…
このスレの住人はオブジェクト指向がほとんど分かってないことが判明しますた。
231 :
M.B.:04/10/18 09:18:04
>>227 オブジェクト志向はそれほど意識せずともよいと思われ。
だいたい、通常のプログラムはほとんど基本型だけで間に合うなり。
オブジェクトもCの構造体の代りに使うことがほとんどだし、クラス定義とインスタンスも宣言と実体と考えてさほど問題なし。
漏れ自身は動的なメモリ管理(参照カウンタによるメモリ管理と自動ちり集め)が使えるというメリットが一番重要と考えている。
>>231 それはちょっとあまりに。。。
例えるなら、2〜30年前に「構造化プログラミングはそれほど意識せず
とも良いと思われ」と言ってるのと同じだよ。。。
234 :
M.B.:04/10/18 12:59:20
>>233 「(数十行程度の、Cなら関数レベルの)プログラムが書ける」程度の段階だと構造化プログラミングの有難みがよく分からんのと同じで、
オブジェクト志向の有難みは「使い回しのきくコード」がある程度蓄積されないとわからんような気がする。
確かにオブジェクト志向のコードは再利用が楽っちゅーか、保守改修が安全かつ効率よく行なえるというメリットがあるのだが、
(インタフェースにしろ内部構成にしろ)ある程度こなれたコードがないと、そのメリットが活かせないうらみがある。
もともと他の言語でしててJavaに乗り換えるんなら確かにJavaのオブジェクト志向というありかたは重要だが、
プログラム初心者は「とにかく動かす」ところから始めて(Javaはそういう使い方に向いている)、それからオブジェクト志向を意識したプログラムに書き換えたほうがよさそうに思われ。
>>231=234
ああ、初心者は最初はオブジェクト指向を意識しなくてもよいということか。
まあオブジェクト指向とオブジェクト指向プ(ry
昔「志向」と「指向」の違いを力説していた
やつがいたなあ。ほとんどくだらん精神論だったけど。
オレ、これからオブジェクト志向で行って見ようかと思う。
オブジェクト指向の特徴として最初に再利用性を挙げられると違和感が
再利用性と言ってる時点で
240 :
M.B.:04/10/18 16:42:20
>>238 とはいえ「ありものを適当にギッてきてちょこっと直したらそれらしく動き、
しかもヘンなことが起きない」っつーのは開発の王道だし。
それ以外に「どこをどう直したらいいかの見当がつけやすい」っつーのも、
オブジェクト志向のメリットとしてあるけどさ。
「なんでもかんでもオブジェクト」っつーのは、理念としては美しいんだが、
やっぱり設計レベルの話っしょ。初心者はそこまで大規模なシステム組まんと思う。
やはり「属性と動作という概念」と「カプセル化」が最強
初心者向けJAVAの教材でよく「人」とか「車」とか「商品」などをクラス化して
属性や動作や継承などについて説明してるけど、あれなら初心者でも理解し易いと思うけどな
わん
>>242 SunのJavaチュートリアルは自転車だったね。
貴重なレスありがとうございました。
モノに例える場合ですが、それでパラメータとメソッドと戻り値の関係は分かりましたが、オブジェクトとクラスとインスタンスとパッケージの関係がどうしても分かりません。何かいい例はありませんか?
クラス - 自転車
オブジェクト- 実際の自転車
>>245 オブジェクト = クラスのインスタンス です。クラスってのは単なる定義であって、実際に
クラスから生成されて実行可能になったものがインスタンスつまりオブジェクトです。
パッケージは単なる名前空間、つまりクラス名が衝突しないためのクラスカテゴリです。
>>245 オブジェクト-自転車という概念
クラス-自転車の設計図
インスタンス(オブジェクト)-本物の自転車
パッケージ-ブランド名
>>248 結局我々は
>>245に オブジェクト指向という名のクラスのインスタンスを求められているのか?
250 :
デフォルトの名無しさん:04/10/19 13:56:31
えと、宿題スレみたいなので質問いいのでしょうか?
九九の表を System.out.print(); を使って
for文、while文、do while文を作成しなさいという問題なのですが
表示が
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 ,,,,,,,
,,,,,,,
9 18 27 36 45 54 63 72 81
こんな感じです
初歩かもしれませんが、よろしくお願いします(*- -)(*_ _)ペコリ
>>250 public static void main(String[] args) {
System.out.print("for (int y = 1; y < 10; y++) {¥n");
System.out.print(" for (int x = 1; x < 10; x++) {¥n");
System.out.print(" System.out.print((x*y)+" ");¥n");
System.out.print(" System.out.println();¥n");
System.out.print(" }¥n");
System.out.print("}");
}
253 :
M.B.:04/10/19 14:06:46
>>250 > for文、while文、do while文を作成しなさいという問題なのですが
ここんとこが意味不明だが
for (int n = 1;n < 10;n += 1) {
for (int m = 1;m < 10;m += 1) {
int x = n * m;
if (m < 9) {
System.out.print("" + x + " ");
} else {
System.out.print("" + x + "\n");
}
}
}
254 :
デフォルトの名無しさん:04/10/19 14:07:02
>>250 for(int a=1; a<10; ++a) {
for(int b=1; b<10; ++b) {
System.out.print(a*b + " ");
}
System.out.println("");
}
きみたち、要求された仕様を満足していないよ
for、while、do-whileの場合で3パターン作れってことじゃ?
System.out.print() を用いて3種類のループを作り、かつ表示は九九の掛け算表
258 :
M.B.:04/10/19 14:19:42
>>250 これでどうだ。
for (int n = 1;n < 10;n += 1) {
while (true) {
int m = 1;
do {
System.out.print((n * m) + " ");
m += 1;
} while(m < 9);
System.out.print((n * m) + "\n");
break;
}
}
whileが意味無さ過ぎだな
260 :
M.B.:04/10/19 14:43:58
>>256 >>258 みたいな馬鹿やっといてコレ言っちゃうのもナンだが、
for以外を使うのはナンセンスと思われ。
>>257 例外起こさせといて上でcatchするかw
261 :
M.B.:04/10/19 14:45:32
262 :
M.B.:04/10/19 15:04:34
>>259 じゃあ、こんなもんで。
for (int n = 1;n <= 9;n += 1) {
int [] dan = new int[9];
int sum = 0;
int cnt = 1;
while (cnt <= 9) {
sum += n;
dan[cnt - 1] = sum;
cnt += 1;
}
StringBuffer linebuf = new StringBuffer("");
cnt = 1;
do {
linebuf.append(dan[cnt - 1] + " ");
cnt += 1;
} while(cnt < 9);
linebuf.append(dan[cnt - 1] + "\n");
System.out.print(linebuf.toString());
}
263 :
MーH:04/10/19 15:06:44
ヒルベルト曲線をTurtleクラスで書く方法を教えてもらえないでしょうか?
おねがいします。
電大生
265 :
デフォルトの名無しさん:04/10/19 20:14:19
640*480のjpgの画像処理なんですが
色相画像から色相ヒストグラムを表示する方法教えてください
266 :
250:04/10/19 22:53:12
説明下手ですみません;;
256さんのいう通り3パターンで作るということです
267 :
デフォルトの名無しさん:04/10/19 23:15:42
入力した文字列を逆から表示しろ
って宿題なんですが、どなたかよろしくお願いします。
配列を使った簡単な問題にもかかわらずわからないです。。。
>>263 あなたの使うTurtleクラスがどんなものかわからないので無理です。
>>267 配列を使わなきゃいけないんですか?
269 :
267:04/10/19 23:38:45
>>268 そうらしいです。
入力した整数または実数の値を、入力した順番と逆順に表示するプログラム
っていう問題なんですが・・・
new E() によって生成したオブジェクトに対して next() メソッドを起動するたびに、 e(自然対数の底)の値の小数点以下の各桁の値が順に返ってくるように、クラス E を定義する。
なんていう無茶な課題が出ました。
助けてください。
\ │ /
/ ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
─( ゚ ∀ ゚ )< くっちゃらはぴはぴ!
\_/ \_________
/ │ \
∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< くっちゃらはぴはぴ!
Py厨〜〜〜〜! >( ゚∀゚ )/ | / \__________
________/ | 〈 | |
/ /\_」 / /\」  ̄ / /
>>269 ああ、「入力順と逆」か。
"ABCDE"→"EDCBA"かと思った。
import java.io.*;
public class Inverse {
public static void main(String[] args) {
String[] strings = new String[100];
int index = 0;
System.out.println("Input some strings. ('@' to quit)");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
try {
String str = br.readLine();
if (str.equals("@")) break;
strings[index] = str;
index++;
}
catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("== RESULT ==");
while (true) {
if (index == 0) break;
index--;
System.out.println(strings[index]);
}
}
}
>>270 ま た お ま え か !
・・・がんがれ
import java.util.Random;
public class E {
private final Random random = new Random();
public int next() {
return random.nextInt(10);
}
}
eを1桁ずつ計算する方法ってあるの?
ないならマクローリン展開で計算しちゃおうか・・・
277 :
デフォルトの名無しさん:04/10/20 02:35:43
>>270 EクラスをこうすればOK
class E {
double e = Math.E % 1;
int next() {
e*=10;
int num=(int)(e/1);
e%=1;
return num;
}
}
意義あり!
いや、異議あり!
三角形を描けだって
>>280 System.ou.println( "△" );
System.ou.println( "▲" );
System.ou.println( "▽" );
System.ou.println( "▼" );
好きなのを選べ
おっと、outのtが抜けてた
283 :
M.B.:04/10/20 10:07:54
>>266 for (int n = 1;n <= 9;n += 1) {
StringBuffer linebuf = new StringBuffer("");
int sum = 0;
for (int m = 1;m <= 9;m += 1) {
sum += n;
linebuf.append(sum);
if (m < 9) {
linebuf.append(" ");
}
}
System.out.print(linebuf.toString() + "\n");
}
284 :
M.B.:04/10/20 10:08:41
>>266 int n = 0;
while(++n <= 9) {
StringBuffer linebuf = new StringBuffer("");
int sum = 0;
int m = 1;
while(m++ < 9) {
sum += n;
linebuf.append(sum + " ");
}
sum += n;
linebuf.append(sum + "\n");
System.out.print(linebuf.toString());
}
285 :
M.B.:04/10/20 10:09:06
>>266 int n = 1;
do {
StringBuffer linebuf = new StringBuffer("");
int sum = 0;
int m = 1;
do {
sum += n;
linebuf.append(sum + " ");
} while (++m < 9);
sum += n;
linebuf.append(sum + "\n");
System.out.print(linebuf.toString());
} while (++n <= 9);
286 :
M.B.:04/10/20 10:14:06
>>283 を訂正
for (int n = 1;n <= 9;n += 1) {
StringBuffer linebuf = new StringBuffer("");
int sum = 0;
for (int m = 1;m < 9;m += 1) {
sum += n;
linebuf.append(sum + " ");
}
sum += n;
linebuf.append(sum + "\n");
System.out.print(linebuf.toString());
}
287 :
M.B.:04/10/20 10:31:05
>>284 も int n = 0 が気に入らんので修正
int n = 1;
while(n <= 9) {
StringBuffer linebuf = new StringBuffer("");
int sum = 0;
int m = 1;
while(m++ < 9) {
sum += n;
linebuf.append(sum + " ");
}
sum += n;
linebuf.append(sum + "\n");
System.out.print(linebuf.toString());
n += 1;
}
288 :
デフォルトの名無しさん:04/10/20 10:40:01
289 :
デフォルトの名無しさん:04/10/20 13:21:55
初歩的な質問で申し訳ありませんが、教えていただければと思い、カキコです。。。
例えば、コンソール上で以下のようなコマンドライン引数を使うとします。
java Test 123a456b789c0 098d765e432f1 8g8h8 9i9j9
で、以下の
abcdefghij
12345678900987654321888999
ように、文字列と数字をわけてそれぞれ出力するコードの書き方がわかりません。。。
どなたか、ご教授頂ければ、幸いです。。。
>>289 public class Test {
public static void main(String[] args) {
StringBuffer alphabets = new StringBuffer();
StringBuffer numbers = new StringBuffer();
for ( int i = 0; i < args.length; i++ ) {
for ( int j = 0; j < args[i].length(); j++ ) {
char ch = args[i].charAt(j);
if ( '0' <= ch && ch <= '9' ) {
numbers.append( ch );
} else if ( 'a' <= ch && ch <= 'z' ) {
alphabets.append( ch );
}
}
}
System.out.println( alphabets.toString() );
System.out.println( numbers.toString() );
}
}
291 :
289:04/10/20 13:54:40
>>290 ああああ、ありがとうございます!!動きました!
僕は一日中考えてもわからなかったのに、数分で答え頂けるとは。。。
本当に感謝です!
292 :
289:04/10/20 15:22:48
すみません。。引き続き質問なのですが。。
コンソール上で以下のように、一個だけコマンドライン引数を使うとして
java Test 1235679
下のようにカンマ編集して出力するコードを教えていただけないでしょうか?
12,356,79
度々ですが、よろしくお願いします。。。
>>292 それどういうルールでカンマ入れてるのよ。
294 :
289:04/10/20 15:54:26
>>293 いや、特にルールは気にせず、結果がそうなればおっけーです。。。
295 :
デフォルトの名無しさん:04/10/20 15:59:48
すみません。初心者です。。
下のソースをrecursion treeにしてあらわしたいのですがいまいちわかりません。
よろしくおねがいします。。。
import java.io.*;
public class Hanoi {
private final static int disks = 3;
public static void Move(int count, char start, char finish, char tmp) {
if (count > 0) {
Move(count - 1,start,tmp,finish);
System.out.println("Moving a disk from " + start + " to " + finish);
Move(count - 1,tmp,finish,start);
}
}
public static void main(String[] args) {
Move(disks,'A','C','B');
}
}
296 :
デフォルトの名無しさん:04/10/20 16:14:25
細かい fillOval の連続としてグラフの線を描画してるんですが、途中から色を変えたいんです。
どうやったらいいでしょうか?
お願いします!助けてください・・・・!
>>294 ルール気にせずだと、
System.out.println("12,356,79");
でもいいって事になっちゃうんだけど。
前提条件はちゃんとしよう!
>>294 >いや、特にルールは気にせず、結果がそうなればおっけーです。。。
では、お言葉に甘えて・・・
class Test{
public static void main(String[] args) {
if (args[0].equals("1235679"))
System.out.println("12,356,79");
}
}
299 :
デフォルトの名無しさん:04/10/20 16:35:36
>>295 そのプログラムで何をしたいのか、もう少し具体的に書いてください。
>>296 もうちょっと具体的に質問を書いてください。
ちなみに、日本語で済む所に無闇に横文字を使うと、
某朝鮮人東大教授みたいに空知識の空威張りと見られやすいです。
カンサンジュン?
>>299 あ、スイマセン・・・
けっこうでかいプログラムだったんで、どこから書けばわからなかったもので
ifで範囲指定でできました。
>>299 >>295ではクラス名からハノイの塔であることがわかります。
>>296のfillOvalはGraphicsクラスのメソッド名です。
ちなみに、知識がないのに発言してると、
某元総理大臣みたいに空知識の空威張りと見られやすいです。
303 :
デフォルトの名無しさん:04/10/20 17:02:39
ハノイの塔のディスクの動きをツリー構造で表したいのです。
Move(3,A,C,B)
/ \
Move(2,A,B,C) Move(2,B,C,A)
/
こんな感じで。
304 :
デフォルトの名無しさん:04/10/20 17:18:35
..思うように表示できませんが。
Move(3,A,C,B)
/ \
Move(2,A,B,C) Move(2,B,C,A)
/
どういう順序になっているのか、どの動きのときにどの表示(例えばMove a disk to A fromC)
になるのかわかりません。
よろしくおねがいします。。
305 :
デフォルトの名無しさん:04/10/20 19:36:46
JAVA始めて間もないので計算プログラムに苦しんでおります。
どなたか教えてください。
1+1=2みたいに表示させたいのですがどうしたらいいですか?
あと+を入力したら足し算、−を入力したら引き算という具合に。
import java.io.*;
class Inputcalc{
public static void main(String[] args) throws IOException {
InputStreamReader stream = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(stream);
String str;
double xx, yy;
System.out.print("Enter: ");
str = in.readLine();
xx = Double.parseDouble(str);
//ここで+-*/のいずれかを入力する。
System.out.print("Enter: ");
str = in.readLine();
yy = Double.parseDouble(str);
//計算結果をだす
in.close();
}
}
>>305 import java.io.*;
class Inputcalc{
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str;
double xx, yy;
String operator;
System.out.print("Enter x: ");
str = in.readLine();
xx = Double.parseDouble(str);
System.out.print("Enter operator: ");
operator = in.readLine();
System.out.print("Enter y: ");
str = in.readLine();
yy = Double.parseDouble(str);
String result;
if (operator.equals("+")) {
result = xx + yy;
} else if (operator.equals("-")) {
result = xx - yy;
} else if 以下略
System.out.println(xx+" "+operator+" "+yy+" = "+result);
}
}
>>302 おいおい、なんでこっちが質問者の真意を汲んであげなきゃいけないんだよ。
泣いてる幼稚園児を相手にしてるんじゃないんだから。
何を聞きたいのかを整理して相手に伝えることもできない香具師はJava以前に国語の勉強(ry
まあ
>>299がバカっぽいことには同意だが。
>>295 ディスクを移動するたびに「手順」オブジェクトを作ってツリーに格納してゆき
移動がすべて終わったらツリーの中身をまとめて表示するのがいいと思う。
移動のたびにSystem.out.println()ではツリーに見えるように表示できないっぽい。
>>296 もっと具体的に書いてくれよ。
とりあえず描画色を変えるのはjava.awt.GraphicsクラスのsetColor(java.awt.Color)で。
例えば、配列y[x]に「xに対応するyの値」が入ってるとすると
public void paint(Graphics g) {
for (int x=0; x < y.length; x++) {
if (y[x] < 0) {
g.setColor(Color.RED);
}
else {
g.setColor(Color.BLACK);
}
g.fillOval(x, y[x], 1, 1);
}
}
とすればy[x] < 0のとき赤色、そうでないとき黒色になる。
x = 10 以降を赤色にしたいなら if (x >= 10) にすればいい。
>>295 コンソール出力だと難しいのでグラフィックにしてみました。
下記のプログラムをコンパイルして表示してみてください。
ツリー図面が出ますので。
各マス内の左上のカッコ内の数字が、実行順序です。
上の段がメソッドの各引数です。下の段がメッセージです。
はい。
package untitled59;
import java.awt.image.*;
import java.awt.*;
import java.awt.color.*;
import javax.swing.*;
public class Hanoi {
private static final int disks = 3;
private static final int WID=160;
private static final int HEI=40;
private static BufferedImage img=new BufferedImage((1<<disks-1)*WID, disks*HEI*2, BufferedImage.TYPE_INT_ARGB);
private static Graphics2D g=img.createGraphics();
private static int order=1;
private static int[] drawC=new int[disks];
public static void Move(int count, char start, char finish, char tmp, Point apt) {
if(count > 0) {
int index=disks-count;
int x = (img.getWidth()-(1<<index)*WID)/2 + WID*drawC[index];
int y = index*HEI*2;
g.drawRect(x, y, WID, HEI);
Point pt=new Point(x+WID/2, y);
if(apt!=null) g.drawLine(apt.x, apt.y, pt.x, pt.y);
pt.translate(0, HEI);
++drawC[index];
Move(count-1, start, tmp, finish, pt);
g.drawString("("+order+") Move("+count+","+start+","+finish+","+tmp+")", x, y+16);
g.drawString("Moving a disk from "+start+" to "+finish, x, y+(HEI/2)+16);
++order;
System.out.println("Moving a disk from " + start + " to " + finish);
Move(count-1, tmp, finish, start, pt);
}
}
313 :
>>295 ハノイの塔・ツリー図 その3:04/10/20 20:16:56
public static void main(String[] args) {
g.setColor(Color.white);
g.fillRect(0,0,img.getWidth(),img.getHeight());
g.setColor(Color.black);
Move(disks,'A','C','B', null);
JFrame frame=new JFrame();
JLabel label=new JLabel(new ImageIcon(img));
JScrollPane scroll=new JScrollPane();
scroll.getViewport().add(label);
frame.getContentPane().add(scroll);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
314 :
デフォルトの名無しさん:04/10/20 21:22:07
学校の宿題のヘルプお願いします。
swingをつかってJtableの中のJTextArea(JTextField?)内に
Loadボタンを押したとき別ファイルから最初の行を除いて表示させたいのですが、
どうやればいいんでしょうか?
えっとたとえば、
1234
Apple
Banana
って書いてある別ファイル(.txt)をFileReaderでプログラムの中に読み込んで
このうち
Apple
Banana
のみをJtable内のボタンを押したときにJTextAreaに表示したいのです。
よろしければご教授くださいませ。
315 :
デフォルトの名無しさん:04/10/20 21:33:39
306さん、ありがとうございます。
実行したところ
2.java:23: 互換性のない型
検出値 : double
期待値 : java.lang.String
{ result = xx + yy; }
^
2.java:26: 互換性のない型
検出値 : double
期待値 : java.lang.String
{ result = xx - yy; }
^
2.java:29: 互換性のない型
検出値 : double
期待値 : java.lang.String
{ result = xx * yy; }
^
2.java:32: 互換性のない型
検出値 : double
期待値 : java.lang.String
{ result = xx / yy; }
というメッセージが出ます。
何とかしようと考えましたがどうしたらいいかわかりません。
どうすればこの問題を解決できますか?
>315
手元にあるJavaの入門書、特に「変数の型」について書いてある部分を読むと
幸せになれると思う。
とこれだけじゃ何だから、
> double xx, yy;
> String result;
と
> result = xx + yy;
をよーく見比べてみよう。
>>315 もうしわけない。
String result;
↓
double result;
に直してくれ。
318 :
デフォルトの名無しさん:04/10/20 22:30:29
316さん 317さん
プログラム修正後エラーが1つありましたが
今回は自分で解決することができました。
いろいろ教えてくれてどうもありがとうございました。
319 :
デフォルトの名無しさん:04/10/20 23:00:00
授業でロボコードやってるんですが
「乱戦の中敵や銃弾から逃げ回り、残りの敵が1体となったとき攻撃に移る」
ようなロボットを作らないといけないんです。
よろしくお願いします。
320 :
デフォルトの名無しさん:04/10/20 23:24:29
みんなハイレベルな問題やってますね・・・
>>319 ちょっと曖昧過ぎない?
逃げ回るアルゴリズムが肝だと思うんだが・・・
できるだけ距離を保つってのはどうだ
ヤンマーニ流せばいいじゃない
325 :
289:04/10/21 12:44:14
>297
あー、そうなっちゃいますよね。
ごめんなさい。。。
>298
返答遅くなって申し訳ありません。
あと、ご回答ありがとうございます!感謝です!
やはり、僕のすごい説明不足でした。ごめんなさい。
ルールとしては、与えられるコマンドライン引数は可変するものだと考え、
三桁ごとにカンマを入れていきます。
つまり、コンソール上で
java Test 123456789
と入力すれば、
123,456,789
と三つくぎりで出力され、
java Test 75612893
と入力すれば、
75,612,893
と出力されるコードです。わがまま言って、申し訳ないです。
どうか、よろしくお願いします。。。
>>325 import java.io.*;
public class Comma {
public static void main(String[] args) {
try {
System.out.print("Input number:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
for (int i = str.length()-3; i > 0; i -= 3) {
str = str.substring(0, i)+","+str.substring(i, str.length());
}
System.out.println("Result: "+str);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
327 :
289:04/10/21 14:18:32
>>326 さすがです!ありがとうございます!
僕にとっては複雑なコードなので、後でAPIリファレンスを見ながら勉強させて頂きます。
ただ、ここでも僕の説明下手が出ちゃったのですが、
コンソールではなく、コマンドプロンプトで、、、という考えに修正させてください(汁)。
コマンドプロンプトで、インタプリタを実行時にコマンドライン引数を使うということです。
コマンドプロンプトで以下のように
java Test 123456789
と入力したら、
123,456,789
と、三桁区切りで出力されるコードです。
ほんと、度々、すみません。。。
>>325 あのね、説明不足じゃなくてね、
最初の例は二桁目と五桁目でカンマが入っていて三桁ごとに
カンマが入ってなかったわけ。
だからみんなルールを確認していたわけ。
不足じゃなくて間違っていたんだよ、それ理解してる?
329 :
289:04/10/21 15:15:04
>>328 あ、そうですね。。。
今気がつきました。
みなさん、申し訳ないです。。。
330 :
M.B.:04/10/21 15:16:53
>>326 ……しかし何だな、C プログラマ生活が長かった漏れとしては、
Java のファイル I/O の表現っつーのはどうも馴染めんな。
もちろん、ただ FILE * と書いてあって何をするのかわからん C のほうが
設計として悪いっつーのは重々承知しとるんだが。
>330
バイトストリームと文字ストリームが切り分けられていて、
行指向文字ストリームなど扱おうとするとインスタンス生成のときマンドクサイが
慣れてみるとこれはこれで便利だお。
332 :
M.B.:04/10/21 15:25:06
>>331 > 慣れてみるとこれはこれで便利だお。
その境地にはまだ達しておりませぬ……ガクシorz
修行します。サンクス。
333 :
デフォルトの名無しさん:04/10/21 15:31:07
>>332 ストリーム自体、C++のパクリじゃないですか?
>>289 import java.text.*;
public class Test
{
public static void main(String[] args){
try{
long l = Long.parseLong(args[0]);
Format f = new DecimalFormat("#,###");
System.out.println(f.format(l));
for(int i=1; i<args.length; i++){
f = new DecimalFormat(args[i]);
System.out.println(f.format(l));
}
}
catch(ArrayIndexOutOfBoundsException ex){
System.out.println("値入れれ");
}
catch(NumberFormatException ex){
System.out.println("変なの入れるな");
}
}
}
長いのはむりぽ。
335 :
289:04/10/21 15:41:33
>>334 ありがとうございました。
最初に頂いた、ソースで自分なりにいじって出来るようになりました。
今回はすごく勉強になりましたです。
もう少し勉強して、出直します!でわでわ。
Channelがいいな。
>>333 Cから入るとなかなかiostreamを使う気にはならんよ
わざわざiostreamを使う利点といえば標準入力の入力チェックが出来るくらいだからなぁ・・・
338 :
デフォルトの名無しさん:04/10/21 18:32:28
640*480の画像の色相ヒストグラムを表示する方法を教えてください。
縦軸がピクセル数、横軸が色相です。
>>338 下記に色相ヒストグラムを表示するプログラムを書きますので
コピペしてコンパイルしてみてください。
package untitled60;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class Hue {
public static void main(String[] args) {
showGraph( getHueMap() );
}
static int[][] getHueMap() {
JFileChooser fc=new JFileChooser();
fc.showDialog(null, "イメージ選択");
File file=fc.getSelectedFile(); if(file==null) System.exit(0);
BufferedImage img=null;
try {
img=ImageIO.read(file);
} catch(Exception ex) {
System.exit(0);
}
int[] hMap=new int[100];
for(int y=0; y<img.getHeight(); ++y) {
for(int x=0; x<img.getWidth(); ++x) {
Color col=new Color(img.getRGB(x,y));
float[] hsb=Color.RGBtoHSB(col.getRed(), col.getGreen(), col.getBlue(), null);
++hMap[(int)(hsb[0]*100)];
}
}
int max=0;
for(int i=0; i<hMap.length; ++i) if(hMap[i]>max) max=hMap[i];
for(int i=0; i<hMap.length; ++i) {
hMap[i]=(int)((double)hMap[i]/max*100);
}
return new int[][] {hMap, {max}};
}
static void showGraph(int[][] param) {
int[] hMap=param[0];
int max=param[1][0];
BufferedImage graph=new BufferedImage(680,420, BufferedImage.TYPE_INT_ARGB);
Graphics2D g=graph.createGraphics();
g.setBackground(Color.white);
g.clearRect(0,0,graph.getWidth(),graph.getHeight());
g.setColor(Color.black);
g.drawRect(0,0,600,400);
for(int i=0; i<hMap.length; ++i) {
if(hMap[i]==0) continue;
g.setColor(Color.blue); g.fillRect(i*6, (100-hMap[i])*4, 6, hMap[i]*4);
g.setColor(Color.black); g.drawRect(i*6, (100-hMap[i])*4, 6, hMap[i]*4);
}
g.drawString("色相0", 0,416);
g.drawString("色相50", 280,416);
g.drawString("色相100", 550,416);
g.drawString(max+"ピクセル", 600,16);
g.drawString("0ピクセル", 600,400);
g.dispose();
JFrame frame=new JFrame();
JLabel label=new JLabel(new ImageIcon(graph));
frame.getContentPane().add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
343 :
古代帝國富士皇朝総帥・伯壬旭 :04/10/21 21:13:54
上記のプログラムを実行するとファイル選択ダイアグラムが出ますので、
適当なイメージファイルを選択してください。
そうすると、そのイメージの色相ヒストグラムが出ますので。
>>344 ほほほ。その通り。
私は宇宙神ザイン(時霊ザイン)でもある。
ちなみ富士皇朝は実在の組織だ。
>>345 マジかよ。
組織も何もない
>>345だけのオリジナル神のほうが好感が持てたが、
それはこのスレとは別の話だな。
さっそくコンパイルして
/*
<APPLET CODE="Hue.class" WIDTH=650 HEIGHT=500 >
</APPLET>
*/
とタグを埋め込んでappletviewerを起動したのですが
アプレットは初期化されていませんとでます何が間違えているんでしょうか?
>>348 アプレットじゃないから。
シェルから実行しる。
350 :
古代帝國富士皇朝総帥・伯壬旭 :04/10/21 22:01:49
いや、アプレットでない普通のアプリケーションなので
コンパイルした実行ファイルを、そのままjava.exeで起動してください。
Java.exeの引数教えてください。
352 :
古代帝國富士皇朝総帥・伯壬旭:04/10/21 22:26:04
>>351 アップレットに直したので、これをコピペしてアプレットで実行してください。
アプレットサイズは、横680、縦420で。
353 :
色相・その1:04/10/21 22:27:58
package untitled60;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class Hue extends JApplet {
public void start() {
showGraph( getHueMap() );
}
int[][] getHueMap() {
JFileChooser fc=new JFileChooser();
fc.showDialog(null, "イメージ選択");
File file=fc.getSelectedFile(); if(file==null) System.exit(0);
BufferedImage img=null;
try {
img=ImageIO.read(file);
} catch(Exception ex) { System.exit(0); }
int[] hMap=new int[100];
for(int y=0; y<img.getHeight(); ++y) {
for(int x=0; x<img.getWidth(); ++x) {
Color col=new Color(img.getRGB(x,y));
float[] hsb=Color.RGBtoHSB(col.getRed(), col.getGreen(), col.getBlue(), null);
++hMap[(int)(hsb[0]*100)];
}
}
int max=0;
for(int i=0; i<hMap.length; ++i) if(hMap[i]>max) max=hMap[i];
for(int i=0; i<hMap.length; ++i) hMap[i]=(int)((double)hMap[i]/max*100);
return new int[][] {hMap, {max}};
}
354 :
色相・その2:04/10/21 22:28:23
void showGraph(int[][] param) {
int[] hMap=param[0];
int max=param[1][0];
BufferedImage graph=new BufferedImage(680,420, BufferedImage.TYPE_INT_ARGB);
Graphics2D g=graph.createGraphics();
g.setBackground(Color.white);
g.clearRect(0,0,graph.getWidth(),graph.getHeight());
g.setColor(Color.black);
g.drawRect(0,0,600,400);
for(int i=0; i<hMap.length; ++i) {
if(hMap[i]==0) continue;
g.setColor(Color.blue); g.fillRect(i*6, (100-hMap[i])*4, 6, hMap[i]*4);
g.setColor(Color.black); g.drawRect(i*6, (100-hMap[i])*4, 6, hMap[i]*4);
}
g.drawString("色相0", 0,416);
g.drawString("色相50", 280,416);
g.drawString("色相100", 550,416);
g.drawString(max+"ピクセル", 600,16);
g.drawString("0ピクセル", 600,400);
g.dispose();
JLabel label=new JLabel(new ImageIcon(graph));
getContentPane().add(label);
setSize(label.getPreferredSize().width, label.getPreferredSize().height);
setVisible(true);
}
}
私は
>>351じゃないですけど、アプレットでやろうと思い
>>353-354をコピペ→コンパイル→アプレット実行したんですが
やはりNoClassDefFoundErrorでてしまいます。
何が原因かもわからないペーペーですいません。
Swing入ってないとか?
>>355 パッケージを意識してない罠とみた
ファイルは untitled60 というディレクトリに入ってて、javaコマンドを実行しているのは
そのディレクトリの一つ上のディレクトリでつか?
>>356 公開されているSwingのアプレットは問題なく実行できました
>>357 D:\JAVA\untitled60の中にHue.java
コマンドプロンプトから
C:\xxxxxxx\yyyyyyyy>d:
D:>cd\java
D:\JAVA>javac untitled60\Hue.java
D:\JAVA>appletviewer untitled60\Hue.java
としたんですがアプレットは初期化されていませんとでます。
これは思いっきり間違えてますか?
>>358 ・・・・・・・・・orz
いつからJavaはスクリプト言語になったのだろう?
・・・・・・・・orz
>>340-342のほうは実行可能でした
なぜアプレットのほうはできないんだ・・・・orz
>>363 わかりましたorz本当に申し訳ありません。勉強してきます
ここでふと疑問が
>>339さんの書いてくれたやつには色相0、50、100となってますが
色相は0°〜359°までのはずなんですがただの表記ミスってだけですよね?
それともこのコードだと100°までしかないんですかね?
365 :
M.B.:04/10/22 09:54:07
>>338 スレ違いどころか板違いだが解説しよう。
ここで言ってる「色相」はマンセルカラー(HSB系)の色相。
マンセル系では色をH(Hue)色相・S(Saturation)彩度・B(Brightness)明度で表し、
0.0 <= H < 1.0 (1.0は含まず)
0.0 <= S <= 1.0
0.0 <= B <= 1.0
つーことになっとるのよ。それを100で正規化してるワケ。
ちなみに明度・彩度の場合は、(sMap とか bMapとかやった場合)配列の次元を+1せんと、領域外参照になる。
詳細は「色 HSB系」あたりでググれ。
専門なのか?
367 :
M.B.:04/10/22 15:08:23
>>366 色覚とかに関係する画像処理プログラムを書いたときに、上司に教わった。
なんでも上司の親父さんが塗料製造会社で塗料の開発とかやってた人で、
家にはマンセル・カラーチャートやら『色材協会誌』やら『色の常識』(日本規格協会)やらが
普通にあったんだそうだ。
368 :
M.B.:04/10/22 15:15:49
ちなみに視覚情報処理関係のお奨めの文献は以下の二冊。
池田 光男/芦沢 昌子『どうして色は見えるのか―色彩の科学と色覚』
池田光男『眼はなにを見ているか―視覚系の情報処理』
(ともに平凡社)
M.B.殿よ。よくぞ補足してくれた。
そなたの富士皇朝への入朝を認め、帝士の資格を授与する。
371 :
M.B.:04/10/22 17:08:51
372 :
デフォルトの名無しさん:04/10/23 00:28:50
ウィンドウの作成で左上にあるコーヒーカップみたいなアイコンを
自分で書いたアイコンに入れ替えたいのですが
どうにも替わってくれません。
何が悪いのでしょうか?
373 :
デフォルトの名無しさん:04/10/23 00:29:57
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Lesson{
public static void main(String argv[]){
GameFrame gf=new GameFrame();
}}
class GameFrame extends JFrame{
MenuBar menubar;
Menu game;
Menu help;
MenuItem MenuItem1;
MenuItem MenuItem2;
MenuItem MenuItem3;
ImageIcon icon = new ImageIcon("ii.jpg");
GameFrame(){
setSize(500,500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("あ");
//ここでアイコンを入れ替えようとしています
ImageIcon icon = new ImageIcon("icon.jpg");
game = new Menu("あ");
help = new Menu("あ");
menubar = new MenuBar();
menubar.add(game);
menubar.add(help);
}}
374 :
デフォルトの名無しさん:04/10/23 01:06:45
すみません
上から16行目の
ImageIcon icon = new ImageIcon("ii.jpg");
は消し忘れです
375 :
デフォルトの名無しさん:04/10/23 01:23:28
>>373 setTitle("あ");
の次に
setIconImage(icon.getImage());
の一文を加えればOK
376 :
デフォルトの名無しさん:04/10/23 10:43:49
本当に宿題やってくれるんですか?
377 :
デフォルトの名無しさん:04/10/23 11:09:07
やりますよ〜
378 :
デフォルトの名無しさん:04/10/23 11:15:18
最近は宿題やりたがりコテハンが復活してきたので、どんどん
宿題文をコピペしてください。
379 :
372:04/10/23 11:35:55
>>375 ありがとうございます!
うまく動作しました
380 :
デフォルトの名無しさん:04/10/24 12:27:17
age
381 :
デフォルトの名無しさん:04/10/25 14:12:42
age
382 :
デフォルトの名無しさん:04/10/25 15:25:38
宿題を教えてもらいたいのですが・・・
>382
藻前さんが出された宿題の内容なんぞ誰もしらん。もっぺん先生に聞いといで。
中身が分かったらカキコしんさい。誰か答えてくれる(かもしれん)から。
384 :
デフォルトの名無しさん:04/10/25 16:01:01
>>383 どうもありがとうございます。
質問させてもらいます。
0,1,1,2,3,5,8,13,21,34,55,89、・・・の数列の規則性を
見つけて、この数列を1000より小さいものまで表示するプログラムを作成せよ。
お願いします。規則性すら分かりません・・・
>>384 フィボナッチ数列。
a(n) = a(n-1) + a(n-2)
386 :
デフォルトの名無しさん:04/10/25 16:07:06
>>385 どうもありがとうございます。
でも、それは習ってません・・・
>>386 習わなくてもわかれ。
public class Seq
{
public static void main(String[] args){
int a = 0;
int b = 1;
System.out.print(a+","+b);
for(int c; (c=a+b)<=1000; ){
System.out.print(","+c);
a = b;
b = c;
}
}
}
388 :
デフォルトの名無しさん:04/10/25 16:33:49
>>387 本当にありがとうございます!
感動して涙がポロリ。
訂正orz
public class Seq
{
public static void main(String[] args){
int a = 0;
int b = 1;
System.out.print(a+","+b);
for(int c; (c=a+b)<1000; a=b, b=c){
System.out.print(","+c);
}
}
}
390 :
デフォルトの名無しさん:04/10/25 16:41:59
391 :
デフォルトの名無しさん:04/10/25 16:47:19
どっちもできるはずなんだが・・・
393 :
デフォルトの名無しさん:04/10/25 18:47:48
394 :
デフォルトの名無しさん:04/10/25 19:31:30
お願いします!
学生数? 3
学生1の科目1の点数? 60
学生1の科目2の点数? 80
学生1の科目3の点数? 75
学生2の科目1の点数? 70
学生2の科目2の点数? 85
学生2の科目3の点数? 80
...
...
学生 科目1 科目2 科目3 合計
1 60 80 75 215
2 75 85 80 240
...
...
平均
最高
最低
何をお願いするというのだろう
396 :
デフォルトの名無しさん:04/10/25 20:17:23
>>395 失礼しました。
これを表示するプログラム(数字はキーボードで)を
教えてください。
397 :
デフォルトの名無しさん:04/10/25 21:42:18
式y=sqrt(x+4)のyの値を表示するプログラムを作りたいんですが、
x=0のとき、「正解!2」
x≠0のとき、「間違い!(他の数字)」
と表示させたんです。とりあえず、
import java.io.*;
class keisan{
public static void main(String args[]){
double x=0,y;
System.out.println("数値は?");
y = Math.sqrt(x+4);
x = keyInput.calc;
if(x== 0){
System.out.println("正解!"+y);
}
else{
System.out.println("間違い!"+y);
}
}
}
と考えたんですが、
x = keyInput.calc;
のところで、シンボルを解決できませんとエラーがでます。
どうすればいいか教えていただけないでしょうか?
399 :
M.B.:04/10/26 09:31:40
×keyInput.calc;
○keyInput.calc();
400 :
M.B.:04/10/26 09:41:25
>>397 そういう無意味な問題を出す教師を漏れんとこに連れてこい。
小一時間問い詰めてやる。
そもそも実数値を==で比較する基本的にイケナイ。
sqrt()の引数だったら負値、0.0、正値で分岐しる。その場合のみオッケー。
>>396 表示するだけならSystem.out.println()でも使えばいいじゃない
402 :
M.B.:04/10/26 13:56:07
>>394 import java.io.*;
public class Seiseki {
public static void main(String[] args) throws Exception {
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("学生数? ");
int gakuseisuu = Integer.parseInt(in.readLine());
if (gakuseisuu < 1) System.exit(1);
int [] kamoku1 = new int[gakuseisuu];
int [] kamoku2 = new int[gakuseisuu];
int [] kamoku3 = new int[gakuseisuu];
for (int cnt = 0;cnt < gakuseisuu;cnt += 1) {
System.out.print("学生" + (cnt + 1) + "の科目1の点数? ");
kamoku1[cnt] = Integer.parseInt(in.readLine());
System.out.print("学生" + (cnt + 1) + "の科目2の点数? ");
kamoku2[cnt] = Integer.parseInt(in.readLine());
System.out.print("学生" + (cnt + 1) + "の科目3の点数? ");
kamoku3[cnt] = Integer.parseInt(in.readLine());
}
403 :
M.B.:04/10/26 13:57:15
System.out.println("学生 科目1 科目2 科目3 合計");
for (int cnt = 0;cnt < gakuseisuu;cnt += 1) {
int goukei = kamoku1[cnt] + kamoku2[cnt] + kamoku3[cnt];
System.out.println((cnt + 1) + " " + kamoku1[cnt] + " " + kamoku2[cnt] + " " + kamoku3[cnt] + " " + goukei);
}
int souwa1 = kamoku1[0];int souwa2 = kamoku2[0];int souwa3 = kamoku3[0];
int saikou1 = kamoku1[0];int saikou2 = kamoku2[0];int saikou3 = kamoku3[0];
int saitei1 = kamoku1[0];int saitei2 = kamoku2[0];int saitei3 = kamoku3[0];
for (int cnt = 1;cnt < gakuseisuu;cnt += 1) {
souwa1 += kamoku1[cnt];souwa2 += kamoku2[cnt];souwa3 += kamoku3[cnt];
if (saikou1 < kamoku1[cnt] ) saikou1 = kamoku1[cnt];
if (saikou2 < kamoku2[cnt] ) saikou2 = kamoku2[cnt];
if (saikou3 < kamoku3[cnt] ) saikou3 = kamoku3[cnt];
if (saitei1 > kamoku1[cnt] ) saitei1 = kamoku1[cnt];
if (saitei2 > kamoku2[cnt] ) saitei2 = kamoku2[cnt];
if (saitei3 > kamoku3[cnt] ) saitei3 = kamoku3[cnt];
}
404 :
M.B.:04/10/26 13:57:50
System.out.println("科目1 科目2 科目3");
System.out.println("平均 " + (souwa1 / gakuseisuu) + " "+ (souwa2 / gakuseisuu) + " "+ (souwa3 / gakuseisuu) + " " );
System.out.println("最高 " + saikou1 + " "+ saikou2 + " "+ saikou3 + " " );
System.out.println("最低 " + saitei1 + " "+ saitei2 + " "+ saitei3 + " " );
}
}
405 :
289:04/10/26 14:01:14
すみません。
二日かけてもとけない宿題があるので、戻ってきました。。。
/*
java Test 123 578 5778 k89s 1234
引数(可変)をすべて足す。
ただし、以下のことを行う
1.アルファベットは除外する。
k89sの場合、89となる
2.全角の1〜9は半角数字とみなし、計算する
1234は1234となる。
上記の答は、
7802
*/
よろしければ、このコードを教えてください。
よろしくお願いします。
>>402 System.outが指すPrintStreamのインスタンスでautoflushが有効になっている
のはかならずしも仕様ではないから、ユーザの入力を促すプロンプトを
出したらflush()しておいたほうが好ましいね。
407 :
M.B.:04/10/26 14:10:42
>>394 設計イクナイ!!(・A・)入力間違エタドウスルカ!! 出題者ハ謝罪シル!!
408 :
M.B.:04/10/26 14:38:08
>>405 import java.util.*;
public class Test {
public static void main(String[] args) throws Exception {
final String nums = "0123456789";
final String zennums = "0123456789";
int sum = 0;
for (int cnt = 0;cnt < args.length;cnt += 1) {
StringBuffer buf = new StringBuffer("");
String arg = args[cnt];
for (int pos = 0;pos < arg.length();pos += 1) {
int idx;
if ((idx = nums.indexOf(arg.charAt(pos))) >= 0) {
buf.append(nums.charAt(idx));
continue;
}
if ((idx = zennums.indexOf(arg.charAt(pos))) >= 0) {
buf.append(nums.charAt(idx));
continue;
}
}
String str = buf.toString();
if (str.length() > 0) sum += Integer.parseInt(str);
}
System.out.println(sum);
}
}
409 :
289:04/10/26 15:46:50
>>408 ありがとうございます!
まだ試していませんが、後でソースながめながら走らせてみようと思います。
感謝です。
すみません〜
昨日宿題が出たんですが
do while文なんですけど
これをfor文とwhile文2つに直せという問題です
表示結果がまったく同じにといわれたので
やってみたのですが、こんがらがってしまったので助けてください;;
import java.io.*;
public class mondai {
public static void main(String[ ] args) {
int i = 1;
do {
System.out.print("\t"+(i));
i = i + 1;
} while (i < 10);
System.out.println();
i = 1;
do {
System.out.print(i);
int j = 1;
do {
System.out.print("\t" + (i*j));
j++;
} while (j < 10);
i++;
System.out.println();
} while (i < 10);
}
}
問題の意味がわからない。
do whileをforのみとwhileのみの二つ作れと?
これ全部をforとwhile一つづつにしろと?
StringBuffer buf = new StringBuffer("");
は電子透かしか?
>412
引数ごとに文字列バッファを初期化する以外の意味はないと思うが。
414 :
デフォルトの名無しさん:04/10/27 00:55:17
キーボードから5人分の国語、算数、理科のテストの点数を入力させ、科目ごとの点数を高い順に表示、および科目ごとの平均点を表示するプログラムを書け。
点数を入れるときに名前も入れられるようにして、点数順位が名前順で出てくるなどの工夫があるとなお良い。
名前を点数とまとめて処理する方法がわからなくて困ってます。助けてください。
415 :
デフォルトの名無しさん:04/10/27 01:36:01
あした、回答が出ますよ。。。。
あしたです。。。。
まっててください。。。
>>414 一応できたけど、汚くて見せられません。
書き直します。
public class Stat
{
private static final int NUMBER = 5;//人数
private static final String[] SUBJECT = {"国語", "算数", "理科"};//教科名 & 教科数
private static Data[][] list = new Data[SUBJECT.length][NUMBER];
private static void read()throws IOException{
String s = SUBJECT[0];
for(int i=1; i<SUBJECT.length; i++) s += " "+SUBJECT[i];
System.out.println("\"名前 "+s+"\"のように"+NUMBER+"人の値を入力してください");
for(int i=0; i<NUMBER ; i++){
System.out.println(i+1+"人目の値を入力してください");
System.out.print(":");
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));
st.eolIsSignificant(true);
st.nextToken();
String name = st.sval;
for(int j=0; j<SUBJECT.length; j++){
list[j][i] = new Data();
list[j][i].name = name;
st.nextToken();
list[j][i].point = (int)st.nval;
}
}
}
private static double getAverage(int subject){
int sum = 0;
for(int i=0; i<NUMBER; i++) sum += list[subject][i].point;
return (double)sum/NUMBER;
}
private static void print(){
for(int i=0; i<SUBJECT.length; i++){
System.out.println(SUBJECT[i]+" "+getAverage(i));
Arrays.sort(list[i]);
for(int j=0; j<NUMBER; j++) System.out.println(list[i][j].name+" "+list[i][j].point);
}
}
public static void main(String[] args)throws IOException{
read();
print();
}
}
>>414 いちばん上にこれを・・・orz
import java.io.*;
import java.util.*;
class Data implements Comparable{
String name;
int point;
public int compareTo(Object o){
return ((Data)o).point-point;
}
}
そして、もっといい方法があるかもしれない。
それと、408みたいに書くにはどうすればいいんだろう。
>>417 st.eolIsSignificant(true);は不要。
421 :
M.B.:04/10/27 09:32:02
>>419 行頭の半角スペースはHTMLの表示で除去されるので、
エディタを使って半角スペース二個を全角スペース一個で置換してから投稿。
コードとして利用するときは逆に全角スペース一個を半角スペース二個で置換。
ただしSunのコーディングルールだと1タブ8スペースのインデントで、
ネスト一段について1タブが推奨。
漏れは1インデント4スペース(タブ不使用)なので本当は変則。
なお、プリティプリンタ(プログラムを自動的にインデントするフィルタ)は、
(インデントのルールは各自決めるとして)演習問題として適当と思われ。
422 :
M.B.:04/10/27 09:53:48
>>410 (for 版 mondai.java)
import java.io.*;
public class mondai {
public static void main(String[ ] args) {
int i = 1;
for (;;) {
System.out.print("\t"+(i));
i = i + 1;
if (!(i < 10)) break;
}
System.out.println();
i = 1;
for (;;) {
System.out.print(i);
int j = 1;
for (;;) {
System.out.print("\t" + (i*j));
j++;
if (!(j < 10)) break;
}
i++;
System.out.println();
if (!(i < 10)) break;
}
}
}
423 :
M.B.:04/10/27 09:55:22
>>410 (while版 mondai.java)
import java.io.*;
public class mondai {
public static void main(String[ ] args) {
int i = 1;
while(true) {
System.out.print("\t"+(i));
i = i + 1;
if (!(i < 10)) break;
}
System.out.println();
i = 1;
while(true) {
System.out.print(i);
int j = 1;
while(true) {
System.out.print("\t" + (i*j));
j++;
if (!(j < 10)) break;
}
i++;
System.out.println();
if (!(i < 10)) break;
}
}
}
424 :
デフォルトの名無しさん:04/10/27 10:11:30
JBuilder起動したらスタックオーバーフローが起きやがった orz
425 :
M.B.:04/10/27 10:16:05
>>410 Javaの宿題スレにプログラム変換の修羅場を見た!
import java.io.*;
public class mondai {
public static void main(String[ ] args) {
int i = 1;
System.out.print("\t"+(i));
for (i = i + 1;i < 10;i = i + 1) {
System.out.print("\t"+(i));
}
System.out.println();
i = 1;
System.out.print(i);
int j = 1;
System.out.print("\t" + (i*j));
for (j++;j < 10;j++) {
System.out.print("\t" + (i*j));
}
i++;
System.out.println();
while(i < 10) {
System.out.print(i);
j = 1;
System.out.print("\t" + (i*j));
for (j++;j < 10;j++) {
System.out.print("\t" + (i*j));
}
i++;
System.out.println();
}
}
}
426 :
駒 :04/10/27 11:34:53
学生証番号を入力すると,学生証番号の最後についているアルファベットを 算出するプログラム
320135→Jでおながいしまつ。
427 :
駒 :04/10/27 11:35:48
学生証番号を入力すると,学生証番号の最後についているアルファベットを 算出するプログラム
320135→Jでおながいしまつ。
サンプルが一個じゃ作れん
429 :
デフォルトの名無しさん:04/10/27 11:44:21
そのJを導く規則あんの?
見てわかりませんか?
あの暗号デコード式ですよ。
マルチすんなよ、と釘を刺してここへ誘導したが
その前にマルチしてやがったかorz
……階段踏み外して落っこちて逝け
>>414 今思うとData.nameを入力順の番号にして、
名前の配列を参照させた方がよかったかもしれないです。
436 :
M.B.:04/10/27 13:10:22
437 :
M.B.:04/10/27 13:26:01
……ところで昔入ったプロジェクトで使ってたForteかなんかのエディタが、
スペース入力しても勝手にタブに置換しくさって、
しかもタブストップのデフォルトが8なもんだから、
プロジェクト全体が「1インデント1タブ8スペースタブストップ」で往生したような記憶があるのだが……
漏れの記憶違いか?
開発環境の話は該当スレでどうぞ
440 :
M.B.:04/10/27 13:41:29
>>434or2
ヒントは4桁の数字を入力し,各桁ごとの数字データに分解するプログラムらしいのでつが・・。
>441
public char test( String number ) {
number = number.substring( number.length() - 4 );
int count = 0;
for ( int i = 0; i < 4; i++ ) {
char ch = number.charAt( i );
count += ch - '0';
}
return (char)(count + 'A' );
}
>441
あのなあ……
最 初 か ら、 暗 号 化 ア ル ゴ リ ズ ム も 含 め て 宿 題 に な っ て る と 書 け
しかし底意地の悪い宿題だな。同情はするが。
宿題丸投げしようって腹のやつは、自分が何をわかってないか説明できないのが多い
丸投げなら問題文も丸投げしろ。
これで東大生だってんだからお笑いですね
計プロ1からやりなおせ
putchar('A');
System.out.print("OwO");
String OwO = "オンドゥルルラギッタンディスカー!!";
System.out.print(OwO);
お礼遅くなってスミマセン
M.B.さんありがとうございます
助かりました
>441
普通そんな規則なんぞ入学後数ヶ月程度で気づく。
それができないのはよっぽどの阿呆なのでとっとと南棟屋上あたりから飛び降りるなどしてください
by十数年前の指導員
453 :
M.B.:04/10/28 09:34:52
>>451 律儀なのは好感が持てるが、
> これをfor文とwhile文2つに直せという問題です
とかいった文意不明の質問をしてはイカン。
とりあえず問題文を読みこなして理解し、
自分の言葉で問題の内容を整理して、
「問題が解けん!」という認識を持ってから質問しる。
でなかったら問題文をコピペして、
「問題文の意味すらわからん!」と書け。
454 :
M.B.:04/10/28 09:46:13
ちなみに分かっとらんとツラいだろうが申し添えておくが、
>>422 と
>>423 は(漏れ的には)ネタである。
do 文ではループの最後で判断が行なわれるため、
条件判断をせずにループの中身が一回実行される。
だから、「i == 1 のときと j == 1 のときに比較が行なわれない」という
元のプログラムの動作(10を1に書き換えても1*1が出る)を尊重すると、
どうしてもループの中身を二度書くことになる。
そこを変えていいのなら、for文を使ってもっとシンプルに書ける。
for文とwhile文の書き換えは、機械的に行なえる。
455 :
M.B.:04/10/28 09:56:18
> for文とwhile文の書き換えは、機械的に行なえる。
【for か らwhile 】
仮に
for(int i = 0;i < n;i += 1) {ループの中身}
となってたら、
int i = 0;
while (i < n) {
{ループの中身}
i += 1;
}
※ループ変数 i のスコープを制限したいときは、全体を{}で括る。
【while から for】
while(条件式) → for(;条件式;)
456 :
M.B.:04/10/28 10:06:59
>>451 これが普通のforを使ったコードなり。
既知外じみたインデントは勉強だと思って自分で直すべし。
while版は
>>455を参考にすべし。
import java.io.*;public class mondai {
public static void main(String[ ] args) {
for (int i = 1;i < 10;i += 1) { System.out.print("\t"+(i));
} System.out.println();
for (int i = 1;i < 10;i += 1) { System.out.print(i);
for (int j = 1;j < 10;j += 1) { System.out.print("\t" + (i*j));
} System.out.println();
}}}
暇そうだな
458 :
デフォルトの名無しさん:04/10/28 11:44:06
宿題教えてもらったらお礼を言わなきゃいけないんですか?
459 :
M.B.:04/10/28 11:48:09
>>457 暇なんだよ。だれか宿題出してくれよ。
>>458 とりあえず、
「助かりました! 本当にありがとうございました!」と書いておけば、
次も助けてもらえる確率が上がると思われ。
それが大人の判断というものだ。
460 :
デフォルトの名無しさん:04/10/28 11:59:21
>>459 >暇なんだよ。だれか宿題出してくれよ。
「入力した多項式のグラフを描くプログラムをつくれ。範囲は問わないが、素直じゃなかったら減点。」
宿題じゃなくてお題スマソ。暇だったらやってくれ。
コードを読んで勉強したいです。
462 :
デフォルトの名無しさん:04/10/28 14:34:46
【課題】
食べ物に関するアンケートの回答をひとつずつ順番に入力します。
すべてを回答(入力)
すると、入力された情報の一覧を表示するプログラムを作成しなさい
質問の順序は問わないものとし、質問には必ず回答するものと考えてよい。
仕様1
プログラムの起動は以下のようにする
>java FoodResearch "パラメータ名"
仕様2
プログラムは以下のようにする。
"TypeA":好きな食べ物・嫌いな食べ物を質問する
"TypeB":好きな食べ物・嫌いな食べ物・今食べたいものを質問
"help" :プログラムの使い方を(パラメータの説明)表示
仕様3
このプログラムの使い方は次のようにする
1。ユーザーがパラメータを指定してプログラムを起動する
2。プログラムはパラメータで指定された項目の入力を促す、メッセージを表示
3。ユーザはプログラムに指定された項目を入力する
4。すべての項目を入力するとシステムは入力された項目の一覧を表示して終了する
463 :
デフォルトの名無しさん:04/10/28 14:37:20
つづき…
仕様4
パラメータがついていない場合、存在しないパラメータが指定された場合は、エラー
メッセージを表示して、プログラムを終了する
仕様5
ソースコードはクラスごとにファイルお作成する。ひとつのファイルに複数のクラス
を記述してはいけない
追加昨日
好きな寿司ネタ・嫌いなすしネタ・こんなすし屋は嫌だ、を質問するパラメータ
"TypeC"を追加せよ。
お願いします(*´Д`*)ハァハァ
入力された項目の一覧って、そのままでいいの?
465 :
デフォルトの名無しさん:04/10/28 14:53:03
授業中なんです。
子宮!お願いします
(((((( ゜д゜))))))
466 :
デフォルトの名無しさん:04/10/28 14:57:06
ヨコボウくらい敷いたら絵になると思いますがたぶんそのままでもモウマンタイだと思いますヽ(´ー`)ノ
>465
……ちょっと待てい。
現在進行形で授業中、で、授業中に完成させんといかんのか?
タイムリミット教えれ。できそうならやるが。
468 :
M.B.:04/10/28 15:01:49
>>461 巾乗は^を使うのか**を使うのか。
項と項の間の*は省略できるのかできないのか。
2.0*x^2+3.0*y^2なんていうのも多項式だが、
こういうのは三次元表示でもするのか。
もうちょい練った問題持ってきてくれ。
469 :
デフォルトの名無しさん:04/10/28 15:02:55
あと1時間くらいです!どうもまことにすいません
>>469 とりあえずつくってみたけど、用件を満たしているのか疑問。
import java.io.*;
public class FoodResearch
{
private static final String[] typeA = {"好きな食べ物は?", "嫌いな食べ物は?"};
private static final String[] typeB = {"好きな食べ物は?", "嫌いな食べ物は?", "今食べたいものは?"};
private static final String[] typeC = {"好きな寿司ネタは?", "嫌いな寿司ネタは?", "どんな寿司屋が嫌だ?"};
public static void main(String[] args)throws IOException{
if(args.length != 1){
System.out.println("エラーです。");
return;
}
String[] question;
if(args[0].equals("help")){
System.out.println("こしょこしょ。授業中なのか!");
return;
}
else if(args[0].equals("TypeA")){
question = typeA;
}
else if(args[0].equals("TypeB")){
question = typeB;
}
else if(args[0].equals("TypeC")){
question = typeC;
}
else{
System.out.println("エラーだ。");
return;
}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] answer = new String[question.length];
for(int i=0; i<question.length; i++){
System.out.println(question[i]);
answer[i] = br.readLine();
}
for(int i=0; i<question.length; i++){
System.out.println(question[i]+" "+answer[i]);
}
}
}
473 :
デフォルトの名無しさん:04/10/28 15:27:08
か、か、神降臨!
まさにキタ━(゜∀゜)━━!!って言う奴ですね。
更新ボタン何回押したことか
474 :
デフォルトの名無しさん:04/10/28 15:29:07
どうもです!
今コピペしてコンパイル中です!
ありがとうございましたぁっ!
475 :
M.B.:04/10/28 15:33:02
>>469 糞っ!出遅れたぜ。
import java.io.*;
import java.util.*;
public class FoodResearch {
public static void main(String [] args) throws Exception {
if ((args.length != 1) || (args[0].equals("help"))) {
System.err.println("java FoodResearch \"パラメータ名\"");
System.err.println("パラメータ名:TypeA, TypeB, TypeC, help のいづれか");
System.exit(-1);
}
final String [] QuesA = {"好きな食べ物は?", "嫌いな食べ物は?" };
final String [] QuesB = {"好きな食べ物は?", "嫌いな食べ物は?", "今、何が食べたい?" };
final String [] QuesC = {"好きな寿司ネタは?", "嫌いなすしネタは?", "「こんな寿司屋は嫌だ!」という寿司屋はどんな店?" };
String [] Ques = null;
if (args[0].equals("TypeA")) Ques = QuesA;
if (args[0].equals("TypeB")) Ques = QuesB;
if (args[0].equals("TypeC")) Ques = QuesC;
if (Ques == null) {
System.err.println("パラメータ名:TypeA, TypeB, TypeC, help のいづれか");
System.exit(-1);
}
ArrayList answer = new ArrayList();
for (int cnt = 0;cnt < Ques.length;cnt += 1) {
System.out.print(Ques[cnt]);
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
System.out.flush();
answer.add(in.readLine());
}
System.out.print(answer.toString());
}
}
>>468 スマソ。
巾乗は^で、項の間の*は省略可能で、
1元の多項式でやってくだされ。
477 :
デフォルトの名無しさん:04/10/28 15:37:22
エラーが…っ!
型の開始が不正です
identfierがありません
とか計4つ
先越された……orz
>>477 全角スペースを半角スペースまたはtabにちゃんと直したか?
480 :
デフォルトの名無しさん:04/10/28 15:47:40
直しましたっ!
でも(´・ω・`)
つか2個目のでできました!
神いすぎ。あんたら最強や
481 :
デフォルトの名無しさん:04/10/28 15:56:49
イッコメのやつはブレスの数が違ってただけでした、こちらがわのミスですさぁ
皆さんどうもわざわざありがとうございました
483 :
M.B.:04/10/28 16:02:21
>>476 式の解析だけでも結構面倒なんだがな(-_-!)。
それに、範囲はどうする。-1.0〜1.0とか-π〜+πとかいろいろあるが。
変曲点求めて値の範囲求めて表示域決めて正規化して目盛振って……とかやってもいいんだが、
それやってると数学的にもけっこう複雑になって、
しかも数式処理に近いことまでやるからけっこうウザいプログラムになるぞ。
数値計算の勉強したかったら、戸川隼人先生の
『微分方程式の数値計算』と『UNIXワークステーションによる科学技術計算ハンドブック』(Cのソースつき)でも
読んだほうがいいんじゃないか?
でなかったらマンデルブロア集合とかジュリア集合とかの計算とか、
小分かりのしそうな例題は他にありそうに思うが。
>>483 わかった。レスありがとう。
数値計算は面倒そうな雰囲気だし、Javaによるアルゴリズム事典でも読んで遊ぶことにするよ。
NO1,Hogeo
NO2.Hogeko
NO3.hogehoge
とかいう感じで一回ファイルに保存させて(プログラム中で最初に保存させる)
JTextField二つと検索ボタンと書き込みボタンがあり
片方のJTextField1にNO1と打ち込み検索ボタンを押したら最初に保存させたファイルの中を検索して
もう一つのJTextField2にHogeoと表示させ、JTextField2のHogeoをHoooとか適当に変えて書き込みボタン押したら
新しくファイルに保存し直したいんですけど
どうやってファイルに保存してどうやってファイルの中を検索すればいいですか?
>486
そこURL削ったらすごいな……
D言語にObjective-Cまで書いてるよ
マカーでもなさそうなのになにゆえ??
職業、情報技術者って書いて歩けどマカーじゃないの?
本を出してるのにこれだけ載せてくれるのはありがたいね。
二十歳そこそこなのにかなり儲かってそうだね。ウラマシー
ブックマークしてあったけど、おれよりたった2つ上だったのか。
おれも大学なんて行ってる場合じゃない・・・のか?
javaとmysqlを使って
1.名前
2.生年月日(yy/mm/dd)
3.部署コード
4.給料
を繰り返し入力して、データベースを作るプログラムを作りなさい。
部署は部署コードを主キーにして部署名を表示させます。
機能として入力と閲覧、変更、削除を出来るようにすること。
という宿題が出ました。
dos窓で操作します。
javaからmysqlを操作する方法がまったく分かりません。誰か助けてくださいm(_ _)m
492 :
M.B.:04/10/29 10:12:33
>>491 Javaのデータ構造の一部としてデータベースを利用する方法もありますが、
通常は SQL のコードを DB に向かって吐きます。
詳細は "JDBC Java MySQL" でおググりなさい。
493 :
M.B.:04/10/29 10:18:06
>>481 いまさら言っても詮無いが
ファイルのオープンはfor文の前に移動
……無念 orz
>>486-487 JavaはC++と同じ記述が出来ない上に遅いからグズ。
とか煽っておきながら、オブジェクト指向の話が大嘘。
Objective-CとObjective-C++を混同してるし、
言語仕様と実装の区別がつかないみたいでgcc独自部分を言語仕様と誤解してる。
初心者が読むのは危険ナリ。
つーか、典型的な言語マニアじゃん。
>>486の人って。
書いてあるのは初級〜中級レベルの事だけだし、それなら
一つの言語につき2週間くらいで学べる。問題はそこからなんだけどね。
しかし、猫娘がかわいいので許す。ハァハァ。。。
497 :
デフォルトの名無しさん:04/10/29 23:36:28
はじめまして。課題でわからないところがあるのでカキコします。
Javaの問題です。
『int型の変数a,bにデータを入力し、反復によりa÷bの商を求める。
ただし、小数点第一位で四捨五入し、答えは整数である。』
ついでにa,bは手入力ってことで。商は求められたんですけど、
四捨五入がどうやってやるかわかりません。どうか教えてください。お願いします。
>言語マニア
んだな。ここまで来たら是非SmallTalkもやってもらいたいw
498は>496ね。スマソ。
迷惑掛けついでに>497
「四捨五入」って具体的に数値をどうすること?
まずそれを日本語で書いてみて、それからそれをどうやってJavaで書くか考えてみ。
(まぁ」四捨五入は定型句があるけど、それをポンと書いてもなんだかなと思うので)
double c = double(a/b);
(c/1) > 0.5 ? c+0.5 : ('A' )
501 :
デフォルトの名無しさん:04/10/30 00:13:23
a/b + ((a%b)*2 >= b ? 1 : 0)
こんな課題を自分で考えているのですが、なかなかできません・・・
「MySQLのDBに登録した座標(40,40)をAWTアプレットで表示させる」
座標の点は画像を表示させています。
アプレットだけなら簡単に作れました。また、MySQLに登録した座標を
Javaから呼び出すことにも成功しました。
多分、この2つを合わせればいいのでしょうが・・・どうかお願いします。
そこまでできて何ができないのか
う〜ん、ソースを見てもらった方が良いのでしょうか?
どうやって組み合わせればいいのかさっぱりさっぱり。
505 :
デフォルトの名無しさん:04/10/30 12:23:27
デフォルトではAWTはMySQL等を使えないんじゃないか?
Swingでやった方がいいと思うがね
506 :
デフォルトの名無しさん:04/10/30 12:40:02
>>500-501 反復でって書いてあるから割り算を筆算で行う際の過程を
そのままたどれって課題かなと俺は思った。
皆様どうも始めまして。早速質問なのですが、
↓のコードをimmutableにせよっていう宿題なのですが・・・・テストケースも貼らせていただきます。
import java.awt.Point;
public class Passenger {
private int id;
private Point pickupLocation;
private Point deliveryLocation;
public Passenger(int aId, Point pickup, Point destination)
{
if ((pickup == null) || (destination == null))
throw new NullPointerException();
id = aId;
pickupLocation = pickup;
deliveryLocation = destination;
}
public Point getDeliveryLocation() {
return deliveryLocation;
}
public int getId() {
return id;
}
public Point getPickupLocation() {
return pickupLocation;
}
}
import java.awt.Point;
import junit.framework.TestCase;
public class ImmutablePassengerTest extends TestCase {
Passenger passenger;
final int id = 2663;
Point pickup;
Point destination;
protected void setUp() throws Exception {
super.setUp();
pickup = new Point(1, 1);
destination = new Point(2, 2);
passenger = new Passenger(id, pickup, destination);
}
private void checkImmutable() {
assertEquals("pickupLocation.x", 1, passenger.getPickupLocation().x);
assertEquals("pickupLocation.y", 1, passenger.getPickupLocation().y);
assertEquals("deliveryLocation.x", 2, passenger.getDeliveryLocation().x);
assertEquals("deliveryLocation.y", 2, passenger.getDeliveryLocation().y);
}
511 :
509:04/10/30 13:35:05
>>510 の続きです・・・・。
public void testModifyConstructorParams() {
pickup.x = 0;
pickup.y = 0;
destination.x = 0;
destination.y = 0;
checkImmutable();
}
public void testModifyGetResult() {
Point p = passenger.getPickupLocation();
p.x = 0;
p.y = 0;
Point d = passenger.getDeliveryLocation();
d.x = 0;
d.y = 0;
checkImmutable();
}
}
よろしくお願いします。
512 :
>>509の回答:04/10/30 13:56:55
import java.awt.Point;
public class Passenger {
private int id;
private Point pickupLocation;
private Point deliveryLocation;
public Passenger(int aId, Point pickup, Point destination)
{
if ((pickup == null) || (destination == null))
throw new NullPointerException();
id = aId;
pickupLocation = new Point( pickup );
deliveryLocation = new Point( destination );
}
public Point getDeliveryLocation() {
return new Point( deliveryLocation );
}
public int getId() {
return id;
}
public Point getPickupLocation() {
return new Point( pickupLocation );
}
}
>>512 すげー!テストパスした!本当にありがとうございます!!
もう一問あるのですが、そっちはとりあえずこれを参考にがんばってみようとおもいます!!!
もし無理だったらまた質問させてください・・・。
本当にありがとうございました!
今見てみてちょっと疑問に思ったのですが、インスタンスフィールドのpickupLocationとdeliveryLocation
はfinalじゃなくてもいいのですか?
514 :
デフォルトの名無しさん:04/10/30 15:57:52
わかりました!ありがとうございます!
今もう一個もやってるのですが・・・・・わかんない・・・・。
もうちょっとがんばってみます。
516 :
514:04/10/30 16:04:52
>>513 訂正です。
言われる通り、finalの方がいいと思います。
C: \...> java ren72 [Enter]
□■□■□■□■□■□■
階乗の値を求めてみるのさ
■□■□■□■□■□■□
整数nの階乗の値を求めてみます!
整数nの値を入力しておくれやす
n => 3 [Enter]
---------------------------
3の階乗の値(3!)は6でござる!
---------------------------
C: \...>
以上お願いします。
import java.io.*;
class Sample_00 {
BufferedReader br;
public Sample_00() {
br = new BufferedReader(new InputStreamReader(System.in));
}
private String dataInput() {
try {
return (br.readLine());
}
catch(IOException e) {
System.out.println("IOエラー" + e);
}
return null;
}
public int kaijou(int num) {
int kNum=1;
for(int i=2; i <= num; i++) {
kNum *= i;
}
return kNum;
}
private void start() {
boolean flag=false;
int kNum=0;
String buff="";
System.out.println("階乗の値を求めるプログラム\n");
while(true) {
System.out.print("n = ");
if((buff=dataInput())==null) continue;
try {
kNum = Integer.parseInt(buff);
}
catch(NumberFormatException e) {
System.out.println("\n数字のみ入力してください\n");
continue;
}
if(kNum <= 2) {
System.out.println("n に代入する値は 2 より上を入力してください");
continue;
}
System.out.println("\n---------------------");
System.out.println(kNum + "の階乗(" + kNum + ")の答えは");
System.out.println(kaijou(kNum));
System.out.println("---------------------\n");
while(true) {
System.out.println("\n\nもう一度計算しますか? [yes!=終了]");
if((buff=dataInput())==null) continue;
if(!(buff.equals("yes"))) flag=true;
else flag=false;
break;
}
if(flag) break;
}
System.out.println("\n終了します。");
}
public static void main(String[] args) {
new Sample_00().start();
}}
>>518 一応動いた、汚いけど我慢してくだはい
すみません・・・2問目も質問させてください・・・・
またImmutableなのですが、とりあえずスーパークラス、サブクラス、テストケースすべてはらせて頂きます。
import java.awt.Point;
import java.util.Date;
public abstract class Event {
private Date date;
private Passenger passenger;
public Event(Passenger aPassenger){
assert aPassenger != null;
date = new Date();
passenger = aPassenger;
}
public abstract Point getLocation();
public Date getDate(){
return date;
}
public Passenger getPassenger() {
return passenger;
}
}
2つのサブクラスです。
import java.awt.Point;
public class PickupEvent extends Event {
public PickupEvent(Passenger aPassenger) {
super(aPassenger);
}
public Point getLocation() {
return getPassenger().getPickupLocation();
}
}
と
import java.awt.Point;
public class DeliveryEvent extends Event {
public DeliveryEvent(Passenger aPassenger) {
super(aPassenger);
}
public Point getLocation(){
return getPassenger().getDeliveryLocation();
}
}
524 :
522:04/10/31 10:30:18
テストケースです。
import java.awt.Point;
import java.util.Date;
import junit.framework.TestCase;
public class ImmutableEventTest extends TestCase {
Passenger passenger;
final int id = 2663;
Point pickup;
Point destination;
PickupEvent pickupEvent;
DeliveryEvent deliveryEvent;
protected void setUp() throws Exception {
super.setUp();
pickup = new Point(1, 1);
destination = new Point(2, 2);
passenger = new Passenger(id, pickup, destination);
pickupEvent = new PickupEvent(passenger);
deliveryEvent = new DeliveryEvent(passenger);
}
public void testModifyPickupEventDate() {
Date pickupDate = pickupEvent.getDate();
pickupDate.setDate(0);
assertFalse("modified date",
pickupDate.equals(pickupEvent.getDate()));
}
public void testModifyDeliveryEventDate() {
Date deliveryDate = deliveryEvent.getDate();
deliveryDate.setDate(0);
assertFalse("modified date",
deliveryDate.equals(deliveryEvent.getDate()));
} }
です。どうぞよろしくお願いします。
525 :
502:04/10/31 11:07:17
すいません、1日ずっと考えてたんですが、どうしても出来ないので
コード貼ります
/* <applet code="Nagarebosi.class"
width="400" height="500"></applet>
*/
import java.awt.*;
import java.applet.*;
import java.sql.*;
public class Graph extends Applet{
Image back,hosi;
public void init(){
//背景を取得
back = getImage(getDocumentBase(),"back.jpg");
//星を取得
hosi = getImage(getDocumentBase(),"hosi.gif");
}
public void paint(Graphics g) {
//イメージファイルを表示
g.drawImage(back,10,10,this);
g.drawImage(hosi,60,50,this);
}
}
こちらがMySQL用に作ったものです。
MySQLに登録している座標を元に星を動かしたいのですが・・・
どうやれば動くのかわかりません・・・
よろしくお願いします。
import java.sql.*;
public class zahyou {
public static void main(String[] args) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql://localhost/kadai?user=root&useUnicode=true&characterEncoding=SJIS";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String sql = "select * from hosi where date = 40";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int date = rs.getInt("x");
int kai = rs.getInt("y");
System.out.println(x + " " + y);
}
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
すいません、525の9行目はGraphではなくNagarebosiでした
528 :
デフォルトの名無しさん:04/10/31 12:12:13
>>522 522のコードをこうすればOK
import java.awt.Point;
import java.util.Date;
public abstract class Event {
private Date date;
private Passenger passenger;
public Event(Passenger aPassenger){
assert aPassenger != null;
date = new Date();
passenger = aPassenger;
}
public abstract Point getLocation();
public Date getDate(){
return new Date( date.getTime() ); //←ここだけこう変える
}
public Passenger getPassenger() {
return passenger;
}
}
529 :
522:04/10/31 12:23:36
>>528 どうもありがとうごいます!
だめだー、ぜんぜんわかりません・・・・。
もしよろしければなぜこうなるのか簡単でいいので
説明していただけたりしないですか?おねがいします・・・。
いろいろサイトを漁っていたのですが、ぜんぜんいい所が見つからず・・・。
530 :
>>526 その1:04/10/31 13:15:24
public class Nagarebosi extends Applet {
Image back,hosi;
int date, kai;
public void init() {
final Timer timer=new Timer();
back = getImage(getDocumentBase(),"back.jpg");
hosi = getImage(getDocumentBase(),"hosi.gif");
String url = "jdbc:mysql://localhost/kadai?user=root&useUnicode=true&characterEncoding=SJIS";
String sql = "select * from hosi where date = 40";
try {
Class.forName("org.gjt.mm.mysql.Driver");
final Connection con = DriverManager.getConnection(url);
final Statement stmt = con.createStatement();
final ResultSet rs = stmt.executeQuery(sql);
TimerTask task=new TimerTask() {
public void run() {
try {
if(!rs.next()) {
stmt.close(); con.close(); timer.cancel(); return;
}
date = rs.getInt("x");
kai = rs.getInt("y");
repaint();
} catch (Exception e) { e.printStackTrace(); }
}
};
timer.schedule(task, 1000, 500);
} catch (Exception e) { e.printStackTrace(); }
}
531 :
>>526 その2:04/10/31 13:16:02
public void paint(Graphics g) {
g.drawImage(back,10,10,this);
g.drawImage(hosi,date,kai,this);
}
public void update(Graphics g) {
paint(g);
}
}
532 :
デフォルトの名無しさん:04/10/31 13:21:22
>>529 自分のクラスが所持してるデータをそのまま渡すのではなく
そのデータをもとにして新しいオブジェクトを作成して、それを渡せば
自分が所持してるデータと、相手に渡したデータは、内容は同じですが
全く別個のものになりますので、結果的にinmutableになります。
534 :
533:04/10/31 14:00:59
質問書き忘れました・・・。
テストのほうはsetDate()後にgetDate()で返ってくる値を求めている(?)のですが、
EventのほうでgetTime()を使用したのはなぜでしょうか?
getTime()は月、日にち、年などすべて返すからなんでしょうか?
わかりづらかったらごめんなさい。
>530 様
ありがとうございます!これから試してみます!
536 :
デフォルトの名無しさん:04/10/31 15:08:21
>>534 Eventクラスが所持するDate型オブジェクトdateと同じ内容の
新しいDate型オブジェクトを作成する為には、dateの情報が必要と
なります。つまりDate#getTime()で得られるlong値(1970年1月1日からの
ミリ秒数)が必要なのです。
getTime()で得られるlong値を、新しくDate型オブジェクトそ作成する時の
コンストラクタの引数に指定すると、Eventクラスが所持するdateと
同じ内容のDate型オブジェクトができるのです。
同じオブジェクトを作成する為の情報を得る為にgetTime()を使ってるのです。
>>536 Date.clone()の方がいいのでは?
リファレンス読めばわかることを平気で聞くのはなぜなんでしょうか?
というかリファレンスの存在も教えないクズ教師ばっかりなのはなぜ?
メソッドを定義する時、voidにする場合と値を返す場合とで
それぞれ具体例をあげてどう使い分けたらいいか述べよ
>>538 私は2〜3回目の講義で紹介しているよ。
542 :
526:04/11/01 01:41:13
たびたびすいません、530-531のコードのエラーがどうしても取れません・・・
543 :
デフォルトの名無しさん:04/11/01 02:55:05
>>536 わかりやすい説明どうもありがとうございます!
いつも英語での授業なので日本語で説明されると・・・嬉し涙が・・・・。
>>538 まぁまぁお茶でも飲んで落ち着いて
つ旦
545 :
M.B.:04/11/01 09:52:20
>>497 div.java
public class div {
public static void main(String [] args) throws Exception {
if (args.length < 2) System.exit(1);
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int x = a + a + b;
int y = b + b;
int syou = 0;
while (x >= y) {
x -= y;
syou += 1;
}
System.out.print(syou);
}
}
546 :
M.B.:04/11/01 10:06:54
>>539 > メソッドを定義する時、voidにする場合と値を返す場合とで
> それぞれ具体例をあげてどう使い分けたらいいか述べよ
同じです。
voidの場合はvoidという値が常に帰ってくるというだけです。
Cと違って、intをvoidで受けて無視するようなマネはJavaではできません。
問うなら例外が起きたときに値で返すか例外を投げるか、
そっちの方を問いましょう。
> voidの場合はvoidという値が常に帰ってくるというだけです。
……
>>546 戻り値の型にvoidを指定するということは、void型の戻り値があるというわけでは
なく、戻り値がない、ということを示す。それはCでも同じはずだけど、もしかして
void*と勘違いしてない? それからJavaでも戻り値のあるメソッドを、戻り値を
無視して実行することは可能だし、List#removeとか無視する場合のほうが多い
メソッドもある。
549 :
デフォルトの名無しさん:04/11/01 13:04:51
>>542 そ、そんな。。。
どこで、どうエラーが出るのですか?
550 :
M.B.:04/11/01 13:28:55
>>548 空集合も集合のうち。
戻ってきた値を利用するかしないかはプログラマの勝手だが、
それなりの理由があって値を返しているはずだから、
できればチェックしておくのが安全だし、
利用しないにしても変数で受けて「不使用」とコメントするぐらいのことは
しておくのが親切。
本当の意味で「戻り値がない」というのは、exit()くらいのものだと
個人的には思っている。
(個人的には、Cプログラマー時代に
「printf()の戻り値をチェックしていないのはデバッグ用出力」
とかいった使い方までしていた。本人もやりすぎだと思ったが。)
551 :
M.B.:04/11/01 13:47:42
そういえばつい先日も Java で make を書いたのでつが
Runtime.getRuntime().exec()の戻り値を拾い忘れて
エラー出力は喰われっちゃうわ、
ちょいと時間のかかる処理があるとその先の前提条件が成立しないわで、
しばらくmakeの役に立ちまへんでした。
lint みたいに「戻り値取ってないぞ」「使ってない変数があるぞ」とか、
小うるさい警告を出してくれる javac のオプションはないのかにゃ?
>>549 すいません、当方の単純なミスでした・・・
バッチリ動きました!ありがとうございます!
554 :
M.B.:04/11/01 15:11:39
> #ところで、「intをvoidで受けて無視する」ってのはどういう意味?
C という言語は「値渡し用の汎用レジスタが一個だけある」状況を想定して設計されてて、
「汎用レジスタに残ってる値がとりあえずの戻り値」(それでも足りないときは
スタックに積む)で、
しかも「レジスタの中身は int とアドレスのどっちと解釈してもオッケー」
というカラクリになっています
(つまり配列の添え字をマイナスにしてシステム領域に手を突っ込んだりする荒業も可能)。
だから、呼ばれる側が int や アドレスを返していたとして、
呼ぶ側が void で宣言すると、それは「レジスタの中身を考慮しません」という宣言になります。
これを逆にいうと、「レジスタの中に何が入ってても無視します」っていう意味になるわけ。
Java の場合は、現行の仕様では「0 個以上 1 個以下の値を戻せます」ということに
なっていて、実行時に引数の型と個数が厳密にチェックされます。だから、
呼ぶ側で void を宣言してると、呼ばれる側も void で辻褄を合わせないといけません。
反面、オブジェクトに関しては、とりあえずオブジェクトで受けておいてから、
呼ぶ側で型のチェックをしてから、戻り値の型に応じて
ダウンキャスト(ナローイング)して利用するということもできます。
Cの話は処理系依存の話だと思うし、そもそもなんでレジスタレベルの話を
しなきゃいかんのかわからんのだが、ISO/ANSI仕様までは知らないので
置いておきます。
>Java の場合は、現行の仕様では「0 個以上 1 個以下の値を戻せます」ということに
なっていて、実行時に引数の型と個数が厳密にチェックされます。だから、
呼ぶ側で void を宣言してると、呼ばれる側も void で辻褄を合わせないといけません。
「呼ぶ側でvoidを宣言する」ってどうやるの? 戻り値を受ける変数を宣言
しないってこと? もしそうなら、「呼ばれる側も void」なんてことない
でしょ?
556 :
M.B.:04/11/01 15:37:59
> 必要ならチェックするし、不要ならチェックしないというのは
> 当たり前のことではないですか?
私の場合、チェックするしないの問題よりも、
呼ぶ側で戻り値を受けていないと、「そこだけを見た場合に」、
そのメソッドが void なのか、それとも戻り値があるんだけど
利用していないのかが分からない点を重視しています
(「そのくらい調べろ」っていう意見もあるかもしれないけど)。
だから、「戻り値を利用しないのが一般的な場合」を除いて、
*戻り値を受けていなければ、戻り値は 0 個。
*戻り値があっても利用しない場合は、その場で宣言して戻り値の型を明確にし、
なおかつその用途が分かるような名前を付ける。
というのが親切かと。
それに、デバッガ使って追いかけるときにも、そうやっとくと便利そうだし
(私はデバッガ使わないけど)。
557 :
M.B.:04/11/01 15:49:50
>>555 前スレ 423〜425 でも参照してくらはい。
ついでに藤本裕之『叫ぶ! C プログラマ―プロが説くC のカラクリと落とし穴』
の第 VI 章の『「printf()」が書けますか?』も参考にしていただけると
ありがたく思います。
(ついでながら ANSI C だと main() は int 型)
558 :
デフォルトの名無しさん:04/11/01 16:02:51
Javaの宿題を無料でやってくれるスレは
ここですか?
559 :
M.B.:04/11/01 16:17:25
>>555 ファイル Foo.java
public class Foo {
public static void main(String[] args) {
Bar bar = new Bar();
bar.baz();
}
}
ファイル Bar.java
public class Bar {
int baz() {
return 0;
}
}
として、Foo.java をコンパイルして実行するとOKですが、
それからBar.java を
public class Bar {
void baz() {
}
}
と書き換え、Bar.java のみをコンパイルして Foo を実行すると、
java.lang.NoSuchMethodError を出して落ちます。
560 :
M.B.:04/11/01 16:20:47
>>558 > Javaの宿題を無料でやってくれるスレは
> ここですか?
いえ、Javaの宿題を無料でやってくれるヒトが
現れやすいスレがここです(スレッドに宿題をやってくれるメソッドは実装されていません)。
釣れるか釣れないかは、人柄やネタによります。
>>1 を参考にしてください。
562 :
M.B.:04/11/01 17:19:53
>>561 じゃあ、ついでに補足。Bar.javaを
public class Bar {
int baz() {
return 0;
}
void baz() {
}
}
とやってコンパイルすると、
「Bar.java:5: baz() はBar で定義されています。」
と、コンパイラに蹴られます。
このあたり、カラクリをじっくり考えると、
安全性と可読性を考えた言語仕様と、
効率のよい実行を考えた実装の相克が垣間見えて、
なかなかにムズムズします。
本当は代入文を無くして、メソッドで代入を実現してしまうのが
オブジェクト志向としては王道なんですが、
こんどは null とか new の扱いに困ったりするわけです。
また新しい言語とか出てくるのかなぁ……
> このあたり、カラクリをじっくり考えると、
それは void とは全く関係ない。
メソッド呼び出しを名前と引数型で解決してるから、
同名で同引数型のメソッドを一つのクラスで複数回定義できないだけ。
>>556 そんな俺様ルールを宿題の答えとして返されてもね。
というか、戻り値を利用していないときになんで戻り値があるかどうかとか気に
なるのか全然わからん。
>>559 これをもって何を主張しようとしているのか不明。
それが「呼ぶ側でvoidを宣言する」ってことなんですか? 呼ばれる側が勝手に
インタフェース変えたら実行時エラーが出て当然でしょう。
>>562 言語仕様に当たった上で書いてますか?
藤本弘之きらい。
文章の端々で「私はプログラムだけじゃないんですよフッ」と言いたげでウザイ。
「メソッドを定義する時、voidにする場合と値を返す場合とで
それぞれ具体例をあげてどう使い分けたらいいか述べよ」
という宿題に「同じです。」と答えちゃ
それが真実かどうかに関わらずアレだと思うんだ。
あとクールにストイックにソースコードだけ書いてるときのM.B.は
あまりウザくなくてかっこいいと思うんだ
宿題の一部なんですが、
public static void main ( String [] args ) {}
の中から
static 宣言されていないメソット(同じクラス内にある)を
使いたいんですが、当然のようにコンパイルエラーがでます。
何か方法はありますか?
使いたいメソットを static にすることはできません。
>567
だーかーら、staticってのが何を意味してるのかちゃんと覚えんさい。
とりあえず、ありがちだと思う解は、
a. main()の中で、main()を含むクラスのインスタンスを作る。
b. そのインスタンスを使えばstaticじゃないメソッドは当然呼べる。
class Foo
{
public static void main(String[] args)
{
Foo instance = new Foo();
Foo.hoge();
}
private void hoge()
{
System.out.println("Foo.hoge()");
}
}
// インデント全角スペース使ってるのでちうい。
>>567 staticコンテキストはクラスのインスタンスと隔離された領域にあるので、同一クラス内のインスタンスメンバー
を直接参照できません。一度自分自身のインスタンスを作成してインスタンス変数経由で呼び出します。
ちなみにそうした点でとまどう様なコードは、たいていの場合2つ以上に分解すべきクラスを1つにまとめています。
その「アクセス不能なメンバー」は別のクラスに分離すべきではありませんか?
M.Bの堕ちっぷりが(・∀・)イイ!!
とりあえず動きました。
もう少してを加えれば完成できそうです。
>>568-
>>569 さんありがとうございます。
>>568 corejavaもう一周読み直します・・・
>>569 >その「アクセス不能なメンバー」は別のクラスに分離すべきではありませんか?
その通りだと思います。
しかし宿題が穴埋め形式だったので、そのようなことはできませんでした。
じゃあmainメソッドをvoid無しでコーディングしてみて
>>572 うざい。
そろそろ次の宿題来ないかな。
テキストボックスを表示し、それに入力された文字をそのままコンソールに表示する
という宿題をお願いします。
575 :
デフォルトの名無しさん:04/11/02 10:03:51
>>574 キーを押すとテキストフィールドに文字が出るのと同時に
コンソールにも出力されるプログラム。。。
package hw2;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class App extends JFrame {
public static void main(String[] args) {
JTextField tf=new JTextField();
tf.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
try {
String text=e.getDocument().getText(e.getOffset(), e.getLength());
System.out.print(text);
} catch (BadLocationException e1) { }
}
public void changedUpdate(DocumentEvent e) { }
public void removeUpdate(DocumentEvent e) { }
});
JFrame frame=new JFrame();
frame.getContentPane().add(tf);
frame.setSize(400,64);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
576 :
M.B.:04/11/02 12:14:04
板違いスマソ。
>>565 > 文章の端々で「私はプログラムだけじゃないんですよフッ」と
> 言いたげでウザイ。
いや、あれは自分の本業がプログラマだと思ってないだけだろ(-_-;)。
コンピュータっつーものを見てる視線が素人っつーかユーザの立場だし。
プロを自称する奴のレベルが低いからああいいう物言いになるだけ。
577 :
M.B.:04/11/02 12:31:28
>>564 だいたい「手続き」と「関数」って本来別物でしょうが。
それを C が手続きを「void を返す関数」で代用したのと、
大域脱出の手段が longjump() くらいしか存在しなかったんで
戻り値でなんとかするしかなかったっつーのが
もともとあって、その C のプログラムを Java に移植する際の利便を考えて、
ああいう文法仕様になってる訳っしょ?
関数の引数への副作用を防止して、
そのかわり OOP で明示的に記述するようにしただけっつー見方もできるわけで、
「値として戻す」っていう形式自体や、戻り値によってはメソッドが区別されないことに
そんなに意味があるとは思えんのだが。
>もともとあって、その C のプログラムを Java に移植する際の利便を考えて、
ああいう文法仕様になってる訳っしょ?
Cからの移植性なんぞ大して考慮していないと思うんですが、どこからこう
いう解釈になったんでしょう。メソッドに戻り値を持たせないOOPLって
一般的ではない(というか私は知らない)と思うのですが。
>関数の引数への副作用を防止して、
そのかわり OOP で明示的に記述するようにしただけっつー見方もできるわけで、
「引数への副作用」は防止されていません。
>「値として戻す」っていう形式自体や、戻り値によってはメソッドが区別されないことに
そんなに意味があるとは思えんのだが。
「戻り値によってはメソッドが区別されない」ではなく、「戻り値の型は
メソッドシグネチャに含まれない」です。
#「戻り値によっては」って区別される場合もあると思ってるのかな
これは想像ですが、戻り値の型がメソッドシグネチャに含まれないのは、
戻り値を受けなくてもメソッドを呼び出せるようにするためでしょうね。
M.B.さんがJavaの言語仕様について何か不満がある、というのはわかるの
だけど、何が不満なのかいまいち理解できないです。
Fortrunにもあったsubroutineとfunctionの区別をC言語がしなかったのは
実装上の手抜きだとD.Ritcheも書いているし、traditionalなCにはvoidはもともと存在しない。
存在しなかったものに何の根拠をもとめているのだろうか?
、、と書けばきっと全然別の話を持ち出すんだろうなMBは。自分の意見を
文章に変換する時点で相手に説明する理論展開ができていない。というか
自分の脳内妄想を日本語に変換する能力に決定的に欠けている。
それに言語仕様から“わざと”目を背けて仕様と実装を混同する話は、
つい最近もこのスレで見た気がするのだが。
580 :
462:04/11/02 14:42:02
462です。
今度で最後にしますからお願いします(><
課題
指定されたファイルの内容を出力するプログラムを作成
またディレクトリ内にあるすべてのファイルのファイル名と最初の一行を一覧表示する機能も実装
ファイル名および一覧昨日はコマンドラインで指定するものとします
仕様1
プログラム起動は以下のようにする
>java FileException
仕様2
パラメータは以下のようにする
"List":ディレクトリ内にあるすべてのファイルとファイル名と最初の一行を一覧表示する
これ以外のパラメータの場合はファイル名の指定とみなし、該当するファイルの内容を表示する
(パラメータ名と同じ名前のファイルはない物と考えてよい)
仕様3
このプログラムの使い方は次のようにする
1.ユーザがパラメータを指定してプログラムを起動する
2-1.パラメータが"List"だった場合、プログラムはディレクトリ内にあるすべてのファイルのファイル名と最初の一行を表示して終了する
2-2.パラメータが"List"以外であったら、ファイル名とみなし該当するファイルの内容をすべて表示して終了する
(仕様4)
プログラムの置かれるディレクトリに"files"フォルダを作成する。このプログラムで表示するファイルはすべてこのフォルダの中に置くファイルの内容はテキスト形式とする
仕様5
パラメータがついていない場合、存在しないファイルが指定された場合は、エラーメッセージを表示してプログラムを終了する
仕様6
ソースコードはクラスごとにファイルを作成する。ひとつのファイルに複数のクラスを記述してはいけないまたファイル名とクラス名を同じにすること
追加機能
ディレクトリ内にあるすべてのファイル名とファイルの最後の1行を表示するパラメータ"RList"を追加
追加機能2
指定したファイルのファイル名を変更する機能を追加、その際のパラメータは次のようにする
>java FileException ReName"変更前ファイル名""変更後ファイル名"
パラメータの数が足らない場合はエラーメッセージを表示。
>>580 書いてみたさ。慣れないChannelとか使ってみたさ。
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class FileException
{
private static String readList()throws IOException{
File[] filelist = new File(".").listFiles();
StringBuffer sb = new StringBuffer();
for(int i=0; i<filelist.length; i++){
sb.append(filelist[i].getName()+"\n");
BufferedReader br = new BufferedReader(new FileReader(filelist[i]));
sb.append(br.readLine()+"\n");
br.close();
}
return sb.toString();
}
582 :
M.B.:04/11/02 16:16:34
>>578 > メソッドに戻り値を持たせないOOPLって
> 一般的ではない(というか私は知らない)と思うのですが。
「戻り値を無視できる」というのが、「行儀はよくないが楽」なのよ。
> 「引数への副作用」は防止されていません。
それがJavaの中途半端なところなのだが、
それを完全に防止しちゃうと不便でしかたがないし、
真面目にやってると重くなってしょうがない。
> M.B.さんがJavaの言語仕様について何か不満がある、というのは
> わかるのだけど、何が不満なのかいまいち理解できないです。
Java の仕様はバランスがとれていてよくできていると思う。
おかげで自分用のツールをちゃかちゃかっと作るのにも使えるし
きっちりした業務用アプリケーションを大勢で書くのにも使える。
ただ、用途によってスタイルは使い分けないと、
落とし穴に嵌って痛い目を見るぞ、と。
private static String readRList()throws IOException{
File[] filelist = new File(".").listFiles();
StringBuffer sb = new StringBuffer();
for(int i=0; i<filelist.length; i++){
sb.append(filelist[i].getName()+"\n");
BufferedReader br = new BufferedReader(new FileReader(filelist[i]));
String s=null, c;
while((c=br.readLine())!=null){
s = c;
}
sb.append(s+"\n");
br.close();
}
return sb.toString();
}
private static String readFile(String f)throws IOException{
FileChannel fc = new FileInputStream(f).getChannel();
ByteBuffer bb = ByteBuffer.allocate((int)fc.size());
fc.read(bb);
bb.clear();
byte[] bytes = new byte[bb.capacity()];
bb.get(bytes);
String data = new String(bytes);
fc.close();
return data;
}
584 :
M.B.:04/11/02 16:17:42
public static void main(String[] args)throws IOException{
if(args.length==1){
if(args[0].equals("List")) System.out.println(readList());
else if(args[0].equals("RList")) System.out.println(readRList());
else System.out.println(readFile(args[0]));
}
else if(args.length==3){
if(args[0].equals("ReName")) new File(args[1]).renameTo(new File(args[2]));
}
else{
System.out.println("エラー。");
}
}
}
>>584 気にしないで下さいな。
エラーメッセージとか例外処理とかいろいろいい加減ですみませぬ。
587 :
M.B.:04/11/02 16:20:53
二重に割り込んでどうする orz
>>585 9行目にエラーメッセージを追加で。
でもきれいじゃないな。
readListとreadRListはひとつにして、引数で分岐させるべきだったか。
590 :
M.B.:04/11/02 16:37:28
>>579 > Fortrun
キッシュイータが綴りを間違えとるなw
ついでに言っとくと、本物のプログラマは大文字の「FORTRAN」を使うんだよ。
> traditionalなCにはvoidはもともと存在しない。
「traditional な C」って何だそりゃw
C なんてもんは他のハードからシステムをギッてきて
自前の環境を立てるための手段でしかないんだから、
マシンコードレベルの動作が端的かつ簡潔に見えりゃいいんだし、
移植をやってる人間が理解できりゃいいんだよ。
その後ツールを融通するのに、いちいちコードの隅々まで理解してると面倒臭いから、
void だのなんだのといった行儀作法の話が出てきたんだが、
それでも「移植性や可読性なんぞより実行効率を優先しろ」という了解があって使ってる。
C と ラ ー メ ン に ス タ ン ダ ー ド な ん ぞ ね え ん だ よ
……趣味や好き嫌いや美学はあるがね。
遅かったか。追加機能は実装していないやつだけど、せっかく作ったので。
import java.io.*;
public class FileException {
private static final String PATH = "files";
public static void main(String[] args) {
if(args.length != 1) {
System.out.println("usage : java FileException List | filename");
return;
}
try {
if(args[0].equals("List")) {
try {
displayFiles();
} catch(FileNotFoundException e) {
System.out.println("wrong directory.");
}
} else {
try {
displayFile(args[0]);
} catch(FileNotFoundException e) {
System.out.println(args[0] + " does not exist.");
}
}
} catch(IOException e) {
e.printStackTrace();
}
}
private static void displayFiles() throws FileNotFoundException, IOException {
File src = new File(PATH);
if(!src.exists()) {
throw new FileNotFoundException();
}
File[] files = src.listFiles();
for(int i=0;i<files.length;i++) {
System.out.println("filename : " + files[i].getName());
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
String line = reader.readLine();
if(line != null) {
System.out.println(line);
}
reader.close();
}
}
private static void displayFile(String filename) throws FileNotFoundException, IOException {
BufferedReader reader = new BufferedReader(new FileReader(PATH + "/" + filename));
String line = null;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}
593 :
デフォルトの名無しさん:04/11/02 21:00:50
この前、本を読んでいたら、確かに、
Cは、ポインターを渡す分、そのポインターが、どこのアドレスを入れているかに
かなり注意しないと、怖いらしい。M.B.サンのおしゃってることは、
かなり、的を得ていることもありかと、JAVAは、そういう点では、考えなくてすみ、
らくなのかも、ーーーと初心者の意見です。
型チェックは厳密だしね。
あー。なんか違う話みたいですね。
596 :
M.B.:04/11/02 22:38:17
>>593 C には「右値と左値」っつーのがあって、
x = y というのは、「アドレス &x に *y を sizeof(x の型) 分だけ memcopy() しろ」みてーな
すっげー即物的な記述を言い換えただけみたいなところがある。
だから、「 C はコンパイラじゃなくて高級マクロアセンブラだ」っつー奴もいる。
元がシステム記述言語だけあって、やりたい事は大抵できる事になってて、
いざとなったらインライン・アセンブラという手だってある。
そういう世界から Java に来ると、「こんなんでプログラムが書けるかぁ!」と思うことはあるのだが、
ちゃんとツボは押さえていてくれるのが Java のいいところだし、
反面「ワケわからん初心者はお行儀のいいプログラムを書こうね」と言いたい部分でもある。
C言語みたいなもう引退した言語にしがみついてるやつがいいそうなネタだな。
C#とはいわないけどC++くらいは勉強したほうが良いんじゃないかい?
Cはまだまだ現役だよ。
>>591 君は底が浅いなぁ
そうやってスレ違いのキ印を構うから居ついちゃうんだよな
ヲレのチソチソはまだまだ現役だよ。
>>598 空気の読めない奴だなぁ
やっぱり「Java!宿題!」じゃだめだったんだよ
すっかり雑談スレになってる
> C には「右値と左値」っつーのがあって、
右辺値と左辺値かな?
Fortran90すらしらない年寄りみたいだし
あんまりイジメないように(w
>>604 Fortran77でいいじゃない。
90がでたころはもうすでにFortranの時代は終わっていた。
>>603 英語だとlvalueだな。rvalueってのは見たことないかも。
まー、「左値」でも悪くないとは思うが、「左辺値」と
「辺」を入れるほうが一般的とは思う。
607 :
M.B.:04/11/03 12:32:07
>>606 すまんこってす。『数学セミナー』で C 言語が紹介された頃には、
まだ適切な訳語がのうて、『右の値』ち『左の値』ちて言っとったばい。
OOL も、『もの志向言語』『算体主導型言語』とか言ってたし。
608 :
M.B.:04/11/03 12:39:34
>>597 C++ つーぐらいだから評価が終わった時にはもう中身が変わってるw
上の議論の流れはつかめませんでしたが、
M.B.さんは上司に欲しいと思ったよ。
雑談スマソ。
610 :
M.B.:04/11/03 20:40:01
ところで次の宿題はまだか。
誰が流れをぶった切ったと思って・・・
いや、相手した俺らか
612 :
デフォルトの名無しさん:04/11/03 23:22:36
宿題っていうのは、あるときはあるないときはないのですよ。
>>596 Cは、私にとって魔法使いが、えいって魔法掛けてるように思えますよ。
何でもできちゃいそうで、
JAVAは、Classを組み立てる段階が、面白いなって感じます。
でも、機械に近い部分が、どのような組み立てになっているのか
すごく好奇心はあるので、Cがんばって習おうかなと思います。
宿題を自分でやってるなら何の問題も無い
>>612 実際にCを勉強したときにCのイメージが変わりそうだな
614 :
M.B.:04/11/03 23:41:36
>>611 いや、そこまで年寄りに気ぃ使わんでも。
Java つうのがそもそも SmallTalk やら C やらのしがらみをひきずってる部分があるので、
「お前ら、それっておかしいだろう!」っつー批判はむしろ出てこないと
先行き暗い部分はあるのだよ。
だから、機械寄りの抜け穴にこだわって、
「オレってこんな使い方も知ってるんだぜ」みたいな方面に行っちゃうのは、
正直( Java 的には)悲しいわけ。
サラっと書くなら Java 、だけど脱いでもスゴいんです、みたいな感じで C 、
そういうのがカッコいいように思う。
615 :
古代帝國富士皇朝総帥・伯壬旭 :04/11/03 23:49:05
盛り上がってるようだな。
さあ、もっと論じ合うがよい!
今日は無礼講だ。
大いに語るがよい!
Cが特化している部分は、コード全体から見れば微々たるもの。
残りのほとんどは、構造化なり、擬似OOなりしないと結局収拾つかない。
Cだって、Java的(というかOO)な考え方が必要なんだよ。
てかプログラミングってのはそういうもんだ。規模が大きくなればよけいにな。
>614
SmallTalk > Smalltalk
とか指摘される側になっても何にも感じてないんだろうなあ
619 :
M.B.:04/11/04 08:57:43
>>616 C の場合はそれを「見立て」というか、文法以外のスタイル(文体)の部分で解決してるものだから、
結局個人の資質の問題になっちゃって、大規模開発には向かない部分があるだろ。
C++ だって Objective-C だってプリプロセッサで皮を被せる形で OOL 化するとかいった便法だし。
構造化とか OO 的な思想とかいったことを考えるんだったら、「Java に乗り換える」ってのが一番簡単でしょ。
確かに C から Java に乗り換えるともどかしい部分があるけどさ、そのあたりの見極めが Java は割と適切だから、
処理系の中身まで解っててプログラム組んでるような人間だったら、それほどストレスを感じないと思う。
620 :
M.B.:04/11/04 09:38:55
>>618 書いてから気づいたが、それほど思い入れのある言語ではないので。
ただ、あの言語は OO の具合が半端ではないので、
3 + 4 * 5 が 35 になったりする(+ や * は演算子ではなくセレクタ扱い)。
あれに比べると Java というのは「Cと似たり寄ったりの言語」であって、
「オブジェクト志向」というコンセプトはあんまり表に出ていないような
気がする。
受験者の人数を教えておくれ
n => 3 [Enter]
1人目の得点を教えておくれ => 50 [Enter]
2人目の得点を教えておくれ => 60 [Enter]
3人目の得点を教えておくれ => 70 [Enter]
最高点:70点
最低点:50点
平均点:60点
yoro
622 :
M.B.:04/11/04 10:11:10
623 :
M.B.:04/11/04 10:26:32
平均点は小数点以下切捨て。
import java.io.*;
public class Seiseki0 {
public static void main(String[] args) throws Exception {
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("受験者の人数を教えておくれ");
System.out.print("n => ");
System.out.flush();
int gakuseisuu = Integer.parseInt(in.readLine());
if (gakuseisuu < 1) System.exit(1);
int [] tensuu = new int[gakuseisuu];
for (int cnt = 0;cnt < gakuseisuu;cnt += 1) {
System.out.print((cnt + 1) + "人目の得点を教えておくれ => ");
System.out.flush();
tensuu[cnt] = Integer.parseInt(in.readLine());
}
int goukei = 0;
for (int cnt = 0;cnt < gakuseisuu;cnt += 1) {
goukei += tensuu[cnt];
}
int saikou = tensuu[0];
int saitei = tensuu[0];
for (int cnt = 1;cnt < gakuseisuu;cnt += 1) {
if (saikou < tensuu[cnt] ) saikou = tensuu[cnt];
if (saitei > tensuu[cnt] ) saitei = tensuu[cnt];
}
System.out.println("最高点:" + saikou + "点");
System.out.println("最低点:" + saitei + "点");
System.out.println("平均点:" + (goukei / gakuseisuu) + "点" );
}
}
結局やってんのかよ。
暇そうだな。
キーボードから整数を1つ入力し,その値をint型配列dataから二分探索で検索する
プログラムを作成してください。見つかった場合は,その要素番号を,見つからなかった場合は「見つかりませんでした」と出力
条件:
検索対象の配列dataは
int data[] = {23, 35, 60, 73, 95, 102, 112, 150, 182, 200, 350 };
です。
検索対象は,Findクラスの中のクラスメソッドとして実装し, メソッド名は binSreach と
します。引数や戻り値の型は任意ですが,要求した結果が求めれるようにしてください。
さらに,検索状況も表示するようにしてください。
検索範囲が変わったら,右側か左側どちらに,狭まったか。
また,その要素の場所を表示
例:
0番目の要素より右にあり,9番目の要素より左を探します。
3番目の要素より左にあります。
7番目の要素より右で,9番目の要素より左を検索します。
7番目の要素より右にあります。
3番目の要素にありました。
よろしくおねがいします。
626 :
M.B.:04/11/04 10:32:18
午後から仕事なんだよ。
けど行きたくねぇんだよ。
だから逃避してんだよ。悪いかよ。
Javaってのはとことん中庸を目指した言語だと思うのね。新しい何かを作ろうとしたのではなくて。
だからたとえばSmalltalkのような思想がちがちの言語の仲間ではなく、OOのような理念と言語としてのJavaを直接結びつけるのは変だと思う。
それは宿題か?
629 :
462:04/11/04 14:28:41
あ”〜!!!
581さん,591さん
あ、この前はありがとうございました。礼も言わず失礼しました。
自分いっぱいいっぱいだったんで。
【課題】
標準入力から入力した内容を指定のファイルに保存するプログラムを作成しなさい
入力は1行だけでなく最大20行まで連続して入力できるようにしなさい。
行の先頭で":end"が入力されたら、終了してファイルに保存される物とします。また、保存するファイル名はコマンドラインで指定するものとします。
仕様1
プログラムの起動は以下のようにする
仕様2
プログラムの使い方は次のようにする
1.ユーザーがファイル名を指定してプログラムを起動する
2.プログラムは入力を促す
3.ユーザーは文章を入力する。文章は繰り返し入力できる
4.入力行が100行に達するか”end”が入力されたら、プログラムは今まで入力された内容を指定された
ファイルに保存して、終了仕様3
プログラムの置かれるディレクトリに"files"フォルダを作成する。
このプログラムで保存するファイルはすべてこのフォルダの中に置く
仕様4
パラメータがついていない場合は、エラーメッセージを表示して、プログラムを終了する
仕様5
すでに存在するファイルが指定された場合は、そのファイルを上書きして保存する。
存在しないファイルが指定された場合は新規にファイルを作成して保存する
仕様6
ソースコードはクラスごとにファイルを作成する。ひとつのファイルに複数のクラスを記述してはいけない。
またファイル名とクラス名を同じにすること
とりあえず自分でやってみることにします。
んでも参考までに見てみたいんで、ネ申の方々できたらお願いします
630 :
古代帝國富士皇朝送水・伯壬旭:04/11/04 15:11:24
>>625 その1
package hw3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Find {
static int data[] = {23, 35, 60, 73, 95, 102, 112, 150, 182, 200, 350 };
public static void main(String[] args) {
int target=0;
try {
if(data.length==0) throw new Exception;
System.out.print("数値の入力: ");
String param=new BufferedReader(new InputStreamReader(System.in)).readLine();
target=Integer.parseInt(param);
} catch (IOException e) {
System.out.println("入力が不正");
System.exit(0);
}
int ans=binSearch(target);
if(ans!=-1) {
System.out.println((ans+1)+"番目の要素にありました");
} else {
System.out.println("見つかりませんでした");
}
}
631 :
古代帝國富士皇朝送水・伯壬旭:04/11/04 15:12:08
>>625 その2
static int binSearch(int target) {
int length=data.length;
int head=0;
int tail=length-1;
while(length>0) {
int index=length/2+head;
System.out.println("探索範囲の中央、"+(index+1)+"番目の要素と比較します");
if(target>data[index]) {
length=tail-index;
head=index;
if(length<=0) break;
++head;
System.out.print((index+1)+"番目の要素より右にあり、");
} else if(target<data[index]){
length=index-head-1;
tail=index;
if(length<=0) break;
--tail;
System.out.print((index+1)+"番目の要素より左にあり、");
} else {
return index;
}
System.out.println((head+1)+"番目から"+(tail+1)+"番目の範囲を探します");
}
if(target==data[head]) return head;
else return -1;
}
}
>>625 失礼。一部書き間違えた。
>>630の12行目
if(data.length==0) throw new Exception;
の部分を
if(data.length==0) throw new Exception();
と訂正してください。
>>625 失礼。一部書き間違えた。
>>630の12行目
if(data.length==0) throw new Exception;
の部分を
if(data.length==0) throw new IOException();
と訂正してください。
>>629 package hw4;
import java.io.*;
public class App {
public static void main(String[] args) {
if(args.length==0) {
System.out.println("パラメーターファイル名がない"); System.exit(0);
}
System.out.println("テキスト入力開始");
StringBuffer text=new StringBuffer();
int count=0;
BufferedReader bufR=new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
String line=bufR.readLine();
if(line.startsWith("end")) break;
text.append(line + "\r\n");
if(++count >= 100) break;
} catch (IOException e) { }
}
try {
File dir = new File("files");
if (!dir.exists()) dir.mkdir();
File file=new File(dir, args[0]);
BufferedWriter bufW = new BufferedWriter(new FileWriter(file));
bufW.write(text.toString());
bufW.close(); bufR.close();
} catch (IOException e) {
System.out.println("ファイル書き込みエラー"); System.exit(0);
}
}
}
635 :
M.B.:04/11/04 17:05:30
>>629 まあ、同じようなもんだが。
import java.io.*;
import java.util.*;
public class Filter {
public static void main(String [] args) throws Exception {
if (args.length != 1) {
System.err.println("usage: java Filter filename");
System.exit(1);
}
System.out.println("行頭に \"end\" があったら入力終了。");
System.out.flush();
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
ArrayList text = new ArrayList();
for (int lineNumber = 0;lineNumber < 100;lineNumber += 1) {
String line = in.readLine();
if (line.startsWith("end")) break;
text.add(line);
}
try {
BufferedWriter bufWtr = new BufferedWriter(new FileWriter(args[0]));
ListIterator liter = text.listIterator();
while (liter.hasNext()) {
bufWtr.write((String)liter.next());
bufWtr.newLine();
}
bufWtr.close();
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
636 :
デフォルトの名無しさん:04/11/04 21:36:35
n 以下の 3 つの自然数 a, b, c (a ≦ b ≦ c) で,a2 + b2 = c2(三平方)を満たすすべての組とその個数を出力するプログラムを作成せよ(ヒント:三重の for 文に,if 文を組み合わせる).
nはあとから入力するもので、特別に与えられたメソッドint n = KeyboardInput.inputInt();を使います。
完成品だと起動したとき
数字を入力してください
と出て、例えば5を入力すると
a=0 b=5 c=5
a=3 b=4 c=5
a=0 b=4 c=4
a=0 b=3 c=3
a=0 b=2 c=2
a=0 b=1 c=1
a=0 b=0 c=0
7個です
とか出るものです。
どうかよろしくお願いします。
次のレスで自分が考えたのも貼ってみます。
637 :
デフォルトの名無しさん:04/11/04 21:38:54
public static void main(String[] args) {
System.out.print("数字を入力してください");
int n = KeyboardInput.inputInt();
for (int c = n; c <= n && c >= 0; c--) {
for (int b = c; b <=c && b >= 0 ; b-- ) {
for (int a = b; a <= b && a >= 0; a--) {
if (c * c == a * a + b * b) {
System.out.println("a=" + a +" b=" + b + " c=" + c);
} else {
[ここにいれるべき、何もしないで次へ行くという命令がわかりません]
}
}
}
}
}
あとabcの組の個数を出力する方法もわからないのです。
638 :
M.B.:04/11/04 22:19:50
>>636 題意とはだいぶ違うし効率も悪いけど一応。
public class Sqr {
public static void main(String [] args) throws Exception {
int n = 0;
for (int c = 5;c < 100;c += 1) {
int cc = c * c;
for (int a = 1;a < c;a += 1) {
for (int b = a;b < c;b += 1) {
if (((a * a) + (b * b)) == cc) {
n += 1;
System.out.println(n + ": a = " + a +", b = " + b + ", c = " + c);
}
}
}
}
}
}
>>636 3平方ということは、a^2+b^2=c^2なのではないでしょうか?
public class Square
{
public static void main(String[] args){
int n = KeyboardInput.inputInt();//Integer.parseInt(args[0]);
int counter = 0;
for(int c=2; c<=n; c++){
int rt = (int)Math.sqrt(n);
for(int a=0; a<=rt; a++){
for(int b=0; b<=rt; b++){
if(c == a*a+b*b){
System.out.println("a="+a+" b="+b+" c="+c);
counter++;
}
}
}
}
System.out.println(counter/*(counter/2+counter%2*/);
}
}
>>638 ありがとうございます。ですがそれをコンパイルしようとしたらエラーが95個とかでました…。
public static void main(String[] args) {
System.out.print("数字を入力してください");
int n = KeyboardInput.inputInt();
for (int c = n; c <= n && c >= 0; c--) {
for (int b = c; b <=c && b >= 0 ; b-- ) {
for (int a = b; a <= b && a >= 0; a--) {
if (c * c == a * a + b * b) {
System.out.println("a=" + a +" b=" + b + " c=" + c);
}
}
}
}
}
これでとりあえずa,b,cを表示するプログラムはできたのですが、組の個数を表示する方法がさっぱりわからないのです。
>>639 8行目のc=2をc=0に。
9行目のsqrt(n)をsqrt(c)に。
642 :
M.B.:04/11/04 22:35:02
>>639 こういう怖いもの知らずの若さが好きだ。
643 :
M.B.:04/11/04 22:37:16
>>640 コピペしましたね?
エディタで全角スペース一個を半角スペース二個に置換してからコンパイルなさい。
b=aに初期化すればいいのか・・・
a ≦ b ≦ cだったのか・・・
648 :
あらやっこ:04/11/05 01:11:39
キーボードから2つの整数を変数に入力したのち、
ポインタを使って、たがいの値を変換するプログラムを作りなさい。
ただし int a, b,sumを利用。
お願いします。(C言語ですが)
649 :
M.B.:04/11/05 03:28:53
>>646 ついでにいうと漏れ自身は 0 を自然数に含めているが、
今回は常識に従った。
で、直角二等辺三角形は斜辺と底辺の長さの比が無理数だから、
b = a + 1 で初期化しても結果は変わらず。
>>648 スレタイを千回叫んで(ry
651 :
M.B.:04/11/05 08:48:35
>>644 > すみません。。
謝ることはない。若さは特権なのだ!
【問題】
7^2 + 24^2 = 15^2 + 20^2 = 25^2
14^2 + 48^2 = 30^2 + 40^2 = 50^2
のように、複数通りの平方数の和で表される平方数がある。
問1)上限値 n (自然数)が与えられている。
二通り以上の平方数の和で表される、n^2 以下の平方数をすべて求め、
a, b の組合せを表示せよよ。
問2)また、その中で、a と b、a' と b' が互いに素である組合せから
なるもののみを選んで表示せよ。
がんがれ若人、雪辱を果たすのだ!
652 :
M.B.:04/11/05 09:44:17
>>650 > とっとと報告しる!
広告じゃなくてマ板かなんかから流れてきたネタだと主他。
653 :
コピペ推奨:04/11/05 10:07:24
654 :
コピペ推奨:04/11/05 10:18:06
┗┳┳━ |_| ━━━┳┳┛
┃┃ / ヽ ┃┃ もういくつ寝ると 出て行くの
┏┻┻ |======| ━━┻┻┓
┗┳┳ ヽ__ ¶_ ノ ━━┳┳┛ 朝鮮人は ウソついて
┃┃ (/) ┃┃
┃┃ (/) ┃┃ 日本に居座り たかります
凸┃┃ (/) ┃┃凸
Ш┃┃ (/) ┃┃Ш 早く出て行け 朝鮮人♪
.|| ┃┃ (/) ┃┃.||
∧_∧ (/) ∧_∧ ∧ ∧
( ・∀・) (/)(´∀` ) <゜Д゜ > 元歌:童謡「お正月」
(つ つミ (/)(⊃⊂ ) ⊂ ⊃
|_|_|_I(/)_|_|_|__| |
/////ノ,,,,,,ヽ ////|| |〜
//////////// |∪∪
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 奉 納 |
655 :
コピペ推奨:04/11/05 10:22:00
656 :
デフォルトの名無しさん:04/11/05 14:12:05
二次元配列 array を次のように定義する。
int array[ ][ ] = { { 1 } , { 2 , 3 , 4 } , { 5 , 6 } };
array の全要素の値を表示するプログラムを作成しなさい。
【条件】
・配列要素の値の表示には、ネストしたfor文(for文の二重ループ)を使用する。また、各for文の継続条件には「length」を使用すること。
・プログラム実行時の画面表示
1
234
56
お願いします。
657 :
デフォルトの名無しさん:04/11/05 14:51:22
age
659 :
デフォルトの名無しさん:04/11/05 14:58:59
>>656 public class HomeWork {
public static void main(String[] args) {
for(int x=0; x<array.length; ++x) {
for(int y=0; y<array[x].length; ++y) {
System.out.println(array[x][y]);
}
}
}
}
660 :
デフォルトの名無しさん:04/11/05 15:01:32
>>656 public class HomeWork {
public static void main(String[] args) {
int array[ ][ ] = { { 1 } , { 2 , 3 , 4 } , { 5 , 6 } };
for(int x=0; x<array.length; ++x) {
for(int y=0; y<array[x].length; ++y) {
System.out.println(array[x][y]);
}
}
}
}
661 :
デフォルトの名無しさん:04/11/05 15:50:51
コンパイルできないのですが。
662 :
デフォルトの名無しさん:04/11/05 16:47:31
んな訳ない。
663 :
デフォルトの名無しさん:04/11/05 17:43:42
660さんのソースだと配列要素の値が縦に1 2 3 4 5 6 と出るけど、問題文では
1
234
56
とでるようにならないのですか?
664 :
M.B.:04/11/05 18:18:46
>>658 漏れのはこんな感じ。
public class Sqr {
public static void main(String [] args) throws Exception {
int n = 10000; // n >= 5;
int counter = 0;
for (int c = 5;c <= n;c += 1) {
int counter2 = 0;
int c2 = c * c;
int ax = 0;int bx = 0;
for (int a = 1;a < c;a += 1) {
int a2 = a * a;
if ((c2 - a2) < a2) break;
for (int b = a + 1;b < c;b += 1) {
int b2 = b * b;
if ((a2 + b2) > c2) break;
if (!primal(a,b)) continue;
if ((a2 + b2) == c2) {
counter2 += 1;
switch(counter2) {
case 1:
ax = a;bx = b;
break;
case 2:
counter += 1;
System.out.print(counter + ": " + ax +"^2 + " + bx + "^2");
System.out.println(" = " + a + "^2 + " + b + "^2 = " + c + "^2");
break;
default:
System.out.println(" = " + a + "^2 + " + b + "^2");
}}}}}}
665 :
M.B.:04/11/05 18:19:11
static boolean primal( int m, int n ) {
do {
int m2 = m % n;
if (m2 == 0) return false;
m = n;
n = m2;
} while (n != 1);
return true;
}
}
666 :
M.B.:04/11/05 18:22:38
>>663 System.out.println(array[x][y]);
}
を、
System.out.print(array[x][y]);
}
System.out.println();
とすればいいはず。(違うかもしれん。自分で試してみれ)
668 :
デフォルトの名無しさん:04/11/05 21:37:31
>666
できました。
ありがとうございます
669 :
M.B.:04/11/05 21:45:09
>>1 に
> 数学関係は数式も出しておくれよ
とあるので註しておくと、
>>665 はユークリッドの互除法という算法。
swap の使えない言語だとちとつらい。
再帰を使って書くとスマートだが重い。
671 :
M.B.:04/11/05 22:44:32
>>670 加速度 V が変位 x に逆比例っつーことはフックの式で単振動っつーことか?
k は「ばね計数」だな。
答えは x0 = 1 だから振幅 1 の正弦波になると思うが……
だったら積分範囲が「0<x<10」っておかしくね?
0.0 <= t <= 1.0 で定数 k を 0.1 単位で 0.1 から 10.0 まで変えて
x の挙動を見ろ、とかいうのがありそうな話だが。
672 :
M.B.:04/11/05 22:50:08
×加速度 V
○速度 V
×0.0 <= t <= 1.0 で定数 k を 0.1 単位で 0.1 から 10.0 まで変えて
○0.0 <= t <= 10.0 の範囲で定数 k を 0.1 単位で 0.1 から 10.0 まで変えて
673 :
M.B.:04/11/05 22:57:03
アダプティブ法っていうのがわかりません。探してみたんですが、本しか見つけられませんでした。
そのページも何を言ってるのかわかりませんでした。。
ルンゲ・クッタ法で、0<t<10、k=1の場合をやってみました。
public class RK
{
private static double F(double x){
double k = 1;//kの値
return -k*x;
}
public static void main(String[] args){
double x0 = 1;
double v0 = 0;
double t0 = 0;
double dt = 0.1;//dtの値
while(t0 < 10){
double x1 = dt*v0;
double v1 = dt*F(x0);
double x2 = dt*(v0+v1/2);
double v2 = dt*F(x0+x1/2);
double x3 = dt*(v0+v2/2);
double v3 = dt*F(x0+x2/2);
double x4 = dt*(v0+v3);
double v4 = dt*F(x0+x3);
x0 += (x1+2*x2+2*x3+x4)/6;
v0 += (v1+2*v2+2*v3+v4)/6;
t0 += dt;
System.out.println("t="+t0+" x="+x0+" v="+v0);
}
}
}
676 :
M.B.:04/11/05 23:04:36
>>674 おおすばらしい。パチパチ
アダプティブってのは「適応的」とか「適応型」とかいって、
刻み幅(ここではdt)を高次の量(この場合、速度とか加速度とは)を見ながら
動的に変えてゆくことをいうのだ。
677 :
M.B.:04/11/05 23:14:41
ワシがまだ生まれる前の話じゃがのう、
人類が月に行ったんじゃ。
その時の軌道計算がのう、地球と月と太陽の重力が全部効いてくるので、
解析的にはムリだったのじゃ。
そこで数値積分で解いたんじゃが、
その時に使われたのが「8次のルンゲ・クッタ・ジル」だったのじゃ。
ルンゲ・クッタ法はニュートン法ほど簡便ではないが、
タフなので工学的な問題にしばしば使われる標準的な手法なのじゃ。
だからライブラリを探せばたいていどっかで見つかるのじゃ。
詳しくは戸川隼人先生の『微分方程式の数値計算』を読むとよいのじゃ。
>>677 ああ、ポルノグラフィティの歌詞って、そういう意味だったのか。
679 :
M.B.:04/11/06 00:20:24
そう。1969/07/20だかに、アポロ11号が着陸。
「これは小さな一歩だが、人類にとっては大きな飛躍である」
つー名台詞がある。
ついでにいうと、その有人月面着陸プロジェクトの名前が
『アポロ』で、
そのプロジェクトが終わって退職したエンジニアが作った
コンピュータ会社が
アポロ・コンピュータだっつー話。ホントかどうか知らんけど。
680 :
M.B.:04/11/06 00:25:25
>>679 そしてそのときに、宇宙飛行士が好んで食していたのが
アポロチョコレート
682 :
M.B.:04/11/06 08:03:16
>>681 ほんまかいな。
そしてそのとき NASA のスタッフが被っていたのが
アポロキャップ。
ポイントは月桂樹の刺繍(太陽神アポロンに関係)。
683 :
M.B.:04/11/06 08:07:09
684 :
M.B.:04/11/06 08:13:07
スレ汚しスマソ……orz
練習問題9.3〜全てのトランプをごちゃまぜるぞ!〜
全てのトランプをごちゃまぜにした結果を表示するプログラムを作成しましょう.なお,ジョーカーもちゃんと2枚入っています.配列は二次元配列を用いるようにしましょう(片方はトランプの種類の配列,片方は数字の配列).
【動作例】
C: \...> java ren93 [Enter]
□■□■□■□■□■□■
ハートのエースがでてこない
■□■□■□ ■□■□■□
まぜました.房州さん,八百長なんてなしですよ.
---------------------------
ハートのキング
スペードの3
ジョーカー
・
・
・
ダイヤのクイーン
---------------------------
C: \...>
たびたびですがお願いします。
>>685 import java.security.*;
import java.util.*;
public class Shuffle
{
private static final String[] number = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
private static final String[] pattern = {"ハート", "スペード", "ダイヤ", "クローバー"};
private static final String joker = "ジョーカー";
public static void main(String[] args){
int[] a = new int[54];
for(int i=0; i<54; i++) a[i] = i;
Random r;
try{
r = SecureRandom.getInstance("SHA1PRNG");
}
catch(NoSuchAlgorithmException ex){
r = new Random();
}
for(int i=0; i<54; i++){
int p = r.nextInt(54);
int c = a[i];
a[i] = a[p];
a[p] = c;
}
for(int i=0; i<54; i++){
int p = a[i]/13;
if(p==4){
System.out.println(joker);
continue;
}
System.out.println(pattern[p]+"の"+number[a[i]%13]);
}
}
}
>>685 チェックはしてません。どこか間違ってるかもしれません。
SeaureRandomは使わなくてもいいかもしれません。
もっとシャッフルしたい時は、
>>688の1行目のループの回数を増やしてください。
>>689 SecureRandom。
ループの回数を増やす時は、配列の参照に使っているiをi%54に。
問題ちゃんと読んでなかったorz
692 :
M.B.:04/11/06 09:49:54
カード [] deck = new カード("全部"); // 配列の中にカードを全部生成
for (int n = 0;n < (deck.length - 1);m += 1) {
m = n 以上 deck.length 未満の乱数;
deck[m] と deck[n] を swap; // m == n の場合も気にせず実行。
}
※ deck を class として定義して、
swap を private なメソッド化としておいて、
shaffle を呼ぶようにすると綺麗になるかも。
693 :
M.B.:04/11/06 09:53:09
【雑談】JavaっぽいけどJVMで走らず【ぬるぽ】
……狙いすぎたか。orz
【雑談】Javaっぽいけどトロイの木馬【セキュリティ】
695 :
M.B.:04/11/06 13:46:40
こういう感じはどうですか、総帥閣下。
【ネタ拝借】Java ショートプログラム一本勝負【質問・相談可】
与えられた仕様に基づく Java プログラムを書くスレ
・「こういうプログラムが欲しい」という注文をUPしておくれ
・ただし機能は単純に 仕様も簡潔・明快に提示しておくれ
・屑な仕様は容赦なく放置 犯罪的な奴も放置
・回答者は原則として単独で動くプログラム(アプレット可)をキボンヌ
・コードは原則的に、丸ごと・ここにコピペしる(てなワケで必然的に長いのは×)
・可能な範囲で可読性も考慮しておくれよ 出題者はそれ見て勉強しておくれよ
・複数回答OK ただし差別化はしておくれ(添削はOK)
・質問・相談可 ヒマネタ・雑談も流れに乗ってりゃOK
・JavaScript 等、他言語の課題は徹底的にゴルァ
696 :
中学1年生:04/11/06 14:11:56
alertメッセージに応答して
「4と6の積は、24です。」と表示するプログラムを作りなさい。
なお積(24)は、関数呼び出しで結果を求めて表示させること。
という宿題が出たんですけど、中々上手くできません。
よろしくお願いします。
>>696 alertメッセージに応答してってどういうことですか?
import javax.swing.*;
public class Alert
{
private static int product(int x1, int x2){
return x1*x2;
}
public static void main(String[] args){
int x1 = 4;
int x2 = 6;
String message = x1+"と"+x2+"の積は、"+product(x1, x2)+"です。";
JOptionPane.showMessageDialog(null, message, "Alert", JOptionPane.WARNING_MESSAGE);
}
}
>>575 試してみましたがうまく動作しませんでした。
>>698 パッケージを確認してないせいじゃないですか?
1行目のpackage hw2;文を消してみてください。
>>698 もしくは、
まさかコンソール画面が確認できないという事では。。。
まあ、
>>575のプログラムを見るに、キーストロークすると
JTextFiledとコンソール出力の両方に文字が出るだけの仕様みたいだが
(末尾への追加だけで、削除や変更には対応してない)
>>699 1行目を削除したら動作しました。
ありがとうございました。
ところで日本語を入力してみたのですが、1文字ずつ表示せずに
表示がおかしくなってしまいます。
(恐らく削除や変更ができないことと関連しているのでしょうが)
これを直すにはどの辺りに手を付ければいいのでしょうか。
>>701 変換のせいですね。
InputMethodEventとかを捕まえていぢると上手くいくかも知れませんが、
保障は出来ません。
703 :
デフォルトの名無しさん:04/11/06 17:17:45
>>701 一番簡単な方法ですが、JTextFieldに文を入力してリターンキーを
押すと、コンソールに出力されるやつです。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class App extends JFrame {
public static void main(String[] args) {
final JTextField tf = new JTextField();
tf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(tf.getText());
tf.setText("");
}
});
JFrame frame = new JFrame();
frame.getContentPane().add(tf);
frame.setSize(400, 64);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
>686
なんとなくこの板じゃなく情シス板向けなスレな気がした。個人的に。
ところで本当はアポロは月面に着陸してなかったと(ry
>>702 InputMethoEventが発生したら、
KeyEventでENTERキーが入力されるまで、DocumentEventを無視するとか。
だめか。
707 :
デフォルトの名無しさん:04/11/06 17:34:50
そうじゃ。
アポロ月着陸を当時生放送で見たが、月面に立てられたアメリカ国旗が
ゆらゆらと動き、星や宇宙船の光がまたたいていたのは有名な話なのじゃ。
それらは、空気が存在する場所でしか決して起きない現象なのじゃ。
あの月着陸の映像が本当だとしたら、月面には空気がある事になってしまう。
つまり、あの映像は地球の映画セット内で撮られたものなのじゃ。
同時期に上映された「2001年宇宙の旅」を見ても分かるとおり、当時の
ハリウッドは、あれ位リアルな月面映像を撮る事は十分に可能だったのじゃ。
アメリカは月着陸プロジェクトに結局失敗してしまい、国家の威信失墜を
防ぐ為に、あのような一大捏造劇を行ったのじゃ。
そろそろ、
【雑談】Javaから月まで【0x01】
が必要ですね。
709 :
M.B.:04/11/07 00:21:41
>>707-708 それってピーター・ハイアムズ監督の『カプリコン1』のネタ。
誰かさっさと宿題持ってきなさい。
710 :
デフォルトの名無しさん:04/11/07 02:53:36
コンパイラを書く宿題の第1段階で字句解析する部分を作れって言われたんですが
どこからどうやって始めればいいのか分かりません。
具体的には、LexicalAnalyzerクラスが短いテキストファイルを読み込んで、
lexメソッドが呼び出される度に1語(Token)ずつ返す感じで考えているのですが。
Tokenはint typeとString valueとint lineNumから成り立ってる単純なクラスです。
1字先を常に保存するnextCharみたいな変数がいるとかいらないとか・・・。
711 :
デフォルトの名無しさん:04/11/07 02:57:44
旗揺れてたっけ?
>>710 基本は1文字ずつ読んでいく
原則空白・タブは読み飛ばす
最初に読んだ文字の種類によってどんなTokenか決める
(決まらない場合はとりあえず中間状態として、次の文字を読み込んで決まるまで繰り返すか↓の処理のあとに判断)
Tokenの条件に合致しない文字が出てくるまで読み込んでいく
1字先を常に保存するのは↑の処理で読んだ条件に合致しない文字が次のTokenの一部だった場合に読み飛ばされるのを防ぐため
(C言語ではそれを戻すためのungetc()なんてのがあるがJavaにあるのかな・・・?)
713 :
M.B.:04/11/07 09:13:47
まず対象とする言語の文法について書こう。
FORTANみたいに「空白を一切無視する」なんてのもあるわけだし。
あと、GNU 関連のツールは一度ぜんぶメモリにロードしちゃうスタイルのものが多いから、
「一文字戻す」とかいう処理は書かなくて済む。
宿題がほしいようなのでお願いします
Excel から値を読み込んで、指定した保存先に Excelのシートの名前で保存する
┏━━━━━┳━━┓
┃肉まん2個. ┃280. ┃
┣━━━━━╋━━┫
┃肉まん4個. ┃560. ┃
┗━━━━━┻━━┛
Excel こんな感じでもいいので適当なExcel
ただし、文字列、数値は必ず含む
┏━━━━━━━━┓
┃肉まん2個 ┃
┃280円 ┃
┃肉まん4個 ┃
┃560円 ┃
┗━━━━━━━━┛
っていうのやってくれませんか?
Excelから値、文字を取得する方法
J2SDKのバージョンは 1.4.2 でお願いします。
できれば肉まん、餃子とExcelに書き込んでグループセルも作ってほしいです。
グループセルの値でフォルダを作ってその下にシート名のファイルを作ってみて下さい。
csvなら、やってやっても良かったんだがな。
Excelから読み込んでtext file へ書き出すだけ。
import java.io.*;
import java.sql.*;
class ExcelDb {
static String BookName = "TestBook";
static String OutFileName = BookName + ".txt";
public static void main(String[] args) throws Exception {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:" + BookName;
Connection conn = DriverManager.getConnection(url , "" , "" );
Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("select * from test1");
r.next();
StringBuffer buf = new StringBuffer();
for(int i = 0; i < 2; i++){
buf.append( r.getString(1) + "\n");
buf.append( r.getInt(2) + "円\n");
r.next();
}
BufferedWriter w = new BufferedWriter(new FileWriter(OutFileName));
w.write(buf.toString());
w.close();
r.close();
stmt.close();
conn.close();
}
}
ODBC経由だとなんかいまいち自由にカーソルを動かせない?
isLast() も FOWIRD_ONLYだって怒られる。
ActiveX使って、Cell 移動したほうが楽そうだけど、やったこと無い。
自分のパソコンからテキストファイルを読み込んで行ごとに配列に入れるには
どうしたらいいですか?
お願いします
ワロタ
String[] line = new String[100];
BufferedReader br = new BufferedReader( new FileInputReader( "filename" ) );
lines[i] = br.readLine();
723 :
M.B.:04/11/07 13:46:54
725 :
デフォルトの名無しさん:04/11/07 20:58:50
どうも。コンパイラ宿題の者です。みなさん回答どうもありがとうございます。
ちなみに文法は以下のような感じです。
Program = Block.
Block = "{" [VarDecl] Statementlist "}".
VarDecl = "int" Iddef {"," Iddef} ";".
Iddef = Identifier ["=" Expression].
Statementlist = Statement {";" Statement}.
Statement = Assignment | PrintStatement | Block | Empty.
Assignment = Identifier AssignmentOperator Expression.
AssignmentOperator = "=" | "+=" | "-=".
PrintStatement = "print" "(" Expression ")".
Expression = [AddingOp] Term {AddingOp Term}.
AddingOp = "+" | "-".
Term = Factor {MultOp Factor}.
MultOp = "*" | "/".
Factor = Constant | Identifier | "(" Expression ")".
Constant = Digit {Digit}.
Identifier = Letter {Letter | Digit}.
Letter = "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|
"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|"y"|"z".
Digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9".
Emptyは非終端記号ではなく単純に空という意味です。
726 :
デフォルトの名無しさん:04/11/07 21:03:06
今のところは字句解析のみ書けばOKみたいです。
次の宿題がコンパイラ全部になるようです。
一度メモリに全部ロードするっていうのは
今回はしない方がいいって先生が言ってました。
どうも皆様お疲れ様です。早速質問なのですが、TODOと書かれているメソッドを上記のコメントどおりに完成させよという宿題です。
長ったらしくて申し訳ないのですが、よろしくおねがいします。
package com.swifttaxi.domain.operations;
import java.awt.Point;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Taxi extends Vehicle {
/** The current pickup request */
private PickupRequest pickupRequest;
/** @see Vehicle#Vehicle(int, Point) */
public Taxi(int aId, Point aLocation) {
super(aId, aLocation);
}
/** Clear all pickup requests. */
private void clearPickupRequests() {
setPickupRequest(null);
}
/**
* Perform the Taxi's activity. If the Taxi is idle, update the idle
* records. If the Taxi is driving, drive to the next location. If the Taxi
* is offloading, offload the Passenger. If the Taxi is picking up, pick up
* the Passenger.
*
* @see com.swifttaxi.domain.operations.Vehicle#doActivity()
*/
public void doActivity() {
if (isFree()) {
//idle
} else if (isDrivingToPickup() || isDrivingToDelivery()) {
//drive to next location
drive();
} else if (isPickingUp()) {
pickupPassengers();
} else if (isOffloading()) {
offloadPassengers();
} else {
// unknown state - log it as a bug
final Logger logger = Logger.global;
logger.log(Level.SEVERE, "Unknown state for " + this + " at "
+ getLocation());} }
/**
* Drive to the next location in the path to the target.
*/
public void drive() {
final Point next = nextLocation();
setLocation(next);
}
/** @return the pickup request for this Taxi */
public PickupRequest getPickupRequest() {
return pickupRequest;}
/**
* Determine whether this Taxi is driving to a delivery location.
*
* @return true if this Taxi is diving to its target.
*/
public boolean isDrivingToDelivery() {
return !getLocation().equals(getTarget())
&& !getPassengers().isEmpty(); }
/**
* Determine whether this Taxi is driving to a pickup location.
*
* @return true if this Taxi is diving to a pickup location.
*/
public boolean isDrivingToPickup() {
return !getLocation().equals(getTarget())
&& (getPickupRequest() != null); }
/**
* Determine whether this Taxi is free. It is free if it has no target
* Location.
*
* @see Vehicle#isFree()
*/
public boolean isFree() {
return getTarget() == null; }
/**
* Determine whether this Taxi is offloading passengers.
*
* @return true if this Taxi is offloading passengers.
*/
public boolean isOffloading() {
return getLocation().equals(getTarget())
&& !getPassengers().isEmpty();
}
/**
* Determine whether this Taxi is picking up passengers.
*
* @return true if this Taxi is picking up passengers.
*/
public boolean isPickingUp() {
return getLocation().equals(getTarget())
&& (getPickupRequest() != null);
}
/**
* Offload the Passenger.
*
* @pre the state of this Taxi is 'offloading passenger'
* @post this Taxi recorded a DeliveryEvent for its Passenger
* @post this Taxi has no associated Passenger
* @post this Taxi became free
*/
public void offloadPassengers() {
//TODO }
/**
* Pick up the Passenger waiting at the Taxi's location.
*
* @pre the state of this Taxi is 'picking up passenger'
* @pre the Passenger of the pending PickupRequest is not null
* @pre the destination location of the PickupRequest's Passenger is not
* null
* @post the Passenger set of the Taxi became the Passenger alone
* @post the target of this Taxi became the Passenger's destination
* @post the PickupRequest was removed from this Taxi
*/
public void pickupPassengers() {
//TODO }
/**
* Handle the request for a Passenger pickup.
* @pre this Taxi is free
* @pre aPassenger != null
* @pre aPassenger's pickup location != null
* @post a PickupRequest for aPassenger was created and was associated with this Taxi
* @post the target of this Taxi became the pickup location
* @param aPassenger the Passenger to pick up.
* @see Vehicle#requestPickup(Passenger)*/
public void requestPickup(Passenger aPassenger) {
assert isFree();
assert aPassenger != null;
final Point pickupLocation = aPassenger.getPickupLocation();
assert pickupLocation != null;
setTarget(pickupLocation); //1.2.2
final PickupRequest request = new PickupRequest (aPassenger); //1.2.3
setPickupRequest(request); //1.2.4
}
/**
* @param aPickupRequest
* the pickup request for this Taxi.
*/
public void setPickupRequest(PickupRequest aPickupRequest) {
pickupRequest = aPickupRequest;
}
/** @see java.lang.Object#toString() */
public String toString() {
return "Taxi[" + getId() + "]";
}
}
ここまでがひとつのクラスです・・・。すみません、長いですね・・。
733 :
727:04/11/08 05:36:12
734 :
733:04/11/08 10:09:00
えー、どうやらできたようですw
どうもお騒がせいたしました・・・。
また何かあったらお邪魔させていただきます。
735 :
デフォルトの名無しさん:04/11/08 11:25:51
736 :
M.B.:04/11/08 15:05:33
Java の GUI には慣れてないので勉強になるなコレ。
まず、コンストラクタの最初の方に
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
を足しとけ。終わらんで迷惑だ。
次に、String inputValueをコンストラクタの外に出せ。イベントリスナーから見えん。
それから、actionPerformed(ActionEvent event) {
の中で、
JButton button = (JButton)(event.getSource());
if (button == zeroButton) {
if (inputValue.equals("0")) {
inputValue = "0";
} else {
inputValue = inputValue + "0";
}
}
ってな具合に入力値を溜めこむルーチンを書け。
こっから先はしばらく考えてからまた質問。んじゃ。
737 :
M.B.:04/11/08 15:18:01
忘れてたホイ。アクションリスナーの最後を、
textfield.setText(inputValue);
と差し替え。
……ところで「全画面」ボタンを殺のと、
リサイズを禁止するのはどうするんだろう。
GUI の素人が手を出したのは失敗だったか orz
738 :
289:04/11/08 15:27:06
またまた、質問です。。。
年月日を2つ渡し、その差の日数をもとめるコードが書けません。。。
例えば、2004年01月12日と2004年01月14日日の差の日数を求める場合、
コマンドライン上で、
java Test 20040112 20040114
と、二つの引数をわたし、この場合、
2
と出力されるコードです。Calendarクラスを使うのは予想がつくのです
が、調べても日数の差を求めるメソッドが見当たりません。。。
よろしければ、ご教授よろしくお願いします。
フレームのリサイズ(&最大化)はsetResizable(false)で(同時に)禁止できる
けど、最小化の禁止手段はないです。
最小化されるのを感知してすぐ元のサイズに戻すのは可能だけど、動きは見
えてしまいます。
標準APIには日数差を求めるメソッドはないので、
ミリ秒の差を86400000で割るしかない。
閏秒の問題は誤差だと思ってあきらめる。
741 :
M.B.:04/11/08 15:55:07
742 :
M.B.:04/11/08 17:36:47
>>735 仕様とはちょっと違っちゃったがまあ勘弁してくれ。
現在のところ足し算だけしかできない。あとは工夫すること。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class CalcMain {
public static void main(String[] args) {
Calculator.setDefaultLookAndFeelDecorated(true);
Calculator calculator = new Calculator();
}
}
743 :
M.B.:04/11/08 17:37:31
class Calculator extends JFrame
implements ActionListener {
final String [] nums =
{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
private JTextField textfield;
private JButton [] numBotton;
private JButton plusButton, minusButton, multipleButton, divideButton;
private JButton equalButton, clearButton;
private String inputValue;
private String operator;
private boolean isOperator, numInput;
private int mem;
744 :
M.B.:04/11/08 17:38:16
public Calculator() {
this.setSize(220, 280);
this.setLocation(100, 100);
this.setResizable(false);
this.setTitle("Calculator");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(null);
contentPane.setBackground(Color.blue);
numBotton = new JButton[nums.length];
for (int cnt = 0;cnt < nums.length;cnt += 1) {
numBotton[cnt] = new JButton(nums[cnt]);
numBotton[cnt].addActionListener(this);
}
745 :
M.B.:04/11/08 17:38:51
clearButton = new JButton("C");
equalButton = new JButton("=");
plusButton = new JButton("+");
minusButton = new JButton("-");
multipleButton = new JButton("*");
divideButton = new JButton("/");
numBotton[7].setBounds(5,40,50,50);
numBotton[4].setBounds(5,90,50,50);
numBotton[1].setBounds(5,140,50,50);
numBotton[0].setBounds(5,190,50,50);
numBotton[8].setBounds(55,40,50,50);
numBotton[5].setBounds(55,90,50,50);
numBotton[2].setBounds(55,140,50,50);
clearButton.setBounds(55,190,50,50);
numBotton[9].setBounds(105,40,50,50);
numBotton[6].setBounds(105,90,50,50);
numBotton[3].setBounds(105,140,50,50);
equalButton.setBounds(105,190,50,50);
plusButton.setBounds(155,40,50,50);
minusButton.setBounds(155,90,50,50);
multipleButton.setBounds(155,140,50,50);
divideButton.setBounds(155,190,50,50);
746 :
M.B.:04/11/08 17:40:13
for (int cnt = 0;cnt < nums.length;cnt += 1) {
contentPane.add(numBotton[cnt]);
}
contentPane.add(clearButton);
contentPane.add(equalButton);
contentPane.add(plusButton);
contentPane.add(minusButton);
contentPane.add(multipleButton);
contentPane.add(divideButton);
textfield = new JTextField("0");
textfield.setBounds(5,5,200,30);
textfield.setEditable(true);
contentPane.add(textfield);
plusButton.addActionListener(this);
minusButton.addActionListener(this);
multipleButton.addActionListener(this);
divideButton.addActionListener(this);
equalButton.addActionListener(this);
clearButton.addActionListener(this);
inputValue = "0";
mem = 0;
isOperator = false;
numInput = false;
show();
}
747 :
M.B.:04/11/08 17:41:18
public void actionPerformed(ActionEvent event) {
JButton button = (JButton)(event.getSource());
for (int cnt = 0;cnt < nums.length;cnt += 1) {
if (button == numBotton[cnt]) {
if (!numInput) {
inputValue = nums[cnt];
numInput = true;
} else {
if (inputValue.length() < 10) {
inputValue = inputValue + nums[cnt];
} else {
// ビープ音とか出す。
}
}
}
}
748 :
M.B.:04/11/08 17:43:23
if (button == plusButton) {
yy = Integer.parseInt(inputValue);
operator = "+";
isOperator = true;
numInput = false;
}
if (button == clearButton) {
inputValue = "0";
numInput = false;
}
if ((button == equalButton) && isOperator) {
mem += Integer.parseInt(inputValue);
Integer result = new Integer(mem);
inputValue = result.toString();
numInput = false;
}
textfield.setText(inputValue);
}
}
……いまさらながら何て長いんだorz
749 :
M.B.:04/11/08 17:47:59
一か所間違いあり。yy となっているところを mem に。
750 :
M.B.:04/11/08 22:36:39
>>574の課題ですが、
よくよく読んでみると以下のような注文がありましたので再度お願いします。
・java.awt.event.* をインポートすること
・クラス定義の最初でimplements ActionListenerをすること
・表示は入力と同時に行うこと
・バックスペースでの削除にも対応させること(任意)
import java.awt.*;
import java.awt.event.*;
public class Kadai extends Frame implements TextListener {
TextField TextBox;
Kadai(){
addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });
TextBox = new TextField(10);
TextBox.addTextListener(this);
add(TextBox);
pack();
setVisible(true);
}
public void textValueChanged(TextEvent e){
System.out.println(TextBox.getText());
}
public static void main(String[] args){
new Kadai();
}
}
あ、あと、ActionListener では、そんな要求満たせるわけねーだろ、ボケ
と教授に言っといてください。
Imageを作る時、URLが不正だとぬるぽがでるんですが
これはどうやって回避すればいいですか?
正しいURLを使う。
757 :
デフォルトの名無しさん:04/11/09 06:51:14
760 :
289:04/11/09 11:47:05
761 :
デフォルトの名無しさん:04/11/09 12:16:18
すみません。全然分かりませんので、教えてください。
以下のことを満足させる電卓のアプレットを完成させよ。
・電卓はラベル、またはテキストフィールドとボタンから構成される。ボタンはグリッドレイアウト
で配置する。
・1〜9の数字ボタン・・・・電卓に数値を入力するときに押す。
・四則演算ボタン・・・・加減剰余を計算するときに押す。
・=(イコール)・・・・計算の答えを求めるときに押す。
・AC(オールクリアーボタン)・・・・今までの計算と表示されている数値をすべて消去する
・C(クリアーボタン)・・・・今までの計算を残して表示されている数値のみを消去する。
・電卓に入力できる数値は整数のみである。ただし、出力できる数値は整数と小数である。
・電卓に入出力できる数値の範囲は小数点やマイナスを含めて8桁である。
・計算途中や答えの数値に桁あふれが発生した場合や、0で除するなどの数学的に誤った操作を
した場合にエラー処理をする。
・エラー処理はテキストフィールドあるいはラベルにエラーの内容が分かるようなエラーメッ
セージを表示させる。
・エラーメッセージが表示されているときは、オールクリアボタンのみが有効であるようにする。
762 :
M.B.:04/11/09 13:54:22
>>761 また出やがったか orz
つーか、ちょっと前のカキコくらい嫁。
>>742-748 だ。アプレットではなく Java アプリだが。
ついでにいうとボタンはグリッドレイアウトでは配置していないので、
ボタンを格納する JPanel を new するときにグリッドレイアウトを指定しる。
「1〜9の数字ボタン」は「0〜9の数字ボタン」が正。
小数点とクリアボタンを加えて横3縦4に配置するのが定跡。
なお、「AC」と「C」はカシオ、シャープは「C」と「CE」。
エラーメッセージが表示されているときは、オールクリア、クリア、
小数点および数字キーのみが有効であるようにすると使い勝手が向上。
なお、数字は(向かって)右詰で表示するのが本当だが、
今のところ漏れにも方法がわからん。
なお、内部表現としては int を使っているが、
BigDecimalを使うと波瀾に富んで面白くなる。
ついでに初等関数の数値計算は一松信先生の『初等関数の数値計算』を読んで自分で書こう。
逆数の逆数が元の数になるよう工夫するのもまた一興。
……がんがれ。
763 :
デフォルトの名無しさん:04/11/09 14:40:59
>>762 すみません、軽率でした。
参考にがんばってみます。
764 :
計算機 その1:04/11/09 17:54:24
>>561 package hw6;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class HW6 extends JApplet {
double value;
boolean initFlag = true;
char opeFlag;
JLabel label = new JLabel("0");
JPanel panel = new JPanel(new GridLayout(5, 4));
JButton[] btn = new JButton[17];
ActionListener ne = new Number(), oe = new Operator(), ee = new Equal(), ce = new Clear();
public void init() {
label.setFont(new Font("Dialog", 1, 30));
getContentPane().add(label, BorderLayout.NORTH);
getContentPane().add(panel);
ActionListener[] als = new ActionListener[] { ne, ne, ne, oe, ne, ne,
ne, oe, ne, ne, ne, oe, ne, ce, ee, oe, ce };
String[] btnLabel = { "7", "8", "9", "/", "6", "5", "4", "*", "3", "2",
"1", "−", "0", "C", "=", "+", "A" };
for (int i = 0; i < btnLabel.length; ++i) {
btn[i] = new JButton(btnLabel[i]);
btn[i].addActionListener(als[i]);
btn[i].setFont(new Font("Dialog", 1, 15));
panel.add(btn[i]);
}
setVisible(true);
}
765 :
計算機 その2:04/11/09 17:55:20
void error(String text) {
opeFlag = 0;
value = 0;
initFlag = true;
label.setText(text);
Component[] cs = panel.getComponents();
for (int i = 0; i < cs.length - 1; ++i) cs[i].setEnabled(false);
}
class Number implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (opeFlag == 0) value = 0;
StringBuffer sb = new StringBuffer(label.getText());
if (initFlag) sb.delete(0, sb.length());
initFlag = false;
String text = sb.insert(sb.length(), ((JButton) e.getSource()).getText()).toString();
if (text.length() > 8) { error("エラー(桁あふれ)"); return; }
label.setText(text);
}
}
class Operator implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (opeFlag != 0) ee.actionPerformed(e);
if (label.getText().startsWith("エラー")) return;
opeFlag = ((JButton) e.getSource()).getText().charAt(0);
value = Double.parseDouble(label.getText());
initFlag = true;
}
}
766 :
計算機 その3:04/11/09 18:02:10
class Equal implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (initFlag || opeFlag==0) return;
double num = Double.parseDouble(label.getText());
switch (opeFlag) {
case '+': value += num; break; case '−': value -= num; break;
case '*': value *= num; break; case '/': value /= num; break;
}
if (value == Double.POSITIVE_INFINITY || value == Double.NEGATIVE_INFINITY) { error("エラー(不正計算)"); return; }
if (value % 1 != 0) {
if (String.valueOf(value).length() > 8) { error("エラー(桁あふれ)"); return; }
label.setText(String.valueOf(value));
} else {
if (String.valueOf((int) value).length() > 8) { error("エラー(桁あふれ)"); return; }
label.setText(String.valueOf((int) value));
}
initFlag = true; opeFlag = 0;
}
}
class Clear implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (((JButton) e.getSource()).getText().equals("C")) {
if (initFlag) return;
} else {
opeFlag = 0; value = 0;
Component[] cs = panel.getComponents();
for (int i = 0; i < cs.length; ++i) cs[i].setEnabled(true);
}
initFlag = true; label.setText("0");
}
}
}
767 :
古代帝國富士皇朝総帥・伯壬旭:04/11/09 18:04:13
上記の計算機アプレットは
400×300のサイズで。
768 :
古代帝國富士皇朝総帥・伯壬旭:04/11/09 18:07:49
アンカーを間違えた。
上記の計算機プログラムは、
>>761氏への回答です。
769 :
デフォルトの名無しさん:04/11/09 18:34:01
>>758 問題文は
>>757程度の内容しかかいてないんです・・・
補足で「Javadocを探して、引数や戻り値の確認をしてください」くらいでして・・・
770 :
デフォルトの名無しさん:04/11/09 20:59:01
>>757って問題文が抽象的過ぎて分からないんだけど
こんな感じでいいのかな?
class Hello {
public static void main (String args[]) {
System.out.println("Javaプログラム");
System.out.println("4.17の平方は"+Math.pow(4.17,2.0)+"です");
}
}
以下の課題を C, C++, Java, Smalltalk のどれかの言語を使って作りなさい。 なお、Smalltalk は標準入出力がないので、適宜入出力の仕様を付加しなさい。
注意: どちらも Windows の API は使用しないで作って下さい。
課題1
標準入力からテキストファイルを読み込み、 行を短い順に出力しなさい。 但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い 出力し、空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力 した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、最後の 5 行を示しなさい。
なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに依存 しなければなりません。 勝手な上限を設けてはいけません。
772 :
M.B.:04/11/09 23:25:27
馬鹿者! 問題文だけ貼りつけてどうする!
「こんな課題が出たのですが、[ここに言い訳を書く]ので、
どうしたらいいかわかりません。どうかお願いします!」
くらい書け。
>>772 申し訳ない。まったく手がつけられません。
どうかよろしくお願いします。
774 :
M.B.:04/11/09 23:46:35
Java の ArrayList を代替するライブラリが C にはないので、
C で書くのが面白いのだが、スレ違いなのでパス。
C++ の場合は業務的には STL かなんかを使うのが定跡なんだろうが、
学生の演習となると、なんかあざとい感じがしてイヤ。
Java でやる場合、すでに自前のライブラリがあるので、
解りやすく一本のプログラムにまとめるのがマンドクセ。
てなワケでこのスレで神に祈りを捧げなさい。
あなたの信仰があなたを救い、神が降臨されるでしょう。
……ア〜メェ〜ン。
import java.io.*;
import java.util.*;
public class SortSample{
public static void main(String[] args) throws Exception{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
List list = new ArrayList();
for(String line;(line = reader.readLine()) != null;){
list.add(line);
}
String[] lines = (String[])list.toArray(new String[0]);
Arrays.sort(lines,new Comparator(){
public int compare(Object o1,Object o2){
try{
return ((String)o1).getBytes("ASCII").length - ((String)o2).getBytes("ASCII").length;
}catch(Exception e){
throw new RuntimeException(e);
}
}
public boolean equals(Object o){
return false;
}
});
for(int i=0;i<lines.length;i++){
if(lines[i].length() > 0){
byte[] output = new byte[80];
System.arraycopy(lines[i].getBytes("ASCII"),0,output,0,Math.min(lines[i].getBytes("ASCII").length,80));
System.out.println(new String(output).trim());
}
}
}
}
あ、LinkedListでremoveのほうが簡単だったか
import java.io.*;
import java.util.*;
public class LineSorter {
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader( new InputStreamReader( System.in ));
ArrayList lines = new ArrayList();
String line;
while( null != ( line = rd.readLine() ) ){
line = line.substring(0, Math.min(80, line.length()));
int i;
for(i = 0; i < lines.size(); i++){
String cmp_str = (String)(lines.get(i));
if( line.length() < cmp_str.length() ){
break;
}
}
lines.add(i, line);
}
Iterator it = lines.iterator();
while(it.hasNext()){
System.out.println((String)it.next());
}
}
}
空行を除くの忘れてた。
>>777 の、一つ目のwhile の直後に
if( line.length() == 0 ) continue;
の一文を入れてくれ。
すれ汚しすみませんが、訂正。
>>777だと、全角文字も一文字と数えられちまう。
import java.io.*;
import java.util.*;
public class LineSorter {
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader( new InputStreamReader( System.in ));
ArrayList lines = new ArrayList();
String line;
while( null != ( line = rd.readLine() ) ){
if( line.length() == 0 ) continue;
line = line.substring(0, Math.min(80, line.length()));
int i;
for(i = 0; i < lines.size(); i++){
String cmp_str = (String)(lines.get(i));
if( line.getBytes().length < cmp_str.getBytes().length ){
break;
}
}
lines.add(i, line);
}
Iterator it = lines.iterator();
while(it.hasNext()){
System.out.println((String)it.next());
}
}
}
780 :
デフォルトの名無しさん:04/11/10 04:42:47
結局LexicalAnalyzerはダメですか・・
短いプログラムだと思うんですけどねぇ・・
781 :
M.B.:04/11/10 06:49:58
>>780 あの手のトークンリーダーはマンドクセなうえに、
分かりやすい解説書があまりないのだ。
中西正和『やさしいコンパイラの作り方』(共立出版)でも読んで
自助努力しる。
782 :
デフォルトの名無しさん:04/11/10 07:48:08
じゃぁ書いたらここにアプしてみます
tarou 40
hanako 20
pochi 50
を数値をみてpochi 50,tarou 40,hanako 20の順に並べ替えて、その後
数値を除いたpochi,tarou,hanakoの順番を取り出したいと思っています。
ご教授いただければうれしいです。
import java.io.*;
import java.util.*;
public class LineSorter{
class Line implements Comparable{
private String line;
Line(String line){this.line = line;}
public int compareTo(Object o){return line.length() - ((Line)o).line.length();}
public String toString(){return line.substring(0,80);}
}
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader( new InputStreamReader( System.in ));
TreeSet lines = new TreeSet();
String line;
while( null != ( line = rd.readLine() ) ){
if( line.length() == 0 ) continue;
lines.add(new Line(line));
}
for(Iterator it = lines.iterator();it.hasNext();System.out.println(it.next()));){
}
}
import java.io.*;
import java.util.*;
public class LineSorter783{
class Line implements Comparable{
private String name;
private int val;
Line(String line){
this.name = line.substring(0,line.indexOf(" "));
this.val = Integer.parseInt(line.substring(line.indexOf(" ")));
}
public int compareTo(Object o){return ((Line)o).val-val;}
public String toString(){return name;}
}
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader( new InputStreamReader( System.in ));
TreeSet lines = new TreeSet();
String line;
while( null != ( line = rd.readLine() ) ){
if( line.length() == 0 ) continue;
lines.add(new Line(line));
}
for(Iterator it = lines.iterator();it.hasNext();System.out.println(it.next()));){
}
}
786 :
M.B.:04/11/10 10:29:59
>>782 いま
>>725 の文法を眺めていて思ったんだが、
符号も AddingOp なんだな。
で、int と print は予約語、と。
シンボル(ここでは Identifier 。「識別子」ってところか)と
予約語を区別するには文脈によるしかないので
字句解析ルーチンの仕様としてはあんまり嬉しくないんだよな。
「予約語と同一綴りのシンボルを禁止する」っていう制限を入れると、
クラス定義や関数定義ができなくなっちゃうので、
字句読取りルーチン(が返す Token の属性値)では
どっちも「シンボル」としておいて、
符号と加減算演算子みたいに、
上位ルーチン(解析部)で区別するというのではダメか?
787 :
M.B.:04/11/10 11:16:45
>>782 Program = Block;
Block = "{" [VarDecl] Statementlist "}";
VarDecl = %VarType Iddef {"," Iddef}* ";";
%VarType = Identifier;
Iddef = %VarName ["=" Expression];
%VarName = Identifier;
Statementlist = Statement {";" Statement}*;
Statement = Assignment | Procedure | Block | (void);
Assignment = %VarName AssignmentOperator Expression;
AssignmentOperator = "{:=|+=|-=}"; // 代入は ":=" にしてしまう。
Procedure = %ProcName "(" Expression ")";
%ProcName = Identifier;
Expression = (%Sign) Term {%AddingOp Term};
%Sign = PlusMinus;
%AddingOp = PlusMinus;
PlusMinus = [+-];
Term = Factor {MultOp Factor}*;
MultOp = [*/];
Factor = Constant | Identifier | "(" Expression ")";
Constant = [0-9]+;
Identifier = [a-z][a-z0-9]*;
788 :
M.B.:04/11/10 11:17:09
※Token が返すのは、
"{", "}", "(", ")", ",", ";", "=",
AssignmentOperator, PlusMinus, MultOp, Constant, Identifier,
EOF のいずれかの値。なお、
%:文脈依存の属性
():省略可能
{}:区切りを示す括弧
*:0回以上の繰り返し(後に置く)
+:一回以上の繰り返し(後に置く)
[]:文字のどれか
"{|}":文字列のどれか
\:エスケープ文字
;:終端
(void):空
この仕様なら作譜も楽だろ。
jtextfieldに入力した文字を、メモ帳に書き出したいのですが
(jtextfieldに文字入力し、メモ帳に保存の繰り返し)
メモ帳を見ると、単語↑単語↑単語・・・
というふうになっています
これを
単語
単語
単語 としたいのですが、わかりません。write()の括弧の中をかえればいいんでしょうか。
あと、単語を20文字入力しても15文字でメモ帳に書き出したいのですが
初心者で、質問もおかしいかもしれませんが、おねがいできないでしょうか
790 :
M.B.:04/11/10 15:32:24
>>789 write の後に newLine() してみな。
あと、String クラスの subString メソッド調べてみな。
791 :
デフォルトの名無しさん:04/11/10 15:40:53
792 :
M.B.:04/11/10 17:59:18
>>782 あとな、エラーメッセージに出したい情報、
たとえば行番号とカラム位置なんていうのは、
Token クラスに持たせておくこと。
構文解析のときになんとかしようと思うと、
訳わかんなくなる。
793 :
782:04/11/10 18:29:53
分かりました。でも予約語と識別子の区別は字句解析でしないといけないです。
一応その仕様が宿題みたいです。で、次の宿題でコンパイラ全体を作る時に
字句解析ともども根本から見直しさせられるっていう感じみたいです。
どうもありがとうございました。今日とりあえず書いてみます。
794 :
M.B.:04/11/10 20:46:23
>>793 > 分かりました。でも予約語と識別子の区別は字句解析でしないといけないです。
だったら識別子を切り出した後に、int と print だけチェックするルーチンを書け。
で、そのコードは本番用では捨てて、ちゃんとした型チェックが行なえるように修正しろ。
> で、次の宿題でコンパイラ全体を作る時に
> 字句解析ともども根本から見直しさせられるっていう感じみたいです。
ということなら、ボロが出る前に用済みになる。
ついでに、言っとくと、
通常「予約語」っつーのは if とか while とか do とか、
switch とか case とか break とか(repeat とか until とか)、
あるいは class とか extends とか、そういうものをいう。
で、そういう予約語は変数を含めてシンボルとしては使えんようになっている。
逆に(相当に変態的だが)数字や変数型はシンボルとして使えるようにしても、
それほどややこしいことは起きない。
int int = 3; int 2 = int + int; System.out.println( 2 + 2 );
とかやって 6 が出力されるとかいうのはかなり変態的だが、
それで処理系が複雑になるとかいったことはないので安心しろ。
795 :
M.B.:04/11/10 23:58:26
>>771 C言語なら追加するときに追加する行よりも長い行の前に追加すれば
ばchar[81]のリスト構造でもできないことはないな
意味わかんねーよ。
しかもCだし。
798 :
M.B.:04/11/11 21:04:15
宿題まだー?
>>797 typedef struct _tag_NODE {
char linedata[81];
struct tag_NODE* next;
}NODE;
のリスト構造作って追加するときはヘッドから走査して
追加するデータより長い行の前に追加するようにすれば
C言語でも課題がこなせるのではないかと思っただけ
800 :
M.B.:04/11/11 23:03:54
>>799 「C言語でも」つーか「C言語なら」だな。
むしろ Java でやろうとすると悩む。
まあ、当該 NODE の linedata で新しい NODE を new して、
linedata を差し替えたうえで tag に新 NODE の参照を
セットすりゃいいだけの話なんだが。
802 :
782:04/11/12 03:46:39
こんな感じじゃダメですよね・・・
public class LexicalAnalyzer {
private FileReader file;
private char current;
private char next;
private int line;
public LexicalAnalyzer(String name) {
try {
file = new FileReader(name);
next = (char) file.read();
line = 1;
} catch (FileNotFoundException e) {
System.err.println("cannot open " + name);
System.exit(1);
} catch (IOException e) {
System.err.println(e);
}
}
public static void main(String[] args) {
LexicalAnalyzer lex = new LexicalAnalyzer(args[0]);
LexicalToken token = lex.getNextToken();
while (token != null) {
System.out.println(token);
token = lex.getNextToken();
}
}
803 :
782:04/11/12 03:47:09
private void read() {
try {
current = next;
next = (char) file.read();
} catch (IOException e) {
System.err.println(e);
}
}
public boolean hasMoreToken() {
int c = (int) current;
if (c == 65535) return false;
else return true;
}
804 :
782:04/11/12 03:48:30
public LexicalToken makeIdentifier() {
String value = "";
value += current;
while ((Character.isLowerCase(next)) || (Character.isDigit(next))) {
value += next;
read();
}
if (value.equals("int")) {
read();
return new LexicalToken(LexicalToken.VARDECL,line,value);
}
else if (value.equals("print")) {
read();
return new LexicalToken(LexicalToken.PRINT,line,value);
}
else return new LexicalToken(LexicalToken.VAR,line,value);
}
public LexicalToken makeConstant() {
String value = "";
value += current;
while (Character.isDigit(next)) {
value += next;
read();
}
return new LexicalToken(LexicalToken.CONSTANT,line,value);
}
}
805 :
782:04/11/12 03:49:14
public LexicalToken getNextToken() {
read();
if (!hasMoreToken()) return null;
if ((current == '\r') || (current == '\n') ||
(current == '\t') || (current == ' ')) {
if (next == '\n') {
line++;
read();
}
return getNextToken();
}
if (current == '+') {
if (next == '=') {
read();
return new LexicalToken(LexicalToken.PLUSEQUAL,line);
}
else return new LexicalToken(LexicalToken.PLUS,line);
}
if (current == '-') {
if (next == '=') {
read();
return new LexicalToken(LexicalToken.MINUSEQUAL,line);
}
else return new LexicalToken(LexicalToken.MINUS,line);
}
if (Character.isLowerCase(current)) return makeIdentifier();
if (Character.isDigit(current)) return makeConstant();
806 :
782:04/11/12 03:50:20
switch (current) {
case '{' : return new LexicalToken(LexicalToken.C_BRA,line);
case '}' : return new LexicalToken(LexicalToken.C_KET,line);
case '(' : return new LexicalToken(LexicalToken.BRA,line);
case ')' : return new LexicalToken(LexicalToken.KET,line);
case ',' : return new LexicalToken(LexicalToken.COMMA,line);
case ';' : return new LexicalToken(LexicalToken.SEMICOLON,line);
case '=' : return new LexicalToken(LexicalToken.EQUAL,line);
case '*' : return new LexicalToken(LexicalToken.MULTI,line);
case '/' : return new LexicalToken(LexicalToken.DIVIDE,line);
default : return new LexicalToken(LexicalToken.UNKNOWN,line,Character.toString(current));
}
}
ダメダメです
次のプログラムは、食事をする人を表現しています。
このプログラムのEatingMan#eat()メソッドは、
if〜elseが入り組んでいてとても複雑な上に、
新しい種類のFoodクラスを作成する度に変更を加える必要があります。
適切なデザインパターンを用いて、このプログラムを書き換えなさい。
なお、すべての食べ物について、その食べ方は1通りしかないものとします。
ソースコードは次のレス。
class EatingMan{
void eat(Food food){
if(food instanceof Rice){
// お箸を使ってfoodを食べる
}
else if(food instanceof Bread){
// 手づかみでfoodを食べる
}
else if(food instanceof Steak){
// ナイフとフォークを使ってfoodを食べる
}
}
}
class Food{
}
「if〜elseが入り組んでいてとても複雑」ってなんかわざとらしいな
質問があります。
二次元配列 String [] hoge = new String [7]があり、
表形式の行列で表すと次のような形になります。
(,は見やすくするため、CとDの文字列は何でもよい)
列→
A B C D
0, 0, hogeA, hogeI
行 0, 1, hogeM, hogeG
↓ 0, 2, hogeS, hogeV
1, 0, : :
1, 1, : :
1, 2, : :
2, 0, : :
表では列名に便宜上A,B,C,Dと名前をつけました。
質問があります。
二次元配列 String [] hoge = new String [7]があり、
表形式の行列で表すと次のような形になります。
(,は見やすくするため、CとDの文字列は何でもよい)
列→
A B C D
0, 0, hogeA, hogeI
行 0, 1, hogeM, hogeG
↓ 0, 2, hogeS, hogeV
1, 0, : :
1, 1, : :
1, 2, : :
2, 0, : :
表では列名に便宜上A,B,C,Dと名前をつけました。
>811 >812は表がきれいに再現されませんでした。
すみません。
質問があります。
二次元配列 String [] hoge = new String [7]があり、
表形式の行列で表すと次のような形になります。
(,は見やすくするため、CとDの文字列は何でもよい)
A B C D
0, 0, hogeA, hogeI
0, 1, hogeM, hogeG
0, 2, hogeS, hogeV
1, 0, : :
1, 1, : :
1, 2, : :
2, 0, : :
表では列名に便宜上A,B,C,Dと名前をつけました。
この二次元配列からそれぞれ次のような一次元配列を作成するには
どうしたよいですか。
列Aの行の値が「0」の部分をひとまとめにして列B、列C、列Dそれぞれで一次元配列をつくる。
→ 列B {0, 1, 2} 列C {"hogeA", "hogeM", "hogeS"} 列D {"hogeI", "hogeG", "hogeV"}
列Aの行の値が「1」の部分をひとまとめにして・・・
列Aの行の値が「2」の部分をひとまとめにして・・・
おねがいします。
815 :
M.B.:04/11/12 08:36:19
>>802 LexicalToken クラスの宣言はどこだ?
816 :
デフォルトの名無しさん:04/11/12 10:46:50
>>813 package hw8;
public class HW8 {
static String[] column={
"0001112", /*列A*/
"0120120", /*列B*/
"abcdefg", /*列C*/
"hijklmn" /*列D*/
};
public static void main(String[] args) {
char target='0'; //指定文字
String[] s=pickup(target);
System.out.println("列A内の文字「"+target+"」に対応して抽出作成された各文字列");
for(int i=0; i<s.length; ++i) System.out.println(s[i]);
}
static String[] pickup(char target) {
String[] answer=new String[column.length-1];
for(int i=0; i<answer.length; ++i) {
answer[i]=new String();
}
for(int i=0; i<column[0].length(); ++i) {
if(column[0].charAt(i)==target) {
for(int k=0; k<answer.length; ++k) {
answer[k]=answer[k].concat(String.valueOf(column[k+1].charAt(i)));
}
}
}
return answer;
}
}
817 :
デフォルトの名無しさん:04/11/12 10:54:53
>>808 class EatingMan{
void eat(Food food){
food.eat();
}
}
abstract class Food {
abstract void eat();
}
class Rice extends Food {
void eat() { /*お箸を使ってfoodを食べる*/; }
}
class Bread extends Food {
void eat() { /*手づかみでfoodを食べる */; }
}
class Steak extends Food {
void eat() { /*ナイフとフォークを使ってfoodを食べる*/; }
}
すみません質問です。
友人たちに聞いても分からなかったので教えてください。
「mxn 行列 A と n 次元ベクトル b の積 A*bを計算して m 次元ベクトル c に格納し、表示するプログラム」
を作りたいです。
結果は
行列 A =
[ xx.x xx.x xx.x xx.x xx.x ]
[ xx.x xx.x xx.x xx.x xx.x ]
[ xx.x xx.x xx.x xx.x xx.x ]
[ xx.x xx.x xx.x xx.x xx.x ]
ベクトル b (の転置) =
[ xx.x xx.x xx.x xx.x xx.x ]
--- 計算結果 ---
ベクトル c (の転置) =
[ xx.x xx.x xx.x xx.x ]
こうなるようにしたいのですが・・。
どなたかご教示願います。
819 :
間違えた 訂正します:04/11/12 10:57:33
>>808 class EatingMan{
void eat(Food food){
food.eat();
}
}
interface Food {
void eat();
}
class Rice implements Food {
void eat() { /*お箸を使ってfoodを食べる*/; }
}
class Bread implements Food {
void eat() { /*手づかみでfoodを食べる */; }
}
class Steak implements Food {
void eat() { /*ナイフとフォークを使ってfoodを食べる*/; }
}
>>816 レスありがとうございます。
やってみます。
>>816 もとの配列が一次元ではなくて二次元配列でした。
せっかく書いてくれたのにすみません。もう一度お願いします。
[訂正版]
二次元配列 String [][] hoge = new String[7][4]があり、
表形式の行列で表すと次のような形になります。
(,は見やすくするため、CとDの文字列は何でもよい)
hoge = {
{0, 0, hogeA, hogeI},
{0, 1, hogeM, hogeG},
{0, 2, hogeS, hogeV},
{1, 0, },
{1, 1, },
{1, 2, },
{2, 0, },
}
822 :
デフォルトの名無しさん:04/11/12 11:35:30
>>818 package hw9;
public class HW9 {
static int[][] A = {
{0, 1, 2, 3, 4},
{5, 6, 7, 8, 9},
{10,11,12,13,14},
{15,16,17,18,19}
};
static int[] B = {1,2,3,4,5};
static int[] C = new int[A.length];
public static void main(String[] args) {
for(int x=0; x<A.length; ++x) {
for(int y=0; y<A[x].length; ++y) {
C[x]+=A[x][y]*B[y];
}
}
System.out.print("―計算結果―\nベクトル c (の転置) =\n[");
for(int i=0; i<C.length;) {
System.out.print(C[i]);
if(++i >= C.length) break;
System.out.print(",");
}
System.out.println("]");
}
}
>>828さん
ありがとうございます!
申し訳ないのですが、この結果をフレームに表示したいです。
書き込みに不備があってすみません。
import java.awt.*;
import java.awt.event.*;
public class HW9 extends Frame {
public HW9() {
setSize(400,300);
addWindowListener(new WindowAdaptor() {
public void windowClosing(WinowEvent e){
System.exit(0);
}
});
}
この後どう書き換えていけばよいでしょうか。
スレ違いだとは思いますが助けてください。
824 :
古代帝國富士皇朝総帥・伯壬旭:04/11/12 12:11:21
>>821 package hw8;
public class HW8 {
// static String[][] hoge = new String[7][4];
static String[][] hoge = {
{"0", "0", "hogeA", "hogeI"},
{"0", "1", "hogeM", "hogeG"},
{"0", "2", "hogeS", "hogeV"},
{"1", "0", "hogeW", "hogeX"},
{"1", "1", "hogeY", "hogeZ"},
{"1", "2", "hogeJ", "hogeK"},
{"2", "0", "hogeM", "hogeL"},
};
public static void main(String[] args) {
String target="0"; //指定文字列
String[] s=pickup(target);
char label='B';
for(int i=0; i<s.length; ++i) {
System.out.print("列"+(label++)+"{");
System.out.print(s[i]); System.out.println("}");
}
}
static String[] pickup(String target) {
String[] answer=new String[hoge[0].length-1];
for(int i=0; i<answer.length; ++i) answer[i]=new String();
for(int a=0; a<hoge.length; ++a) {
if(!target.equals(hoge[a][0])) continue;
for(int b=1; b<hoge[a].length; ++b) answer[b-1]=answer[b-1].concat(" " + hoge[a][b] + ",");
}
return answer;
}
}
825 :
デフォルトの名無しさん:04/11/12 12:28:59
>>823 package hw9;
import java.awt.*; import java.awt.event.*;
public class HW9 extends Frame {
static int[][] A = {
{0, 1, 2, 3, 4},
{5, 6, 7, 8, 9},
{10,11,12,13,14},
{15,16,17,18,19}
};
static int[] B = {1,2,3,4,5};
static int[] C = new int[A.length];
public static void main(String[] args) {
for(int x=0; x<A.length; ++x) {
for(int y=0; y<A[x].length; ++y) C[x]+=A[x][y]*B[y];
}
new HW9();
}
HW9() {
TextArea ta=new TextArea(); ta.setFont(new Font("Dialog", 0, 15)); add(ta);
ta.append("―計算結果―\nベクトル c (の転置) =\n[");
for(int i=0; i<C.length;) {
ta.append(String.valueOf(C[i]));
if(++i >= C.length) break;
ta.append(",");
}
ta.append("]");
setSize(400,300);
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } });
setVisible(true);
}
}
826 :
782:04/11/12 20:26:09
すいません、LexicalToken載せるの忘れてました。
ダメなのは分かってるんですがどこらへんをどう改良すればいいのか
是非教えていただきたいです・・・。最初は1文字のTokenのタイプナンバーは
各キャラクターを整数型にキャストしたもので割り当てていたんですけど、
宿題の詳細をよく読んだらタイプナンバーは0から始めろってことだったので
仕方なく改良したらこんなことになっちゃったのです。
public class LexicalToken
{
public final static int BRA = 0; /* Single char tokens */
public final static int KET = 1;
public final static int C_BRA = 2;
public final static int C_KET = 3;
public final static int COMMA = 4;
public final static int SEMICOLON = 5;
public final static int EQUAL = 6;
public final static int MULTI = 7;
public final static int DIVIDE = 8;
public final static int PLUS = 9;
public final static int MINUS = 10;
public final static int PLUSEQUAL = 11; /* Multi char tokens */
public final static int MINUSEQUAL = 12;
public final static int VARDECL = 13; /* Complex tokens */
public final static int PRINT = 14;
public final static int VAR = 15;
public final static int CONSTANT = 16;
827 :
782:04/11/12 20:26:43
public final static int UNKNOWN = 99;
private int type;
private int line;
private String value;
public LexicalToken(int type, int line) {
this.type = type;
this.line = line;
switch (type) {
case 0: value = "OpenBracket"; break;
case 1: value = "CloseBracket"; break;
case 2: value = "OpenCurlyBracket"; break;
case 3: value = "CloseCurlyBracket"; break;
case 4: value = "Comma"; break;
case 5: value = "Semicolon"; break;
case 6: value = "AssignmentOp: ="; break;
case 7: value = "MultOp: *"; break;
case 8: value = "MultOp: /"; break;
case 9: value = "AddingOp: +"; break;
case 10: value = "AddingOp: -"; break;
case 11: value = "AssignmentOp: +="; break;
case 12: value = "AssignmentOp: -=";
}
}
828 :
782:04/11/12 20:27:30
public LexicalToken(int type, int line, String value) {
this.type = type;
this.line = line;
switch (type) {
case 13: this.value = "ReservedWord: " + value; break;
case 14: this.value = "ReservedWord: " + value; break;
case 15: this.value = "Identifier: " + value; break;
case 16: this.value = "Constant: " + value; break;
case 99: this.value = "UnknownToken: " + value;
}
}
public String toString() {
return "type " + type + " | " + value + " | line: " + line;
}
}
830 :
M.B.:04/11/12 22:19:06
>>828 できてんじゃん。すごいすごい。
ただ、いかんせん設計つーか問題自体が悪いところがあって、
制約を緩めないとこれ以上綺麗なコードにはならんだろうね。
それを踏まえてアドバイスしておくと、
1)一文字づつ入力するより一行づつ入力し、
トークン切り出しの部分ではfor文を使う。
行をまたがるトークンはないので、改行符号のチェックが省略できて
全体の見通しがよくなる。
また、こういうふうにしておくと、
+= と -= のチェックを二重の if 文ではなく、
String オブジェクトの Matches メソッドで行なえるようになるので、
コードがすっきりする。
2)唯一、行をまたがって現れるのがコメントなので、
まずファイルの終わりにぶちあたった時の例外を定義して、
トークン切り出しルーチンの入口のところで try & catch で
待ち構えて、空白とコメントを読み飛ばすところで
ファイルの終わりを検出したら、throw しろ。
以上。がんがれ。
>829
カプセル化して情報隠蔽を図れば、当然に可視性を下げるんじゃないでせうか。
とJavaもOOPもどしろーとな漏れが畏れ多くも口を出してみるテスト。
おいおい、正しいカプセル化はむしろ可読性を高めるだろう
それとも、もしかして可視性って可読性とは別ですか
>831-832
なんか俺の言いたいことと違う。
「interface内のメソッドは自動的に
public abstract
になるのに、それをimplementsしてるクラスのeat()メソッドが
パッケージの可視性しかないから、
このままではコンパイルエラーになると思う。」
ということを言いたかった。
切腹!
836 :
M.B.:04/11/12 23:03:15
>832
「可視性」はアクセス許可のつもりで書いていた。
可読性については同意。
>833
はい、すっかり見落としてました。
ということで829、832とも正直スマンカッタorz
ありがたいアドバイス。長々とコード貼り付けた甲斐がありますた。
行入力にするかどうかは実は結構迷ってたんですが、
確かに行をまたがるTokenはないですね。なぜか気付きませんでした。
あとStringクラスのMatchesメソッド見たんですがイマイチ使い方がピンときません。
どうやるんでしょう?この場合 +=か-=か=て感じでマッチさせるのですか?
(+-)*= みたいな?
[+-]?=では?
>>825さん
レス遅れてすみません。本当助かります!
そのプログラムをそのまま実行したらエラーが出ました。
Exception in thread "main" java.lang.NoClassDefFoundError:HW9(wrong name:hw9/HW9)
とのことなのですが・・。
ちなみにファイル名はHW9.javaとしました。
コンパイルエラーはでてないですが、実行できません。
どうすればよいのでしょうか、たびたびすみません。
841 :
M.B.:04/11/12 23:51:47
>>838 紛らわしいこと言ってスマソ。
regionMatches()で長いほう(部分文字列でないほう)
を先に比較すればオッケー。つまりは、
"+=" を '+' より先に、"-=" を '-' より先にチェックする。
case 文では条件判断を書けず、
if 〜 else は向かって右へ右へとインデントしちゃってウザいので、
関数(メソッド)で定義して return で戻すのが定跡になっている。
まあ、他にも手はあるのだけどね、あまり一般的でないので、
見た香具師が混乱する。
842 :
デフォルトの名無しさん:04/11/12 23:53:11
843 :
M.B.:04/11/12 23:54:40
>>840 > package hw9;
を削れ。
844 :
M.B.:04/11/12 23:56:43
>>841 の補足。
do {
} while (false);
でくくっといて、breakで抜ける。
>>840さん
実行できました!
助かりました。
教えてくださった方々ありがとうございました!
846 :
M.B.:04/11/13 00:36:30
847 :
デフォルトの名無しさん:04/11/13 01:51:13
class Student{
private int ID;
private String name;
private int[]reportScores;
public String getStudentName(){return name;}
}
class Prog3Students{
private Student[] students;
public Prog3Students(int n){
students = new Student[n];
}
public void InsertionSortByName(){
int i,j;
Student s;
for (i=0; i < a.length; i++){
s = students[i];
for (int j=i;(j > 0) &&
s.getStudentName().compareTo(students[j-1]).getStudentName());
j--){
students[j] = students[j-1];
}
students[j] = s;
}
}
}
848 :
847:04/11/13 01:51:52
class TestProg3Students{
public static void main(String[] argv){
Prog3Students p3s = new Prog3Students(100);
p3s.InsertionSortByName();
}
}
上記のプログラム例を参考にして、学生情報(学籍番号、名前、
レポートの平均点)を下記のような実行例になるように、アルファベット順で
ソート(挿入ソート)するプログラムを作成しなさい。
作成するクラスは、Student, Prog3Students, TestProg3Studentsの3つとする。
変数やメソッドを適切に追加・修正して完成させなさい。
ソーティング前:
StudentID: 16000009, StudentName: Yamashita Daisuke, AverageScore: 95
StudentID: 16000010, StudentName: Yamamoto Gorou, AverageScore: 78
StudentID: 16000012, StudentName: Wada Kyouko, AverageScore: 80
StudentID: 16010001, StudentName: Asada Jirou, AverageScore: 88
StudentID: 16010002, StudentName: Okada Hanako, AverageScore: 90
StudentID: 16020005, StudentName: Kimura Tarou, AverageScore: 66
StudentID: 16020007, StudentName: Suzuki Ichirou, AverageScore: 70
ソーティング後:
StudentID: 16010001, StudentName: Asada Jirou, AverageScore: 88
StudentID: 16020005, StudentName: Kimura Tarou, AverageScore: 66
StudentID: 16010002, StudentName: Okada Hanako, AverageScore: 90
StudentID: 16020007, StudentName: Suzuki Ichirou, AverageScore: 70
StudentID: 16000012, StudentName: Wada Kyouko, AverageScore: 80
StudentID: 16000010, StudentName: Yamamoto Gorou, AverageScore: 78
StudentID: 16000009, StudentName: Yamashita Daisuke, AverageScore: 95
849 :
847:04/11/13 01:52:42
import java.lang.*;
import java.io.*;
import java.util.*;
class SortableData {
private int[] a;
public SortableData(int initSize) {
}
public void bubbleSort() {
}
public void selectionSort() {
}
public void insertionSort() {
}
850 :
847:04/11/13 01:53:49
public void fillRandomData() {
for (int i = 0; i < a.length; i ++) {
a[i] = (int) (java.lang.Math.random() * 10000.0);
}
}
public void fillOrderedData() {
}
public void fillRevOrderedData() {
}
public void print(String header) {
System.out.print(header);
System.out.print(a[0]);
for (int i = 1; i < a.length; i ++) {
System.out.print("," + a[i]);
}
System.out.println();
}
}
851 :
847:04/11/13 01:54:24
class TestSort {
public static void main(String[] argv) {
SortableData sd = new SortableData(10);
System.out.println("BubbleSort");
sd.fillRandomData();
sd.print("Random: ");
sd.bubbleSort();
sd.print("------> ");
sd.fillOrderedData();
sd.print("Ordered: ");
sd.bubbleSort();
sd.print("-------> ");
sd.fillRevOrderedData();
sd.print("Reverse: ");
sd.bubbleSort();
sd.print("-------> ");
}
}
(1)上記に示したソート可能なデータを保持するクラスSortableData,およびこのクラスの
オブジェクトを利用してソートを行うクラスTestSortとを完成させて以下のデータに対して、
正しくソートできることを確認しなさい。
(a)正順に並べたデータ (1,2,3,4,5 → 1,2,3,4,5)
(b)逆順に並べたデータ (5,4,3,2,1 → 1,2,3,4,5)
(c)ランダムに並べたデータ (3,5,1,2,4 → 1,2,3,4,5)
852 :
847:04/11/13 01:56:35
(2)上記のプログラムを改造して、ランダムな場合でよいので、ソートの実行時間がどのように
変化するかを調べ、考察せよ。
import java.lang.*;
import java.io.*;
import java.util.*;
class SortableData {
...
}
class TestSortPerformance {
public static void main(String[] argv) {
if (argv.length == 0) {
System.out.println("Usage: java TestSortPerformance size1 size2 ...");
return;
}
853 :
847:04/11/13 01:57:57
for (int i = 0; i < argv.length; i ++) {
int size = Integer.parseInt(argv[i]);
SortableData sd = new SortableData(size);
long start,end;
System.gc();
sd.fillRandomData();
start = new Date().getTime();
sd.bubbleSort();
end = new Date().getTime();
System.out.println("bubble sort for " + size +
" data took " + (end - start) +
"milliseconds");
// 選択ソートの実行計測
...
// 挿入ソートの実行計測
...
}
}
}
を参考にすること。
854 :
847:04/11/13 01:59:10
以上3つの課題です。
どうかお力をお貸し下さい。お願いします。
>>848 その1
import java.util.*;
public class TestProg3Students {
static String data =
"StudentID: 16000009, StudentName: Yamashita Daisuke, AverageScore: 95\n" +
"StudentID: 16000010, StudentName: Yamamoto Gorou, AverageScore: 78\n" +
"StudentID: 16000012, StudentName: Wada Kyouko, AverageScore: 80\n" +
"StudentID: 16010001, StudentName: Asada Jirou, AverageScore: 88\n" +
"StudentID: 16010002, StudentName: Okada Hanako, AverageScore: 90\n" +
"StudentID: 16020005, StudentName: Kimura Tarou, AverageScore: 66\n" +
"StudentID: 16020007, StudentName: Suzuki Ichirou, AverageScore: 70\n";
public static void main(String[] argv) {
Prog3Students p3s = new Prog3Students(data);
p3s.InsertionSortByName();
p3s.showSortedList();
}
}
class Student {
private int ID;
private String name;
private int[] reportScores;
private int averageScore;
Student(int id, String n, int average) {
ID=id; name=n; averageScore=average;
}
public String getStudentName() {
return name;
}
public String getStudentInfo() {
return "StudentID: "+ID+", StudentName: "+ name+", AverageScore: "+averageScore;
}
}
>>848 その2
class Prog3Students {
private Student[] students;
public Prog3Students(String data) {
StringTokenizer st=new StringTokenizer(data, ",\n");
String label1="StudentID:", label2="StudentName:", label3="AverageScore:";
int id=0; String name=""; int average=0;
List list=new ArrayList();
while(st.hasMoreTokens()) {
String token=st.nextToken().trim();
if(token.startsWith(label1)) {
id=Integer.parseInt(token.substring(label1.length()).trim());
} else if(token.startsWith(label2)) {
name=token.substring(label2.length()).trim();
} else if(token.startsWith(label3)) {
average=Integer.parseInt(token.substring(label3.length()).trim());
list.add(new Student(id, name, average));
}
}
students=new Student[list.size()];
for(int i=0; i<list.size(); ++i) students[i]=(Student)list.get(i);
}
public void InsertionSortByName(){
for (int i=0; i < students.length; i++){
for (int j=i;(j > 0) && students[j].getStudentName().compareTo(students[j-1].getStudentName())<0; j--){
Student swap = students[j]; students[j] = students[j-1]; students[j-1] = swap;
}
}
}
public void showSortedList() {
for(int i=0; i<students.length; ++i) System.out.println(students[i].getStudentInfo());
} }
>>752を以下のように改造してみましたがうまく動作してくれません。
JOptionPane.showMessageDialogの辺りが怪しいと思うのですが、
どう修正していいのか分からないので教えて頂けないでしょうか。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Kadai extends Frame implements TextListener {
static int width;
TextField TextBox;
Kadai(String width){
Integer.parseInt(width);
addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });
TextBox = new TextField(width);
TextBox.addTextListener(this);
add(TextBox);
pack();
setVisible(true);
}
public void textValueChanged(TextEvent e){
System.out.println(TextBox.getText());
}
public static void main(String[] args){
JOptionPane.showMessageDialog(null, "入力内容表示プログラム");
width = JOptionPane.showInputDialog("文字数を入力");
new Kadai(width);
}
}
858 :
古代帝國富士皇朝総帥・伯壬旭:04/11/13 10:59:59
>>851 その1
TestSortクラスはそのままで
class SortableData {
private int[] a;
public SortableData(int initSize) {
a=new int[initSize];
}
public void fillRandomData() {
Set set=new TreeSet();
for (int i = 0; i < a.length;) {
int num=(int)(Math.random()*a.length);
if(!set.contains(new Integer(num))) {
set.add(new Integer(num));
a[i]=num;
++i;
}
}
}
public void fillOrderedData() {
for(int i=0; i<a.length; ++i) a[i]=i;
}
public void fillRevOrderedData() {
for(int i=0; i<a.length; ++i) a[i]=a.length-1-i;
}
public void print(String header) {
System.out.print(header);
System.out.print(a[0]);
for (int i = 1; i < a.length; i++) System.out.print("," + a[i]);
System.out.println();
}
859 :
古代帝國富士皇朝総帥・伯壬旭:04/11/13 11:01:34
>>851 その2
public void bubbleSort() {
for(int i=0; i<a.length; ++i) {
for(int j=1; j<a.length-i; ++j) {
if(a[j]<a[j-1]) {
int swap=a[j]; a[j]=a[j-1]; a[j-1]=swap;
}
}
}
}
public void selectionSort() {
for(int i=0; i<a.length; ++i) {
for(int j=i; j<a.length; ++j) {
if(a[i]>a[j]) {
int swap=a[j]; a[j]=a[i]; a[i]=swap;
}
}
}
}
public void insertionSort() {
for(int i=1; i<a.length; ++i) {
for(int j=i; j>0 && a[j]<a[j-1]; --j) {
int swap=a[j]; a[j]=a[j-1]; a[j-1]=swap;
}
}
}
}
860 :
古代帝國富士皇朝総帥・伯壬旭:04/11/13 11:03:11
>>852 その1
class TestSortPerformance {
public static void main(String[] argv) {
if (argv.length == 0) {
System.out.println("Usage: java TestSortPerformance size1 size2 ..."); return;
}
for (int i = 0; i < argv.length; i++) {
int size = Integer.parseInt(argv[i]);
SortableData sd = new SortableData(size);
long start,end;
System.gc();
sd.fillRandomData();
start = new Date().getTime();
sd.bubbleSort();
end = new Date().getTime();
System.out.println("bubble sort for "+size+" data took "+(end - start)+"milliseconds");
sd.fillRandomData();
start = new Date().getTime();
sd.selectionSort();
end = new Date().getTime();
System.out.println("selection sort for "+size+" data took "+(end - start)+"milliseconds");
sd.fillRandomData();
start = new Date().getTime();
sd.insertionSort();
end = new Date().getTime();
System.out.println("insertion sort for "+size+" data took "+(end - start)+"milliseconds");
}
}
}
861 :
古代帝國富士皇朝総帥・伯壬旭 :04/11/13 11:12:25
>>852 その2
>ランダムな場合でよいので、ソートの実行時間がどのように
>変化するかを調べ、考察せよ。
bubble sort for 10000 data took 735milliseconds
selection sort for 10000 data took 797milliseconds
insertion sort for 10000 data took 266milliseconds
>>860のコードで、引数を10000にしてテストした結果は上記のようになる。
862 :
デフォルトの名無しさん:04/11/13 11:19:41
>>857 width = JOptionPane.showInputDialog("文字数を入力");
を
String width = JOptionPane.showInputDialog("文字数を入力");
とすればOK
テスト
>>862 ありがとうございます
修正を加えたところ、とりあえずは動作するようになりましたが
肝心のTextField()で引数のwidthがintではなくStringとなっているのか
ダイアログの大きさが変わってくれません。
どうすればよいのでしょうか。
>>808のデザパタ問題について。
>>819 Food#eat() よりも
Food#eatenBy(EatingMan) というメソッドであるべきと思います。
食べるという行為が、食べる人について全く関与せずに行われることは
あまり無いと思うので。
些細なry
>865
混ぜっ返しかもしれんけど
EatingMan#eat(Food)でいいのと違うだろうか。
で、インターフェース(abstractクラスの方がいいかな? )Foodには
bitten()とか、getTaste()とか用意しておいて。
単にメソッド名の問題なのなら
クラス名に対するメソッド名は
主格関係でも目的格関係でもいいじゃないの?
食べるという行為は常に人が絡むものだからってことで
Food#eatenBy(Man) にするっていうのは分かる気がするけど。
メソッド名の問題……それも、単に個人的な感触というか印象の問題なんで、
(「なんとなく」人間中心に考えた方が座りがいいなぁ、という程度の話)
異論のある方は867はさくっと見逃して下せえまし。スレ汚し失礼しやした。
↓以下何事もなかったかのように宿題と回答
>>867 あからさまに混ぜっ返しなのだが、
getTaste() とか getColour() とかいうメソッドは、
Manのメソッドにせんとイカン。
亜鉛が足りないとかいうと味がわからん。
読み込んだテキストファイルの数字を使ってペイントで図形を描画したいんですが。
>871
宿題文を省略せず全文書いてください。
……ところでだな、いいかげん
「 Java のプリティプリンタ(とりあえずインデントのみ)を書け」
とかいう宿題を持ってきてくれる親切や香具師が
出てきてくれるんじゃないかなと期待しておるのだが。
いちいちインデントしてコードを確認するのも面倒なのだが、
かといって率先して書こうという気にもならんので……
>873
自分で宿題を書いて自分で回答。これ最強。
>>875 ワシの正体はトーベ・ヤンソンの『ムーミン谷の夏まつり』に出てくる、
「飛行おに」なのじゃ。
「ルビーの王さま」と「ルビーの女王」を求めて、
世界中をさまよっておるのじゃ。
>>874 『無目的コンピュータ用語辞典』からネタ引っ張ってくるのはやめれ。
>876
ムーミン……
あれを読んでファンタジックな世界に浸っていた時代が
俺にもありました……(AAry
ついでだ、でっちあげ宿題。
「飛行おに」「ルビーの王様」「ルビーの女王」の3クラスを作り、
それぞれに適当な思考ロジックを与えて鬼ごっこするプログラムを作成せよ。
追いかけ・逃げはターン制で順次行ってもよし、3つスレッド走らせてバラバラに動かすもよし。
表示もAWT、Swingは言うに及ばずコマンドコンソールでもOK。さぁどうだ。
# なお、ルビーの王様/女王をRubyで実装するとかいうベタなギャグは却下。
879 :
M.B.:04/11/13 23:07:26
>>878 それなら「公園番」と「スナフキン」と「子供たち」だろう。
で、アイテムとして「ニョロニョロ」を加える。
>>877 なぜわかった!
さては貴様、Googleの中の人だな!!
881 :
M.B.:04/11/14 00:04:31
>>880 『bit 悪魔の辞典』の時代から、
そっち方面はアンテナ張ってるのよ。
882 :
M.B.:04/11/14 00:05:39
またしてもネタスレ化に手を貸している
馬鹿だ _| ̄|○
>>883 > ダイアログの大きさが変わってくれません。
の詳細キボンヌ