2011-08-10 20 views
0

実行可能な行のコード(ELOC)、空白行の行(BLOC)、およびコメント(CLOC)をJavaおよびC++コードのみに対してスキャンおよび検索するJavaプログラムを作成しました。以下は私のコードです:実行可能なコード行を見つけるためのJavaアルゴリズム

if(extension.contains("java") || extension.contains("c++")) 
       { 
        Scanner input = new Scanner(fileObject); 
        while(input.hasNext()) 
        { 
         String s = input.nextLine(); 
         if(s.length()==0) 
         { 
          bloc++; 
         } 
         else if(s.contains("/*") || s.startsWith("/*")) 
         { 
          cloc++; 
          while(!s.contains("*/")) 
          { 
           cloc++; 
           s = input.nextLine(); 
          } 
         } 
         else if(s.contains("//")) 
         { 
          cloc++; 
         } 
         else 
         { 
          eloc++; 
         } 
        }//while 
        System.out.println("ELOC: "+(eloc)); 
        System.out.println("Blank Lines: "+bloc); 
        System.out.println("Comment Lines: "+cloc); 
       } 

私は異なるJavaとC++のソースコードを実行しましたが、必ずしも正しい答えを出すとは限りません。私はそれをより良くするために何ができますか?私が使用できるJavaコードがオンラインにありますか?

この質問では、実行可能なコード行を数えています。次のような行が表示される場合:

int x=0;//some comment 

この場合、上記の行は実行可能な行の1つとして数えます。

String extension=getExtension(fileObject.getName()); 
      if(extension.contains("java") || extension.contains("c++")) 
      {   
       Scanner input = new Scanner(fileObject); 
       String s; 
       while(input.hasNext()) 
       { 
        s = input.nextLine().trim(); 
        eloc++; 
        if(s.equals("")) 
        { 
         bloc++; 
        } 
        if(s.startsWith("//")) 
        { 
         cloc++;  
        } 
        if(s.contains("/*") && !s.contains("*\\")) 
        { 
         cloc++; 
         while(!s.contains("*/")) 
         { 
          cloc++; 
          eloc++; 
          s = input.nextLine(); 
         } 
        } 
        else if(s.contains("/*") && s.contains("*\\")) 
        { 
         cloc++; 
        } 
       } 
       System.out.println("Total number of lines: "+eloc); 
       System.out.println("ELOC: "+(eloc-(cloc+bloc))); 
       System.out.println("Blank Lines: "+bloc); 
       System.out.println("Comment Lines: "+cloc); 
      } 

どれコメント/アドバイスはappreciated..Thanks次のようになります。以下は、私の更新されたコードです!

+0

http://stackoverflow.com/questions/2184999/sloc-for-java-projects –

+1

あなたは「正しい答えを常に出すとは限らない」と言った。それが間違っているとき、どうしたのですか?あなたは例を挙げることができますか? –

+0

私は結果をlocmetrics.comと比較していますが、同じ結果は得られません。 – sap

答えて

2

Unixシステムでは、単にclocを使用できます。これはあなたに次のような出力が得られます。

src$ cloc . 
51 text files. 
51 unique files.        
285 files ignored. 

http://cloc.sourceforge.net v 1.53 T=0.5 s (82.0 files/s, 5854.0 lines/s) 
------------------------------------------------------------------------------- 
Language      files   blank  comment   code 
------------------------------------------------------------------------------- 
Java       39   618   119   2145 
XML        2    8    0    37 
------------------------------------------------------------------------------- 
SUM:       41   626   119   2182 
------------------------------------------------------------------------------- 

コード行は、コメントや空白が含まれていますが、Java用CLOCを使用してブロックブラケットやimport文のようなものが含まいたしません。

他にも利用可能なツールがありますが、これはコード行を数えれば簡単です。お役に立てれば。期待カウントを生成しません

0

例:

int a; 
a = 7; // comment, yeah 
int b /* my favorite variable */ = 3; 
executeMethod(dataField, 
    moreData,excitingBoolean,resultSetFromMyGrandma, 
    anotherParameterTakingAnotherWholeLine); 

あなたのプログラムは非常に優雅なコメントまたは複数行のステートメントを処理していません。

編集

私は、ツリーに完全にそれを解析するJavaコンパイラを使用して文法のコメントとコードの実行可能行を認識して、そこからカウントを示唆しています。単純なチェックがスキップされる可能性のある例外はたくさんあります。それはゼロの長さを持っていない可能性がありますあなたの現在のアプローチ

+0

"a = 7; //コメント、ええ"または "int b/*私の好きな変数*/= 3;"のような行をどのように扱うことをお勧めしますか? – sap

+0

elocとclocの両方を増やしてはいけませんか? – Atreys

+0

trueですが、if文には何を入れますか? – sap

1

空行にとっては悪夢だ

String commentCodeFun = " // not a real comment ";

:また、ラインを考えます。その内容には空白が含まれている可能性があります。長さを確認する前にtrimmingを試して、より正確なカウントを取得してください。

私が言うことができる唯一のことは、コードとコメントを含む行がある場合、数字がオフになることです。部分的にコメントが含まれていても、今度はコード全体がコメントとみなされているようです。例:

Validate(input); // This validates user input 

これはELOCではなくCLOCとしてカウントされます。

// Validate user input 
Validate(input); 

ではなく、すべての開発者が、第二の方法を使用します:コーディングスタイルがよりこのようであれば、これは問題ではないかもしれません。私は個人的に文脈に応じて両方の組み合わせを使用します。

+0

良い点。私はif(s.trim()。length()== 0)を追加しましたが、次のような行をどのように扱うかはわかりません:Validate(input); //これによりユーザ入力が検証されます – sap

+0

ELOCとCLOCの両方をインクリメントできます。 –

関連する問題