Java:while文でファイル入出力 [勉強]
職業訓練の夏休み中、しっかりJavaの復習をやっている私ってば、お利口さんだってばYO。
(褒められて伸びる子です。伸びるのは才能であって、アゴではありません)
では、教科書7章「while文」の練習問題7-3にチャレンジです。
「標準入力から1行ずつ読み取って、以下のルールにしたがい処理を行い、標準出力に出すプログラムMakeHtmlを書け」
ルール1.最初に一度だけ"<html><head><title>My Page</title></head><body>"を出力。
ルール2.標準入力が終わったら、最後に"</body></html>"を出力。
ルール3.入力行が"■"で始まっていたら、■を取り除いた残りの文字列を"<h1>"と"</h1>"ではさんで出力。
ルール4.入力行が"●"で始まっていたら、●を取り除いた残りの文字列を"<h2>"と"</h2>"ではさんで出力。
ルール5.入力行が"----"と等しかったら、"<hr>"を出力。
ルール6.入力行が"address"と等しかったら、"<a href="mailto:agoago@example.com">agoago@exeample.com</a>"を出力。
ルール7.ルール3~6以外は、入力行をそのまま出力。
で、入力用テキストとして準備されているのは、以下のhello.txtです。
■私のホームページへようこそ
----
●こんにちは
こんにちは! 私のホームページへようこそ。
----
●自己紹介
私は しゃくれアゴといいます。どうぞよろしく。
----
●メール待っています。
あなたからのメールをお待ちしています。
メールアドレスは、
address
です。
で、上記テキストファイルをHTMLファイルに変換する際は、以下のようにjavaを実行します。
java MakeHtml < hello.txt > hello.html
さてさて・・・面倒な練習問題ですねぇ。
でも、ひとつひとつのルールを処理に置き換えていけば、ソースに書けなくもない・・・・・・かな??
以下、練習問題7-3の回答ソースです。(教科書の最後の方に載っていた回答じゃなくて、私なりに考えて書いたソースですよ)
import java.io.*;
public class MakeHtml {
public static void main(String[] args) {
BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));
try {
String line;
String rule3 = "";
String rule4 = "";
while ((line = kbd.readLine()) != null) {
//ルール1
System.out.println("<html><head><title>My Page</title></head><body>");
//ルール3
if (line.charAt(0) == '■') {
//substring(int)により■以降の文字列を代入
rule3 = line.substring(1);
System.out.println("<h1>" + rule3 + "</h1>");
} else if (line.charAt(0) == '●') {
//ルール4
//substring(int)により●以降の文字列を代入
rule4 = line.substring(1);
System.out.print("<h2>" + rule4 + "</h2>");
} else if (line.equals("----")) {
//ルール5
//----を<hr>に置換
String hr = line.replace("----", "<hr>");
System.out.println(hr);
} else if (line.equals("address")) {
//ルール6
//addressをmeiltoタグに置換
String adrs = line.replace("address", "<a href=\"mailto:agoago@example.com\">agoago@example.com</a>");
System.out.println(adrs);
} else {
//ルール3~6以外は、そのまま出力
System.out.println(line);
}
}
//ルール2
System.out.println("</body></html>");
} catch (IOException e) {
System.out.println(e);
}
}
}
ちょっとコメントがウザいですか?
書いている自分に対するコメントだったりもしたんですけどね。(^-^;
while文の章だから、標準入力があるかぎりwhileでループさせて、while内ではif文やelse if文でそれぞれのルール(条件)の処理をさせています。
これがいまの しゃくれアゴの中から絞り出てきた結果です・・・。
で、このソースをjavacでコンパイルした後、java MakeHtml < hello.txt > hello.htmlと実行すると・・・・・以下のようなHTMLファイルが出力されました。
<html><head><title>My Page</title></head><body>
<h1>私のホームページへようこそ</h1>
<html><head><title>My Page</title></head><body>
<hr>
<html><head><title>My Page</title></head><body>
<h2>こんにちは</h2><html><head><title>My Page</title></head><body>
こんにちは! 私のホームページへようこそ。
<html><head><title>My Page</title></head><body>
<hr>
<html><head><title>My Page</title></head><body>
<h2>自己紹介</h2><html><head><title>My Page</title></head><body>
私は しゃくれアゴといいます。どうぞよろしく。
<html><head><title>My Page</title></head><body>
<hr>
<html><head><title>My Page</title></head><body>
<h2>メール待っています。</h2><html><head><title>My Page</title></head><body>
あなたからのメールをお待ちしています。
<html><head><title>My Page</title></head><body>
メールアドレスは、
<html><head><title>My Page</title></head><body>
<a href="mailto:agoago@example.com">agoago@example.com</a>
<html><head><title>My Page</title></head><body>
です。
</body></html>
・・・なんかおかしなHTMLタグがありますな。
出力されたHTMLファイルをダブルクリックしてIEとかブラウザで見た限りだと問題なさそうだったんですけど、こうやってHTMLタグだけで見ると、正しく処理がされていないことが分かりますねぇ。
たぶん、最初のルール1処理がwhile文の最初に実行されるから・・・各行に最初の行にしか出力しないHTMLタグが出力されちゃっているんですね。(^-^;
う~ん・・・まだまだ直す場所があるってコトですねぇ。
どうやろう・・・・・・
12行目のルール1処理がwhile文の中に入っているから問題なんだから、12行目だけwhile文の外に出しちゃえばイイんですよね。
System.out.println("<html><head><title>My Page</title></head><body>");
while ((line = kbd.readLine()) != null) {
と、while分とルール1の処理の行を入れ替えれば・・・大丈夫!
あー、よかった。よかった。
ルール1の処理をwhile文の上(外)に出してコンパイルし直して実行(java MakeHtml < hello.txt > Hello.html)した結果、出力されたHello.htmlの内容は以下の通りです。
<html><head><title>My Page</title></head><body>
<h1>私のホームページへようこそ</h1>
<hr>
<h2>こんにちは</h2>こんにちは! 私のホームページへようこそ。
<hr>
<h2>自己紹介</h2>私は しゃくれアゴといいます。どうぞよろしく。
<hr>
<h2>メール待っています。</h2>あなたからのメールをお待ちしています。
メールアドレスは、
<a href="mailto:ago@example.com">ago@example.com</a>
です。
</body></html>
ふぅ・・・。
無事、問題を解決。
よかった、よかった。これで7章の練習問題終了っ!
これで8章「メソッド」の練習問題にチャレンジできますよ。
コメント 0