研究帖2

 

 

 


作者へのメッセージ
研究課題 インデントもいるデント、太字にするつもりは無かった

研究課題 インデントもいるデント、太字にするつもりは無かった。

 

 

N* うーん、困ったな。

S* 博士、どうしたんですか?

N* うん、せっかくきれいにインデントをつけてコードを書いたのに、ホームページでは 左寄せになっているんだ。

S * はあ、なるほど。テキスト文書でスペースをいれても、htmlでは文字が無いことになる ようですよ。

N * なに!そんな事があるのか。何とかならないかな。

S* 何とかって、どうしたいんですか。

N * いや、例えば、コードを書いたテキストファイルを読んで、行頭から最初の字までの空白を 数えて、その分をhtmlで空白を表す文書に変えて、他のファ イルに出力するコードがjavaで書ければいいんだ。

S* なるほどね。とりあえず、htmlで空白を表す方法を調べないとね。

N* うん。頼むよ。あと、太字と細字を切り替える方法も調べてくれ。

S* はい、やってみます。

(続く)

2時間後、そよ風さんが戻ってきた。

s*  博士、分かりました!

n* そうか、どうだった?

s* HTMLのソースを見たら、"<b></b>"が入っていると、その間は太字になる事がわかりました。 それに、ソースの半角スペースは何も無くなりますが、全角スペースはちゃんとあけて 有りました。だから、半角スペースを全角スペースに変えるプログラムを作ればいい訳です。

n* なるほど、そうだったのか!だったら、コードを書いたテキストを読み込んで、そこの 半角スペースを全角に変えて、別な名前で保存すればいいんだね。

s* そうですが、重要な問題があります。

n* 何だね。

S* "ナイス プログラム"のように、文字列の中に半角のスペースがあったら、それも入れ替えてしまいます。

N* そうか、それなら、「"」が出るたびに、boolean変数の「true」と「false」を  切り替えて、「false」の時だけ処理すればいいんだ。

S* なるほどね。ですが、まだ重要な問題があります。

N* なんだ、まだ有るのか。何だい?

S* せっかくコードを公開しても、そのコピー&ペーストでjavaファイルを作ると、全角スペースが        有るのでコンパイルできないと思います。

N* 何だ、そんな事か。それなら、半角スペースを全角に変え、全角スペースを半角に変えるよう        なプログラムにして、コピーで作ったファイルを同じプログラムにかければ、全角が半角に もどってコンパイル出来るようにすればいいと思うよ。

S* ああ、そうか。それならうまく行きそうですね。

N* 問題は、どんな風にコードを書くかだが、分かるかい?

S* 調べてみないと分かりませんが、棚の入門書に書いてあった「ファイル入出力」のテクニック      を使えば出来るかもしれません。

N* そうか。もしやり方がわかったら、教えてくれ。

S* はい。(そよ風さんは去っていく。) 

(続く。) 

 

その後3日が過ぎ、そよ風さんがやって来た。

NBS 「やあ、ひさしぶりだね。どうしてたの? 」

NBS 「はい、家にこもって研究してました。博士、何か気づきませんか? 」

NBS 「うん、研究帖がずいぶん読みやすくなったね。どうしたの? 」

NBS 「htmlのプロトタイプを作って、各行の先頭に"」</p><p><b>NBS </b>「 "と入れたんです。ソースを見てください。 」

NBS 「でも、これでは誰のせりふか分からないねえ。 」

NBS 「大丈夫!後からNBSのどれかを消せばいいんです。 」

S 「ねっ! 」

N 「おっ! 」

S 「ほいっ! 」

N 「すごいっ! 」

S 「すごいでしょっ! 」

N 「すごいっ!が、早速本題に入ろう。研究はどこまで出来た? 」

S 「はい。ファイル入出力関係のテクニックを調べて、キーボードから入力するクラス や、フォルダーの中身やファイルの属性を色々調べるクラスを作りました。(インデントはまだ出来ない。)

プログラム"OIAIO"(Output Input All In One)

