Програми С++   складаються з класів, функцій, змінних і інших елементів. Велика частина цих матеріалів присвячена детальному опису цих елементів і їх взаємодії в програмі, щоб продемонструвати, як програма працює в цілому.
На сьогоднішньому зайнятті.
■    Елементи програми С++ 
■    Взаємодія елементів
■    Що таке функція і що вона робить
■    Прості операції введення і виведення

 Частини програми Hello World

Ваша перша програма C++ (зайняття 1, "Перші кроки") усього лише виводила на екран просте вітання Hello World. Проте ця програма містить деякі з найбільш важливих фундаментальних складників програми C++ . Давайте скористаємось лістингом 2.1 як відправною точкою для аналізу компонентів, що містяться в усіх програмах C++ .

 ЛІСТИНГ 2.1

1: // Директива препроцесора, яка підключає заголовок iostream 
2: #include <iostream>
3:
4: // Початок програми: блок функції main  
5: int main ()
6:  
7:	/* Виведення на екран */
8:	std::cout « "Hello World" « std::endl;
9:
10:	// Повернення значення операційній системі
11:	return 0;

 продовжимо ...

  Рядки 1,4, 7 і 10, що розпочинаються з символів // або /*, є коментарями і ігноруються компілятором. Коментарі призначені для людей. Детальніша інформація про коментарі приведена в наступному розділі.

  Цю програму C++   можна грубо розділити на дві частини: директиви препроцесора, які розпочинаються з символу #, і основну частину програми, яка починається з int main ().

Директива препроцесора #include

