вівторок, 18 вересня 2012 р.

Розгалуження


Для того щоб зрозуміти розгалуження потрібно ввести поняття програми. Програма — це алгоритм представлений у якісь формі, комп’ютерна програма представлена у двійковій формі. Алгоритм — це набір послідовних дій. Наприклад, ми прокидаємося вранці, спочатку відкриваємо очі, а потім встаємо з ліжка і так далі, це є наш алгоритм який ми проводимо вранці. Часто виникають потреби робити алгоритм не послідовно, а в залежності від випадку треба робити ту чи іншу дію. Наприклад, ми пішли у магазин і якщо у ньому буде масло певної марки то купити його. У C++ це можна записати у вигляді:

if (butterExists == true)
   buyButter();

Команда if це є умова, після слова if йдуть дужки, а в них вказується логічне значення true або false. Замість логічних значень можна вказати логічні операції, наш вираз є прикладом логічної операції. Не важко здогататися, що butterExists це змінна типу bool, отже, можна було написати так:

if (butterExists)
   buyButter();

Це нічого не змінить. А тепер уявимо, що нам сказали купити масло такої марки, а якщо його не буде купити будь-яке масло. Це записується так:

if (butterBrandAExists)
   buyButterBrandA();
else
   buyOtherButterBrand();

Тобто else виконується коли наш варіант не правдивий. З цим я надіюсь зрозуміло. Після команди if можна виконати тільки один оператор, а що тоді робити коли операторів треба виконати багато. Для цього створили блочний оператор. Він задається:

{}

Усередину нього ми можемо помістити будь-яку кількість операторів а представлятеметься він як один. А тепер приклад:

#include <iostream>
using namespace std;

int main(){
   int a;
   int b;
   int c;
   cin >> a >> b;
   if (a > 10){
      a = a + b;
      c = ++a;
      cout << c;
   }
   else
      cout << “a <= 10” << endl;

   return 0; 
}

Також деколи бувають ситуації коли потрібно щось робити до якогось часу. Наприклад читати до 23 години та інше. Для цього у C++ є два оператори while та do while. Вони схожі але мають одну відміність.

While
Записується у вигляді
while ([умова])
оператор;
Умови також логічні, тобто все, що підходить для if підходить і сюди, але треба бути обережним, тому що якщо умова не змінюється і завжди істинна то цей цикл буде нескінченим, це приведе до зависання програми і вона не зможе нормально завершитися. Потрібно щоб умова змінювалась усередині циклу. Наприклад:

bool f = true;
while (f)
   f = false;

Цикл виконається 1 раз, тому що умова, яку він перевіряє змінюється у циклі і на наступну ітерацію умова буде не істина і цикл не буде виконуватися. Тут також можна використовувати блочний оператор.
Do while
Аналогічний оператор, відрізняється тільки, що точно один раз цикл виконається, його ще називають цикл з постумовою (аналогічно while — цикл з передумовою). Задається:

do{
   оператор(и);
}while ([умова])

Приклад:

double x = 2.0;
do {
   x = 1 / x;
}while  (x > 0.000001);
cout << x;

Деколи умову потрібно перевіряти усередині циклу. Тоді цикл роблять безкінечним, а всередині при якісь умові викликають оператор break;
Наприклад потрібно порахувати суму чисел від 1 до 10, використовуючи безкінечний цикл:

int i = 1;
int s = i;
while (){
   s += ++i;
   if (s > 10)
      break;
}
cout << s;

А тепер порахуємо числа від 1 до 10 не включаючи 5. Для цього будемо використовувати оператор continue:

#include <iostream>
using namespace std;

int main(){
   int i, s;
   i = s = 1;
   while (s <= 10){
      if (i == 5){
         i++;
         continue;
      }
      s += ++i;
   }
   cout << s << endl;
   return 0;
}

Є ще один тип циклу for. Він задається:

for ([ініціалізація ітератора];[умова];[збільшення ітератора]){

}

ініціалізація ітератора це просто блок для ініціалізації змінних. Там часто пишуть int i = 0; але можна проініціалізувати багато змінних. Наприклад:

int a, b;
for (a = 0, b = 1;;)

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

for (int i = 0; true; cout << “I'm cycle”)
   break;

Воно виведе на екран рядок “I'm cycle”. Оператори continue та break; також дійсні. Будь-який for можна замініти на while. Наприклад, перепишемо попердні оператори:

int i = 0;
while (true){
   cout << “I'm cycle”;
   break;
}

for може не містити якогось блоку або всіх блоків. У останньому випадку буде безкінечний цикл. Тобто
for (;;)

На сьогодні все. Не забудьте потренуватися, адже приктила найголовніше у будь-якій справі :-).

понеділок, 17 вересня 2012 р.

Урок 3. Типи даних

