Доброго дня усім.
Сьогодні ми спробуєм розглянути мінімальний базис знань, необхідних для написання програм на С++.
І найперше, що Я хотів вам розказати, це куди писати чи вставляти свій новий код. Свій новий код необхідно вставляти в головну функцію програми - "main". Тобто:
int main(int argc, char** argv)
{
//вставляємо свій код сюди
return 0 ;
}
Тобто вам необхідно запустити своє улюблене середовище розробки, створити новий проект (бажано вибрати "консольна програма") і, якщо середовище само згенерувало дану функцію, друкувати код між двома фігурними дужками (як показано у прикладі вище), а якщо середовище не генерую дану функцію - скопіювати чи набрати її самостійно. З концепцією функцій ми познайомися пізніше в даній статті.
Типи даних
У С++ є декілька вбудованих типів даних, без яких ми собі не уявляємо наше повсякденне життя. До них відносять:
- char - символьний тип (зберігає один символ);
- bool - булевий тип (зберігає значення "true" і "false")
- short - ціле число (зберігає одну цілу цифру з малою потужністю типу)
- int - ціле число (зберігає одну цілу цифру)
- float - дійсне число (зберігає одне число з плаваючою крапкою)
- double - дійсне число з подвійною точністю (те саме що і float, але більша потужність типу).
Дані типи сортовані по зростанню використання пам'яті. Наприклад (на моїй 32-х розрядній системі), char займає тільки один байт і максимальна кількість значень, які можна записати в змінну даного типу складає 28=256 значень, а для типу int - 4 байти, що займає 232=4294967296 значень. Щоб перевірити, скільки пам'яті використовує кожен тип можна скористатися наступною програмою:
#include <iostream>
using namespace std ;
int main (int argc, char** argv)
{
cout << "тип char займає " << sizeof (char) << " байти\n" ;
cout << "тип short займає " << sizeof (short) << " байти\n" ;
cout << "тип int займає " << sizeof (int) << " байти\n" ;
cout << "тип float займає " << sizeof (float) << " байти\n" ;
cout << "тип double займає " << sizeof (double) << " байти\n" ;
return 0 ;
}
Для моєї системи, після компілювання і виконання даної програми, вивід у термінал буде наступним:
Щоб оголосити змінну будь-якого типу необхідно скористатися наступним синтаксисом:
<необхідний_тип> <назва_змінної>;
Наприклад, наступна програма оголошує змінну цілого числа (int), числа з плаваючою крапкою (double) і масива символів (char) розміром 256 значень.
int main (int argc, char** argv) //головна функція програми
{
int a ; //ціле число
double b ; //число з мантисою
char message[256] ; //масив символів
return 0 ; //виходимо з програми
}
У C++ є ще декілька ключових слів для модифікування типів (unsigned, volatile, long), але Вам необхідно спочатку вивчити базові типи і загальний синтаксис С++.
Оператори вибору
У С++ є три типи операторів: if-оператор; switch-оператор; і оператор "?:;".
Оператор вибірки має наступний синтаксис:
if ( /* умова*/ )
{
// команди, якщо справджується умова
}
else
{
// команди, якщо умова не справджується
}
Наприклад, розглянемо наступну програму:
#include //вивід на екран
#include //для типу string
using namespace std; //використовуємо простір імен
int main (int argc, char** argv) //головна функція програми
{
std::string uname ; //оголошуємо рядкову змінну
std::cout << "Введіть своє ім'я: " ; //виводимо повідомлення на екран
cin >> uname ; //зчитуємо ім'я користувача
if (uname=="Юрій") //оператор і умова
{
cout << "Привіт, Юрій\n" ;
}
else
{
cout << "Привіт, незнайомець\n" ;
}
return 0 ; //виходимо з програми
}
Після компілювання і виконання наступної програми в консолі, ми побачимо наступне:
Оператор switch призначений для множинної вибірки значень. Його синтаксис наступний:
switch (/* змінна*/)
{
case /* можливе_значеня-1 */ :
/* Ваші команди для даного значення */ ;
break ;
case /* можливе_значеня-2 */ :
/* Ваші команди для даного значення */ ;
break ;
/* ... */
default :
/* Ваші команди для значення, яке ви не врахували */ ;
}
Наприклад, розглянемо програму, яка зчитує номер місяця і виводить на екран його назву:
#include <iostream> //для виводу на екран
#include <string> //тип string
using namespace std; //використовуємо простір імен
int main (int argc, char** argv) //головна функція програми
{
int month = 0 ; //цілочисельна змінна
std::cout << "Введіть номер місяця: " ; //виводимо на екран повідомлення
cin >> month ; //зчитуємо номер місяця
switch (month) //оператор вибірки
{
case 1: //для першого місяця
cout << "Січень\n" ; //виводимо повідомлення
break ; //вихід з оператора
case 2:
cout << "Лютий\n" ;
break ;
case 3:
cout << "Березень\n" ;
break ;
case 4:
cout << "Квітень\n" ;
break ;
case 5:
cout << "Травень\n" ;
break ;
case 6:
cout << "Червень\n" ;
break ;
case 7:
cout << "Липень\n" ;
break ;
case 8:
cout << "Серпень\n" ;
break ;
case 9:
cout << "Вересень\n" ;
break ;
case 10:
cout << "Жовтень\n" ;
break ;
case 11:
cout << "Листопад\n" ;
break ;
case 12:
cout << "Грудень\n" ;
break ;
default :
cout << "Такого місяця немає!\n" ;
}
return 0;
}
Після компілювання і виконання у терміналі даної програми ми отримаємо наступне:
Оператор "?:" в основному корисний через свою можливість повертати значення на відміну від оператора if. Його синтаксис наступний:
/* умова */ ? /* команди1 */ : /* команди2 */ ;
Якщо умова справджується, виконуються команди з блоку "команди1", а якщо умова не справджується - воконуються операції з блоку "команди2". Наприклад розглянемо наступну програму:
int main(int argc, char** argv)
{
bool a ; //оголошуємо булеву змінну
a = 2<1 ? true : false ; //обчислення оператором вибірки
return 0; //виходимо з програми
}
Очевидно, що у програмі в змінну а запишеться false, оскільки 1 завжди менше від 2, тобто умова не справджується і оператор повертає значення з свого другого блоку.
Цикли
Є три типи циклів: цикл з передумовою (while), цикл з післяумовою (do while) і цикл з визначеною кількістю ітерацій (цикл for).
Для циклу з передумовою синтаксис буде наступним:
while (/* умова */)
{
// команди для повторення
}
Наприклад, розглянемо програму, яка виводить числа від 1 до 10 у вікно консолі:
#include <iostream> //для виводу повідомлень
using namespace std; //використовуємо простір імен
int main(int argc, char** argv) //головна функція програми
{
int i = 1 ; //цілочисельна змінна
while (i<=10) //цикл і умова
{
cout << i++ << " " ; //виводимо на екран
}
return 0 ; //виходимо з програми
}
Вивід буде наступним:
Перевага циклу з післяумовою полягає у тому, що його дії виконаються хоча б один раз. Його синтаксис наступний:
do
{
// дії для повторення
} while (/* умова */) ;
Розглянемо наступну програму:
#include <iostream> //для виводу на екран
#include <string> //для типу string
using namespace std; //використовуємо простір імен
int main ()
{
string command ; //змінна типу string
do //початок циклу
{
cout << "enter command: " ; //виводимо запрошення на ввід команди
cin >> command ; //зчитуємо команду в буфер
//ось тут обробка Ваших команд операторами вибірки
}
while (command!="exit" && command!="quit") ; //цикл і умова
return 0 ; //виходимо з програми
}
При її виконанні в командному інтерпретаторі, ми отримаємо наступне:
Синтаксис третього типу виглядає наступним чином:
for (<попередні умови і оголошення>; <умова циклу>; <дія на кожній ітерації>)
{
/* команди на виконання */
}
Приклад використання циклу:
#include //для виводу на екран
#include //для типу string
using namespace std; //використовуємо простір імен
int main (int argc, char** argv) //головна функція програми
{
string str = "world wide" ; //оголошуємо змінну і записуємо в неї слова
int cnt = 0; //оголошуємо обрахункову змінну
for (int i=0; i<str.size(); ++i) //початок циклу
{
if (str[i]=='w') //перевіряємо рівність значевння букві 'w'
{
++cnt; //обраховуємо скільки разів зустрічається буква 'w' у словах
}
}
//виводимо результат на екран
cout << "Буква '" << "w" << "' зустрічається у слові '"
<< str << "' " << cnt << " раз\n" ;
return 0 ; //вихід з програми
}
Після виконання програми на екрані ми побачимо наступне:
Додаткові можливсті мови
До додаткових можливостей мови можна віднести перш за все функції. Функції використовуються коли у програмі часто зустрічається певний код, який, для лаконічності, можна віднести у окремі підпрограму - функцію. Синтаксис функції:
/* тип_повернення */ /* назва_функції */ (/* параметри_функції_через_кому*/)
{
//код функції...
return /* тип_повернення */ ;
}
Розглянемо наступний приклад використання функції
#include <iostream> //для виводу на екран
#include <string> //для типу string
using namespace std; //використовуємо простір імен
void print_to_screen (double a) // оголошуємо функцію виведення на екран
{
cout << "Моє число = " << a << endl ; // виводимо повідомлення
return ; //повертаємо ніщо (void - пустий тип)
}
int main (int argc, char** argv) //головна функція програми
{
double z = 230.5 ; // оголошуємо змінну і зберігаємо у неї значення
print_to_screen (z) ; //викликаємо функцію
z = 5.5 ; //Змінюємо значення змінної z
print_to_screen (z) ; //викликаємо функцію
return 0 ; //вихід з програми
}
При виконанні програми ми отримаємо:
Іншою корисною якістю С++ являються класи. Класи - це основа парадигми об'єктно-орієнтованого програмування (ООП). Вони являються зручним способом організації коду, особливо для великих програм. Тільки завдяки класам, Ви можете програмувати на рівні коду "world.create()", або ж робити асемблерні вставки за допомогою оператора __asm__, завдяки успадкуванні якостей мови С. Основний синтаксис оголошення класу у С++ наступний:
class /* назва_класу */
{
public:
//загальнодоступні функції (ментоди) і поля (змінні)
private:
// недоступні поза межами класу поля і методи
} ;
Розглянемо приклад використання класу:
#include <iostream>
using namespace std;
class Human
{
public:
int age() { return years ; }
void set_age( int a) { years = a ; }
Human () { years = 0 ; }
private:
int years ;
} ;
int main (int argc, char** argv)
{
Human Andriy;
Andriy.set_age(45) ;
cout << "Вік Андрія складає " << Andriy.age() << endl ;
return 0 ;
}
Після виконання програми, ми можемо побачити наступне:
Самі класи С++ мають ще безліч корисних функцій, на подобі дочірніх класів, віртуальних функцій і класів, і багато чого іншого. Окрім звичайних класів, С++ також має шаблонні функції і шаблонні класи, але все це виходить за межі даної статті.
В даній статті Ви познайомилися з основними частинами мови для написання найпростіших програм. Якщо Ви бажаєте глибше розуміти синтаксис і симантику мови, Вам необхідно прочитати не одну книгу і статтю, особливо книги її творця - Б'ярна Страуструпа.