1. C++ / Говнокод #2513

    +55.5

    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
    //------------------------------- COMPARE -------------------------------------
    // Function to compare two strings on a mask, using a question mark and
    // asterisk.Question mark matches any single character. The asterisk matches
    // any signs of a minimum length of zero. maximum length is not limited. Only
    // the next character in the mask has a value when there is a coincidence.
    int compare(const char pat[],const char text[],int rec_ex)
    {
        bool    flag = false;               // flag show if working on "star"
        int     pat_len ,txt_len,           // lehtghs of pattern and text
                flagc,                      // counter and  position i check
                shift=0;                    // shift position
    
        pat_len = (int)strlen(pat);         // get lehtgh of pattern
        txt_len = (int)strlen(text);        // get lehtgh of text
    
        if(rec_ex == 1 || (!pat_len && !txt_len))   // check if have to check some
            return(1);                      // if yes return 1 or if have exit
        else if(rec_ex == pat_len)          // else return 0 becose not check that
            return (0);                     // return 0
    
        for(flagc=0;flagc < pat_len;flagc++)
            if(pat[flagc] == '*' && flagc + 1 == pat_len)
                return(compare(pat,text,1));// end of check return 1
            else if(pat[flagc] == '*')
                flag = true;                // start * compare set flag true
            else if(pat[flagc] != '?')
            {
                if(toupper(pat[flagc]) != toupper(text[flagc+shift]) && !flag)
                    return(compare(pat,text,pat_len));   // bad char and no star
                else if(toupper(pat[flagc]) == toupper(text[flagc+shift]) && flag)
                    flag = false;                   // set flag false position
                else if(toupper(pat[flagc]) != toupper(text[flagc+shift]) && flag)
                    shift++;
            }
            else if(pat[flagc] == '?')
            {                               // check if have ? in star operation
                if(toupper(pat[flagc]) == toupper(text[flagc+shift]) && flag)
                    flag = false;           // set flag false position
                else if(toupper(pat[flagc]) != toupper(text[flagc+shift]) && flag)
                    shift++;                // add one more into shift
            }
        if((flagc+shift < txt_len && !flag) // text have nore chars and
            || (flagc+shift == txt_len +1 && pat[pat_len+1] != '*'))
            return(compare(pat,text,pat_len)); // and next char in pattern no star
        else
            return(compare(pat,text,1));       // end of pattern and text
    
    }

    Вот на после завтра нужно по программированию функцию написать- рекурсивную для сравнения строк по маске.
    Написал :-) якобы рекурсивную функцию :-)

    Запостил: werd, 01 Февраля 2010

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

    • Где здесь С++? O_o
      ФуФуФу. Это Си. Должно быть стыдно.
      Ответить
      • Частично прав.
        Но не совсем. Это С в С++.
        Вся фишка курса в том что нас учат модульному программированию на языке Си под С++ компайлер.
        Зачем? - не знаю.
        Ну стыдится мне нечего :-)
        Я вообще про другое, дело в рекурсии.
        Функция не рекурсивная, хотя хочется верить что да :-)
        все ретурны которые возвращают на рекурсию на самом деле просто вызывают функцию что бы вернуть либо 0 либо 1.
        16-19 - ая строчка произойдёт только при рекурсивном вызове, и вторая половина логики в ифе почти не имеет смысла- была придумана для отвода глаз, но самый главный код работает в первый вызов от начала до конца.
        Рад что никто не просёк "соль" значит можно спокойно сдавать на проверку :-)
        Ответить
        • А, блин! Реально, надо было привести пример вызова этой функции :)
          tim
          Ответить
        • >и вторая половина логики в ифе почти не имеет смысла- была придумана для отвода глаз
          Во каг! :)
          Ответить
    • А bool - это разве не C++ ?
      По коду- соль в том, что после условия в 16-й строке функция возвратит что-то?
      tim
      Ответить
      • bool - это C99.
        Или ваще typedef.
        Да и код не обязан компиляться:)
        Ответить
        • Из того, что bool - это C99 или даже typedef не следует, что приведенный код - не на C++. Так что тому guest'у должно быть стыдно.
          tim
          Ответить
      • почти :-) ну это уже в рекурсивном вызове
        Ответить
    • код нечитаем. Как вы это понимаете ?
      Ответить
    • >>pat_len = (int)strlen(pat); // get lehtgh of pattern
      >> txt_len = (int)strlen(text); // get lehtgh of text
      >> return (0); // return 0
      >> flag = false; // set flag false position
      >> shift++; // add one more into shift

      Привет, Кэп, как жизнь?

      зы возможно стоило нормально оформлять код, а не писать кучу говнокомментов, только ухудшающих читаемость? =)
      Ответить

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