Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Signed, unsigned, long, short 2 страница




Операнди, що беруть участь в операціях "з'ясування" відношення, можуть мати практично будь-який тип, головне, щоб їх можна було порівнювати. Що стосується логічних операторів, то їх операнди повинні мати тип bool, і результат логічної операції завжди матиме тип bool. Оскільки у мові програмування C++ будь-яке ненульове число оцінюється як істинне (true), а нуль еквівалентний помилковому значенню (false), то логічні оператори можна використовувати в будь-якому виразі, який дає нульовий або ненульовий результат.

Табл. 3.8. Оператори відношення і логічні оператори

Оператори відношення Значення
== дорівнює
!= не дорівнює
> більше
< менше
>= більше або дорівнює
<= менше або дорівнює
Логічні оператори Значення
&& І
|| АБО
! НЕ

Необхідно пам'ятати! У мові програмування C++ будь-яке ненульове число оцінюється як true, а нуль – як false.

Логічні оператори використовують для підтримки базових логічних операцій І, АБО і НЕ відповідно до такої таблиці істинності. У ній 1 використовується як значення ІСТИНА, а 0 – як значення ФАЛЬШ.

 

р q рІq рАБОq НЕр
         
         
         
         

Незважаючи на те, що мова програмування C++ не містить вбудованого логічного оператора, що "виключає АБО" (ХОR), його неважко "створити" на основі вбудованих. Подивіться, як наведено нижче функція використовує оператори І, АБО і НЕ для виконання операції, що "виключає АБО":

bool ХОR (bool а, bool b)

{

return (a || b) &&!(a && b);

}

Ця функція використовується у наведеному нижче коді програми. Вона відображає результати застосування операторів І, АБО і що "виключає АБО" до значень, що вводяться Вами ж[14].

Код програми 3.8. Демонстрація механізму використання логічної операції ХОR()

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

bool ХОR(bool а, bool b); // Оголошення логічної функції

 

int main ()

{

bool p, q;

cout << "Введіть P (0 або 1): ";

cin >> p;

cout << "Введіть Q (0 або 1): ";

cin >> q;

cout << "P І Q: " << (p && q) << "\n";

cout << "P АБО Q: " << (p || q) << "\n";

cout << "P ХОR Q: " << ХОR(p, q) << "\n";

 

getch (); return 0;

}

bool ХОR(bool а, bool b) // Визначення логічної функції

{

return (а || b) &&!(а && b);

}

Ось як виглядає можливий результат виконання цієї програми.

Введіть P (0 або 1): 1

Введіть Q (0 або 1): 1

P І Q: 1

P АБО Q: 1

P ХОR Q: 0

У цій програмі звернемо Вашу увагу ось на що. Хоча параметри функції ХОR() вказані з типом bool, користувач вводить цілочисельні значення (0 або 1). У цьому немає нічого дивного, оскільки мова програмування C++ автоматично перетворить число 1 в true, а 0 – в false. І навпаки, при виведенні на екран bool -значення, що повертається функцією ХОR(), воно автоматично перетвориться в число 0 або 1 (залежно від того, яке значення "повернулося": false або true). Цікаво відзначити, що, коли типи параметрів функції ХОR() і тип значення, що повертається нею, замінити типом int, ця функція працюватиме абсолютно так само. Причина проста: вся справа в автоматичних перетвореннях, що виконуються С++-компілятором між цілочисельними і булевими значеннями.

Як оператори відношення, так і логічні оператори мають нижчий пріоритет порівняно з арифметичними операторами. Це означає, що такий вираз, як 10 > 1+12 буде обчислено так, як би його було записано у такому вигляді:

10 > (1+12)

Результат цього виразу, звичайно ж, дорівнює значенню ФАЛЬШ. Окрім того, погляньте ще раз на настанови виведення результатів роботи попередньої програми на екран.

cout << "P І Q: " << (p && q) << "\n";

cout << "P АБО Q: " << (p || q) << "\n";

Без круглих дужок, у які поміщені вирази р && q і р || q, тут обійтися не можна, оскільки оператори && і || мають нижчий пріоритет, ніж оператор виведення даних.

За допомогою логічних операторів можна об'єднати в одному виразі будь-яку кількість операцій відношення. Наприклад, у цьому виразі об'єднано відразу три операції відношення:

var>15 ||!(10<pm) && 3<=item

У наведеній нижче таблиці наведено пріоритет операторів відношення і логічних операторів.

Табл. 3.9. Пріоритет операторів відношення і логічних операторів

Пріоритет Оператори
Найвищий !
  > >= < <=
  ==!=
  &&
Нижчий ||

3.6. Запис арифметичних виразів

Оператори, літерали і змінні – це все складові виразів. Ймовірно, Ви вже знайомі з виразами з попереднього досвіду програмування або ще зі шкільного курсу алгебри. У наступних підрозділах спробуємо коротко розглянути основні аспекти виразів, які стосуються їх використання у мові програмування C++.

3.6.1. Перетворення типів у виразах

Якщо у виразі змішані різні типи літералів і змінних, то компілятор перетворить їх до одного типу. По-перше, всі char - і short int -значення автоматично перетворяться (з розширенням "типорозміру") до типу int. Цей процес називається цілочисельним розширенням (integral promotion). По-друге, всі операнди перетворяться (також з розширенням "типорозміру") до типу найбільшого операнда. Цей процес називається розширенням типу (type promotion), причому він виконується по-операційно. Наприклад, якщо один операнд має тип int, а інший – long int, то тип int розширюється в тип long int. Або, якщо хоча б один з операндів має тип double, будь-який інший операнд призводить до типу double. Це означає, що такі перетворення, як з типу char в тип double, цілком допускаються. Після перетворення обидва операнди матимуть один і той самий тип, а результат виконання операції – тип, який збігається з типом операндів.

Розглянемо, наприклад, перетворення типів, які схематично представлено на рис. 3.1. Спочатку символ ch піддається процесу "розширення" типу і перетвориться в значення типу int. Потім результат виконання операції ch/izm приводиться до типу double, оскільки результат добутку f*d має тип double. Результат виконання всього виразу отримає тип double, оскільки до моменту його обчислення обидва операнди матимуть тип double.

Рис. 3.1. Приклад|зразок| перетворення типів у мові програмування C++

3.6.2. Перетворення, що відбуваються під час використання типу bool

Як ми вже зазначали вище, значення типу bool автоматично перетворяться в цілі числа 0 або 1 під час використання у виразі цілочисельного типу. Під час перетворення цілочисельного результату в тип bool нуль перетвориться в false, а ненульове значення – в true. І хоча тип bool відносно недавно був доданий в мову програмування C++, виконання автоматичних перетворень, пов'язаних з типом bool, означає, що його введення у мові програмування C++ не має негативних наслідків для коду програми, написаного для попередніх версій мови програмування C++. Понад це, автоматичні перетворення дають змогу мові програмування C++ підтримувати початкове визначення значень ФАЛЬШ і ІСТИНА у вигляді нуля і ненульового значення. Таким чином, тип bool дуже зручний для програміста.

3.6.3. Операція приведення типів даних

У мові програмування C++ передбачено можливість встановлення для виразу заданий тип. Для цього використовується операція приведення типів (cast). Мова програмування C++ визначає п'ять видів таких операцій. У цьому розділі розглянемо тільки один з них, а інші чотири – описано нижче у цьому навчальному посібнику (після теми побудови об'єктів). Отже, загальний формат операції приведення типів є таким:

(тип) вираз

У цьому записі елемент тип вказує на тип, до якого необхідно привести вираз. Наприклад, якщо виникає бажання, щоб вираз х/2 мав тип float, необхідно написати таке:

(float) х/2

Приведення типу розглядається як унарний оператор, і тому він має такий самий пріоритет, як і інші унарні оператори.

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

Код програми 13.9. Демонстрація виконання операції приведення типів

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main () // Виводимо i та значення i/2 з дробовою частиною.

