Кресты / Говнокод #2008 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
class WordCount{

private:
	string _t;
	vector <int> _w;

	int wc(){
		string tw;
		int s = 0;
		for(int i = 0; i < _t.size(); ++i){
			if(_t[i] == ' '){
				tw.clear();
				for(int j = s;j < i;++j){
					tw += _t[j];
				}
				
				size_t z = 0;
				for(int k = 0; k < i - s; ++k){
					int jj = 1;
					for(int d = 0; d < k;  ++d)
						jj *= 10;

					z += jj * static_cast<int>(_t[k]);

				}

				bool sa = true;
				for(int az = 0; az < _w.size(); ++az)
					if(_w[az] == z) sa = false;
				if(sa)_w.push_back (z);

				s = i+1;
			}
		}
		if(s < _t.size() ){
			size_t z = 0;
			for(int k = s;k < _t.size();++k){
					
					int jj = 1;
					for(int d = 0; d < k;  ++d)
						jj *= 10;

					z += jj * static_cast<int>(_t[k]);
			}

			bool sa = true;
				for(int az = 0; az < _w.size(); ++az)
					if(_w[az] == z) sa = false;
				if(sa)_w.push_back (z);
		}
		return _w.size();
	}

public:

	int WordCount(string text){

		_t = text;

		return wc();

	}
};

Клас, который должен был подсчитывать кол-во уникальных слов в строке.
Наслаждайтесь, господа!

Запостил: hacker-l0maker hacker-l0maker, (Updated )

Комментарии (14) RSS

  • Выглядит логично. Найди комбинацию символов до пробела -- это слово. Проверь: есть ли слово в словаре? Если есть, ничего не делай, если нет, то добавь слово в словарь, уникальных на одно больше.
    Правда кодирование слова смущает... А так... Для C программиста всё так и было бы. Весьма вероятно, что в C++ есть более продвинутые методы или функции-нечлены для работы со строками.

    Ну да... И название метода wc (ватер клазет) сразу сообщает нам, что необходимо запостить это на говнокод =]
    Ответить
    • что меня смущает:
      1) код почти нечитабельный. например, здесь
      [code language="c++"]for(int j = s;j < i;++j){
      tw += _t[j];
      }
      [/code]
      можно было использовать strcpy. Плюс зачем строка tw, если она нигде не используется потом? Очевидно, программируя в таком стиле, легко потерять логику
      2) вообще утерян смысл программирования класов
      3) самое забавное: повторения кода.
      [code language="c++"]
      bool sa = true;
      for(int az = 0; az < _w.size(); ++az)
      if(_w[az] == z) sa = false;
      if(sa)_w.push_back (z);
      [/code]
      Почему не отдельные метод?
      Ответить
      • С точки зрения С++ здесь много чего "не так". К вашим замечаниям можно ещё добавить, что не следует искать что-то в векторе, есть алгоритмы группы find. Функции неявно встроенные. Копируется строка в закрытую переменную. Как я и написал выше, похоже, что это код С программиста на С++. Мы все такие коды писали курсе на втором. На первом нас активно учили структурному программированию, а на втором "новым эффективным методам".

        Ясно же, что ни вектор не используется, ни строка, ни сама суть класса. Зато C виден насквозь.

        Я потому этот код и не минусую и не плюсую.
        Ответить
      • Да. И как обычно.
        Хорошо бы всё, что вы считаете говнокодом, сразу писать в комментарии к коду. Иначе можно с разных сторон на код смотреть и обнаружить, что не такое уж и говно. Или на вменяемый код говном обзываться.
        Ответить
  • Использовать static_cast<int> для преобразования от char к int это как-то неоправданно. Для встроенных типов и неуказателей лучше C-style cast.
    Ответить
    • Ничего проти static_cast не имею, но само суммирование просто маразм (и по стилю и по эффективности)

      [code]
      for(int k = 0; k < i - s; ++k){
      int jj = 1;
      for(int d = 0; d < k; ++d)
      jj *= 10;

      z += jj * static_cast<int>(_t[k]);

      }
      Ответить
  • Нафиг нужен весь этот изврат, если есть strtok (или boost::tokenizer) и std::set (или tr1::unordered_set)?
    Ответить
  • wc - программа в *nix осях,
    Выдержка из мана:
    wc - print newline, word, and byte counts for each file
    Ответить
  • А в самом деле, как лучше подсчитать количество слов в строке (не применяя внешние библиотеки)?
    Ответить
  • не знаю как сам алгоритм, но стиль написания кода в данном случае -- говно редкое.
    Ответить
  • очередной ОО-идиот. Зачем здесь создавать класс?
    Ответить
  • вообще нада юзать std::string::find_first_not_of(" \n\r\t", currentPos)
    А так видно, что код начинающим написан
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8