親子におすすめの新型プラネタリウムとは?

3桁の数字を当てるhit&blowを作っています。
3桁の重複のない数字を発生させ、入力した数字と照合させ正解か不正解の判定までは出来ます。しかし、hitとblowの表示ができず苦しんでます。
アドバイス、参考になるサイト等を教えてください。
お願いします。

A 回答 (6件)

#3です。



>エラーが出ます。どこが悪いか教えてもらえますか?
何のコンテナで実行されているのかわかりませんが、ログは確認してみましたか?
見たところコンパイルエラーになるはずなので実行もされてないはずです。コンパイルエラーの箇所などはログにはき出されているはずなので確認してください。

以下、私の気づいた点です。
・num4はintなのにint配列として扱われている。
・入力に対しても、正解に対しても頭が0の時が考慮されていない。(intまたはIntegerで数値を扱っている)
    • good
    • 0

とりあえずぱっと見だと、


セッションから値を取り出してるけど、
セッションに値を格納していない。
ってところかな。

セッションに格納するのか、リクエストに格納するのか、格納したときの名前と同じ名前で取り出さないといけない。

ここら辺かな。
個人的には{とか}が同じ行で見づらいとか、だから余計な{}の組があるんだなぁとか思いますが。(コンパイルエラーは出ないので別に問題ないっちゃぁ問題ない。)

あと、ちょっと下にある
「再:助けてください」
と同じようなソース(やりたいことは違うみたいだけど)で、同じようなとこでひっかかってるみたいだから、参考にしてみてもいいんじゃないかな。

あとは「エラーがでます。」って言うのなら、そのエラーも書かないと。
    • good
    • 0

もしかして、hit/blowの履歴を表示できないってことではないですか?


だとしたら、
1.input type=hidden でユーザ入力送信時に過去の
履歴も毎回送信するようにする。
(カンマ区切りとかで。)
2.過去の履歴をセッション変数にする
のどちらかがよいかと思います。
的外れだったら申し訳ありません。。。
    • good
    • 0

#1です。



hitとblowの判定は難しくないので、一応サンプルを・・・

numbersが当てるの数字でinputが入力された数字だとします。両方int型の配列を想定しています。

// hitを求める
int hit = 0;
for(int i = 0; i < 3; i++){
if(numbers[i] == input[i]){
hit++;
}
}

// blowを求める
int blow = 0;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(i != j && numbers[i] == input[j]){
blow++;
}
}
}

この回答への補足

書き込みありがとうございます。上を元に作ってみたのですが、エラーが出ます。どこが悪いか教えてもらえますか?

<%@ page contentType="text/html;charset=Shift_JIS" %>
<%
int num1,num2,num3,num4; //num4が正解の数字
boolean isRight;//解答が正解かどうか
Integer num4Int=(Integer)session.getAttribute("num4");//
Boolean isRightBoo=(Boolean)session.getAttribute("isRight");//
if(num4Int==null || isRightBoo==null){
//sessionオブジェクトに正解の情報がない
isRight=true;
}else{
//sessionオブジェクトより取得した値を使う
isRight=isRightBoo.booleanValue();
}
if(isRight){
//既に正解済、新たな正解の数字を乱数で決める
do{num1=(int)(Math.random()*10);}
while(num1==0);

do{num2=(int)(Math.random()*10);}
while(num2==num1);

do{num3=(int)(Math.random()*10);}
while(num3==num1 || num3==num2);
num4=num1*100+num2*10+num3;

isRight=false;
session.setAttribute("num4",new Integer(num4));
session.setAttribute("isRight",new Boolean(isRight));
}else{
//sessionオブジェクトより取得した正解を使う
num4=num4Int.intValue();
}
%>
<html>
<head>
<title>hit&blow</title>
</head>
<body>
<h1>数字当てゲーム</h1>
<br>
<%
int ans;
//requestオブジェクトからパラメータを(解答)を受け取る
String s=request.getParameter("answer");
if(s!=null){
try{
ans=Integer.parseInt(s);
if(num4==ans){
//解答と正解が一致
isRight=true;
HttpSession hs = request.getSession(true);
out.println("<p>正解!</p>");
}int hit = 0;
for(int i = 0; i < 3; i++){
if(num4[i] == ans[i]){
hit++;}}

// blowを求める
int blow = 0;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(i != j && num4[i] == ans[j]){
blow++;
}}} {
//解答が3桁以上のの数字
out.println("<p>3桁の数字を入力してください</p>");
}
}catch(NumberFormatException e){
//数字以外をフォームから受け取ったときの例外処理
out.println("<p>数字は整数で入力してください</p>");
}
}
%>
<hr>
<%
String NextPage="Training7.jsp";
NextPage=response.encodeURL(NextPage);
if(!isRight){
// 解答と正解が不一致
%>
3桁の数字を当ててください。<br>
(3桁の中に同じ数字はありません。)<br>
数字を入力してください。<br>
<form action="<%=NextPage%>">
<input type="text"name="answer">
<input type="submit">
</form>
<%
}else{
//解答と正解が一致
%>
<a href="<%=NextPage%>">もう一度する</a>
<%
}
%>
</body>
</html>

