1. Си / Говнокод #3421

    +129

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    #include <iostream>
    #include <string.h>
    using namespace std;
    int strsearch(char* from, char* what);
    int getnumberafter(char* from, char* what);
    int strch(char* a, char* b, int pos);
    
    int strsearch(char* from, char* what)
    {
        int n=strlen(from)-strlen(what)+1;
        int i;
        for(i=0; i<n; i++)
    	if(strch(from, what, i)==strlen(what)) return i;
        return 0;
    }
    int getnumberafter(char* from, char* what)
    {
        int p, ret=0;
        if((p=strsearch(from,what))==0) return 0;
        p+=strlen(what);
        while(from[p]<'0'&&from[p]>'9')
        {
    	p++;
    	if(p>=strlen(from)) return 0;
        }
        while(from[p]>='0'&&from[p]<='9'&&p<strlen(from))
        {
    	ret=ret*10+(from[p++]-'0');
        }
        return ret;
    }
    int strch(char* a, char* b, int pos)
    {
        int i,n=min(strlen(a)-pos,strlen(b));
        for(i=0; i<n; i++)
    	if(a[i+pos]!=b[i]) return i;
        return i;
    }
    int main(int argc, char* argv[])
    {
        int i;
        double max=1,vol=0;
        for(i=0; i<argc; i++)
        {
    	cout << i << ": " << argv[i] << endl;
    	if(strch(argv[i],"type",0)==4) {  max=getnumberafter(argv[i],"max=");}
    	if(strch(argv[i],"values",0)==6) { vol=(getnumberafter(argv[i],"=")+getnumberafter(argv[i],","))/2;}
        }
        cout << vol/max << endl;
        return 0;
    }

    Задача из чего-то типа этого:
    numid=2,iface=MIXER,name='Master Playback Volume'
    ; type=INTEGER,access=rw---R--,values=2,min=0,max=31,step=0
    : values=31,31
    | dBscale-min=-46.50dB,step=1.50dB,mute=0
    Получить значение в процентах.
    #./a.out `amixer cget numid=2`
    0,67

    Запостил: Tanger, 08 Июня 2010

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

    • Пардон, но где здесь Си?
      Ответить
    • Код совпадает с регэкспом (while|for).+strlen, следовательно говнокод
      Ответить
      • Извините, я что-то не уловил логику где-то между "совпадает с регэкспом" и "говнокод". Да и, честно говоря, и не понял как данный regexp относится к данному коду, но это хрен с ним. Мне интереснее, как из этого следует, что код - говнокод.
        Ответить
        • А что, по-вашему, вычислять strlen в цикле - это хорошая идея?
          Ответить
          • А, я кажется наконец-то понял, что вы хотели сказать фразой "совпадает с регэкспом". Мне изначально показалось, что вы каким-то образом сочли, что программа выполяет ту же функцию что и некий regexp, а не то, что код программы удовлетворяет регулярному выражению. Извиняюсь.
            Ответить
            • Просто "совпадает" - это же общепринятый перевод термина match. Я даже не знаю как выразиться более однозначно.
              Ответить
              • Удовлетворяет? Соответствует?
                Ответить
                • "Соответствует" - неплохой вариант. Но в книжке с совой было, емнип, "совпадает".
                  Ответить
                  • Что доказывает, что говнописатели есть не только среди программистов, но и среди переводчиков.
                    Еще вариант, кое-где использовавшийся, «отвечает».
                    Ответить
      • Кстати о регэкспах, типичный случай того, где C не нужен, поскольку дело происходит на юниксе:)
        Ответить
    • Зачем столько однообразного говна постить? Достаточно выбрать самое говнистое. Эдак скоро архивы с исходниками заливать начнем.
      Ответить

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