Obliczanie sumy - podstawy.

0

Dopiero zaczynam swoją podróż z JS, a już napotkałem się na problem.

Chce napisać program, który spośród dwóch podanych liczb wyliczy sumę od jednej liczby do drugiej.

<!DOCTYPE html>
<html>
    <head>
        <title>Prosta funkcja</title>
        <meta charset="utf-8" />
        <script type="text/javascript">
            function oblicz_sume()
            {
                var liczba1 = document.getElementById("pole1").value;
                var liczba2 = document.getElementById("pole2").value;
                var suma = 0;
                for (i=liczba1; i<=liczba2; i++)
                    suma += i;
   
            document.getElementById("wynik").innerHTML = suma;
            }
</script>
       
    </head>
    <body>
        <h1>TravelWorthy</h1>
        <div id="message">Witamy na naszej stronie!</div>
        <br> <br> <br>
        <input type="text" id="pole1" />
        <input type="text" id="pole2" />
        <input type ="button" id="przycisk" onclick="oblicz_sume()" />
       
        <div id="wynik"> WYNIK </div>
 
       
    </body>
</html> 

Z nieznanych mi przyczyn zmienna suma jest określona jako string(?), do tego jeżeli wpiszemy do pierwszego pola 2, a do drugiego pola np. 11 to program w ogóle nie zadziała. Również nie wiem czemu. Czy ktoś mógłby mi pomóc?

0

Nie znam się na tym, ale parseInt na zmiennej i pomaga.

0

Jeżeli pobierzesz wartość za pomocą .value to otrzymasz string. W javascript operator + dodaje liczby, ale powoduje również konkatenację stringów. Jeżeli zrobisz tak:

var x = "1";
var y = "2";
x + y
// dostajesz "12"

var x = "1";
var y = "2";
parseInt(x, 10) + parseInt(y, 10) // teraz operator + dodaje, a nie łączy. 10 to system dziesiętny
// 3 
+x + +y // + przed zmienną w sposób niejawny castuje ją na int'a
// 3

W twoim przypadku w twójej pętli for, dodajesz stringi na zasadzie

0 + 1 = 01 
01 + 2 = 012 
012 + 3 = 0123

Dlatego parseInt pomaga @szweszwe

0

Może tak?

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>

<div ng-app="example">
  <form name="sumForm" ng-controller="SumController as sum">
    <p>First: <input name="first" ng-model="sum.first" /></p>
    <p>Second: <input name="first" ng-model="sum.second" /></p>
    <p>(Preview) sum: {{sum.result()}}</p>
  </form>
</div>

(coffescript)

example = angular.module('example', [])
example.controller 'SumController', ->
  @sum_n = (n) -> n*(n+1)/2
 
  @first = 0
  @second = 0
  @result = -> 
    result = @sum_n(@second*1)-@sum_n(@first*1)
    if result > 0 then result else 0
  @
1

Zamiast stosować parseInt() lepiej castować zmienne poprzez +zmienna, np:

var x = '13';
console.log(+x + 7); // => 20

Podobnie zamiast toString() lepiej stosować "" + zmienna.
Do castowania do wartości logicznych służy taki zapis: !!zmienna.

Powyższe można oczywiście łączyć:

var x = '0';
console.log('' + !!+x); // => "false"

// zamiast:
console.log((Boolean(parseInt(x))).toString()); // => "false"

Krócej i czytelniej.

0
Desu napisał(a):
+x + +y // + przed zmienną w sposób niejawny castuje ją na int'a

To jest właśnie jawne (wymuszone przez programistę) rzutowanie typu, poza tym + przed zmienną / literałem rzutuje do typu number, niekoniecznie int (bo takiego nawet w js nie ma).

1 użytkowników online, w tym zalogowanych: 0, gości: 1