補足日時:2005/05/02 10:20
    • good
    • 0

JSPで判定はできるけど表示ができないんですよね?


<% if(○○ == ○○) {%>
正解
<%} else { %>
不正解
<%}%>
じゃダメなのかな?

または
<% if(○○ == ○○) {
out.println("正解");
} else {
out.println("不正解");
%>
とか…

ごめんなさい、できればもう少し詳しく教えて頂ければ…
それと質問内容では判定できると言ってますがNo.1の補足では
判定ができないと言ってますね、どっちですか?
    • good
    • 0

>hitとblowの表示ができず苦しんでます。


これだけでは何が出来ないのかさっぱりわかりません。
もう少し具体的に書いた方が回答は得られやすいです。

1.作っているのはアプレット?JSP/Servlet?それともコンソールアプリですか?
2.表示が出来ないのか、hitとblowの判定が出来ないのかどちらでしょう?

この回答への補足

すみません。書き込んだ後に気付きました。
1.JSPで、2.判定が出来ません。
よろしくお願いします。

補足日時:2005/04/30 19:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。

JAVAの練習問題でわからなくて困っています

以下は線形探索のプログラムで、このプログラムを改良して、
要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。

以下のような簡単なプログラムでできる方法で行いたいです。
どなたか答えまたはヒントを下さい、お願いします。
------------------------------------------------------------
import java.util.Random;
import java.util.Scanner;

public static void main (String[] args) {
Random rand = new Random();
Scanner stdIn = new Scanner(System.in);

final int n = 10; //要素数
int[] a = new int[n]; //配列を宣言

for (int j = 0; j < n;)
a[j] = rand.nextInt(10);

System.out.print("配列aの全要素の値\n{ ");
for (int j = 0; j < n; j++)
System.out.print(a[j] + " ");
System.out.println("}");

System.out.print("探す数値 : ");
int key = stdIn.nextInt();

int i;
for (i = 0; i < n; i++)
if (a[i] == key)
break;

if (i < n) //探索成功
System.out.println("それはa[" + i + "]にあります。");
else //探索失敗
System.out.println("それはありません。");
}
}

JAVAの練習問題でわからなくて困っています

以下は線形探索のプログラムで、このプログラムを改良して、
要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。

以下のような簡単なプログラムでできる方法で行いたいです。
どなたか答えまたはヒントを下さい、お願いします。
------------------------------------------------------------
import java.util.Random;
import java.util.Scanner;

