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

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
//------------------------------- 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 werd, (Updated )

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

  • Где здесь С++? O_o
    ФуФуФу. Это Си. Должно быть стыдно.
    Ответить
    • Частично прав.
      Но не совсем. Это С в С++.
      Вся фишка курса в том что нас учат модульному программированию на языке Си под С++ компайлер.
      Зачем? - не знаю.
      Ну стыдится мне нечего 🙂
      Я вообще про другое, дело в рекурсии.
      Функция не рекурсивная, хотя хочется верить что да 🙂
      все ретурны которые возвращают на рекурсию на самом деле просто вызывают функцию что бы вернуть либо 0 либо 1.
      16-19 - ая строчка произойдёт только при рекурсивном вызове, и вторая половина логики в ифе почти не имеет смысла- была придумана для отвода глаз, но самый главный код работает в первый вызов от начала до конца.
      Рад что никто не просёк "соль" значит можно спокойно сдавать на проверку 🙂
      Ответить
      • А, блин! Реально, надо было привести пример вызова этой функции 🙂
        tim
        Ответить
      • >и вторая половина логики в ифе почти не имеет смысла- была придумана для отвода глаз
        Во каг! 🙂
        Ответить
  • А bool - это разве не C++ ?
    По коду- соль в том, что после условия в 16-й строке функция возвратит что-то?
    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

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

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

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

Где здесь C++, guest?!

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


    8