{

int i;

for (i=1; i<=100; ++i)

cout << i << "/ 2 дорівнює: " << (float) i / 2 << "\n";

 

getch (); return 0;

}

Без оператора приведення типу (float) виконалося б тільки цілочисельне ділення. Приведення типів у цьому випадку гарантує, що на екрані буде відображена і дробова частина результату.

3.6.4. Використання пропусків і круглих дужок

Будь-який вираз у мові програмування C++ для підвищення читабельності може містити пропуски (або символи табуляції). Наприклад, наступні два вирази достатньо однакові, але другий прочитати набагато легше:

х=10/y*(127/х);

х = 10 / y * (127/х);

Круглі дужки (так само, як у алгебрі) підвищують пріоритет операцій, що містяться усередині них. Використання надлишкових або додаткових круглих дужок не приведе до помилки або уповільнення обчислення виразу. Іншими словами, від них не буде ніякої шкоди, та зате скільки корисності! Адже вони допоможуть проясняти (у першу чергу для Вас самих, не говорячи вже про тих, кому доведеться розбиратися у цьому без Вас) точний порядок обчислень. Скажіть, наприклад, який з таких двох виразів легше зрозуміти?:

х = y/3-34*tmp+127;

x = (y/3) – (34*tmp) + 127;


Розділ 4. Поняття про настанови керування ходом виконання С++-програми

У цьому розділі Ви дізнаєтеся, як керувати ходом виконання С++-програми. Існує три категорії керівних настанов: настанови вибору (if, switch), ітераційні настанови (що складаються з for -, while - і do-while -циклів) і настанови переходу (break, continue, return і goto). За винятком return, всі решта перераховані вище настанови описано у цьому розділі.

4.1. Використання настанови вибору if

Настанова if дає змогу зробити вибір між двома виконуваними гілками програми.

Настанова if була представлена у розд. 2, але тут розглянемо її детальніше. Повний формат її запису є таким:

if (вираз) настанова;

else настанова;

У цьому записі під елементом настанова розуміємо одну настанову мови програмування C++. Частина else необов'язкова. Замість елемента настанова може бути використаний блок настанов. У цьому випадку формат запису if -настанови набуде такого вигляду:

if (вираз) {

послідовність настанов

}

else {

послідовність настанов

}

Якщо елемент вираз, який є умовним виразом, під час обчислення дасть значення ІСТИНА, то буде виконана if -настанова; інакше – else -настанова (якщо така існує). Обидві настанови ніколи одночасно не виконуються. Умовний вираз, що керує виконанням if -настанови, може мати будь-який тип, що є дійсним для С++-виразів, але головне, щоб результат його обчислення можна було інтерпретувати як значення ІСТИНА або ФАЛЬШ.

Використання if -настанови розглянемо на прикладі коду програми, яка є версією гри "Вгадай магічне число". Програма відображає випадкове число і пропонує його вгадати. Якщо Ви відгадуєте число, то програма виводить на екран повідомлення схвалення ** Правильно **. У цій програмі представлена ще одна бібліотечна функція rand (), яка повертає випадково вибране ціле число від нуля до RAND_MAX. Для використання цієї функції необхідно приєднати до програми заголовок < cstdlib >.

Код програми 4.1. Демонстрація програми "Вгадай магічне число"

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int magic; // Магічне число

int guess; // Варіант користувача

 

magic = rand (); // Отримуємо випадкове число.

cout << "Введіть свій варіант магічного числа: ";

cin >> guess;

if (guess == magic) cout << "** Правильно **";

 

getch (); return 0;

}

У цій програмі для перевірки того, чи збігається з "магічним числом" варіант, запропонований користувачем, використовують оператор відношення "==". У випадку збігу чисел на екран виводиться повідомлення ** Правильно **.

Спробуємо удосконалити нашу програму, тобто в її нову версію включимо else -гілку для виведення повідомлення про те, що припущення користувача виявилося неправильним.

Код програми 4.2. Демонстрація програми "Вгадай магічне число": перше удосконалення

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int magic; // магічне число

int guess; // варіант користувача

 

magic = rand (); // Отримуємо випадкове число.

