Към съдържанието
wannacode

Смятане

Проблем

Сметката на масата

Поръчал си три кафета по 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);
Отговор

Проблем

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);
Стъпка по стъпка, с думи
  1. Три оценки: 5, 6, 6.
  2. Първо скобите: 5 + 6 + 6 = 17.
  3. 17 / 3 е 5,667…, а Math.trunc оставя само цялата част: колко цели групи по 3 има в 17? 5.
  4. Остатъкът 2 (това е 17 % 3) се отрязва. Резултатът е цялото число 5.
  5. 5 се записва в whole.
  6. Отпечатва се „Цялата част: 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
-1
1.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 + " остават");
Отговор

Идеята

Превръщане между типове

В 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.666666666666667
5.67
9
  • Math.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);
Изход
65
B
2147483648
9007199254740992
  • В Java и C# int стига до 2 147 483 647 и едно повече „превърта“ до отрицателно число. В JavaScript 2147483647 + 1 е просто 2147483648. Границата е другаде: целите числа са точни до 9 007 199 254 740 991, а след това губят точност (последният ред). За по-големи числа има BigInt.

Пробвай

Намери грешката

Сметката за ток е 125 € и се дели между трима съквартиранти. Програмата казва, че всеки дава 41,00 €, а трябва 41,67 €. На кой ред е грешката?

Избери реда с грешката.

Идеята

Съкратени записи: += и ++

Често променяш стойност спрямо самата нея: балансът на картата намалява с всяка покупка, броячът расте с едно. За това има кратки записи:

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 кв. см
12
7.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);
Изход
3
4
-2
5.68
  • Math.round закръгля „половинката“ нагоре, към по-голямото число: 2,5 става 3, а -2,5 става -2. За два знака след запетаята умножаваш по 100, закръгляш и делиш на 100. Ако е само за печат, по-удобно е toFixed(2).
  • toFixed не следва езиковите настройки на компютъра: точката си е точка навсякъде.

Упражнение

Да смята програмата

Реши задачите в редактора си. Всяко число на входа е на отделен ред.

1. Средно на три числа. Прочети три цели числа и отпечатай средното им с два знака след запетаята. Тук ти трябва дробно деление.

Вход
5
6
6
Изход
Средно: 5.67

2. Секунди в часове. Прочети брой секунди и ги раздели на часове, минути и секунди. Подсказка: в един час има 3600 секунди, а % дава каквото остава.

Вход
3725
Изход
1 ч. 2 мин. 5 сек.

3. Обем на сфера. Прочети радиуса и отпечатай обема: V = 4/3 · π · r³. Тук 4 / 3 е 1.333…, както трябва.

Вход
10
Изход
Обем: 4188.79 куб. см

4. Целзий във Фаренхайт. F = C · 9 / 5 + 32. Прочети температурата в градуси Целзий.

Вход
37
Изход
37.0 °C = 98.6 °F

Още задачи

  • Инчове в сантиметри. Един инч е 2,54 см. За 12 инча: 30.48 см.
  • Площ на правоъгълник. Прочети дължината и ширината, отпечатай площта (дължина · ширина).
  • Площ на квадрат. Прочети страната, отпечатай площта. Направи го веднъж с * и веднъж с Math.pow.
  • Радиани в градуси. Градуси = радиани · 180 / π. За 3.14159: 180.00°.
  • Часове в секунди. Прочети брой часове и отпечатай колко секунди са. За 2 часа: 7200.
  • Код на символ. Прочети символ и отпечатай кода му. За A: 65. Първия символ на въведения текст вземаш с (await ask(""))[0]. Какво значи това, ще видим в урока за текста.

Тест

Провери се

1. Колко е Math.trunc(17 / 5)?
2. Колко е 17 % 5?
3. Колко е 17 / 5 в JavaScript?
4. Какво дава Math.trunc(9.99)?
5. Какво отпечатва console.log("Сума: " + 2 + 3)?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·