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.