[С++]Программа, которая подсчитывает эффективное количество строк кода в проекте. (Вопрос по реализации)

Модератор: Модераторы разделов

Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

[С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение pento »

Задача:
1. Программа должна принимать в качестве параметра командной строки имя каталога в котором нужно производить подсчет, а так же типы файлов, которые нужно принимать во внимание.
2. Выходными данными программы являются два числа:
* общее число строк во всех обработанных файлах;
* эффективное число строк кода в обработанных файлах.
3. Под эффективным числом строк следует понимать все непустые строки, а так же строки не являющиеся комментариями.
Под комментариями следует понимать комментарии в C и C++ стиле.
4. Программа должна обрабатывать все файлы указанного типа во всех подкаталогах указанного каталога.

Вопрос:
Насколько правильно будет создать и использовать класс вида

Код: Выделить всё

 class LineCounter {
   private:
      string sLComment = "//";
      string mLCommentStart = "/*";
      string mLCommentEnd= "*/";
   public:
     vector<double> countLines( string path){
        vector<double>  counter;
    ....
      if  ("директория") {
         counter = this->countLines( iPath );
       }else{
        // здесь дял каждого текстового файла считаем количества строк
      }
    }
}

То есть будет рекурсивный вызов метода класса..."Подводные камни"?
Надеюсь объяснил понятно =)
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение sdk »

А что смущает? Это раз.
Что мешает написать и потом уже посмотреть на наличие "подводных камней"? Это два.

PS. Метод const-ом сделай ;)
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение Liksys »

Элементарная задача. Обход каталога (не знаяю, как СиПласПлас), в С можно реализовать через серии opender(), readdir(), closedir(), а получение полного пути к файлу - через getcwd(). Все функции прекрасно в мане описаны.
Спасибо сказали:
Аватара пользователя
polachok
Бывший модератор
Сообщения: 2199
Статус: главный форумный маргинал
ОС: gnu/linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение polachok »

это задача или задачка?
cat *|grep "//|/\*"|wc -l
И немедленно выпил.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение sdk »

Liksys,
и к чему ты это все?

Во-первых, человек не спрашивал с помощью каких функций реализовывать, он спросил правилен ли его подход с рекурсией.
Во-вторых, он его интересует именно C++.
;)

polachok,
Млин и ты туда же :).

Молодцы ребята, вы отлично показали, что умеете крутые фишки делать, но как это относится к заданному вопросу?
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение Liksys »

polachok писал(а): ↑
28.11.2006 21:40
это задача или задачка?
cat *|grep "//|/\*"|wc -l

тогда уж через find, т.к. надо рекорсивно. И еще: многие программеры (включая меня) растягивают звездочки комментов на новые строки. Так что метод надо усовершенствовать.
Спасибо сказали:
Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение pento »

(pento @ Nov 28 2006, в 23:51) писал(а):PS. Метод const-ом сделай wink.gif

Пасиб, что-то сразу не сообразил..=)
Почему сразу не попробывал...да просто решил посоветоваться )
(Liksys @ Nov 29 2006, в 00:32) писал(а):Обход каталога (не знаяю, как СиПласПлас), в С можно реализовать через серии opender(), readdir(), closedir(), а получение полного пути к файлу - через getcwd(). Все функции прекрасно в мане описаны.

Это всё замечательно, но делается с помощью Boost::filesystem + вопрос по большей части был касательно использования рекурсии и метода класса =)
(polachok @ Nov 29 2006, в 00:37) писал(а):это задача или задачка?
cat *|grep "//|/\*"|wc -l

И таки все варианты расположения комментариев учитывать будет и большое количество файлов с большим количеством строк?...Вообще говоря, задача была эта совсем не на знание cat/grep и т.п. а на С++ ;)

(Liksys @ Nov 29 2006, в 00:40) писал(а):И еще: многие программеры (включая меня) растягивают звездочки комментов на новые строки. Так что метод надо усовершенствовать.