********************************************************************* import java.io.*; import java.util.*; import java.text.*; class Kio{ String ioSet(String s){ String str=""; try{ InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.println(s); str=br.readLine(); } catch(Exception e){ System.out.println("例外:"+e); } return str; } } class oiaio{ public static void main(String args[]){ Kio kio=new Kio(); String sdf=kio.ioSet("ファイル名を入力してください。"); //String sd=kio.ioSet("ディレクトリ名を入力してください。"); FC fc=new FC(); //String ls[]=fc.dCheck(sd); String ls[]=fc.fCheck(sdf); for(int i=0;i

N 「うーん、訳がわからん。やっぱり改行をいれよう。」

*********************************************************************

import java.io.*;

import java.util.*;

import java.text.*;

class Kio{

String ioSet(String s){

String str="";

try{

InputStreamReader isr=new InputStreamReader(System.in);

BufferedReader br=new BufferedReader(isr);

System.out.println(s);

str=br.readLine();

}

catch(Exception e){

System.out.println("例外:"+e);

}

return str;

}

}

class oiaio{

public static void main(String args[]){

Kio kio=new Kio();

String sdf=kio.ioSet("ファイル名を入力してください。");

//String sd=kio.ioSet("ディレクトリ名を入力してください。");

FC fc=new FC();

//String ls[]=fc.dCheck(sd);

String ls[]=fc.fCheck(sdf);

for(int i=0;i

System.out.println(ls[i]);

}

}

}

class FC{

String[] dCheck(String sd){

File fi=new File(sd);

String ls[]=fi.list();

return ls;

}

String[] fCheck(String sf){

String[] sfc=new String[7];

File fi=new File(sf);

if(fi.exists()){

sfc[0]=sf+"は存在する。";

sfc[1]="パス:"+fi.getParent();

sfc[2]="フルパス:"+fi.getPath();

sfc[3]="ファイルサイズ:"+fi.length();

sfc[4]="読み込み出来るか?:"+fi.canRead();

sfc[5]="書き込み出来るか?:"+fi.canWrite();

sfc[6]="最終更新日時:"+cmDate(fi.lastModified());

}

else{

sfc[0]=sf+"は存在しない。";

for(int i=1;i

sfc[i]="";

}

}

return sfc;

}

String cmDate(long l){

Date d1=new Date(l);

DateFormat df=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);

return df.format(d1);

}

}

N 「ふう、改行を入れるだけで大変だ。早くインデンター(インデントを入れる プログラム)を作ってくれよ。 」

S 「そうですね。で、どうですか?私のコード。 」

N 「うん、いいね。KioやFCのクラスは取っておけば他でも使えそうだし、便利そうだね。 」

S 「そうでしょ。 」

N 「この後どうするの? 」

S 「もっと入出力の方法を調べて、スペースを入れ替える方法を探します。 」

N 「うん。期待してるからね。 」

  

B 「博士、研究はうまく行ってますか? 」

N 「やあ、まだ未完成だが、順調だよ。 」

S 「ファイル入出力の方法が、だいぶわかったわよ。 」

N 「だが、まだインデンターが出来ないんだ。 」

B 「インデンターって何ですか。 」

N 「テキストに書いたコードをhtmlでも同じようにインデントをつけて 見えるように変換し、それをコピーしてコンパイルする時にはもとの形に戻せるような、 ナイスなプログラムだよ。 」

B 「ソースをコピーしてはだめなんですか? 」

N 「え! 」

S 「! 」

B 「htmlのソースに、コードのコピーをそのまま書いて、それを見てもらって、 コピーしてコンパイルしてもらうように説明を書くんです。たとえば、

プログラム"OIAIO"(Output Input All In One)

コードを見る時は、ソースを見てください。

********************************************************************* import java.io.*; import java.util.*; import java.text.*; class Kio{ String ioSet(String s){ String str=""; try{ InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.println(s); str=br.readLine(); } catch(Exception e){ System.out.println("例外:"+e); } return str; } } class oiaio{ public static void main(String args[]){ Kio kio=new Kio(); String sdf=kio.ioSet("ファイル名を入力してください。"); //String sd=kio.ioSet("ディレクトリ名を入力してください。"); FC fc=new FC(); //String ls[]=fc.dCheck(sd); String ls[]=fc.fCheck(sdf); for(int i=0;i

N 「!! 」

S 「!! 」

B 「そうすれば、インデンターなんて変なプログラムはいらないですよ。 」

 

S 「変なプログラムだって!!!!」

B 「うわっ! 」

N 「ちょっとBB君、いくら本質を突いても、そんな人を怒らせるような事 はいっちゃだめだよ。そよ風さんも、怖い顔で人を脅かすのはやめなさい。 」

 

 

さらにそれから1週間たった。

S「博士、やっとインデンターが出来ました。 」

N「やあ、ついに出来たか!どんなプログラムなの? 」

S「コマンドプロンプトでファイル名を入力します。たとえば、"Indenter.java"とね。 」

N「それで? 」

S「javaファイルなら、Tabを全角スペース4個にして、2個連続した半角スペースを全角 スペース1個に変えて、1行の前後に<p>と</p>を入れて、拡張子を"html"に変えたテキストファイルに します。 」

N「ほう!高機能だね。ホームページをコピーして作ったテキストも元に戻せるのかい? 」

S「ええ。拡張子が"java"でないファイルは、全角スペースを半角スペース2個に変えて 、拡張子を".java"にして出力します。 」

N「なるほどね。実際やるとどうなるの? 」

S「これなんですけど」

 

プログラムindenter*******************************************************************

import java.io.*;

class extChange{                   //拡張子変換extension

    String getS(String s,String s2){

        int i1=s.indexOf('.');

        String sout=s.substring(0,i1+1)+s2;

        return sout;

    }

    String checkS(String s){

        int i1=s.indexOf('.');

        String sout=s.substring(i1+1);

        return sout;

    }

}

class Indenter{                    //indent

    public static void main(String[] args){

        

        boolean bj=false;

        Kio ki=new Kio();

        String sfi=ki.ioSet("処理するファイル名を拡張子付きで入力して下さい。");

        

        extChange ex=new extChange();

        System.out.println("元の拡張子:"+ex.checkS(sfi));

        bj=ex.checkS(sfi).equals("java");

        //if(ex.checkS(sfi).equals("java"))bj=true;

        System.out.println("bj:"+bj);

        String sfo="java";

        if(bj){

            sfo="html";

        }

        

        String sf=ex.getS(sfi,sfo);

        System.out.println("出力ファイル:"+sf);

        

        System.out.println("開始");

        try{

            BufferedReader br=new BufferedReader(new FileReader(sfi));

            PrintWriter pr=new PrintWriter(new FileWriter(sf));

            String line;

            

            while((line=br.readLine())!=null){

                int[] il=new int[line.length()];

                System.out.println(line);

        

                for(int i=0;i

                    il[i]=(int)line.charAt(i);

                }

                String sout="";

                for(int i=0;i

                    if(bj){

                        if(il[i]==9){

                            sout=sout+" "+" "+" "+" ";

                        }

                        else if((i

                            sout+=" ";

                            i++;

                        }

                        else{

                            sout+=(char)il[i];

                        }    

                    }

                    else{

                         if(il[i]==12288){

                            sout=sout+" ";

                        }

                        else{

                            sout+=(char)il[i];

                        }    

                    }

                }

                if(bj){

                    sout="<p>"+sout+"</p>";

                }

                

                System.out.println(sout+"-----------出力");

                pr.println(sout);

            }

            

            pr.close();

            br.close();

        }

        catch(Exception e){

            System.out.println("例外"+e+"発生");

        }

        System.out.println("終了");

    }

}

N「ほう、ちゃんと出来たね。コードらしく見えるよ。 」

S「そうですか。まだ改善の余地は有りますけど。」

B「うーん、どうもいまいちですね。 」

S「うわ!BB君、いつの間に入ったの? 」

N「BB君、おどかさないでくれよ。 」

B「さっきからいるんですけど、気が付きませんでしたか? 」

N「全然気付かなかったな。 」

S「で、どこが今一なのよ。 」

B「行の間が広すぎるよ。それに、コマンドプロンプトで動かすより、GUIでやるほうが いいよ。 」

S「そんなことわかってるわよ。人の事より、ゲームの改良は進んでるの? 」

B「いや、あれはまだだけど、見学者を増やす方法を研究してるんだ。 」

S「仕事が遅いわね。じゃ、ゲームは私がやるわ。 」

N「いやっ!それは待ってくれ。BB君!早くゲームの改良をやりたまえ。 」

B「はい!じゃ、さっそく続きに取りかかります。 」

S「でも、私もたまにはゲームをやりたいわ。まだ1回しかやってないのに。 」

N 「はっはっは!大人気ないな。いつでも出来るじゃないか。まずは研究だよ。 」

B 「そうだよ。じゃ、博士、さっそく続きに取りかかります。 」

N 「なんだ、まだいたのか。すぐたのむよ。」

BB君は出て行った。 

 

S 「まったく、あの人は人の事ばかり、ああでもない、こうでもないってうるさいんですよ。 」

N 「本当だ。しかし、これはすばらしい成果だよ。なんと言っても実用的なプログラムを 作ったのは今回が初めてだし、色々応用出来そうだよね。 」

S 「そうですよね。実は、研究帖をもっと簡単に作るプログラムも考えているんです。 」

N 「そうか、それは楽しみだな。 」

この研究は一応完了とする。 

 

コードはこのhtmlのソースを見たほうが分かりやすいかもしれませんので、乗せておきます。

興味のある方は見てください。(BB)

 

プログラムIndenter**************************************************************

import java.io.*; class extChange{ //拡張子変換extension String getS(String s,String s2){ int i1=s.indexOf('.'); String sout=s.substring(0,i1+1)+s2; return sout; } String checkS(String s){ int i1=s.indexOf('.'); String sout=s.substring(i1+1); return sout; } } class Indenter{ //indent public static void main(String[] args){ boolean bj=false; Kio ki=new Kio(); String sfi=ki.ioSet("処理するファイル名を拡張子付きで入力して下さい。"); extChange ex=new extChange(); System.out.println("元の拡張子:"+ex.checkS(sfi)); bj=ex.checkS(sfi).equals("java"); //if(ex.checkS(sfi).equals("java"))bj=true; System.out.println("bj:"+bj); String sfo="java"; if(bj){ sfo="html"; } String sf=ex.getS(sfi,sfo); System.out.println("出力ファイル:"+sf); System.out.println("開始"); try{ BufferedReader br=new BufferedReader(new FileReader(sfi)); PrintWriter pr=new PrintWriter(new FileWriter(sf)); String line; while((line=br.readLine())!=null){ int[] il=new int[line.length()]; System.out.println(line); for(int i=0;i"; } System.out.println(sout+"-----------出力"); pr.println(sout); } pr.close(); br.close(); } catch(Exception e){ System.out.println("例外"+e+"発生"); } System.out.println("終了"); } }

研究課題に戻る。

見学者への注意事項に戻る。