1. JavaScript / Говнокод #18097

    +144

    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
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    function Calculation(a, b, op){
        if (typeof a == "number" && typeof (b) == "number"){
            var result;
            +a; +b;
            if (op == "+")  { result = a+b; alert(result);
            } else if (op == "-") { result = a-b; alert(result);
            } else if (op == "*"){ result = a*b; alert(result);
            } else if (op == "/"){
                if (b!=0){ 
                    result = a/b; alert(result);
                } else {
                    alert("Can`t divide on zero!");
                }
            }
        } else if (a instanceof Array && b instanceof Array) {
            var result = [];
            if ( a.length >= b.length ){
                length = a.length;
                for (var i=0; i < length; i++){
                    a[i] = parseFloat(a[i]);
                    b[i] = parseFloat(b[i]);
                    if (i < b.length-1){
                        if (op == "+"){ result[i] = a[i]+b[i];
                        } else if (op == "-"){ result[i] = a[i]-b[i];
                        } else if (op == "*"){ result[i] = a[i]*b[i];
                        } else if (op == "/"){
                            if (b[i]!=0){
                                result[i] = a[i]/b[i];
                            } else {
                                alert("Can`t divide on zero!");
                            }
                        }
                    } else {
                        result[i] = a[i];
                    }
                } 
                alert(result.join("  |  "));
            } else {
                length = b.length;
                for (var i=0; i < length; i++){
                    +a[i]; +b[i];
                    if (i < a.length-1){
                        switch (op){
                            case "+":
                                result[i] = a[i]+b[i];
                                break;
                            case "-":
                                result[i] = a[i]+b[i];
                                break;
                            case "*":
                                result[i] = a[i]+b[i];
                                break;
                            case "/":
                                if (b[i]!=0){
                                    result[i] = a[i]/b[i];
                                } else {
                                    alert("Can`t divide on zero!");
                                }
                                break;
                        }
                    } else {
                        result[i] = a[i];
                    }
                } 
                alert(result.join("  |  "));
            }
        } else if (a instanceof Object && b instanceof Object) {
            var tempObject = {};
                switch (op){
                    case "+":
                        tempObject.resultA = a.a+b.a;
                        tempObject.resultB = a.b+b.b;
                        break;
                    case "-":
                        tempObject.resultA = a.a+b.a;
                        tempObject.resultB = a.b+b.b;
                        break;
                    case "*":
                        tempObject.resultA = a.a+b.a;
                        tempObject.resultB = a.b+b.b;
                        break;
                    case "/":
                        if (b.b !=0 || b.a != 0){
                            tempObject.resultA = a.a+b.a;
                            tempObject.resultB = a.b+b.b;
                        } else {
                            alert("Can`t divide on zero!");
                        }
                        break;
                }
                
                alert(tempObject.resultA + " " + tempObject.resultB);
        }
    }

    Вот такой вот калькулятор!

    Запостил: alexhelkar, 30 Апреля 2015

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

    • +a; +b;

      Што?
      Ответить
    • Приведение строки к числу ))))
      Ответить
      • А там разве не Variant как в бейсике?
        Ответить
        • Если не приводить тип, можно наткнуться на какую-нибудь весёлую особенность.
          Скажем, "2"*"2" будет 4, а "2"+"2" -- "22". Какой-нибудь Math.exp преобразует строку к числу сам, а пользовательская функция может и набедокурить.
          Ответить
      • Ага. Результат которого выбросили на помойку. А в переменной как была строка, так и осталась. Если уж приводить подобными способами - то как-то так:
        a = +a;
        a -= 0;
        Ответить
        • >Ага. Результат которого выбросили на помойку. \
          Ничего, всегда есть тот кто с помойки этот мусор подберёт. И я говорю конечно же о gc.
          Ответить
    • Кстати, безумное +a; +b; можно действительно использовать как assert для пользовательских значений:
      function StrictValue(v) {
        this.value = v;
      }
      
      StrictValue.prototype.valueOf = function(){
        if(typeof this.value === 'object')
          throw new Error(':(');
        return +this.value;
      };
      
      var a = new StrictValue(2);
      var b = new StrictValue({});
      
      +a;
      console.log('lol'); // lol
      +b; // Error: :(
      console.log('lol');
      Ответить
      • Хм. Это довольно стандартный трюк, переопределять/удалять valueOf/toString чтоб добиться хоть какой-то типабезопастности.
        Ответить
        • Я хотел сделать упор на императивность происходящего.
          Как возможный вариант рассматривал что-то такое:
          function Killer(kill) {
            this.kill = Boolean(kill);
          }
          Killer.prototype.valueOf = function(){
            if(this.kill) throw new Error;
          };
          var a = new Killer(false), b = new Killer(true);
          +a; +b;

          Но так и не придумал, как такое может пригодиться, отчего пришёл к предварительной проверке.

          Наверно надо как-то так:
          // Императивный питух
          function Assert(expr) {
            this.expr = expr;
          }
          Assert.prototype.valueOf = function() {
            if(!this.expr()) throw new Error;
          }

          // пример использования
          var OK = [true];
          var assertOK = new Assert(function(){ return OK[0] === true; });
          
          function maybeSqrt(x, res) {
            if(x < 0) {
              res[0] = false;
              return;
            }
            res[0] = true;
            return Math.sqrt(x);
          }
          
          +assertOK;
          var s = 0;
          for(var i=0; i<10; ++i) {
            var x = Math.random() - 0.3;
            var y = maybeSqrt(x, OK);
            +assertOK;
            s += y;
            console.log(x, y, s);
          }
          console.log('S = ' + s);
          Ответить
    • Ребята, код не мой - я просто разместил обьяву
      Ответить

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