Парсинг файла уже сделал с помощью Boost::Regex + String::* - и работает с любым расположением комментариев..чуть подправлю и можно будет задавать свои идентификаторы границ комментариев(#, <!---> и т.п.).

Всем спасибо за ответы!
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение Zeus »

pento писал(а): ↑
28.11.2006 20:54
Задача:
1. Программа должна принимать в качестве параметра командной строки имя каталога в котором нужно производить подсчет, а так же типы файлов, которые нужно принимать во внимание.
2. Выходными данными программы являются два числа:
* общее число строк во всех обработанных файлах;
* эффективное число строк кода в обработанных файлах.
3. Под эффективным числом строк следует понимать все непустые строки, а так же строки не являющиеся комментариями.
Под комментариями следует понимать комментарии в C и C++ стиле.
4. Программа должна обрабатывать все файлы указанного типа во всех подкаталогах указанного каталога.

Я бы, наверное, всё-таки сделал программу, читающую строки из стандартного ввода.
А уж что ей на вход подавать - уже организовал бы скриптами.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение v04bvs »

pento писал(а): ↑
28.11.2006 20:54
Задача:
1. Программа должна принимать в качестве параметра командной строки имя каталога в котором нужно производить подсчет, а так же типы файлов, которые нужно принимать во внимание.
2. Выходными данными программы являются два числа:
* общее число строк во всех обработанных файлах;
* эффективное число строк кода в обработанных файлах.
3. Под эффективным числом строк следует понимать все непустые строки, а так же строки не являющиеся комментариями.
Под комментариями следует понимать комментарии в C и C++ стиле.
4. Программа должна обрабатывать все файлы указанного типа во всех подкаталогах указанного каталога.

Вопрос:
Насколько правильно будет создать и использовать класс вида

Код: Выделить всё

 class LineCounter {
   private:
      string sLComment = "//";
      string mLCommentStart = "/*";
      string mLCommentEnd= "*/";
   public:
     vector<double> countLines( string path){
        vector<double>  counter;
    ....
      if  ("директория") {
         counter = this->countLines( iPath );
       }else{
        // здесь дял каждого текстового файла считаем количества строк
      }
    }
}

То есть будет рекурсивный вызов метода класса..."Подводные камни"?
Надеюсь объяснил понятно =)

Никаких особых отличий метода класса от обычной функции в плане рекурсии нет. Разве что то, что передаётся неявно указатель this.

Кстати параметр counter

Я присоединяюсь к тому мнению, что программе достаточно обрабатывать только один файл. В качестве примера советую изучить утилиту wc, которая является довольно близким аналогом того, что ты хочешь написать. Кстати интересно будет в статистике указывать объём комментариев, это тоже важная характеристика кода.

(polachok) писал(а):это задача или задачка?
cat *|grep "//|/\*"|wc -l

Это неверно, и вряд ли вы в общем случае построите простейшими средствами нужную утилиту. Здесь необходим лексический анализ.
Спасибо сказали:
Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение pento »

Zeus
v04bvs
Ещё раз=) Никаких вызовов утилит. Это обычное учебное задание дабы поднять С++.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение sdk »

(pento @ Nov 29 2006, в 22:10) писал(а):Zeus
v04bvs
Ещё раз=) Никаких вызовов утилит. Это обычное учебное задание дабы поднять С++.

:)
Я вот как раз хотел сказать...
Это как если бы я спросил "как мне лучше порезать морковку, используя ножик?", а мне бы начали отвечать, что порезать ее можно не только ножиком, а еще и ниткой. И лобзиком тоже можно. А еще лучше наметить надрезы лобзиком, отшлифовать ниткой, а потом уж как-нибудь и ножиком :D.
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение v04bvs »

Нет, мы ему предлагаем её сначала помыть под краном и потом чистую резать. А он настойчиво хочет соскоблить грязь ножом и потом чистить. Ну можно и так.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение sdk »

(v04bvs @ Nov 30 2006, в 09:10) писал(а):Нет, мы ему предлагаем её сначала помыть под краном и потом чистую резать. А он настойчиво хочет соскоблить грязь ножом и потом чистить. Ну можно и так.

Во-во. Я ж о том же. Где он говорил, что ему надо мыть?
Он спрашивал как порезать. Неважно грязную или чистую.

:P
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
pzp-5
Сообщения: 558
Статус: Главный модератор "Пингвинария" на Лафоксе.

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение pzp-5 »

pento писал(а): ↑
28.11.2006 20:54
Вопрос:
Насколько правильно будет создать и использовать класс вида

Сказал бы всем: ключевое слово C++ - и не было бы лишних советов.
з.ы. В Баше (сед или авк) это тебе местная братия решила бы влегкую.
Угадайте: где на фотографии, которая представляет мой аватавр, спрятана птичка?
Спасибо сказали:
Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение pento »

pzp-5 писал(а): ↑
30.11.2006 23:54
pento писал(а): ↑
28.11.2006 20:54

Вопрос:
Насколько правильно будет создать и использовать класс вида

Сказал бы всем: ключевое слово C++ - и не было бы лишних советов.
з.ы. В Баше (сед или авк) это тебе местная братия решила бы влегкую.

Обратите внимание на название темы ;)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение t.t »

