Створити програму, яка б видавала на консоль розмір основних типів даних та їх граничних значень.
Створити програму, яка б видавала результат виконання усіх арифметичних операцій для введеної пари чисел.
Створити програму, яка б видавала результати обчислення кожної, з наведених у таблиці 2.6 функцій. У програмі використати різні види форматування результатів.
Вимоги до звіту Назва роботи.
Мета роботи.
Короткі теоретичні відомості.
Тексти програм з коментарями.
Результати виконання програм у вигляді копій консолі.
Висновки.
Контрольні питання Змінні і константи.
Тип даних.
Арифметичні типи даних.
Описи змінних.
Операція розміру sizeof.
Арифметичні операції.
Операції присвоєння.
Вирази.
Пріоритети операцій у С++.
Узгодження типів.
Бібліотека математичних функцій cmath.
Використання об’єкту cin для введення даних.
Рекомендована література Берн Страуструп. Язык программированя С++. Второе дополненное издание. – М: Бином-Пресс, 2008. – 369 с
Прата Стивен. Язык программирования С++. Лекции и упражнения. Учебник: Пер. с англ./Стивен Прата – СПб.:ООО «ДиаСофтЮП», 2003. –1104 с.
Шилдт Герберт. Полный справ очник по С++. Пер. с англ. – М: Вільямс, 2004. 783 с.
Шпак З.Я. Програмування мовою С. – Львів: Оріяна-Нова, 2012. – 432с.
3Лабораторна робота № 3. Функції Мета роботи:
Познайомитися з поняттям функції у мові С, С++.
Познайомитися з поняттям прототип функції.
Познайомитися із способами передачі параметрів у функції.
Познайомитися із макросами з параметрами.
Створити програму з використанням функцій.
Короткі теоретичні відомості Можна сказати, що функції є основними будівельними блоками програми, написаної на мові С. Функція - це оформлений стандартним чином, логічно завершений фрагмент коду, що має власне ім’я, вирішує деяку локальну задачу і може повертати якийсь результат. Дотепер ми мали справу тільки з функцією main(), або із стандартними функціями, наприклад sin(). Але у процесі створення програми програміст, як правило, створює багато своїх функцій. У цій лабораторній роботі ми познайомимося з функціями більш докладно.
3.1.1Правила написання функцій Всі функції мови С мають однакову структуру, що виглядає таким чином:
nип_значення_що_повертається ім’я_функції(список_формальних_параметрів)
{
тіло_функції
}
Початкова частина функції, яка складається з типу значення, що повертається, імені функції та списку оголошень формальних параметрів, записаного у круглих дужках, називається заголовком функції або сигнатурою.
Тип значення, що повертається, це будь який можливий у мові С тип. Якщо функція нічого не повертає, записується тип void.
Ім’я функції має задовольняти вимогам мови С до написання ідентифікаторів. Після імені функції обов’язково мають бути круглі дужки, незалежно від наявності формальних параметрів.
Список параметрів складається із оголошень формальних параметрів, відокремлених комами. Оголошуються параметри так само, як і звичайні змінні (тип та ім’я), але кожен з параметрів оголошується окремо, навіть, якщо типи сусідніх параметрів співпадають.
Тіло функції, що знаходиться у фігурних дужках, складається з описів внутрішніх змінних та операторів, що реалізують дії, які повинна виконувати функція. Змінні , що оголошені у тілі функції, називають локальними, тому що вони доступні тільки у межах своєї функції. Вони мають бути оголошені до першого звертання.
Повернення результату роботи функції реалізується через оператор return, який має такий синтаксис:
return вираз;
Вираз, що розташований після слова return обчислюється, і його значення є результатом, що повертає функція. Оператор return завершує роботу функції, незалежно від того де він розташований у тілі функції. Якщо алгоритм виконання функції передбачає наявність декількох варіантів завершення, то тіло функції може включати і декілька операторів return.
Якщо функція нічого не повертає, оператор return записується без виразу, або взагалі не використовується.
Нижче, як приклад, наведено опис функції, що повертає суму двох чисел:
float sumTwoNumber (float a, float b)
{float z;
z=a+b;
return z;
}
У тілі функції визначено локальну змінну z, яка за межами функції недоступна. Ця змінна приймає результат додавання змінних а та b. Отримане значення функція повертає через оператор return.
Ту саму функцію можна записати і коротше:
float sumTwoNumber (float a, float b) { return a+b;}
3.1.2Виклик функції Оператори функції виконуються тільки тоді, коли здійснюється звертання до даної функції. Таке звертання називають викликом функції. Виклик функції виглядає так:
ім’я_функції(список_фактичних_параметрів)
Список фактичних параметрів являє собою послідовність виразів, які задають значення формальних параметрів, що перелічені в описі функції. Фактичні параметри обов’язково мають відповідати формальним за кількістю, порядком розташування та типом. Але не за назвами!
Виклик функції, що повертає якесь значення, можна використовувати як вираз, а також в якості операнда виразу. Значенням такого операнда буде значення, що повертає функція.
Приклад звернень до функції, опис якої наведено у попередньому пункті, представлено нижче:
У цьому прикладі перше звернення до нашої функції відбувається під час визначення змінної у. Фактичними параметрами у цьому випадку є константи 4.2 та 5.4, а результатом число 9.6. Друге звернення до нашої функції відбувається у виразі, що передається об’єкту cout. Фактичними параметрами у цьому випадку є змінна х та вираз у/2, а результатом буде число 5.5.
… float x=2.3; float y=sumTwoNumber(4.2, 5.4); cout << 3+sumToNumber(x, y/3);
3.1.3Прототип функції Для того, щоб компілятор мав можливість перевірити правильність звертання до функції та використання її результату, опис функції має бути наведено раніше, ніж звертання до неї. Але розташувати таким чином усі функції програми не завжди можливо, а окрім того, і недоречно. Найкраще першою розташовувати функцію main(), далі записувати функції, які послідовно розкривають алгоритм вирішення задачі, а у кінці наводити функції, що деталізують окремі кроки алгоритму.
Для того, щоб у програмах на мові С можна було використовувати довільний порядок розташування функцій використовують прототипи функцій. Прототип функції співпадає із її заголовком і не має тіла, тобто має таку форму:
тип_значення_ що_повертаєтьсяім’я_функції(список_формальних_параметрів);
Прототип містить усю інформацію, що потрібна компілятору для перевірки правильності застосування функції, і таким чином може замінити для компілятора опис функції, якщо цей прототип розташувати перед викликом функції. Найчастіше прототипи функцій записують перед функцією main(), що є початком програми.
Слід зазначити, що у прототипі можна навіть не наводити імен формальних параметрів, достатньо лише вказати їх типи.
Так, прототип функції, що розглядалася вище як приклад виглядає так:
float sumTwoNumber (float a, float b);
Той же прототип може виглядати і так:
float sumTwoNumber (float, float);
3.1.4Прототипи бібліотечних функцій Майже кожна програма на мові С використовує бібліотечні функції. Тексти цих функцій попередньо компілюють, а отримані об’єктні коди записують у бібліотеки. Прототипи цих бібліотечних функцій записують у спеціальних заголовних файлах. Ці файли у мові С мали розширення .h. Але в мові С++ від цього розширення відмовилися. Деякі заголовні файли С були перетворені у заголовні файли С++. Для таких файлів замість розширення .h почали використовувати префікс с. Так, наприклад, файл math.h став файлом cmath.
Для того, щоб підключити до програми заголовні файли бібліотечних функцій, слід застосувати директиву #include. Наприклад:
#include
Слід зазначити, що використання у програмі заголовних файлів С++, за звичай вимагає включення у програму директиви використання простору імен:
using namespec std;
Тут std – це простір імен стандартних компонентів компілятора С++.
3.1.5Способи передачі параметрів у функції Існує два способи передачі параметрів у функції - передача за значенням (by value) і передача через посилання (by reference). Спосіб передачі вказується при оголошенні параметра у списку формальних параметрів.
За замовчуванням передбачається, що параметри звичайних типів, наприклад, float, double, int, char передаються за значенням, а параметри таких типів як масиви передаються через посилання. Якщо виникає необхідність вказати, що параметр передається через посилання, то перед ім'ям параметра, пишеться символ &.
Передача параметрів за значенням Передача параметрів за значенням передбачає, що під час виклику функції у пам'яті буде виділена спеціальна область для запису копій значень фактичних параметрів, з якими і буде працювати функція.
Такий спосіб передачі захищає змінні, передані у функцію в якості параметрів, від непередбачуваних змін, оскільки функція працює з копіями. Крім того, такий спосіб дозволяє у якості фактичних параметрів задавати вирази. При передачі параметрів буде обчислено значення виразу і передано у функцію.
Недолік такого способу передачі полягає у тому, що для параметрів, які займають багато пам'яті, наприклад, великі масиви чисел або довгі рядки символів, копії займають багато місця у пам'яті і потребують багато часу для пересилання даних з одного місця пам'яті у інше.
Вище, у прикладі з пункту 3.1.1, параметри до функції передаються по значенню. У разі передачі параметрів через посилання до функції передаються адреси фактичних параметрів. Тому такий спосіб передачі називається ще передачею параметрів за адресою.
При такому способі передачі в якості фактичних параметрів можуть бути тільки змінні. Вираз і навіть окреме число або символ передати через посилання неможливо.
Передача параметрів через посилання заощаджує пам'ять і скорочує час звернення до функції. Однак це має і побічний ефект. Адже функція працює безпосередньо з фактичними параметрами, і будь-яка зміна формального параметру є зміною фактичного параметру. Для запобігання такому ефекту використовують кваліфікатор const.
Але побічний ефект має і позитивну сторону. Передачу параметрів через посилання можна використовувати для повернення результатів роботи функції через фактичні параметри. Такий спосіб повернення особливо ефективний, коли потрібно повернути декілька параметрів. Адже функція повертає тільки одне значення.
Розглянемо приклад використання передачі параметрів через посилання для повернення результатів роботи функції.
У наведеній нижче функції формальні параметри обмінюються значеннями і фактичні параметри теж обміняються значеннями.
void swap(float & a., float & b) { float temp = a; a = b; b = temp; }
3.1.6Області оголошення та доступу до імен Область оголошення – це частина програми, в якій можуть здійснюватися оголошення імен змінних, функцій, тощо. Область доступу до імені – це частина програми, у межах якої це ім’я доступно програмісту.
Доступ до імен простягається від точки, в якій це ім’я оголошено, до кінця області оголошення. Незважаючи на те, що оголошення змінних можна розміщувати будь де у межах області оголошення, краще оголошення згрупувати і розмістити на початку області оголошення.
Глобальні та локальні змінні Найширшою областю оголошення є файл, який містить нашу програму. Змінні та константи, що оголошені у файлі, але за межами будь-якої функції називаються глобальними. Глобальні змінні автоматично ініціалізуються нульовим значенням.
Більш вузькою областю оголошення є функція. Імена, що оголошені у функції доступні тільки у межах цієї функції. Змінні, що оголошені у функції називають локальними. Глобальні змінні теж доступні у функціях. Але якщо ім’я локальної змінної у функції співпадає з ім’ям глобальної змінної, то перевага віддається локальній змінній. Тобто локальна змінна перекриває глобальну у межах своєї області доступу.
Найвужчою областю оголошення є блок коду між фігурними дужками. Змінні, що оголошені у блоках теж вважаються локальними.
Локальні змінні автоматично не ініціалізуються. Тому якщо локальна змінна оголошується без ініціалізації (тобто їй не надано початкового значення), то значення цієї змінної може бути будь яким, так зване «сміття».
Глобальні змінні існують поки виконується програма. Пам'ять їм виділяється компілятором і тому їх ще називають статичними.
Локальні змінні створюються тільки після виклику функції та існують тільки до завершення роботи функції, або блоку. Пам'ять для цих змінних автоматично виділяється, а потім звільнюється у процесі виконання програми. Тому такі змінні ще називають автоматичними.
Глобальна чи локальна змінна? На перший погляд глобальні змінні здаються більш привабливими, оскільки до них мають доступ усі функції. Однак такий легкий доступ до змінних знижує надійність програми.
У більшості випадків слід користуватися локальними змінними і передавати їх іншим функціям тільки через параметри і тільки в разі необхідності.
Однак іноді глобальні змінні доцільно використовувати, наприклад, для зберігання постійних даних, що використовуються декількома функціями. Для запобігання небажаним змінам таких даних можна скористатися ключовим словом const.
Специфікатор statsc Мова С дозволяє, у разі потреби, зберегти значення локальної змінної, яка була обчислена у функції. Це може бути потрібно у тих випадках, коли функція використовує значення, що були обчислені під час попереднього виклику цієї функції. Саме так, наприклад, обчислюються випадкові числа. Кожне наступне підраховується на підставі попереднього. Нижче наведено функцію, що формує цілі випадкові числа за формулою x=a*x+b. На перший погляд тут складається враження, що ніякої випадковості нема, але слід враховувати, що константа «а» дуже велика. Результат множення змінної «х» на таке велике число майже завжди буде перевищувати максимально можливе значення для типу unsigned long, внаслідок чого старші біти результату будуть втрачатися. Таким чином результат стає ніби то випадковим.
#include #include using namespace std; // Функцiя генерацiї випадкових чисел unsigned long amkm() { unsigned long a = 0xBL, b = 0x5DEECE66DL; static unsigned long x = time(NULL); return x=a + b * x; } // Тестування функцiї amkm int main() { m: cout << amkm() << "\n"; goto m; return (0); }
Константи «a» та «b» задано у 16-річному форматі.
Початкове значення змінної «х» дорівнює значенню поточного часу, що повертає функція time(). Потім воно змінюється виразом x=a*x+b. Отримане значення зберігається до наступного виклику функції завдяки тому що змінна «х» оголошена із специфікатором statsc.
У функції main() функція amkm() безперервно викликається завдяки використанню мітки «m:» та оператора переходу goto.
3.1.7Макроси з параметрами Макроси з параметрами дають змогу здійснювати макропідстановки, подібні до викликів функцій. Формальні параметри, вказані в списку #define, під час препроцесування замінюються фактичними виразами, заданими у звертанні до макросу. Використання макросів замість функцій має дві переваги. По-перше, макрос вбудовується в тіло програми на етапі препроцесування, отже під час виконання програми не витрачається час на виклик функції. По-друге, аргументи, що вказуються у звертанні до макросів, можуть мати довільний тип.
Синтаксис макросу з параметрами такий:
#define ім’я_макросу(список_ параметрів) вираз_для_заміни
У виразі для заміни кожен з параметрів і весь вираз слід брати у дужки.
Як приклад, наведемо макрос для піднесення числа а до ступеня b:
#define POW(a,b) ( exp( (b) * log(a) ) )
Звернення до цього макросу у програмі може виглядати так:
cout << POW( 3 + x , 4.5 ) << “\n”
перейти в каталог файлов
| Образовательный портал
Как узнать результаты егэ
Стихи про летний лагерь
3агадки для детей |