Типи даних
У комп'ютері всі дані представленні у вигляді двійкових послідовностей. Це зроблено через легкість їх збереження у пам'яті. Вся пам'ять представлена у вигляді конденсаторів: якщо він не заряджений це рівносильно 0, а якщо заряджений — 1. Знати двійкову систему числення обов'язково для професійного програмування. Найменше об'єм інформації — біт, але для полегшення у мовах програмування вважають найменшим значенням — байт. Байт — це 8 біт.
А тепер про типи в C++. Їх поділяють на категорії:
1. Цілі
Цілі числа, які не мають дробової частини. Вони всі мають однакові дії. Відмінний в них тільки розмір, тобто кількість байтів, які вони займають в пам'яті. Найменший тип short має розмір 2 байт. Далі int – 4 байта і long – 8 байт. По правилам комбінаторики можна порахувати їхнє найбільше та найменше значення. У нас двійкова система числення, отже формула буде така: 2^n, де n — к-сть біт. Перший (старший біт) є знаком числа: 0 — додатнє, 1 — від'ємне, число 0 вважається додатнім. Отже, для short маємо 2^15 = 32768 і оскільки ми рахуємо від 0, то максимальне значення буде 32767, а мінімальне -32768. Не важко порахувати і для всіх інших типів. Це буде домашнє завдання! Часто виникають ситуації коли нам непотрібні від'ємні числа і для того щоб економити пам'ять придумали приставку для цілих типів unsigned, що в переводі означає беззнаковий. Тобто для unsigned short максимальне значення буде 2^16 = 65536-1 = 65535 (один віднімаємо тому що рахуємо з 0). Для всіх типів з unsigned мінімальне значення — 0. Також можна ще писати signed, але це не обов'язково тому що задається автоматично (воно означає знаковий). У других мовах програмування всі цілі типи є знаковими і unsigned не допускається.
2. Дійсні
До дійсних належать float та double. Double у 2 рази більший. У пам'яті представляється мантисою і порядком, старший біт також є знаковим. Для них немає unsigned. Float має значення [3.4*10^-38 .. 3.4*10^38], double [1.7*10^-308 .. 1.7*10^308]. У пам'яті float – 4 байта, double – 8 байт. Є ще long double: займає 10 байт та має значення [3.4*10^-4932 .. 3.4*10^4932].
3. Символьні
До символьних відносяться:
char — тип що має 256 значень символів та займає 1 байт у пам'яті, приймає значення символів таблиці ASCII перші 128 символів у всіх системах однакові а інші 128 залежать від локалізації системи.
wchar_t — займає 2 байта, отже може приймати 65536 значень. Приймає символи в кодування unicode. У unicode перші 256 значень збігаються з таблицею ASCII.
4. Логічний тип bool
Цей тип приймає 2 значення true та false (істина та брехня). Незважаючи на кількість можливих значень займає 1 байт у пам'яті, тому що мінімальна одиниця байт, хоча достатньо одного біта. Для економії пам'яті використовують бітові шкали, але про це пізніше. У декого може виникнути питання для чого економити пам'ять якщо її так достатньо. Так, але при передачі через інтернет, особливо коли він дуже повільний, це відіграє важливу роль, але також несуттєво, тому що інтернет розвивається і зараз важко знайти повільне з'єднання.

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

Тепер можна сказати про змінні. Змінна — це комірка у пам'яті і скільки вона в ній займає залежить від типу, можна вважати, що тип це правило вибору даних з пам'яті. Можна об'явити змінну і вказати значення не числом а адресом у пам'яті і по правилам типу воно вибере необхідні дані для змінної. Але це не рекомендується робити, тому що у деяких операційних системах дуже жорсткий контроль пам'яті і якщо программа полізе не у свою пам'ять то ОС може без попередження завершити її. У windows цього немає і тому під нього є віруси. У linux є жорсткий контроль і тому немає вірусів. До речі програми для набору ресурсів в іграх, такі як ArtMoney, працюють по такому принципу, що залазять у пам'ять іншої програми і змінюють у ній дані.

На цьому урок завершений. Прошу писати відгуки у коментарях про цю статтю.

четвер, 13 вересня 2012 р.

Операції

Операцій є багато і тому їх можна розділити на декілька груп:
  1. Арефметичні 
  2. Операції порівняння  
  3. Логічні
  4. Побітові 

До арефметичних операцій належать звичайні операції із числами які ми знаємо: +, -, *, / а також % (остача від ділення).
Тепер про кожну із них. + звичайне додавання, виконується для всіх чисел; - віднімання, якщо є два числа, або зміна знаку, якщо число одне; * множення; / ділення; % остача від ділення, виконується тільки для цілих чисел. Ці операції можна комбінувати з операцією присвоєння, наприклад +=, просто до операції додаємо операцію присвоєння в кінці.

До операцій порівняння належать: операції порівнювання "<"/">" - менше/більше, "<=" / ">=" - менше або рівне / більше або рівне, "==" / "!=" - рівно/нерівно. Усі логічні операції повертають значення true або false (істина або брехня).

