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
Простіше кажучи ця операція поверне 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, то інша (друга умова) – взагалі не перевіряється.
Давайте знову напишемо програму яка перевіряє чи число 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.
|
| Базовий курс програмування на С++. Урок 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.
|
. Даний оператор 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.