do while文を使って、int num = new Random().nextInt(10);を利用して、ランダム数値が2で割り切れるか0だったらwhile文を終わらせるdo-while文を作成したいのですが、わかりません。わかる方、教えてください。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

プログラムを概略を日本語で書いてみましょう。



1) 乱数を求める
2) 1)で求めた乱数が 0 または2で割り切れるならループ終了。そうでないなら 1) へ

となります。
ここまでがわからないなら、問題文を読むことができていません。
Javaの前に国語の復習をしましょう。


do~whileループは
do {
 繰り返す内容
} while( ここの条件が成り立つときは、ループを続ける/ 不成立ならループを止める) ;
となっています。

これと先程の「日本語」と合せれば

do {
繰り返す内容「1) 乱数を求める」
} while ( 「→の条件でないなら」ループを続ける/「1)で求めた乱数が 0 または2で割り切れるなら」ループを止める) ;

となります。
この中の「日本語」を「Java言語」に翻訳したものが「Javaのプログラム」です。

whileの中はちょっと複雑に見えます。
しかし、落ち着いて考えれば
『「1)で求めた乱数が 0 または2で割り切れる」 でないなら』ループ継続
であり
! (「1)で求めた乱数が 0 または2で割り切れる」)
だとわかります。 ! は 条件の真偽を反転させる演算子です。
また、算数の知識があれば、 「1)で求めた乱数が 0 または2で割り切れる」とは偶数であり、「偶数でない」とは「奇数である」ということだとわかります。

whileで判定せずに、ifで判定させ、breakでループを脱出する、という手段もあります。
ですが、この問題程度に使うテクニックではありません。





#1の補足にあったプログラム、ご自身で理解できていないようですが、この程度の規模なら、あなたがコンピュータになって、書いてある通りに実行するのもよいでしょう。

まず、次のものを用意します
○鉛筆と消しゴム : 下記へ書いたり消したりするのに使います。
○(紙の)メモ帳 : 変数の記憶に使います。
○罫線入りレポート用紙 : 画面表示に相当します。
○サイコロ: できれば 0~9の目が出るもの。無ければ1~6で代用


int num = new Random().nextInt(10);
→ メモに
num 「  」
と書きます。変数numを記憶するところです。
Random().nextint(10)は毎回サイコロを振って値を決めます。
例えば、ここで「3」と出たら、メモに
num「 3 」
と書き込みます

num = 9;
→変数num を変更します。
まず、消しゴムで「」の中を消します。次に「9」を書きます。

do{
→ doの開始です。whileでここに戻ってきます。

System.out.println(num / 2);
→ 画面出力なので、num/2 を計算して、レポート用紙に 書きます。
num はint、2もint なので、 int / int = 小数点以下切り捨て となることに注意。

}while(num < 10);
→ メモには num「 9 」と書いてあるはずです
9<10なので、doへ戻ります。

do{
→ 戻ってきました。

System.out.println(num / 2);
→ 画面出力なので、num/2 を計算して、レポート用紙に 書きます。
num はint、2もint なので、 int / int = 小数点以下切り捨て となることに注意。

}while(num < 10);
→ メモには num「 9 」と書いてあるはずです
9<10なので、doへ戻ります。

do{
→ 戻ってきました。

System.out.println(num / 2);
→ 画面出力(以下略

人間なら、そろそろ無駄なことをしていると気付いて、やめるころです。
ですが、コンピュータはそんなことは気にせず、言われた通りに忠実に繰り返します。
    • good
    • 0

>int num = new Random().nextInt(10);



ここで乱数を発生させているのに

>num = 9;

固定値にしたらダメです。

>}while(num < 10);

偶数か0だったら(0も偶数と考えると、要するに2で割ったあまりが0ならば)
という条件になっていません。

この回答への補足

if文も使ったほうがいいということですか?

補足日時:2014/09/26 15:08
    • good
    • 0

どこまでわかった?



何が分からない?

自分の頭を使う気はある?

この回答への補足

public static void main(String [] args){

int num = new Random().nextInt(10);

num = 9;

do{

System.out.println(num / 2);

}while(num < 10);

System.out.println("余りは:" + num);

}

}

までわかりました。出力結果がるーぷしてしまいます。

補足日時:2014/09/26 13:31
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