public static void main (String[] args) {
Random rand = new...続きを読む

Aベストアンサー

えぇと, 「0~9 の値が重複しないようにする」ということ? だとしたら, 最初に 0~9 の値を入れておいて, ランダムに交換するというのが簡単ですね.
for (i=0; i < 10; ++i) a[i] = i;
for (i = 10; i > 1; --i) {
int r = rand.nextInt(i);
int t = a[r];
a[r] = a[i];
a[i] = t;
}
という感じ, かな?

Q階乗の式

「5」と入力すると、「1*2*3*4*5=120」(階乗)と表示されるプログラムを組みたいのですが、
例で言うと120という計算結果は出せるのですが式の部分が出せません。
forまたはwhileによって作るんですが誰か式をうまく出すプログラムが分かる人いらっしゃいませんか?

Aベストアンサー

import java.io.*;

public class kaijyou {
public static void main(String[] args){
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

System.out.print("数字を入力=> ");
int x = Integer.parseInt(in.readLine());
int y=1;

System.out.print("結果は ");
for(int i=1;i<x;i++){

System.out.print(i+"*");
y=i*y;

}
System.out.print(x+"=" +y*x );
}
}

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Q画面出力の際の繰り返しと入力文字チェック

いつもお世話になっております。
System.out.println("数字を入力してください");
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader);
String str = br.readLine();
int res = Integer.parseInt(str);
と記述して画面に出力させた場合、数字以外を入力するとエラーになりますが、入力文字のチェックが可能な方法をご存知の方お願いします。
もうひとつ、作業が終わった後も"数字を入力してください"と繰り返すプログラムについてもご教授ください。
いつも簡単な質問で申し訳ありません・・。一応逆引き辞典で調べてはいるのですが。。

Aベストアンサー

>入力文字のチェック
try {
int res = Integer.parseInt(str);
}
catch(NumberFormatException e){
System.out.println("整数として解釈できない文字が入力されました");
}
のような感じで例外処理します。

>繰り返すプログラム
全体を
while(true){

}
で囲むと繰り返すプログラムになります。
trueの部分を条件式にして条件でループを終了するようにしておくか
if(条件)
break;
のようにループを条件で脱出できるようにしておきます。

Q無名配列の作成方法について質問

以下はJavaの参考書の問題集に掲載されていた、無名配列を作成するソースコードです。
この書き方について疑問があるので、質問させて頂きます。


int[][]n=new int[2][];
n[0]=new int[3];

このn[0]=new int[3];が、無名配列を使って要素に値を設定していると解説に書かれていました。
しかし、この参考書では、別のページで無名配列の作成方法として、int[]n; n=new int[]{1,2,5};のように、要素リストを代入する書き方が、無名配列の例として
紹介されていました。。

質問1:何故、n[0]=new int[3];の書き方も無名配列なのですか?


質問2:そもそも「無名配列」とは何ですか?参考書にもネットで調べても
その解説がほとんど無かったので、、、

Aベストアンサー

無名配列という言葉で検索すると、もっとヒットするのはPerlのものですね。
Perlは標準的には、配列は配列名とセットでないと定義できないのですが、
名前無しでも定義する文法があって、それを無名配列と呼びます。
Perlで多次元配列を使いたいとき、この無名配列という仕様が関わってくるのですが、
どうもこの辺から、その参考書の筆者は元Perl使いで、Perlの用語をJavaでも混同して使っているというのが真相な気がしてなりません。
(Perlと比較して考えると、そもそもJavaの配列は全て無名配列です。)