Як і заявлена його назва, препроцесор (preprocessor) - це інструмент, який запускається перед фактичним початком компіляції. Директиви препроцесора (preprocessor directive) - це команда препроцесору, вона завжди розпочинаються зі знаку фунта (#). У рядку 2 лістингу 2.1 директива #include <і'мя файла> вказує препроцесору взяти вміст файлу (в даному випадку iostream) і включити його в рядок, де розташована директива, iostream - це стандартний файл заголовка, який включається тому, що він містить визначення об'єкту потоку cout, використовуваного в рядку 8 для виведення на екран слів Hello World. Іншими словами, компілятор зміг відкомпілювати рядок 8, що містить оператор std::cout, тільки тому, що ми змусили препроцесор включити визначення об'єкту потоку cout в рядку 2.

Тіло програми - функція main()

У професійних застосунках C++   включаються не лише стандартні заголовки. Складні застосунки, як правило, мають декілька початкових файлів, причому деяким вимагається включити інші. Так, якщо деякий об'єкт, оголошений у файлі FileA, повинен використовуватися у файлі FileB, то перший необхыдно включити в останній. Зазвичай для цього у файл FileA поміщають наступну директиву #include :

include "...relative path to FileBXFileB"

В даному випадку при включенні саморобного заголовка ми використовуємо лапки, а не кутові дужки. Кутові дужки (<>), як правило, використовуються при включенні стандартних заголовків.

Після директиви (директив) препроцесора слідує тіло програми, розташоване у функції main (). Виконання програм C++   завжди починається тут. За стандартною угодою, перед функцією main () вказується тип int. Тип int в даному випадку - це тип значення, яке повертається функції main ().

ПРИМІТКА!!! У багатьох додатках C   можна знайти варіант функції main ( ), який виглядає таким чином:
int main (int arge, char* argv [ ])
Це також сумісно із стандартом і цілком прийнятно, оскільки функція main () повертає тип int, а вміст круглих дужок - це аргументи (argument), що передаються програмі. Ця програма, ймовірно, дозволяє користувачу запускати її з аргументом командного рядка, таким, наприклад, як program.exe /DoSomethingSpecific
/DoSomethingSpecific - це аргумент для цієї програми, що передається операційною системою в якості параметра для обробки у функції
main ().

Обговоримо рядок 8, що фактично виконує завдання цієї програми!

std::cout << "Hello World" << std::endl;

cout ("console-out" (виведення на консоль) вимовляється як see - out (сі-аут)), є оператором, що фактично виводить на екран рядок Hello World, cout - це потік, визначений в стандартному просторі імен (тому і std::cout), а те, що ми робимо, - так це розміщуємо текст рядка Hello World в цей потік, використовуючи оператор виведення в потік <<. Оператор std : :endl використовується для завершення рядка, а введення його в потік еквівалентне вставці знаку абзацу.  Зверніть увагу: оператор виведення в потік (stream insertion operator) використовується при необхідності виведення в потік кожного нового елементу. Перевага потоків C++   полягає в однаковій семантиці, яка використовується потоками різного типу. В результаті різні операції, здійснювані з тим же текстом, наприклад виведення у файл, а не на консоль, виглядають однаково. Таким чином, робота з потоками стає інтуїтивно зрозумілою і, коли ви звикаєте до одного потоку (такому як cout, що виводить текст на консоль), то без проблем можете працювати з іншими (таким як iostream, що записує текстові файли на диск).

Фактичний текст, поміщений в лапки "Hello World", називається строковим літералом (string literal).

Повернення значення

Функції в мові C++   повинні повернути значення, якщо осоружне(противне) не вказане явним чином, main () - ця функція, завжди і обов'язково повертає ціле число. Це значення повертається операційній системі (OS) і, залежно від характеру вашої прикладної програми, може бути дуже корисним, оскільки більшість операційних систем передбачають можливість звернутися до поверненого значення іншим прикладним програмам.  Не так вже і рідко один застосування запускає інше, і батьківському застосуванню (що запустив дочірнє) бажано знати, чи закінчило дочірнє застосування свою задачу успішно. Програміст може використати значення, яке повертається функції main () для передачі батьківському застосунку повідомлення про успіх або невдачу.

Традиційно програмісти повертають значення 0 у разі успіху і - 1 у разі помилки. Проте тип int (ціле число) значення, яке повертається забезпечує розробникові, в межах діапазону доступних значень, достатню гнучкість для передачі безлічі різних станів успіху або невдачі.

УВАГА!!!

Мова C++   чутлива до регістру. Тому готуйтеся до невдачі компіляції, якщо напишете Int замість int, Void замість void і Std::Cout замість std: :cout.

Концепція просторів імен

Причина використання в програмі синтаксису оператора std::cout, а не просто cout, в тому, що елемент, який використаний (cout) знаходиться в стандартному просторі імен (std).

Так що ж таке простір імен (namespaces)?

Припустимо, ви не використали специфікатор простору імен і звернулися до об'єкту cout, який оголошений в двох відомих компілятору місцях. Який з них компілятор повинен використати? Безумовно, це приведе до конфлікту і невдачі компіляції. Ось де виявляються корисні простори імен. Простори імен - це імена, присвоєні частинам коду, допомагаючі понизити вірогідність конфліктів імен. При виклику оператора std::cout ви вказуєте компілятору використати саме той об'єкт cout, який доступний в просторі імен std.

ПРИМІТКА! Ви використовуєте простір імен std (вимовляється "standard" (стандарт)) для виклику функцій, потоків і утиліт, які були затверджені комітетом із стандартів ISO Standards Committee, а отже, оголошені в його межах

Багато програмістів знаходять стомливим регулярне введення в коді специфікатора std при використанні оператора coût і інших подібних засобів, що містяться в тому ж просторі імен. Оголошення using namespace, представлене в лістингу 2.2, дозволить уникнути цього повторення.

ЛІСТИНГ 2.2  ОГОЛОШЕННЯ using namespace

1: // Директива препроцесора, яка підключає заголовок iostream 
2 : #include <iostream>
3:
4: // Початок програми 
5: int main ()
6: {
7:	// Вказати компілятору простір імен для пошуку
8:	using namespace std;
9:
10:	/* Виведення на екран з використанням std::cout */
11:	cout « "Hello World" « endl;
12:
13:	// Повернення значення операційній системі
14:	return 0;
15: }

Аналіз
Зверніть увагу на рядок 8. Повідомивши компілятор, що передбачається використати простір імен std, можна не вказувати простір імен явно в рядку 11 при використанні операторів td::cout і std::endl.
Лістинг 2.3 містить більш обмежувальний варіант коду лістингу 2.2. Тут підключається не увесь простір імен, а тільки ті його елементи, які належить використати.

ЛІСТИНГ 2.3  Інша демонстрація ключового слова using


1: // Директива препроцесора 
2: #include <iostream>
3:
4: // Початок програми
5: int main ()
6: {
7:	using std::cout;
8:	using std::endl;
9:
10:	/* Виведення на екран з використанням cout */
11:	cout « "Hello World" « endl;
12:
13:	// Повернення значення операційній системі
14:	return 0;
15: } 

Аналіз

У лістингу 2.3 рядок 8 лістингу 2.2 була замінена рядками 7 і 8. Відмінність між операторами using namespace std і using std : : cout в тому, що перший дозволяє використати усі елементи простору імен std, без явної вказівки специфікатора простору імен std : :. Зручність останнього в тому, що без необхідності усувати неоднозначність просторів імен явно можна використати тільки оператори std : : cout і std : :endl.

Коментарі в коді C++

Рядки 1,4, 10 і 13 лістингу 2.3 утримують текст на людській мові, але програма все одно компілюється. Вони також не впливають на виведення програми. Такі рядки називаються коментарями (comment). Коментарі ігноруються компілятором і зазвичай використовуються програмістами для пояснень в коді. Отже, вони пишуться на

людській мові (чи професійному жаргоні).

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

РЕКОМЕНДУЄТЬСЯ

Додайте коментарі, що пояснюють роботу складних алгоритмів і частин вашої програми

Оформляйте коментарі в стилі, прийнятому вашим колективом програмістів.

НЕ РЕКОМЕНДУЄТЬСЯ

Не використайте коментарі для повторення або пояснення очевидного

Не забувайте, що додавання коментарів не зробить зрозуміліше запутаний код

Не забувайте змінювати коментарі при зміні коду.

■    Символ // означає, що наступний далі рядок - коментар. Наприклад:

// Це коментар

■    Текст, що міститься між символами /* і */, також є коментарем, навіть якщо він займає декілька рядків:

/* Це коментар, що займає два рядки */

Функції в C++

Функції в мові C++   такі ж, як і в мові С. Функції (function) - це елементи, що дозволяють розділити вміст вашого застосування на функціональні блоки, ко-торые можуть бути викликані по вашому вибору. При виклику функція звичайне возвраща¬ет значення зухвалої функції. Найвідоміша функція, звичайно, - main ().

Вона розпізнається компілятором як відправна точка прикладення C   і повинна повернути значення типу int (тобто ціле число).

У програміста завжди є можливість, а як правило, і необхідність, створювати власні функції. У лістингу 2.4 приведено просте застосування, яке використовує функцію для відображення тексту на екрані, використовуючи оператор std:: cout з різними параметрами.

ЛІСТИНГ 2.4  Оголошення, визначення і виклик функції що демонструє деякі можливості оператора std: :cout

1: #include <iostream>
2: using namespace std;
3:
4; // Объявление функции 
5: int DemoConsoleOutput();
6 :
7: int main()
8: {
9:	// Вызов функции
10:	DemoConsoleOutput() ;
11:
12:	return 0;
13: }
14:
15: // Определение функции 
16: int DemoConsoleOutput()
17: {
18:	cout « "This is a simple string literal" « endl;
19:	cout «	"Writing number five: " « 5 «	endl;
20:	cout «	"Performing division 10 / 5	= " « 10 / 5	« endl;
21:	cout «	"Pi when approximated is 22/7	= " « 22 / 7	« endl;
22:	cout «	"Pi more accurately is 22/7	= " « 22.0 / 7	« endl;
23:
24:	return 0;
25: }

Результат ...

This is a simple string literal

Writing number five: 5

Performing division 10 / 5 = 2

Pi when approximated is 22 / 7 = 3

Pi more accurately is 22 / 7 = 3.14286

Аналіз

Інтерес представляють рядки 5, 10 і 15-25. У рядку 5 знаходиться оголошення функції (function declaration), яке в основному вказує компілятору, що ви хочете створити функцію на ім'я DemoConsoleOutput (), що повертає значення типу int (ціле число). Саме із-за цього оголошення компілятор погоджується відкомпілювати рядок 10, з урахуванням того, що далі (у рядках 15-25) слідує визначення функції (function definition), тобто її реалізація.

Фактично ця функція відображає різні можливості оператора coût. Обра-тите увага: вона виводить не лише текст, як в додатку Hello World в попередніх прикладах, але і результати простих арифметичних обчислень. Два рядки, 21 і 22, відображають результат обчислення числа Пі (22 / 7), але останній точніше просто тому, що при діленні 22.0 на 7 ви вказуєте компілятору вичислити результат як веществен-ное число (тип float в термінах C  ), а не як ціле.

Зверніть увагу, що функція передбачена як що повертає ціле число і повертає вона значення 0. Оскільки ніяких рішень ця функція не приймає, немає ніякої необхідності повертати яке або інше значення. Так само функція main ( ) повертає значення 0. Оскільки функція main ( ) делегує усі свої дії функції DemoConsoleOutput (), мало б сенс використати повертане нею значення для повернення значення з функції main ( ), як це зроблено в лістингу 2.5.

ЛІСТИНГ 2.5  ВИКОРИСТАННЯ ЗНАЧЕННЯ ФУНКЦІЇ, ЯКЕ ПОВЕРТАЄТЬСЯ

#include <iostream>
  using namespace std;

// Объявление и определение функции
  int DemoConsoleOutput()
{
  cout << "This is a simple string literal" << endl;
  cout << "Writing number five: " << 5 << endl ;
  cout << "Performing division 10 / 5 = " << 10/5 << endl;
  cout << "Pi when approximated is 22 / 7 = " << 22 / 7 << endl;
  cout << "Pi more accurately is 22 / 7 = " << 22.0 / 7 << endl; return 0; }

int main()
 {
  // Вызов функции с возвращением результата при выходе
  return DemoConsoleOutput();
 }

далі ...

 

Аналіз

Виведення цього застосування таке ж, як у попереднього. Невеликі зміни є в способі його отримання. Оскільки функція визначена (тобто реалізована) перед функцією main () в рядку 5, її додаткове оголошення вже не треба. Сучасні компілятори C   розуміють це як одночасно оголошення і визначення функції. Функція main () також трохи коротше. У рядку 19 здійснюється викликів функції DemoConsoleOutput () і одночасно повернення її повертаного значення при виході з додатка.

Функції можуть отримувати параметри, можуть бути рекурсивними, містити декілька операторів виходу, можуть бути переобтяженими, вбудовуваними і так далі. Ці концепції вводяться далі, на зайнятті 7, "Організація коду за допомогою функцій".

ПРИМІТКА!  У таких випадках, як тут, коли функція не зобов'язана приймати рішення або повертати повідомлення про успіх або відмову, ви можете оголосити функцію з типом повертаного значення void : void DemoConsoleOutput()

Така функція не може повертати значення, і її не можна використати для ухвалення рішення.

Прості оператори введення  std: :cin і виведення std : :cout

Ваш комп'ютер дозволяє взаємодіяти із застосунками, які виконуються на ньому різними способами, а також дозволяє цим застосуванням взаємодіяти з вами різними способами. Ви можете взаємодіяти з додатками, використовуючи клавіатуру або мишку. Інформація може бути відображена на екрані як текст або у формі складної графіки, може бути надрукована принтером на папері або просто збережена у файловій системі для подальшого використання.  У цьому розділі розглядається найпростіша форма введення і виведення в мові C++ - використання консолі для відображення і введення інформації. Для запису простих текстових даних на консоль використовуються оператор std : : cout (вимовляється як standard see - out (стандарт сі-аут)) і оператор std : : cin (вимовляється як standard see - in (стандарт сi-iн)) для читання тексту і чисел з консолі (як правило, з клавіатури). Фактично при відображенні слів Hello World на екрані в лістингу 2.1 ви вже зустрічалися з оператором cout :

8:    std::cout " "Hello World" " std::endl;

Тут оператор cout супроводжується оператором виведення << (що дозволяє вставити дані в потік виведення), яке підлягає виведенню строковим літералом "Hello World" і символом нового рядка у формі оператора std : :endl (вимовляється як standard end-line (стандарт енд-лайн)).

Застосування оператора cin також дуже просто, він супроводжується змінною, в яку слід помістити дані, що вводяться :

std::cin >> Змінна;

Таким чином, оператор cin супроводжується оператором витягання значення >>  (дані витягаються з вхідного потоку) і змінної, в яку слід помістити дані. Якщо дані, що вводяться, розділені пропуском, слід зберегти в двох змінних, то можна використати один оператор:

std::cin >> Змінна1 >> Змінна2;

Зверніть увагу на те, що оператор cin застосовується для введення як текстових, так і числових даних, як показано в лістингу 2.6.

ЛІСТИНГ 2.6. Використання операторів cin і cout для відображення числових і текстових даних

1: #include 
2: #include 
3: using namespace std;
4: 5: int main() 6: { 7: // Объявление переменной для хранения целого числа 8: int InputNumber; 9: cout << "Enter an integer: "; 10: // Сохранить введенное пользователем целое число 11: cin >> InputNumber; 12: // Аналогично с текстовыми данными 13: cout << "Enter your name: "; 14: string InputName; 15: cin >> InputName; 16: cout << InputName << " entered " << InputNumber << endl; 17: return 0; 18: }

Результат

Enter an integer: 2011

Enter your name: Siddhartha

Siddhartha entered 2011

Аналіз

У рядку 8 змінна InputNumber оголошується як здатна зберігати дані типу int. У рядку 10 користувача просять ввести число, використовуючи оператор cout, а введене значення зберігається в цілочисельній змінній з використанням оператора сin в рядку 13. Те ж саме повторюється при збереженні імені користувача, яке, кынцеве але, не може міститися в цілочисельній змінній. Для цього використовується інший тип - string, як можна помітити в рядках 17 і 18.  Саме тому, щоб використати тип string далі у функції main ( ), в рядку 2 була включена директива #include <string>. І нарешті, в рядку 20 оператор cout використовується для відображення введеного імені і числа з проміжним текстом, щоб отримати виведення Siddhartha entered 2011. Це дуже простий приклад введення і виведення в C++  . Не хвилюйтеся, якщо концепція змінних доки незрозуміла,  детально ми розглянемо її на наступному занятті.

ПІДСУМОК

На цьому занятті ми познайомились з основними частинами простих програм C++  . Тут було продемонстрировано, що таке функція main ( ), викладено введення в простори імен і основи введення і виведення на консоль. Ви використовуватимете багато з них в кожній програмы, яку пишете.