• 締切済み

このクラスをもとに…。

import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列をそのまま出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

> "abc"と入力したら"cba"と反転して文字列が返るようにとかできますかね??  ひょっとしたらもっと良い反転の仕方があるのかも知れませんが、わかりやすいようにシンプルなアルゴリズムで実現してみましたので掲載しておきます。回答が長くなるので前回は行いませんでしたが、今回は分けるべきルーチンを関数化しました。今回も若干のコメント付き。 import java.lang.*; import java.io.*; import java.util.*; class SimpleReader { public static String reverseString(String s) { // クラスメソッドreverseString int begin = 0; int end = s.length() - 1; char[] c = new char[end + 1]; // 文字列を格納できるchar[]を作成 s.getChars(begin, end + 1, c, begin); // Stringをchar[]にする while(begin < end) { // 先頭と最後をスワップ、次に先頭から2つ目と最後から2つ目を・・・・ c[begin] ^= c[end]; // ここから3行で2つの文字をスワップし、次の文字へ移る c[end] ^= c[begin]; c[begin++] ^= c[end--]; } return new String(c); } public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); while(!(s = br.readLine()).equals("end")) { System.out.println(SimpleReader.reverseString(s)); // 文字を反転して表示 System.out.print("Input: "); } } }

すると、全ての回答が全文表示されます。
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

お礼にかかれてある要求仕様では若干複雑なプログラムになりますね。そこでVectorクラスを導入します。Vectorは線形リストを表現するクラスですが、可変長の配列として利用できます。今回はやや難解だと思いますのでコメントも掲載しています。 # 例によってエラーチェックは無いのでお気をつけて(tryすらしてないし)。 import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; Vector v = new Vector(); // Vectorクラスのインスタンス作成、空の線形リストが作られる System.out.print("Input: "); while(!(s = br.readLine()).equals("end")) { if(s.equals("")) { // 入力文字列が空白なら if(v.isEmpty()) { // この時点で空なら System.out.println("no elements"); // 足す数字が無い } else { int sum = 0; String sep = ""; // 先頭の数字には+記号が要らないので空っぽ while(!v.isEmpty()) { // Vectorが空になるまで int i = ((Integer)v.get(0)).intValue(); // 先頭の数字を1個取り出す System.out.print(sep + i); // それを表示 sep = "+"; // 数字と数字を区切る+記号 sum += i; // 足し算 v.remove(0); // 先頭の数字を削除 } System.out.println("=" + sum); // 結果表示 } } else { // 入力文字列が空白でなければ v.addElement(new Integer(s)); // 数字のみの文字列と仮定してIntegerクラスを作成し、配列の一番最後に加える } System.out.print("Input: "); }; } }

hyokkorri
質問者

お礼

すごい・・詳しい説明までのっけていただいてありがとうございます!!

hyokkorri
質問者

補足

最後なんですけど Input: 3 Input: 4 Input: 5 Input: end 3+4+5=12 みたいに表示したいんですけどendまでで終わってしまいます。どうにかなりますか? あとJavaのParseIntなんですけど、前後に空白があるとエラーになるのをそうならないようなプログラムにすることはできますか?文字列中で見つかった最初の数字から連続する数字のみを処理できれば結構です。前後の空白、数字でない文字は無視して、もし数字と認識できない場合は、メッセージを出すとともに、数字0として読み込んでください。 課題なんですがあまりに難しいので悩んでいます。お願いします!!

すると、全ての回答が全文表示されます。
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

はいどうぞ。 import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); while(!(s = br.readLine()).equals("end")); } }

hyokkorri
質問者

お礼

ありがとうございます!!実行できました☆! Input:1 Input:2 Input:(空白) 1+2=3 Input:6 Input:7 Input:8 Input:end 6+7+8=21 と表示(空白でそれまでの計算結果を出して、初期化してまた繰り返してendで終わらせる)させることは可能でしょうか?

hyokkorri
質問者

補足

何回もすいません。。この応用になると思うんですけど、"abc"と入力したら"cba"と反転して文字列が返るようにとかできますかね??

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

関連するQ&A