• ベストアンサー

終了条件文字列 「exit」

(1) 「1以上の整数を入力:」と表示 (2) 1行読み込みをし、入力された値が文字列「exit」と等しいかどうかをチェックし、「exit」と等しい場合はプ ログラムを終了する。 (3) 入力された値が1以上の場合、階乗の計算 という問題で、どうしても「exit」で終わることができません。 できても、NumberFormatException になって終わりってしまいます。 こんな説明で理解してもらえるか分かりませんが、教えていただけませんか。

質問者が選んだベストアンサー

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.5

そのものズバリ。宿題じゃなければ良いけど(笑 import java.io.* ; class Test { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; while(true) { System.out.print("1以上の整数を入力:") ; System.out.flush() ; String s = br.readLine() ; try { int i = Integer.parseInt(s) ; if(i>0) { int answer = 1 ; for(int j=1 ; j<=i ; j++) { answer*=j ; } System.out.println(i+"の階乗は"+answer) ; continue ; } else { System.out.println("不正な入力値です") ; } } catch(NumberFormatException ne) { if("exit".equals(s)) { System.exit(0) ; } else { System.out.println("不正な入力値です") ; } } } } catch(IOException ie) { ie.printStackTrace() ; System.exit(0) ; } } }

suzuno
質問者

お礼

そのものずばりなんてすごくありがたいです。 何日もエラーとの格闘だったもので。半ば諦めていました。とても勉強になります。 長文を書いていただいてすみません。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.4

皆さんの意見をまとめるとこんな感じですか? //sample public class CheckNumber{ static public void main(String[] arg){ int i = 0; //引数のチェック if(arg.length==0){ System.out.println("エラー: 引数を入力してください"); return; } //exitのチェック if("exit".equals(arg[0]))return; try{ i=Integer.parseInt(arg[0]); }catch(NumberFormatException nfe){ System.out.println("エラー: 数値を入力してください"); return; } //数値のチェック if(i<1){ System.out.println("エラー: 1以上の数値を入力してください"); return; } } // ここに階乗計算処理 } exitの評価は arg[0].equals("exit") とはしないほうがよいと思います。 この場合は問題ないとは思いますが、変数にnullが入る場合もあるので、普段から定数を頭に持ってくるほうがいいと思います。

suzuno
質問者

お礼

わざわざまとめてくださってありがとうございます。 組み立て方がよく分かりました。 arg[0].equals("exit")とはしないようにします。

全文を見る
すると、全ての回答が全文表示されます。
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

逆にInteger.parseInt()の前にequals("exit")の判断をしてしまうという手もありますね。

suzuno
質問者

お礼

おお、equals()なんてありましたね。 私って全然覚えてなくて駄目ですね。 いったい文字はどのようにして比較するんだぁ・・なんて考えていました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tajiri
  • ベストアンサー率45% (5/11)
回答No.2

>書き忘れてましたが、NumberFormatException になったら、「エラー 値は1以上の数字ではありません」と表示するようにしなければならないんですよ…。 それならcatchしたあとでifで条件分岐してやれば できると思いますがいかがでしょう。 ちなみにAPIを見るのはプログラムを組むときの 基本ですのでお忘れなく。 (すでにあるものを自分で実装してしまうというのもよくある話です)

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/index.html
suzuno
質問者

お礼

なるほど、catchした後にifとは気が付きませんでした。 ずっと、数値変換する前にif・・とかで考えていたものですから。 二度にわたるご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tajiri
  • ベストアンサー率45% (5/11)
回答No.1

Integer.parseInt()を使ってますよね。 その場合、数字に変換できない場合NumberFormatException を 投げる仕様になっています。 Integer.parseInt()のあたりをtryでくくり NumberFormatException をcatchして 終了処理を記述してください。 (java.lang.String)↓

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Integer.html#parseInt
suzuno
質問者

お礼

