-1

任何人都可以帮助我使这个更通用和更专业吗?

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;


int main()
{
 // open text file for input: 

 string file_name;

 cout << "please enter file name: ";
 cin  >> file_name;

 // associate the input file stream with a text file

 ifstream infile(file_name.c_str());

 // error checking for a valid filename

 if ( !infile )
    {
  cerr << "Unable to open file "
    << file_name << " -- quitting!\n";
  return( -1 );
    }
  else cout << "\n";

 // some data structures to perform the function

 vector<string> lines_of_text;
 string textline;

 // read in text file, line by 

 while (getline( infile, textline, '\n' ))
 {
  // add the new element to the vector

  lines_of_text.push_back( textline );

  // print the 'back' vector element - see the STL documentation

  cout << lines_of_text.back() << "\n";
 }

 cout<<"OUTPUT BEGINS HERE:  "<<endl<<endl;
cout<<"the total capacity of vector: lines_of_text is: "<<lines_of_text.capacity()<<endl;

int PLOC = (lines_of_text.size()+1);
int numbComments =0;
int numbClasses =0;

cout<<"\nThe total number of physical lines of code is: "<<PLOC<<endl;


for (int i=0; i<(PLOC-1); i++)

//reads through each part of the vector string line-by-line and triggers if the 

//it registers the "//" which will output a number lower than 100 (since no line is 100 char long and if the function does not 
//register that character within the string, it outputs a public status constant that is found in the class string and has a huge value
//alot more than 100.


{
string temp(lines_of_text [i]);
if (temp.find("//")<100)
numbComments +=1;
}
cout<<"The total number of comment lines is: "<<numbComments<<endl;

for (int j=0; j<(PLOC-1); j++)
{
string temp(lines_of_text [j]);
if (temp.find("};")<100)
numbClasses +=1;
}
cout<<"The total number of classes is: "<<numbClasses<<endl;
4

5 回答 5

4

正确格式化代码,使用一致的风格和命名法,去掉完全多余的注释和空行。结果代码应该没问题。或“专业”。

在这里,我采取了努力(以及一些纯粹主观的文体事物):

请注意,输出实际上是错误的(只需在程序代码本身上运行它以查看...)。

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string file_name;

    cout << "please enter file name: ";
    cin  >> file_name;

    ifstream infile(file_name.c_str());

    if (not infile) {
        cerr << "Unable to open file " << file_name << " -- quitting!" << endl;
        return -1;
    }
    else cout << endl;

    vector<string> lines_of_text;
    string textline;

    while (getline(infile, textline)) {
        lines_of_text.push_back(textline);
        cout << lines_of_text.back() << endl;
    }

    cout << "OUTPUT BEGINS HERE:  " << endl << endl;
    cout << "the total capacity of vector: lines_of_text is: "
         << lines_of_text.capacity() << endl << endl;

    int ploc = lines_of_text.size() + 1;

    cout << "The total number of physical lines of code is: " << ploc << endl;

    // Look for comments `//` and count them.
    int num_comments = 0;
    for (vector<string>::iterator i = lines_of_text.begin();
            i != lines_of_text.end();
            ++i) {
        if (i->find("//") != string::npos)
            ++num_comments;
    }

    cout << "The total number of comment lines is: " << num_comments << endl;

    // Same for number of classes ...
}
于 2010-04-04T15:14:30.477 回答
3

我不太确定你在问什么,但我可以指出一些可以在这段代码中改进的地方。我将专注于实际陈述并将风格评论留给其他人。

  • cin >> file_name;
    要处理带空格的文件名,最好写
    getline(cin, file_name);

  • int PLOC = (lines_of_text.size()+1);
    为什么你声称比实际多一条线?

  • if (temp.find("//")<100)
    用一些复杂的评论来解释这一点。更好地写入
    if (temp.find("//")<temp.npos)
    以在所有行长上正常工作。

  • cout<<"The total number of comment lines is: "<<numbComments<<endl;
    实际上,您计算了行尾评论的数量。我不会将声明末尾的评论称为“评论行”。

  • 你不计算/* */风格评论。

  • 计算类的数量为};?真的吗?structs、enums 和普通的多余分号怎么样?只需计算class关键字的出现次数。它的两边不应有字母数字字符或下划线。

于 2010-04-04T15:13:24.343 回答
2
  1. 使用适当的缩进,您的代码很难以当前形式阅读。是样式列表。
  2. 可能时更喜欢++variable而不是variable += 1;运营商的++存在是有原因的。
  3. 在你的编码风格上保持一致。如果您要在coutand <<、函数参数和函数括号之间留有空格,则可以这样做,否则不要这样做,但要保持一致。为您的变量选择一种命名约定并坚持下去。您可以在 google 上找到很多关于样式的信息,例如herehere
  4. 不要使用整个std命名空间,只使用你需要的。在您的所有语句中添加一个using std::cout;或前缀coutstd::
  5. 避免不必要的评论。例如,每个人都知道做ifstream infile(file_name.c_str());什么,我不知道您的程序作为一个整体做什么,因为由于缩进,我并不真正关心了解它的作用。这是一个简短的程序,所以与其单独解释每个语句,为什么不解释程序的目的是什么,以及如何使用它呢?

这些都是风格要点。假设您的目标是计算评论和课程,您的程序无法以当前形式运行。这样做比您考虑的要困难得多。如果我有一个“};”怎么办?例如,作为字符串的一部分?如果我在字符串中有注释怎么办?

于 2010-04-04T15:14:25.377 回答
0

不要导入整个std命名空间,只导入你需要的东西:

using std::string;

使用一致的命名约定:决定您是否喜欢name_for_a_variableornameforavariablenameForAVariable. 并使用有意义的名字:让我联想到与,或.numbComments完全不同的事物。numberOfCommentsnumCommentscommentCount

如果您的原始代码看起来像这样,我强烈建议选择单一一致的缩进样式:要么

if ( ... )
    {
    ...
    }

或者

if ( ... )
{
    ...
}

bot不在同一个源文件中。

同时删除无用的评论,如

// add the new element to the vector

这只是关于代码的可读性,甚至没有触及它的功能......(正如其他人已经指出的那样,这是不正确的)。请注意,任何一段代码的阅读次数都可能比编辑次数多得多。如果您需要在几个月后阅读它,我相当肯定您将难以阅读(和理解)您自己的这种形式的代码。

于 2010-04-04T15:04:55.253 回答
0

“更专业”根本不会这样做。使用现有的 SLOC 计数器,因此您无需重新发明轮子。

这个讨论列出了一些: http ://discuss.techinterview.org/default.asp?joel.3.207012.14

另一个提示:不要使用 "temp.find("};}) < 100)",使用 "temp.find("};") != temp.npos;"

编辑:s/end()/npos. 啊。

于 2010-04-04T15:11:58.750 回答