(pzp-5 @ Nov 30 2006, в 23:51) писал(а):В Баше (сед или авк) это тебе местная братия решила бы влегкую.
А на перле так вообще одна строчка :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение v04bvs »

t.t писал(а): ↑
12.01.2007 15:59
(pzp-5 @ Nov 30 2006, в 23:51) писал(а):В Баше (сед или авк) это тебе местная братия решила бы влегкую.
А на перле так вообще одна строчка :)

блин, раздражает честно говоря такое отношение к предмету. Напишите свою строчку, а я укажу вам на её ошибки.
Спасибо сказали:
Аватара пользователя
Ballantre
Сообщения: 114
ОС: Linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение Ballantre »

А потом еще кто-нибудь укажет на ужасающие потери в производительности из - за этой одной строчки. Ведь можно было написать несколько сотен на Его Величестве Ассемблере. Или на худой конец - рекурсия на С++, в чем и просил помочь автор.
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
Спасибо сказали:
Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение pento »

Ballantre
Пойми, задание было - реализовать именно на плюсах, как и что там можно уместить в одну строчку на других языках - не важно.
P.S. Раз уж такая канитель, то в эту одну строчку конечно уместится и условие того, что комментарии могут в тексте распологаться по-разному?
bla bla /*...*/

bla bla /*
....
...*/

bla /*
....
// ...

...*/bla

?
Спасибо сказали:
Аватара пользователя
Бодрый и Веселый
Сообщения: 66
ОС: What?

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение Бодрый и Веселый »

pento писал(а): ↑
14.01.2007 22:19
Раз уж такая канитель, то в эту одну строчку конечно уместится и условие того, что комментарии могут в тексте распологаться по-разному?

Еще последовательность символов означающая начало или конец комментария может встретиться внутри строки: "/*", "//". :)
Спасибо сказали:
Аватара пользователя
Ballantre
Сообщения: 114
ОС: Linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение Ballantre »

Да, но в случае с "//" эта строка, скорее всего, может считаться эффективной. :)
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение t.t »

v04bvs писал(а): ↑
12.01.2007 23:42
t.t писал(а): ↑
12.01.2007 15:59
(pzp-5 @ Nov 30 2006, в 23:51) писал(а):В Баше (сед или авк) это тебе местная братия решила бы влегкую.
А на перле так вообще одна строчка :)
блин, раздражает честно говоря такое отношение к предмету. Напишите свою строчку, а я укажу вам на её ошибки.
Хм.. А как, простите, из этой строчки вы поняли моё отношение к предмету? Полагаю, что неправильно. Я всего лишь говорил о том, что если уж "местная братия" взялась это "решать влёгкую" на sed или awk, то там это как раз не так уж элементарно -- в отличие от перла. Всего лишь комментарий, не более.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение v04bvs »

t.t писал(а): ↑
19.01.2007 19:03
v04bvs писал(а): ↑
12.01.2007 23:42
t.t писал(а): ↑
12.01.2007 15:59
(pzp-5 @ Nov 30 2006, в 23:51) писал(а):В Баше (сед или авк) это тебе местная братия решила бы влегкую.
А на перле так вообще одна строчка :)
блин, раздражает честно говоря такое отношение к предмету. Напишите свою строчку, а я укажу вам на её ошибки.
Хм.. А как, простите, из этой строчки вы поняли моё отношение к предмету? Полагаю, что неправильно. Я всего лишь говорил о том, что если уж "местная братия" взялась это "решать влёгкую" на sed или awk, то там это как раз не так уж элементарно -- в отличие от перла. Всего лишь комментарий, не более.

Корректное решение этой задачи не элементарно ни на перле, ни на других ЯП, т.к. требует лексического анализа программы.
Например

// first comment ??/
second comment

может выглядеть необычно, но это 2 строки комментариев в С++.

Я не говорю про "простые" случаи вроде
write("htllo, \"world/*");
test();
write("*/");
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [С++]Программа, которая подсчитывает эффективное количество строк кода в проекте.

Сообщение t.t »

(v04bvs @ Jan 19 2007, в 21:44) писал(а):Корректное решение этой задачи не элементарно ни на перле, ни на других ЯП, т.к. требует лексического анализа программы.
Смотря что понимать под задачей. Если бы задача была -- удалить все комментарии, оставив остальной текст программы без изменений, тогда да -- нетривиально. А задача "посчитать количество строк, кроме комментариев" -- это несколько другая задача. Например, проблему вида write("htllo, \"world/*"); можно решить одним регекспом s/[^\\]".*[^\\]"/""/gs
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: