Смятане
Проблем
Сметката на масата
Поръчал си три кафета по 2,50 € и два кроасана по 1,50 €. Плащаш с банкнота от 20 €. Колко е сметката и колко ресто трябва да получиш?
Наум става. Но касата в кафенето прави такава сметка стотици пъти на ден, с различни цени и количества. Програмата трябва да смята сама.
Идеята
Аритметичните оператори
Смяташ както на хартия: + събира, - изважда, * умножава, / дели. Тези знаци се казват оператори.
const coffee = 2.5;const croissant = 1.5;const total = 3 * coffee + 2 * croissant;const change = 20 - total;console.log("Общо: " + total + " €");console.log("Ресто: " + change + " €");Общо: 10.5 €Ресто: 9.5 €Редът е като в математиката: първо * и /, после + и -. Затова 3 * coffee + 2 * croissant е 7,5 + 3. Ако искаш друг ред, слагаш скоби: (2 + 3) * 4 е 20.
Има и пети оператор, %. За него е следващата идея.
По-точно, за любопитните
- Операторите с еднакъв приоритет се смятат отляво надясно:
20 - 5 - 3е 12, а не 18. -пред число го прави отрицателно:-total.
- При текст
+не събира, а долепя. Щом отляво има текст, всичко след него се долепя като текст. Това е капанът в следващата карта.
Пробвай
Билети за концерта
Три билета по 8 € и 5 € такса за поръчката.
Какво ще отпечата програмата?
const tickets = 3;const fee = 5;console.log("Общо: " + tickets * 8 + fee);* се смята първо: tickets * 8 е 24. После отляво надясно: „Общо: “ + 24 е текстът „Общо: 24“, а към него се долепя 5. За да излезе 29, сметката трябва да е в скоби: "Общо: " + (tickets * 8 + fee).Проблем
2,25 часа вместо 2 ч. 15 мин.
Филмът е 135 минути. Искаш да го покажеш като часове и минути: 2 ч. 15 мин. Първият опит:
const minutes = 135;const hours = minutes / 60;console.log(hours + " ч.");2.25 ч.В JavaScript / дели винаги дробно, дори когато и двете числа са цели: 6 / 3 е 2, а 17 / 3 е 5.666666666666667. Тук обаче ти трябват два цели часа и останалите минути. Как се взима само цялата част?
Идеята
Цялата част и остатъкът
Math.trunc(...) отрязва дробната част на число: Math.trunc(2.25) е 2. Затова Math.trunc(135 / 60) дава целите часове, а Math.trunc(17 / 3) е 5. Това се казва целочислено деление. Math е сбор от готови сметки. Още от тях има в края на урока.
Ето го стъпка по стъпка, със сбора на три оценки:
const math = 5;const physics = 6;const english = 6;const whole = Math.trunc((math + physics + english) / 3);console.log("Цялата част: " + whole);Стъпка по стъпка, с думи
- Три оценки: 5, 6, 6.
- Първо скобите: 5 + 6 + 6 = 17.
- 17 / 3 е 5,667…, а Math.trunc оставя само цялата част: колко цели групи по 3 има в 17? 5.
- Остатъкът 2 (това е 17 % 3) се отрязва. Резултатът е цялото число 5.
- 5 се записва в whole.
- Отпечатва се „Цялата част: 5“. Дробната част (5,67) не е в резултата.
Отрязаното не се губи напълно. Операторът % дава остатъка от делението: 17 % 3 е 2, защото 17 = 5 · 3 + 2.
Двете заедно разделят количество на цели части и остатък. Филмът е 135 минути:
const minutes = 135;const hours = Math.trunc(minutes / 60);const rest = minutes % 60;console.log(hours + " ч. " + rest + " мин.");2 ч. 15 мин.% ще ти трябва често. Число е четно, ако n % 2 е 0. Последната цифра на число е n % 10.
По-точно, за любопитните
- При отрицателни числа
Math.truncотрязва към нулата, а остатъкът има знака на делимото.%работи и с дробни числа:
console.log(Math.trunc(-7 / 2));console.log(-7 % 2);console.log(7.5 % 2);-3-11.5- Деление на 0 не спира програмата:
5 / 0даваInfinity(безкрайност), а0 / 0и5 % 0даватNaN(„не е число“).
Пробвай
Бутилки в каси
В една каса влизат 6 бутилки. Имаш 17.
Какво ще отпечата програмата?
const bottles = 17;const perCase = 6;console.log(Math.trunc(bottles / perCase) + " каси");console.log(bottles % perCase + " остават");Math.trunc(17 / 6) е 2 цели каси (12 бутилки), а 17 % 6 е остатъкът: 5 бутилки, които не пълнят каса.
Идеята
Превръщане между типове
В JavaScript числата са един тип, number. Няма отделни цяло и дробно, между които да превръщаш: / дели дробно, както видя. Цяло число от дробно правиш с Math:
const total = 5 + 6 + 6;const average = total / 3;console.log(average);console.log(average.toFixed(2));const whole = Math.trunc(9.99);console.log(whole);5.6666666666666675.679Math.trunc(9.99)е 9: отрязва дробната част, не закръглява;Math.round(9.99)е 10: закръглява до най-близкото цяло;Math.floor(9.99)е 9 иMath.ceil(9.01)е 10: закръглява надолу и нагоре.
Превръщане между типове в JavaScript има от текст към число: това е Number(...) от урока за входа.
По-точно, за любопитните
- Всеки символ има код, число в таблицата със символите.
charCodeAt(0)дава кода на първия символ, аString.fromCharCodeправи символ от код:
console.log("A".charCodeAt(0));console.log(String.fromCharCode(66));const maxInt = 2147483647;console.log(maxInt + 1);console.log(9007199254740992 + 1);65B21474836489007199254740992- В Java и C#
intстига до 2 147 483 647 и едно повече „превърта“ до отрицателно число. В JavaScript 2147483647 + 1 е просто 2147483648. Границата е другаде: целите числа са точни до 9 007 199 254 740 991, а след това губят точност (последният ред). За по-големи числа имаBigInt.
Пробвай
Намери грешката
Сметката за ток е 125 € и се дели между трима съквартиранти. Програмата казва, че всеки дава 41,00 €, а трябва 41,67 €. На кой ред е грешката?
Избери реда с грешката.
bill / people е 41.666…, но Math.trunc отрязва дробната част и остава 41. toFixed(2) после го показва като 41.00. Поправката е да няма отрязване: const share = bill / people;.Идеята
Съкратени записи: += и ++
Често променяш стойност спрямо самата нея: балансът на картата намалява с всяка покупка, броячът расте с едно. За това има кратки записи:
let balance = 20;let purchases = 0;balance -= 4.5;purchases++;balance -= 3.5;purchases++;console.log(purchases + " покупки, остават " + balance + " €");2 покупки, остават 12 €| Пишеш | Значи |
|---|---|
balance -= 4.5; |
balance = balance - 4.5; |
total += price; |
total = total + price; |
x *= 2;, x /= 2;, x %= 2; |
същото с *, / и % |
purchases++; |
purchases = purchases + 1; |
seats--; |
seats = seats - 1; |
+= работи и с текст: message += "!"; долепя удивителен знак в края.
По-точно, за любопитните
++ може да стои и пред променливата. Сам на ред няма разлика. В израз има: a++ дава старата стойност и после увеличава, ++a първо увеличава и дава новата.
let a = 5;const b = a++;const c = ++a;console.log(a + " " + b + " " + c);7 5 7Такъв код се чете трудно. Пиши ++ и -- сами на реда.
Идеята
Math: корен, степен, закръгляне
Пицария продава пица от 30 см на същата цена като две пици от 20 см. Кое е повече? Площта на кръг е π · r². За степента и за π има готово в Math: пишеш името и в скоби числата. Math е винаги на разположение, без да го зареждаш. Това са функции, готови парчета код. Свои ще пишеш в модул „Функции“.
const big = Math.PI * Math.pow(15, 2);const small = 2 * Math.PI * Math.pow(10, 2);console.log(`Една от 30 см: ${big.toFixed(1)} кв. см`);console.log(`Две от 20 см: ${small.toFixed(1)} кв. см`);console.log(Math.sqrt(144));console.log(Math.abs(-7.5));Една от 30 см: 706.9 кв. смДве от 20 см: 628.3 кв. см127.5Една голяма пица е повече от две малки.
| Пишеш | Какво дава |
|---|---|
Math.sqrt(x) |
корен квадратен |
Math.pow(x, n) или x ** n |
x на степен n |
Math.abs(x) |
абсолютната стойност (без знака) |
Math.round(x) |
закръгляне до цяло число |
Math.trunc(x) |
цялата част, без закръгляне |
Math.PI |
числото π, 3,14159… |
В JavaScript Math.sqrt(144) е просто 12: числото е едно и също, цяло или дробно.
По-точно, за любопитните
- Закръгляне на 2,5: езиците дават различно.
console.log(Math.round(2.5));console.log(Math.round(3.5));console.log(Math.round(-2.5));console.log(Math.round(5.678 * 100) / 100);34-25.68Math.roundзакръгля „половинката“ нагоре, към по-голямото число: 2,5 става 3, а -2,5 става -2. За два знака след запетаята умножаваш по 100, закръгляш и делиш на 100. Ако е само за печат, по-удобно еtoFixed(2).
- toFixed не следва езиковите настройки на компютъра: точката си е точка навсякъде.
Упражнение
Да смята програмата
Реши задачите в редактора си. Всяко число на входа е на отделен ред.
1. Средно на три числа. Прочети три цели числа и отпечатай средното им с два знака след запетаята. Тук ти трябва дробно деление.
566Средно: 5.672. Секунди в часове. Прочети брой секунди и ги раздели на часове, минути и секунди. Подсказка: в един час има 3600 секунди, а % дава каквото остава.
37251 ч. 2 мин. 5 сек.3. Обем на сфера. Прочети радиуса и отпечатай обема: V = 4/3 · π · r³. Тук 4 / 3 е 1.333…, както трябва.
10Обем: 4188.79 куб. см4. Целзий във Фаренхайт. F = C · 9 / 5 + 32. Прочети температурата в градуси Целзий.
3737.0 °C = 98.6 °FОще задачи
- Инчове в сантиметри. Един инч е 2,54 см. За 12 инча:
30.48 см. - Площ на правоъгълник. Прочети дължината и ширината, отпечатай площта (дължина · ширина).
- Площ на квадрат. Прочети страната, отпечатай площта. Направи го веднъж с
*и веднъж сMath.pow. - Радиани в градуси. Градуси = радиани · 180 / π. За 3.14159:
180.00°. - Часове в секунди. Прочети брой часове и отпечатай колко секунди са. За 2 часа: 7200.
- Код на символ. Прочети символ и отпечатай кода му. За
A: 65. Първия символ на въведения текст вземаш с(await ask(""))[0]. Какво значи това, ще видим в урока за текста.
Тест