cout << "Введіть свій варіант магічного числа: ";

cin >> guess;

if (guess == magic) cout << "** Правильно **";

else cout << "... Дуже шкода, але Ви помилилися.";

 

getch (); return 0;

}

4.1.1. Умовний вираз

Іноді новачків у мові програмування C++ збиває з пантелику той факт, що для керування if -настановою можна використовувати будь-який дійсний С++-вираз. Іншими словами, тип виразу необов'язково обмежувати операторами відношення та логічними операторами або операндами типу bool. Головне, щоб результат обчислення умовного виразу можна було інтерпретувати як значення ІСТИНА або ФАЛЬШ. Як зазначалося у попередньому розділі, нуль автоматично перетвориться в false, а всі ненульові значення – в true. Це означає, що будь-який вираз, який дає в результаті обчислення нульове або ненульове значення, можна використовувати для керування if -настановою. Наприклад, наведена вище програма зчитує з клавіатури два цілі числа і відображає частку від ділення першого на друге. Щоб не допустити ділення на нуль, у програмі використано if -настанову.

Код програми 4.3. Демонстрація механізму використання if-настанови

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int a, b;

cout << "Введіть два числа: ";

cin >> а, b;

if (b) cout << a/b << "\n";

else cout << "На нуль ділити не можна.\n";

 

getch (); return 0;

}

Звернемо Вашу увагу на те, що значення змінної b (дільник) порівнюється з нулем за допомогою настанови if (b), а не настанови if (b!= 0). Йдеться про те, що, коли значення b = 0, умовний вираз, який керує настановою с, оцінюється як ФАЛЬШ, то це призводить до виконання else -гілки. Інакше (коли b містить ненульове значення) умова оцінюється як ІСТИНА, тобто ділення легко виконується. Немає ніякої потреби використовувати наступну if -настанову, яка до того ж не свідчить про хороший стиль програмування мовою C++:

if (b!= 0) cout << a/b << "\n";

Ця форма if -настанови вважається застарілою і потенційно неефективною.

4.1.2. Вкладені if-настанови

Вкладені if -настанови виникають у тому випадку, якщо елемент настанова (див. повний формат запису) використовується інша if -настанова. Вкладені if -настанови дуже популярні у програмуванні. Головне тут – пам'ятати, що else -настанова завжди належить до найближчої if -настанови, яка знаходиться усередині того ж програмного блоку, але ще не пов'язана ні з якою іншою else -настановою. Ось приклад:

if (izm) {

if (jzm) statement1;

if (kzm) statement2; // Ця if -настанова

else statement3; // пов'язана з цією else -настановою.

}

else statement4; // Ця else -настанова пов'язана з if (izm).

Як стверджується в коментарях, остання else -настанова не пов'язана з настановою if (jzm), оскільки вони не знаходяться в одному блоці (незважаючи те, що ця if -настанова – найближча, яка не має при собі " else -пари"). Внутрішня else -настанова пов'язана з настановою if (kzm), оскільки вона – найближча і знаходиться усередині того ж блоку.

Вкладена if -настанова – це настанова, яку використовують як елемент настанови будь-якої іншої if - або else -настанови.

Мова програмування C++ дає змогу 256 рівнів вкладення, але на практиці рідко доводиться вкладати if -настанови на "таку глибину".

Продемонструємо використання вкладених настанов за допомогою чергового удосконалення програми "Вгадай магічне число" (тут гравець отримує реакцію програми на неправильну відповідь).

Код програми 4.4. Демонстрація програми "Вгадай магічне число": друге удосконалення

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int magic; // магічне число

int guess; // варіант користувача

 

magic = rand (); // Отримуємо випадкове число.

cout << "Введіть свій варіант магічного числа: ";

cin >> guess;

if (guess == magic) {

cout << "** Правильно **\n";

cout << magic << " і є те саме магічне число.\n";

}

else {

cout << "... Дуже шкода, але Ви помилилися.";

if (guess > magic)

cout << "Ваш варіант перевищує магічне число.\n";




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 485; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.1 сек.