рассчитывать конкретные вещи в коде в C ++ - PullRequest
0 голосов
/ 04 апреля 2010

Может кто-нибудь помочь мне сделать это более обобщенным и более профессиональным?

#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;

Ответы [ 5 ]

4 голосов
/ 04 апреля 2010

Правильно отформатируйте код , используйте непротиворечивый стиль и номенклатуру и отбрасывайте совершенно лишние комментарии и пустые строки . Полученный код должен быть в порядке. Или «за».

Здесь я взял эффорд (наряду с некоторыми стилистическими вещами, которые являются исключительно субъективными):

Обратите внимание, что на самом деле вывод неверен (просто запустите его на самом программном коде, чтобы увидеть это ...).

#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 ...
}
3 голосов
/ 04 апреля 2010

Я не совсем уверен, что вы спрашиваете, но я могу указать на некоторые вещи, которые можно улучшить в этом коде. Я сосредоточусь на реальных высказываниях и оставлю стилистические комментарии другим.

  • 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;
    На самом деле, вы посчитали количество комментариев в конце строки. Я бы не назвал комментарий в конце утверждения «строкой комментария».

  • Вы не учитываете /* */ стиль комментариев.

  • Считать количество классов как };? В самом деле? Как насчет struct с, enum с и простых лишних точек с запятой? Просто посчитайте количество вхождений ключевого слова class. Он не должен иметь буквенно-цифровых символов или подчеркивания с обеих сторон.

2 голосов
/ 04 апреля 2010
  1. Используйте правильные отступы, ваш код очень трудно прочитать в его текущей форме. Здесь - список стилей.
  2. Предпочитайте ++variable вместо variable += 1, когда это возможно; оператор ++ существует по причине.
  3. Будьте последовательны в своем стиле кодирования. Если вы собираетесь оставлять пробелы между такими вещами, как cout и <<, аргументы функций и парантезы функций делают это, в противном случае - нет, но будьте последовательными. Выберите одно соглашение о присвоении имен для ваших переменных и придерживайтесь его. В Google можно найти множество стилей, например здесь и здесь .
  4. Не используйте все пространство имен std, только то, что вам нужно. Пользователь или using std::cout; или префикс всех ваших cout операторов с std::
  5. Избегайте ненужных комментариев. Все знают, например, что делает ifstream infile(file_name.c_str());, чего я не знаю, это то, что делает ваша программа в целом, потому что мне не важно понимать, что она делает из-за отступа. Это короткая программа, поэтому вместо того, чтобы объяснять каждое утверждение самостоятельно, почему бы не объяснить, какова цель программы и как ее использовать?

Это все стилистические моменты. Ваша программа не работает в ее текущем виде, если ваша цель состоит в том, чтобы считать комментарии и классы. Делать это намного сложнее, чем вы думаете. Что если у меня есть "};" как часть строки, например? Что делать, если у меня есть комментарии в строках?

0 голосов
/ 04 апреля 2010

«Более профессионально» вообще не будет этого делать. Используйте существующий счетчик SLOC, чтобы не изобретать велосипед.

В этом обсуждении перечислено несколько: http://discuss.techinterview.org/default.asp?joel.3.207012.14

Еще один совет: не используйте "temp.find ("};}) <100) ", используйте" temp.find ("};")! = Temp.npos; "</p>

Редактировать: s / end () / npos. Тьфу.

0 голосов
/ 04 апреля 2010

Не импортируйте все пространство имен std, только то, что вам нужно:

using std::string;

Используйте согласованное соглашение об именах: решите, предпочитаете ли вы name_for_a_variable или nameforavariable или nameForAVariable. И используйте значимые имена: numbComments заставляет меня ассоциироваться с совершенно другими вещами, чем numberOfComments, numComments или commentCount.

Если ваш исходный код выглядит следующим образом, я настоятельно рекомендую выбрать один согласованный стиль отступа: либо

if ( ... )
    {
    ...
    }

или

if ( ... )
{
    ...
}

бот не в одном и том же исходном файле.

Также удалите ненужные комментарии, такие как

// add the new element to the vector

Это «только» в отношении читабельности вашего кода, даже не касаясь его функциональности ... (что, как уже отмечали другие, неверно). Обратите внимание, что любой фрагмент кода может быть прочитан намного больше, чем отредактирован. Я вполне уверен, что у вас будут проблемы с чтением (и пониманием) вашего собственного кода в такой форме, если вам понадобится прочитать его даже через пару месяцев после этого.

...