無名○○という用語は、普通は名前を付けなければ定義できないけれど、
特別に名前無しでも定義する方法がある。というとき、前者と区別するために、無名○○とか、匿名○○と呼ぶことが多いです。
(メソッドは通常名前無しでは定義できませんが、C#とかJavaScriptでは名前無しで定義する方法があり、それを匿名メソッドとか呼ばれます。)
Javaには無名クラスという、クラス名を付けずにクラスを定義できる仕様がありますが、こっちは一般的な用語です。

とりあえず「無名配列」は一般的な用語でもないですし、上の話は理解できなくても重要な事は何一つないので、特に気にせず先に進むのがベストでしょう。

無名配列という言葉で検索すると、もっとヒットするのはPerlのものですね。
Perlは標準的には、配列は配列名とセットでないと定義できないのですが、
名前無しでも定義する文法があって、それを無名配列と呼びます。
Perlで多次元配列を使いたいとき、この無名配列という仕様が関わってくるのですが、
どうもこの辺から、その参考書の筆者は元Perl使いで、Perlの用語をJavaでも混同して使っているというのが真相な気がしてなりません。
(Perlと比較して考えると、そもそもJavaの配列は全て無名配列です。)

無名...続きを読む

Q「httpステータス404」というエラーが出ます。

「httpステータス404」というエラーが出ます。

java初心者です、宜しくお願い致します。
EclipseでServletを書いてやりましたが、以下のようなエラーが出ます、
原因はなんでしょうか、宜しくお願い致します。
「httpステータス404-/Servlet%E7%B7%B4%E7%BF%92/ ServOutput」

Aベストアンサー

Not Found
という意味です。
そのファイルが無い。あるいはリンクが間違っています。
詳しくは参考URLをみてください。

参考URL:http://ja.wikipedia.org/wiki/HTTP_404

Q空の文字列とnullと""

java初心者です。
空の文字列とnullと""の3つの関係がよくわかりません。

TextFieldを使った簡単なプログラムを作りました。そこで、”TextFieldに何も入力されていないこと”を判定する文を書こうと思ったのですが、どう書けばいいのか迷いました。

TextFieldのオブジェクトをtfとして、tf.getText()==""かtf.getText()==nullで大丈夫だと思いましたが、実行してみると、どちらを用いても判定できませんでした。結局、tf.getText().length()==0で判定できました。そこで、リファレンスを見ると、getText()はデフォルトで空の文字列を返すと、書いてありました。

したがって、「""とnullは空の文字列とは異なる」という理解に至ったのですが、では空の文字列とは何なのかという疑問がわいてきました。

また、自分は""とnullの違いもよくわかっていません。""とnullが異なるものである、ということはわかるのですが・・・

質問をまとめると
・空の文字列とは何なのか?
・空の文字列は""やnullとどう違うのか?
です。よろしくお願いします。

java初心者です。
空の文字列とnullと""の3つの関係がよくわかりません。

TextFieldを使った簡単なプログラムを作りました。そこで、”TextFieldに何も入力されていないこと”を判定する文を書こうと思ったのですが、どう書けばいいのか迷いました。

TextFieldのオブジェクトをtfとして、tf.getText()==""かtf.getText()==nullで大丈夫だと思いましたが、実行してみると、どちらを用いても判定できませんでした。結局、tf.getText().length()==0で判定できました。そこで、リファレンスを見ると、getText()はデフ...続きを読む

Aベストアンサー

tf.getText() == ""
では、オブジェクト比較になってしまうので、当然NGです。

"".equals(tf.getText())

とすれば良いでしょう。

空文字と呼ばれているものは、""と同じですよ。
Stringクラスで考えると、インスタンス化がされているが、中身の文字列が""の状態にあります。

nullは、そもそもオブジェクトすら設定されていない状態です。
例えばStringBufferクラスの変数を宣言しても、インスタンス化されていない状態、それがnullです。

Q整数の桁数が取得できません

Javaで整数の桁数を取得するには、以下の方法しかないのでしょうか?

int num = 123;
// の桁数3を取得するには
int keta = Integer.toString(num).length;

Aベストアンサー

No.1の方の回答で取得できます。
ただlogを使うと重くなる(処理が遅くなる)との声もあるようです。(参考URL参照)
ちなみにこんな方法でも取得できます。

while(0<num){
num /= 10;
keta++;
}

ただこの方法ですとループが終わった(桁数が取得できた)後、
numの値が0になっていますので、numの値は必ず別の変数に
保持しておいてください。

ちなみに私はいつもmatchoriさんの方法で桁数取得しています。
それでは!

参考URL:http://www.vc-net.ne.jp/~ytp/bbs/java/bbs6333.html

Q配列の中に重複文字列があるか否かをチェックしたいのですが、アルゴリズムを教えてください。

配列10000個の中に次のように文字列が入っているとします。
(実際に使うのはもっとずっと長い文字列が配列内に格納されています。)
Data_Array[1] = "GRZRMZCOMKMSG"
Data_Array[2] = "DCUIROTLUMWBC"
Data_Array[3] = "RGLBMILRPBSMY"
.
.
.
Data_Array[9998] = "RSKFDHAHMOESI"
Data_Array[9999] = "AQVOXBVNILGOP"
Data_Array[10000] = "YNYRUPEXYOGFN"

配列Data_Array[10000]の中に重複文字列がないか探索したいと考えています。

~普段の手順~
配列中身を一度テキストに吐き出し、そのテキストをExcelに貼り付ける。
そして、Excelのフィルタ機能で重複文字列を排除。
その後、重複文字列を排除した文字列を保存したものをテキストファイルに保存する。
それをプログラムで読み込んで配列内に格納してから次の処理を続ける

といった、効率の悪い方法をとっています。
そこで、プログラム内で処理する方法を次のように考えてみました。

~思いつく方法~
dim DataArrayTemp[10000]
for i = 1 to 10000
flag = 0
// 重複文字がないかチェック
for j = i+1 to 10000
ifb Data_Array[i] = Data_Array[j] then
// 重複があった場合はflag = 1にする
flag = 1
break// 内ループ脱出
endif
next
// flag = 0であれば重複がない項目 (flag = 1のときは、重複がある)
ifb flag = 0 then
DataArrayTemp[temp_i] = Data_Array[i]
temp_i = temp_i + 1
endif
next

これは、力技なので配列内の量が多くなると計算時間がかかってしまいます。

ですので、重複しない文字列だけを抽出する効率の良い方法がありましたらどなたか知恵を貸してください。

配列10000個の中に次のように文字列が入っているとします。
(実際に使うのはもっとずっと長い文字列が配列内に格納されています。)
Data_Array[1] = "GRZRMZCOMKMSG"
Data_Array[2] = "DCUIROTLUMWBC"
Data_Array[3] = "RGLBMILRPBSMY"
.
.
.
Data_Array[9998] = "RSKFDHAHMOESI"
Data_Array[9999] = "AQVOXBVNILGOP"
Data_Array[10000] = "YNYRUPEXYOGFN"

配列Data_Array[10000]の中に重複文字列がないか探索したいと考えています。

~普段の手順~
配列中身を一度テキストに吐き出し、そのテ...続きを読む

Aベストアンサー

ハッシュ(連想配列)を使ってはどうでしょうか?

~Perlの例~
#$dataArrayTemp[0 .. 9999]には既に値が格納されていると仮定
%temp = ();
%nodup = ();
for ($i = 0; $i <1000; $i++) {
if (defined($temp{$dataArrayTemp[$i]})) {
if (defined($nodup{$dataArrayTemp[$i]})) {
push(@dups, delete($nodup{$dataArrayTemp[$i]}));
}
next;
}
$temp{$dataArrayTemp[$i]} = $i;
$nodup{$dataArrayTemp[$i]} = $i;
}

ソートすると,例えば(一般に最速と言われている)クイックソートならO(N logN)の計算量になりますが,ハッシュを使えば(少なくとも見かけ上の)計算量はO(N)で済みます。

ただ123456zennsinnさんの使っている言語(BASIC系?)にハッシュがあるかどうかは? VB.NETだとHashtableクラスとかありそうですが。

http://www.atmarkit.co.jp/fdotnet/dotnettips/125hashtable/hashtable.html

ハッシュ(連想配列)を使ってはどうでしょうか?

~Perlの例~
#$dataArrayTemp[0 .. 9999]には既に値が格納されていると仮定
%temp = ();
%nodup = ();
for ($i = 0; $i <1000; $i++) {
if (defined($temp{$dataArrayTemp[$i]})) {
if (defined($nodup{$dataArrayTemp[$i]})) {
push(@dups, delete($nodup{$dataArrayTemp[$i]}));
}
next;
}
$temp{$dataArrayTemp[$i]} = $i;
$nodup{$dataArrayTemp[$i]} = $i;
}

ソートすると,例えば(一般に最速と言われている)クイッ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング