bool -> char -> short-int-unsigned int-long-unsigned long-float-double-long double

Не дивлячись на те, що деякі типи мають однаковий розмір, вони мають різний діапазон значень. Так unsigned int в порівнянні з intможе помістити в себе в 2 рази більше додатних значень і тому він старший у ієрархії. Також варто відмітити, що при участі таких типів як: bool, short, char. Вони автоматично перетворюються у int.

Далі піде мова про перетворення типів у виразі (коді програми).

Ось ми і підійшли до того як визначити якого типу буде результат обчислення. Давайте спробуємо це зробити за допомогою уже відомих знань. Припустимо, що ми працюємо з такими змінними.

int I=27;

short S=2;

float F = 22.3;

bool B = false;

Користуючись цими змінними ми хочемо обчислити I-F+S*B

А ось і питання – У змінну якого типу потрібно записати результат? Відповідь досить проста, але спершу потрібно їх записати у вигляді їхніх типів. int-float+short*bool. Тепер згадаємо, що short та bool автоматично перетворяться у int .

Вираз зміниться наint-float+int*int. Тепер float буде = 0. При множенні двох типів int, результат також буде цього типу. А от int-float буде рівне float. Тут з’явилося нове правило:

 

Якщо у будь-якому виразі використовуються різні типи даних, то результат буде дорівнювати більшому з типів.

 

Таким чином результат виразу буде мати тип float.

float rez = I-F+S*B; // 27-22.3+*0

cout << rez << endl; // результат = 4,7

Тепер це все не настільки важливо, щоб визначити тип достатньо знайти найбільший тип який використовується при обчисленні виразу.

Але це не знімає з програміста всієї обережності при роботі з типами змінних.

 

При діленні цілого числа на ціле, результатом буде також ціле число.

 

int i=3;

int j=2;

cout << i / j; // = 1. Дробова частина втрачена оскільки обидва типи int

Потрібно вказати, що результат повинен бути типу float. Це робиться так:

int i=3;

int j=2;

cout << (float) i / j ; // На екрані 1.5

 

Домашнє завдання

Сьогодні ви вивчили дуже важливу тему. Але щоб повноцінно її застосовувати вам потрібно вивчити теми з наступного уроку. Сьогодні не буде д/з. Ви отримаєте його на наступному уроці, де ви будете використовувати знання з обох уроків.

 

Наступний урок уже готується, очікуйте.

 

Базовий курс програмування на С++. Урок 5. Оператори порівняння. Логічні операції об'єднання. Аспекти використання декременту і інкременту.

 

Написав Joker
Понеділок, 10 листопада 2014 00:19 Переглядів: 2680
Будь-який дурень може написати код, зрозумілий комп'ютеру. Хороший програміст пише код, який зрозумілий людині. Сьогодні ми вивчимо: 1. Різниця між префіксною і суфіксною формою у декрементi/інкременті 2. Оператори рівності. 3. Оператори порівняння. 4. Логічні операції об'єднання і негативна інверсія. Різниця між префіксною та суфіксною формою у декременті/інкременті. На перший погляд все дуже просто, декремент зменшує змінну на 1, а інкремент – збільшує. Також варто підкреслити те, що вони не застосовуються до літералів. Погодьтесь вираз 5++; дещо дивний і зовсім не зрозумілий. А ось так a++; все просто і зрозуміло, навіть якщо змінна a = 5;. Також ми визначили, що синтаксис цих операторів може бути різним (--a; a--;), яка ж між ними різниця? А різниця все таки є. Префіксна форма: --a; ++a; Суфіксна форма: a--; a++; Давайте розглянемо все на прикладі Приклад 1: int a = 8; cout << a; // На екрані 8 a++; cout << a; // На екрані 9 ++a; cout << a; // На екрані 10   У даному випадку нічого несподіваного не відбулося і на перший погляд нічим ці дві форми не відрізняються. Але давайте розглянемо ще один приклад. int a = 8; cout << ++a; // На екрані 9 cout << a++; // На екрані 9 cout << a; // На екрані 10   Якщо крім суфіксної форми інкремента чи декремента є інші оператори, то спершу виконається інша команда (в залежності від оператора) і тільки після цього буде виконане додавання/віднімання 1.   cout << a++; Спершу буде виконано операцію виводу і на екран виведеться число і тільки після того буде виконана операція декремента.   Оператори рівності
Символ Пояснення
== Перевірка ти лівий операнд дорівнює правому
!= Лівий операнд не дорівнює правому

 

Оператори порівняння

Символ Пояснення
< Лівий операнд менший правого
> Лівий операнд більший правого
<= Лівий операнд менший або рівний правому
>= Лівий операнд більший або рівний правому

 

Логічні операції об’єднання і негативна інверсія

В більшості випадків важко обмежитися тільки однією умовою. Для прикладу, щоб перевірити чи число A знаходиться у діапазоні від 5 до 10, нам знадобляться 2 умови. А>=5 і A<=10. Але компілятор не знає літери і, замість цього існують спеціальні символи.

Операція Назва
!= Не
&& І
|| Або

Тепер ми можемо записати нашу умову як A>=5 && A<=10.

 

Логічне І (&&)

Ця операція об’єднує 2 вирази у одне, і як і інші повертає значення true (правда) або false (брехня). Давайте визначимо коли результатом буде true, а коли false

Вираз_1 Вираз_2 Результат операції Вираз_1 && Вираз_2
true false false
true true true
false true false
false false false

Простіше кажучи ця операція поверне true тільки у тому випадку, коли обидва вирази дорівнюють true.

true можна замінити будь-яким числом крім нуля, компілятор сприйме його як істину (true). False можна замінити тільки 0, тобто -1і інші від’ємні числа - true.

Давайте розглянемо приклад програми яка визначає чи число належить діапазону 5-10

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

setlocale(LC_CTYPE, "ukr");

double a;

cout << "Введiть число --> ";

cin >> a;

 

cout << ((a >= 5) && (a <= 10)) << endl;

 

cout << "Якщо ви бачите 0 - число не належить цьому дiапазону." << endl;

cout << "Якщо ви бачите 1 - число належить цьому дiапазону." << endl;

 

_getch();

return 0;

}

 

ЛогічнеАБО (||)

Об’єднує 2 умови і повертає істину (true) тільки у тому випадку, коли хоча б одна з умов поверне істину. Результатом буде false, коли обидві умови дадуть false. Крім цього АБО працює за скороченою системою, якщо перша умова повертає true, то інша (друга умова) – взагалі не перевіряється.

Вираз_1 Вираз_2 Вираз_1 || Вираз_2
true true true
true false true
false true true
false false false

 

Давайте знову напишемо програму яка перевіряє чи число a належить діапазону від 5 до 10. Але тепер будемо використовувати АБО.

view source

print?

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

setlocale(LC_CTYPE, "ukr");

float a;

cin >> a;

cout << ((a <= 5) || (a >= 10)) << endl;

cout << "Якщо ви бачите 0 - число лежить у дiапазоні від 5 до 10"<< endl;

cout << "Якщо ви бачите 1 - число не лежить у дiапазоні від 5 до 10" << endl;

 

_getch();

return 0;

}

 

Логічне НЕ (!)

Логічне НЕ є унарним оператором, тому він не може об’єднувати два критерії (як АБО чи І ). Він використовується у тому випадку коли потрібно змінити результат перевірки на протилежній.

Результат_перевірки !Результат_перевірки
true false
false true

Цей оператор змінює результат перевірки з true на false і з false – true.

 

 

Базовий курс програмування на С++. Урок 6. Оператори if та switch. Тернарний оператор

 

Написав Joker
Неділя, 21 грудня 2014 23:09 Переглядів: 2737
Сьогодні ми вивчимо: 1. Оператор if 2. Оператор switch 3. Тернарний оператор. Оператор if Зараз ми навчимося писати програми і змусимо їх думати . Даний оператор if перевіряє певний вираз на істинність і в залежності від результату перевірки виконуються ті чи інші обчислення. Для початку розглянемо синтаксис. if (вираз_для_перевірки) { Обчислення_1; } else { Обчислення_2; } вираз_для_перевірки– конструкція яка містить логічні або ж арифметичні оператори. обчислення_1– фрагмент програми який виконається тільки в тому випадку, коли результатом вираз_для_перевірки поверне значення true. обчислення_2– фрагмент програми який виконається тільки в тому випадку, коли результатом вираз_для_перевірки поверне значення false. Якщо виконується обчислення_1, то обчислення_2 просто ігноруються. Якщо виконується обчислення_2, то ігноруються обчислення_1. Давайте розглянемо просту програму яка може слугувати прикладом. #include <iostream> #include <conio.h> using namespace std;   int main () { int n,x;   cin >> n >> x;   if (n>x) { cout << "n > x" << endl; } else { cout << "x>n" << endl; }     _getch(); retrun 0; } Комбіновані твердження: Як бути коли вам потрібно перевірити чи число належить діапазону від 5 до 10 (5<x<10) ? Це твердження можна розкласти на 2 простіші: 1) X>5 2) X<10 Також, з попереднього уроку, ми знаємо логічні оператори об’єднання. Перевірити такий діапазон можна так: If (X>5 && X<10)   r Нюанси: На вашу думку, як комп’ютер зрозуміє такий вираз: if (a-b) Давайте розмірковувати разом. Комп’ютер перевіряє вираз який знаходиться у круглих дужках, тобтоа-b. Результат перевірки може бути trueабо false. Також ми знаємо, щоfalse = 0 та true !=0 Тепер можна сказати, якщо a-b = 0, то виконається фрагмент коду записаний у блоці після else. Якщо ж a-b відмінне від 0, то це істина і виконається фрагмент коду прописаний після if.   Можливі помилки: Пам’ятайте, якщо ви хочете перевірити чи одна змінна така сама (дорівнює) іншій, то це виглядатиме так: if(a == b) А не так (неправильно) if(a = b) Також варто пам’ятати, що не можна розривати оператори ifта else, це призведе до помилки на етапі компіляції. Але блок else можна повністю опустити. Тобто синтаксис такий: if (Вираз) { Обчислення_1 } // Продовження програми Цей код рівносильний такому: if (Вираз) { Обчислення_1 } Else { } // Продовження програми   Драбинка if-else Давайте вчитися на прикладах. Для прикладу, покупець купує певний товар. Товар, вартість якого більша 500 грн. , отримує знижку у 5%. Якщо товар коштує 1000 і більше, то знижка - 10 %. Також ми знаємо, що покупець купує тільки один товар. Потрібно вирахувати суму покупки з урахуванням знижки. Для цього найкраще використовувати драбинкуif-else. Синтаксис: if (перевірка_1) { Код_1 } else if (Перевірка_2) { Код_2 } else { Код_3 } Програма може містити довільну кількість перевірок ( else if () ). Тобто фрагмент коду 5-8 рядки може бути повторений довільну к-сть разів, але з різними перевірками. Крім цього, заборонено розривати драбинку будь-яким іншим кодом. Це означає, що не можна вставляти будь-який код між рядка 4 і 5, 8 і 9. Якщо код_1, код_2, код_3, складає не більше одного рядка, то фігурні дужки можна забрати. Це правило здійснюється і для інших блоків (для прикладу цикли). Давайте нарешті розв’яжемо нашу задачу. #include <iostream> using namespace std;   int main () { setlocale (LC_CTYPE, "ukr");   double price, discount;   cout << "Введіть ціну товару --> "; cin >> price;   cout << "\n" << "Ваша знижка = "; if (price >= 500 && price < 1000) { discount = 5; cout << discount << "%" << endl; } else if (price >= 1000) { discount = 10; cout << discount << "%" << endl; } else { discount = 0; cout << discount << "%" << endl; }   cout << "Ви повинні заплатити = " << price - ( price * (discount / 100)) << endl;   return 0; }   Оператор switch Цей оператор виконує ту ж роботу, що й if-else. І у будь-якій ситуації його можна замінити на оператор. Але не завжди оператор if можна замінити на оператор switch. Головна його відмінність полягає в тому, що у деяких випадках ним просто зручніше користуватися ніж аналогічним if. Для прикладу потрібно написати програму в якій міститься меню з 3 пунктів. Ми зможемо реалізувати цю задачу за допомогою if, але цю ж задачу ми можемо розв’язати і за допомогою switch і при цьому код буде виглядати краще. Найчастіше цей оператор використовують саме для створення меню. Синтаксис: switch (вираз) { case значення_1: Дія_1; break; case значення_2: Дія_2; break; default: дія_помилка; } Крім цього, ви можете поставити по закінченню default: ще один break;. Це не призведе до помилки. Вираз– змінна яка перевіряється. Для прикладу ви записали відповідь користувача у якусь змінну. Саме цю змінну він буде перевіряти. Значення_1– перевірка певного критерію зі змінною. Для прикладу значення_1 = 1. Тобто замість значення_1 ми написали 1. Це означає, що ми перевіряємо чи змінна перевірки (та що у виразі) дорівнює 1. Якщо так, тоді ми виконуємо дія_1. Якщо – ні, тоді ми йдемо далі і перевіряємо змінну з наступними case. Якщо жодна перевірка не була успішною, виконається код прописаний у default. Також можна перевіряти символи (Чи змінна дорівнює певному символу) switch(a) { case '!': cout << "1" <<endl; break; case '@': cout << "@" << endl; break; default: cout << "^^^^" << endl; }     Тернарнийоператор Використовується з тою ж метою що й if, але для примітивних перевірок. Синтаксис: Перевірка ? Дія_1 : Дія_2; Так наш код буде красивішим. І буде займати всього один рядок. Приклад: view source print? #include <iostream> using namespace std; int main () { int b; cin >> b; ( (b!=0) ? cout << "Yes" : cout << "No"; Якщо b не дорівнює 0, тоді виведеться Yes, якщо b = 0 – виведеться No.