Qjavaについて教えてください。java初心者です。int arr[] = new int[

javaについて教えてください。

java初心者です。

int arr[] = new int[] { 3, 1, 4, 1, 5, 9, 2, 6 };はどういうことなんでしょうか?
教えてください。

Aベストアンサー

int[] arr = new int[8];
arr[0] = 3;
arr[1] = 1;
arr[2] = 4;
arr[3] = 1;
arr[4] = 5;
arr[5] = 9;
arr[6] = 2;
arr[7] = 6;

https://ideone.com/OMAI0E

Qdo - while文

こんにちは、tomokooです。
下記の様にソースを書きました。
rsはResultSetです。
----------------------------
while(条件A){
  処理;
rs.next();
}

while(rs.next()){
  処理;
}
----------------------------
うまくプログラムは動いたのですが
結果を見て1行飛ばされることに気づきました。
だから
----------------------------
while(条件A){
  処理;
rs.next();
}

do{
  処理;
}while(rs.next()};
----------------------------
としたところ、処理の中の
rs.getString(i); //iは初期化済み
で落ちてしまいます。
whileでよくてdo-whileでだめなことってあるんですか?
結構困ってます。
ご存知の方はよろしくお願いします。

Aベストアンサー

do{
  処理;
} while(rs.next());

とした場合、rs.next()の評価を行う前に「処理」が実行されることに注意してください。つまり、最終レコードになったときに、最終レコードであることの判定が後に来てしまうために、rs.getString(i)で落ちている、ということです。

このロジックでこれを回避するためには、Statementを作るときに、「スクロール可能な」状態にしておく必要があるでしょう。修正すると、こんな感じです。

// スクロール可能なカーソルを作る
Statement stmt = connection.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
 :
 :
while(条件A){
  処理;
rs.next();
}
rs.beforeFirst(); // カーソルを先頭行の手前に移動する
while(rs.next()){
  処理;
}

do{
  処理;
} while(rs.next());

とした場合、rs.next()の評価を行う前に「処理」が実行されることに注意してください。つまり、最終レコードになったときに、最終レコードであることの判定が後に来てしまうために、rs.getString(i)で落ちている、ということです。

このロジックでこれを回避するためには、Statementを作るときに、「スクロール可能な」状態にしておく必要があるでしょう。修正すると、こんな感じです。

// スクロール可能なカーソルを作る
Statement stmt = connection.createSt...続きを読む

Qdo while文のエラー??

下のような拡張ユーグリッドのプログラムを組んだのですがエラーが出て何が悪いのかがわかりません。エラーの内容は
apRSA.java:18: 型の開始が不正です。
do{
^
apRSA.java:57: <identifier> がありません。
}while(q.compareTo(BigInteger.ONE) !=0);
^
の二つです。どなたか助けてください。

import java.math.*;
import java.util.Random;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class apRSA extends Applet{
BigInteger p,q,e,d,m,c,m2,t,t1,p1,q1,e1;

final int bit =512;
final int k =10;
Random rnd =new Random();

do{
p=new BigInteger(bit,k,rnd);
p1=p;
q=new BigInteger(bit,k,rnd);
q1=q;

BigInteger []x;
BigInteger []y;
BigInteger []z;

x =new BigInteger[3];
y =new BigInteger[3];
z =new BigInteger[3];

x[0] =BigInteger.ONE;
y[0] =BigInteger.ZERO;
z[0] =p;

x[1] =BigInteger.ZERO;
y[1] =BigInteger.ONE;

while(q.compareTo(BigInteger.ZERO) !=0){
BigInteger r =p.mod(q);
p=q;
q=r;
}

}while(q.compareTo(BigInteger.ONE) !=0);
}

下のような拡張ユーグリッドのプログラムを組んだのですがエラーが出て何が悪いのかがわかりません。エラーの内容は
apRSA.java:18: 型の開始が不正です。
do{
^
apRSA.java:57: <identifier> がありません。
}while(q.compareTo(BigInteger.ONE) !=0);
^
の二つです。どなたか助けてください。

import java.math.*;
import java.util.Random;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class ap...続きを読む

Aベストアンサー

このapRSAっていうクラスにはメソッドはないのですか。
Javaの場合、処理はメソッド中に書きます。

Qnew int[変数]で確保しても良いんですか?

Javaでの配列の確保の方法です。

int size = 100;
int[] array = new int[size];

のような確保の方法はどの環境・コンパイラでも思い通りの動作をしてくれますか?
C言語では、このような書き方で確保することはできなかったので、Javaでは可能なのか心配で質問しました。

「動的」という意味がまだ完全にわかっていないのですが、上記のような変数の確保は、動的とはいえないのですか?sizeの値をユーザーから受け取れば、確保する大きさはいつも違うようになると思うのですが・・・。


ちなみに下記のようなプログラムで配列の確保を使おうとしています。
static int[] toIntArray(String[] strs){
  int[] array = new int[strs.length]; // ←ここで 確保しています。
  for(int i = 0; i < strs.length; i++){
   array[i] = Integer.valueOf(strs[i]).intValue();
  }
  return array;
}
上記のプログラムはStringの配列からintの配列に変換することを目的にしています。

Javaでの配列の確保の方法です。

int size = 100;
int[] array = new int[size];

のような確保の方法はどの環境・コンパイラでも思い通りの動作をしてくれますか?
C言語では、このような書き方で確保することはできなかったので、Javaでは可能なのか心配で質問しました。

「動的」という意味がまだ完全にわかっていないのですが、上記のような変数の確保は、動的とはいえないのですか?sizeの値をユーザーから受け取れば、確保する大きさはいつも違うようになると思うのですが・・・。


ちなみに下記のような...続きを読む

Aベストアンサー

問題ないです。

ちなみにC言語もC99からはできますよ。

Qreturn new ActionForward("xxx.do",true);による画面遷移

tomcat、struts、mysqlで作成したアプリケーションなのですが・・・
画面Aからリンクをクリックし画面Bへいく動作がたまに(頻繁ではありません。)おかしくなります。
画面Aからリンクをクリックすると、画面Bではなく、アプリケーションの一番始めの画面(index.jsp)へとんでしまいます。
おかしくなる条件はつかめていません。

index.jspの中身
response.sendRedirect("./tologin.do");

画面A(A.jsp)のリンク
●<a href="open.do?・・・・"
→open.doによって呼ばれるアクション
 ●ActionA.java
→ActionA.javaにかかれている遷移先
 ●return new ActionForward("next.do",true);
→next.doによって呼ばれるアクション
 ●ActionB.java
→ActionB.javaにかかれている遷移先
 ●return mapping.findForward(SUCCESS);
→画面B(B.jsp)

という流れになっています。
tomcatのログを見ると・・・

*********** 正常なとき ********************
日付 StandardContext[/application]: Mapped to servlet 'jsp' with servlet path '/jsp/A.jsp' and path info 'null'

and update=true
日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/open.do' and

relativeURI='/open.do'
日付 StandardContext[/application]: Trying exact match
日付 StandardContext[/application]: Trying prefix match
日付 StandardContext[/application]: Trying extension match
日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/open.do' and path info 'null'

and update=true
日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/next.do' and

relativeURI='/next.do'
日付 StandardContext[/application]: Trying exact match
日付 StandardContext[/application]: Trying prefix match
日付 StandardContext[/application]: Trying extension match
日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/next.do' and path info 'null'

and update=true
日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/jsp/B.jsp' and

relativeURI='/jsp/B.jsp'

*********** 異常なとき ********************
日付 StandardContext[/application]: Mapped to servlet 'jsp' with servlet path '/jsp/A.jsp' and path info 'null'

and update=true
日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/open.do' and

relativeURI='/open.do'
日付 StandardContext[/application]: Trying exact match
日付 StandardContext[/application]: Trying prefix match
日付 StandardContext[/application]: Trying extension match
日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/open.do' and path info 'null'

and update=true
日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/' and

relativeURI='/'
日付 StandardContext[/application]: Trying exact match
日付 StandardContext[/application]: Trying prefix match
日付 StandardContext[/application]: Trying extension match
日付 StandardContext[/application]: Mapped to servlet 'action' with servlet path '/' and path info 'null' and

update=true
日付 StandardContext[/application]: Mapping contextPath='/application' with requestURI='/application/jsp/index.jsp'

and relativeURI='/jsp/index.jsp'

となっていて、パスが抜けてしまっているようです。

何度ログインをし直しても、同じ状態が繰り返され続けました。
tomcatの再起動をしても解消されず、何度か繰り返した後、ログイン画面を呼び出すパス(tologin.do)を手打ちして呼び出されたログイン画面からログインをしたところなぜか正常に戻りました。

return new ActionForward("next.do",true);がいけないのでしょうか?

ちなみにreturn new ActionForward("next.do",true);をreturn new ActionForward("",true);とすると、異常な時と同じようなログが出力されます。

よくわからないのですが、return new ActionForward();で遷移するのと、return mapping.findForward();で遷移するのの違いは何でしょうか?

アドバイスよろしくお願いします。

tomcat、struts、mysqlで作成したアプリケーションなのですが・・・
画面Aからリンクをクリックし画面Bへいく動作がたまに(頻繁ではありません。)おかしくなります。
画面Aからリンクをクリックすると、画面Bではなく、アプリケーションの一番始めの画面(index.jsp)へとんでしまいます。
おかしくなる条件はつかめていません。

index.jspの中身
response.sendRedirect("./tologin.do");

画面A(A.jsp)のリンク
●<a href="open.do?・・・・"
→open.doによって呼ばれるアクション
 ●ActionA.java
→...続きを読む

Aベストアンサー

回答がつかないのでちょっと一言

ActionForwardを生成して遷移させたことが無いのでよくわかりませんが、strutsのjavadocには
「このクラスが既存のアプリケーションが使用している公開されたAPIの一部であるという事実がなければ、 このクラスの使用は推奨されずに org.apache.struts.config.ForwardConfig に置き換えられていたでしょう。」
とあります。
あまり推奨されてないようですので、ActionForwardを使わないという手段は取れないのでしょうか?

参考URL:http://www.jajakarta.org/struts/struts1.1/documentation/ja/target/api/org/apache/struts/action/ActionForward.html


このカテゴリの人気Q&Aランキング

おすすめ情報