Логічні && || !. && ( і ) - якщо два вирази істинні то результат буде істинним, можна порівняти з  

Побітові операції роблять дії над бітами числа. 

Перша програма HelloWorld!!!

Сьогодні ми напишем першу невеличку програму, яка має назву HelloWorld!!! .

Почнемо. Програма буде виводити на екран напис “Hello World !!!”. У С++ немає стандартної функції для виводу на екран. Ми її підключемо за допомогою директиви препроцесора (не звертайте уваги на слова, потім звикнете) #include. Взагалі всі директиви препроцесора розпочинаються з символа “#“. Ця директива означає, що замість цієї стрічки в коді буде поміщено вміст файлу, який вказується далі <iostream> (так можна вставляти й інші файли). Це файл бібліотеки для роботи з потоками вводу та виводу, він знаходиться у стандартних каталогах, отже, ми пишемо його назву між “<” і “>”. Якщо файл знаходиться в іншому місці, використовуєм замість “<” і “>” лапки. Після директивів не ставиться символ “;” і кожна директива пишеться у одному рядку і тільки одна вона.

Отже, перший рядок програми має наступний вигляд:

#include <iostream>

Для того, щоб програма краще читалась зробимо невеличкий відступ у два рядка. (Важливо!!! Якщо програма легко читається, легше виправляти в ній помилки. Так що не шкодуйте часу на оформлення) . Також потрібно використовувати коментарі, на які компілятор не реагує. Вони ставляться після “//“. З коментарями ми б написали перший рядок так:

#include <iostream> // Додаємо бібліотеку iostream

Якщо коментар не на одну стрічку, а на декілюка, його потрібно помістити між “/*” і “*/”. Наприклад:

#include <iostream> /* Додаємо бібліотеку

iostream */

Пишемо далі. Другий рядок ми пропускаємо. На третьому пишемо:

int main ( ) {

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

int main ( )

{

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

Далі пишемо:

cout << “Hello World!!! \n”;

Цей оператор і виволить нашу стрічку на екран. Стрічки записуються у лапках. “\n” означає, що каретка буде переміщена на новий рядок. cout - це оператор, після кожного оператора ми ставимо “;“ . Далі можна писати у цьому ж рядку, помилки не буде, але ми цього робити не будемо, щоб дуло легше читати програму. Є де-які стандартні команди які розпочиняються із символа \, про них ми пізніше поговоримо, а зараз головне запам’ятати одну \n.

Після цього рядка ми пишемо:

system”pause”;

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

Наступниї рядок:

return 0;

Означає, що функція повертає значення типу, якого ми вказали вище (int), яке дорівнює 0, тлбто програма завершилася вдало.

Ну і кінець функції (і в даному випадку програми)

}

Ось і все це перша програма, яку треба скомпілювати і запустити. (В Visual C++ запуск клавішею F5, у Dev-C++ - F9)

Повний текст програми:

#include <iostrem>

using namespace std; /* Це для того, щоб був доступ до cout, якби ми цього не написали, то замість

cout << “Hello World !!! \n”; треба було б писати std::cout << “Hello World !!! \n”; */

int main (){

cout << “Hello World !!! \n”;

system(”pause”);

return 0;

}

Основа основ

Усі програми, які ми знаємо записуються у пам’яті, як набір команд для процесора. А процесор може розуміти тільки двійкову форму запису. Отже, програми також повинні бути записані у цій формі. Раніше так і програмували, записували код у двійковій формі, але це було важко і було вирішено замінити де-які команди англійськими словами. Це настала нова епоха програмування Assembler. І для того, щоб процесор його розумів, потрібно було перевести цю програму в двійкову форму. Цей етап називався Трансляцією. Assembler - мова низького рівня.

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

Отже, ви вже знаєте для чого компіляція. Її порівнюємо із працею перекладача, адже ЦП не знає наших мов (надіємося, що в майбутньому його навчать ). Йдемо далі.

Взагалі мов програмування є багато. (Ми будемо вивчати C++. Про інші я не буду говорити, це можна знайти в Google.) Так як і наша мова, мова програмування має такі ж складові (букви, слова, речення, знаки пунктуації), але вони називаються по-іншому (не має значення як, ми ж не будемо здавати іспит в інституті ). Отже, нам потрібно складати твори (як у школі=) ). А як складати, ми будемо вчити довго і весело. В любому навчанні головне, щоб було весело і коротко, тоді буде краще запам’ятовуватись

Для того, щоб писати нообхідно завантажити Інтегроване середовище розробки, зним набагато легше писати програми. Я пораджу вам Microsoft Visual C++ Express, який можна безкоштовно завантажити з офіційого сайту. А якщо великий об’єм не виходить завантажити, можна завантажити Dev-C++ (я сам нею користуюсь)