回答ありがとうございます。 Integer.parseInt()を使ってます。なるほど、そこをtryをくくるんですね。 でも書き忘れてましたが、NumberFormatException になったら、「エラー 値は1以上の数字ではありません」と表示するようにしなければならないんですよ…。すみません。 教えていただいたHP、参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • A列とB列の値の差から、ほしい行を見つけ出す関数

    お世話になります。 A列とB列に、それぞれランダムに数字が入っていて、 「A列とB列の値の差が、±5.1 以上」である行だけを知りたい場合、 どうすればいいでしょうか? (セルの値は整数だけではなくて、小数点5桁以上の場合もあります。) エクセルかロータスで、それを導き出す関数の式がわかる方、ぜひ教えてください。 表計算ソフト超初心者です。よろしくお願いします。

  • Excel 2列に対する検索条件について

    よろしくお願いいたします。 レイアウトとしてB2からG21の範囲で数字または空(何も入っていない)のセルがあります。 今回の計算式をA1に入れたいと思っています。 教えていただきたい計算式は この2行から21行の範囲のC列とE列において両方のセル内容が空だった場合の行番号のG列の値を合計した値をA1に取りだしたいのですができますでしょうか?

  • 16進数の文字列

    16進数の文字列をそれと同値な整数値へ変換する関数をかけという問題なのですが、 この場合文字列を読み込んで、例えば読み込んだ値がABだとした場合、 A*16の1乗+B*16の0乗 を計算する関数を作ればよいのだと思うんですが、 それぞれの値をべき乗する関数も必要になってくると考えています。 そこで問題なのですが、べき乗の関数を作ったとして、それぞれの値(こんかいはAとB)にそれぞれのべき乗した値をかけてやるには、どういった方法があるのでしょうか? 回答よろしくお願いします。

  • Excel2007で文字列を含む複数条件の計算を関数で求めたいのですが

    Excel2007で文字列を含む複数条件の計算を関数で求めたいのですが・・・・。 はじめまして。添付画像のようなデータを作成している途中なのですが、自分の思う返り値がでないためご教授いただければと思います。 添付画像のように、日々入力する作業があります。 2行目の数値は 日付が(1~31)入っています。(条件書式で日曜日を色付けしてます) B列に【緊急】か【その他】を【☆】で分けています。 表内の数字は 時間数を入力します。 (暗算しやすくするため仮の数字を入れています。) 1日7時間以上の場合は定額3500円 7時間未満の場合は1時間当たり500円 それをB列の条件によって計算できるようしています。 (ちなみに1~5日までの金額(11行目と14行目)行へはcountifs,sumifs関数を利用して求めています。) このように数字のみであれば問題ないのですが、7日、8日(J列,K列)のように文字列”◎”が入ると思うような答えが導き出せず、日々の計算に適した関数がわからず困っています。 11行目へB列が空白の時、7時間以上は3500円 7時間未満は500円を “◎”が付いても数値を計算ができ、なおかつ、◎がついたら+300円  14行目へB列が☆(空白じゃない)の時、7時間以上は3500円 7時間未満は500円を “◎”が付いても数値を計算ができ、なおかつ、◎がついたら+300円 を入れることができる関数の組み合わせは存在するでしょうか? 横計(個人当たりの1ヶ月計)は作業列をつくり、 【〔=SUM(IF(LEN(D3:AH3)>1,IF(SUBSTITUTE(D3:AH3,”◎”,””)*1>6,3500,0)))+SUM(IF(LEN(D3:AH3).1,IF(SUBSTITUTE(D3: AH3,”◎”,””)*1<7,500*SUBSUTITUTE(D3:AH3, ,”◎”,””)*1,0)))〕】を配列数式を使っていれてます。(D3:AH3は1~31日までの範囲です。) これを縦計に応用できないかと思って実行したのですが、どうしてもB列の条件が入るとできなくて困ってます。 よい方法があれば教えていただければ大変助かります。 どうぞよろしくお願いいたします。

  • C言語 exitで終了した関数の戻り値

    引数が負の整数であればエラーを表示し終了、0以上の整数であればそのまま戻り値とする関数 int example(int a) { if( a < 0 ) { printf("Error!\n");   exit(1); } return(a); } があったとします。 ここでたとえば  int s1,s2; に対して、 s1 = example(3); とすれば、 s1 = 3 となりますが、 s2 = example(-5); とすれば、 s2 には何が代入されているのでしょうか? 例に書いた関数はしょーもないものですが、 もう少し難しい関数を使って変数に値を入れて、その値で後でfor文などを使って仕分けていくようにしたいのですが、エラー時に代入されるものがわからなくて困っています。 エラー時のみに目印となる値、たとえば -1 などを戻り値とすることはできません。 おねがいします。

  • excelのA列にある文字列で同じ文字を検索

    ExcelのSHEET1のA列に日本語の単語が300件以上入力されています。同じ単語が入力されている可能性があります。同じ単語が入力されている場合は行を削除して 単語を一つにしたいのですが なにか良い方法を教えていただきたいのですが

  • マクロでの条件判断について

    A行に何かデータを入力した場合、同じ列のとなりの行のセルに入力時間を残したいと思い、 例 A1:あ B1:2006/5/9/16:00 A2:い B2:2006/5/10/18:00 以下のマクロを教えて頂いたのですが、 Private Sub Worksheet_Change(ByVal Target As Range) '///A列のセル以外ならマクロ終了/// If Target.Column <> 1 Then Exit Sub '///1行目のセルならマクロ終了/// If Target.Row = 1 Then Exit Sub '///内容がブランクならB列のセルをブランクにする。/// If Target.Value = "" Then Target.Offset(0, 1).Value = "" Else Target.Offset(0, 1).Value = Format(Date + Time, "yyyy/mm/dd hh:mm:ss") End If End Sub A列以外にもC列に入力した値の入力時間をD列にE列に入力した値の入力時間をF列にと、全部で6箇所値を入力したとなりのセルに入力時間が出るようにしたかったのですが、 '///A列のセル以外ならマクロ終了/// If Target.Column <> 1 Then Exit Sub の部分を '///A,C列のセル以外ならマクロ終了/// If Target.Column <> 1 Or Target.Column <> 3 Then Exit Sub のように変更してまずはA列とC列に値を入れて挑戦したのですが、時間が表示されなくこまっておりました。 解決方法をご存知のかたがいらっしゃいましたら、ぜひよろしくお願いいたします。

  • SQL*Plusの終了はquit?exit?

    SQL*Plusの終了はquitでもexitでも どちらを入力しても終了できます。 対話式でコマンド入力の時は好きな方を使えば良いと思いますが、 バッチで記述する場合、各自が好き勝手にするより統一したいものです。 どちらにするべきですか? 好き嫌いのアンケートではありません。 quit、exit、どちらでも良い いずれにしても人に聞かれた時に説明できる理由が欲しいです。 以上、よろしくおねがいします。

  • 困っています助けて下さい。

    階乗の計算 [問題]正の整数 n を入力し,次の式の値を計算し,出力するプログラムを書け.なお,計算は double で行え. (1 + 9.0) * (2 + 9.0) * (3 + 9.0) * ・・・ * (n + 9.0) 上記の問題をdouble形式で説いてくださいお願いします。

  • A列の文字列によってB列への入力を変える

    こんにちは。マクロ初心者で、質問なのですが、 エクセルで、A列に入力されている文字列によって、 B列文字を自動で入力するマクロを作成したいのですが、 どのように記述すればよいでしょうか? 例: A列 |B列 |  あ | 01 |A列「あ」の場合、B列の同じ行に「01」  い | 02 |A列「い」の場合、B列の同じ行に「02」 といった感じです。 初歩的な質問で申し訳ございませんがご教授願います。