субота, 23 липня 2016 р.


 Лінійні програми на С++

 СТАНДАРТНІ ТИПИ ДАНИХ МОВИ С++

 Всі об'єкти (змінні, масиви тощо), з якими працює програма в С/С++, необхідно визначати або описувати. Найпростіша форма визначення змінної:
<тип> <список імен змінних>;
При оголошенні об'єкти можна ініціалізувати (задавати початкове значення).
Наприклад: int j=10, m(3), n;
float c(-1.3), l=-10.23, f1;
Оголошення повідомляють компілятору про властивості та імена об'єктів і функцій. Змінні можуть змінювати свої значення. При наданні значення змінній у комірці пам'яті, яка відводиться під неї, розміщується код цього значення. Доступ до значення цієї змінної можливий через імя змінної, а доступ до ділянки пам'яті здійснюється за її адресою. Розмір ділянки пам'яті, що відводиться змінній, визначається її типом. Перелік базових типів даних наведено у таблиці 1.

Таблиця 1
Тип даних
Назва
Розмір, біт
Діапазон значень
unsigned char
Беззнаковий цілий довжиною не менше 8 біт
8
0 . . 255
сhar
Цілий довжиною не менше 8 біт
8
-128 . . 127
unsigned int
Без знаковий цілий
16
0 . . 65535
short int (short)
Короткий цілий
16
-32768 . . 32767
unsigned short
Беззнаковий короткий цілий
16
0 . . 65535
int
Цілий
16
-32768 . . 32767
unsigned long
Беззнаковий довгий цілий
32
0 . . 4294967295
long int (long)
Довгий цілий
32
-214748348 . . 2147483647
float
Дійсний одинарної точності
32
3.4Е-38 . . 3.4Е+38
double
Дійсний подвійної точності
64
1.7Е-308 . . 1.7Е+308
long double
Дійсний максимальної точності
80
3.4Е-4932 . . 1.1Е+4932

середа, 13 липня 2016 р.


Форматний ввід/вивід у мові С/С++

ФУНКЦІЇ ВВОДУ/ВИВОДУ ТА МАНІПУЛЯТОРИ МОВИ С++


А ось як виглядає програма вводу/виводу з використанням бібліотеки класів С++:
Приклад 2.
# include <iostream.h>
void main()
{ int i;
cout<< “Введіть ціле число\n”;
//об’єкт для вводу з клавіатури і >>розміщення у потік виводу
cin>> i;
cout<< “Ви ввели число”<< i <<”дякую!”;
}
Для форматного виводу у С++ використовуються маніпулятори, для використання яких до програми потрібно підключити заголовний файл <iomanip.h>:
setw(int) – встановлює максимальну ширину поля виводу чисел та рядків (не символів);
setprecision(int) – встановлює максимальну кількість цифр дробової частини для дійсних чисел з фіксованою крапкою;
setiosflags(ios::showpoint | ios::fixed) – вивід дійсних чисел з фіксованою крапкою;
setiosflags(ios::left) або setiosflags(ios::right) – вирівнювання по лівому або правому полю;
endl – при виводі включає у потік символ нового рядка, еквівалентний “\n” (його опис міститься у файлі iostream.h).
Маніпулятори спрямовуються в потік виводу, аналогічно тому, як це зроблено у прикладі 3:
Приклад 3.
# include<iostream.h>
#include <iomanip.h>
void main()
{float d=52.28679;
float f= 410.0;
cout<< setprecision(3);
cout<<setiosflags(ios::showpoint | ios::fixed);
cout<<setw(12)<<d<<endl<<setw(12)<<f<<endl;
}
Результат виводу (ˆ  - позначає пробіл):
ˆˆˆˆˆˆ52.287

ˆˆˆˆˆ410.000
У даному прикладі маніпулятори точності та фіксації крапки спрямовуються у потік виводу одноразово, тоді як ширину поля виводу необхідно встановлювати для кожного значення.

Форматний ввід/вивід у мові С/С++


 ФУНКЦІЇ ВВОДУ/ВИВОДУ МОВИ С

У мові С++ немає вбудованих засобів вводу/виводу – вони здійснюються за допомогою функцій, типів та об’єктів, що містяться у стандартних бібліотеках. Використовується два способи: функції, успадковані з мови С та об’єкти С++.
Основні функції вводу/виводу в стилі С, опис яких міститься у заголовному файлі <stdio.h>:
рrintf (<керуючий рядок>, <список аргументів>);
Керуючий рядок береться у лапки і вказує компілятору вигляд інформації, що виводиться. Вона може містити специфікації перетворення і керуючи або escape-символи.
Специфікація перетворення має такий вигляд:
% <прапор> <розмір поля . точність> специфікація,
де прапор може набувати наступних значень:
- вирівнювання вліво числа, що виводиться (за замовчуванням виконується вирівнювання вправо);
+ виводиться знак додатного числа;
розмір поля – задає мінімальну ширину поля, тобто довжину числа. Якщо ширини поля недостатня, автоматично виконується його розширення;
точність – задає точність числа, тобто кількість цифр його дробової частини;
специфікація вказує на вигляд інформації, що виводиться. У таблиці 2.1 наведено основні формати функції друку.

Таблиця 2.1
Формат
Тип інформації, що виводиться
%d
десяткове ціле число
% і
для виведення цілих чисел зі знаком (printf (“a=%i”, -3));
%u
для виводу беззнакових цілих чисел (printf(“s=%u”, s))
%c
один символ
%s
рядок символів
%e
число з плаваючою крапкою (експоненційний запис)
%f
число з плаваючою крапкою (десятковий запис) (printf(“b=%f\n, c=%f\n, d=%f\n”, 3.55, 82.2, 0.555 ));
%u
десяткове число без знака

Керуючий рядок може містити наступні керуючі символи:
\n – перехід на новий рядок;
\t – горизонтальна і \v – вертикальна табуляція;
\b – повернення назад на один символ;
\r – повернення на початок рядка;
\a – звуковий сигнал;
\” –лапки;
\? – знак питання;
\\ - зворотний слеш.
Список аргументів - об¢єкти, що друкуються (константи, змінні). Кількість аргументів та їх типи повинні відповідати специфікаціям перетворення в керуючому рядку.
Приклад 1.
#include <stdio.h>
#define PI 3.1415926
void main()
{
int number=5, cost=11000, s=-777;
float bat=255, x=12.345;
printf ("%d студентів з¢їло %f бутербродів.\n", number, bat);
printf ("Значення числа pi рівне%f.\n", pi);
printf ("Вартість цієї машини %d%s\n", cost,"у.е");
printf ("x=%-8.4f s=%5d%8.2f ", x, s, x);
}
В результаті виконання останньої функції printf() на екрані буде виведено:
х=12.3450 s= -777 12.34
Функція scanf передбачена для форматного вводу інформації довільного вигляду. Загальний вигляд функції:
scanf (<керуючий рядок>, < список адрес>);
На відміну від функції виводу printf(), scanf() використовує у списку адреси змінних, для одержання яких перед іменем змінної ставиться символ ”&”, що позначає унарну операцію одержання адреси. Для вводу значень рядкових змінних символ ”&” не використовується. При використанні формату %s рядок вводиться до першого пропуску. Вводити дані можна як в одному рядку через пропуск, так і в різних рядках.
Дану особливість ілюструє відповідна частина програми:
int course;
float grant;
char name[20];
printf ( "Вкажіть ваш курс, стипендію, ім¢я \n");
scanf ( "%d%f", &course, &grant);
scanf ( "%s", name); /* ”&” відсутній при зазначенні масиву символів */
Для зміни кольору тексту використовують функції із файла <conio.h>: clrscr() – очищує екран; textcolor(Колір) – задає колір символів; textbackground (Колір) – встановлює колір фону. Вивід тексту на екран здійснюється за допомогою функції cprintf(), яка використовується аналогічно printf(). Зверніть увагу на те, що перехід на початок нового рядка у цій функції здійснюється за допомогою комбінації ”\n\r”.
Колір можна задати за допомогою цілої або іменованої константи, перелік яких наводиться у таблиці 2.2.

Таблиця 2.2

Колір

Константа
Значення константи
Чорний
BLACK
0
Синій
BLUE
1
Зелений
GREEN
2
Червоний
RED
4
Фіолетовий
MAGENTA
5
Сірий
GREY
8
Блакитний
LIGHTBLUE
9
Помаранчевий
LIGHTRED
12
Жовтий
YELLOW
14
Білий
WHITE
15

 ПОРЯДОК ЗАПУСКУ ПРОГРАМИ

1.                Відкрийте нове вікно редагування (File > New) і надайте йому ім’я Welcome (File > Save As);
2.                У новому вікні наберіть текст програми, що наводиться у Прикладі 1.
3.                Відкомпілюйте програму (Compile > Compile або (Alt+F9)). В разі повідомлень про помилку, перевірте текст програми і усуньте невідповідності. Щоразу, вносячи зміни у вихідний текст програми, зберігайте файл (File > Save або F2). Після чого змінену програму слід відкомпілювати;
4.                Запуск відкомпільованої програми здійснюється за командою (Run > Run або Ctrl+F9). Якщо з моменту останньої компіляції вихідний код було модифіковано, ця команда виконає послідовно компіляцію і компоновку. Результат виконання програми можна переглянути, натиснувши комбінацію клавіш Alt+F5.

субота, 5 березня 2016 р.


ЕТАПИ ВИКОНАННЯ ПРОГРАМИ

Вихідна програма, підготовлена на мові С++ у вигляді текстового файла з розширенням *.срр (welcome.cpp), проходить 3 етапи обробки:
1)    препроцесорне перетворення тексту програми;
2)    компіляція;
3)    компоновка (редагування зв'язків чи складання).
Після цих 3 етапів формується машинний код програми, що виконується.
Задачею препроцесора є перетворення (доповнення) тексту програми до початку її компіляції. Правила препроцесорної обробки визначаються програмістом за допомогою директив препроцесора. Директива починається з ”#” ('дієз', 'шарп'). Наприклад,
1) #define - визначає правила заміни в тексті:
#define ZERO 0.0
Це означає, що кожне використання у програмі імені ZERO буде замінюватися на 0.0.
2) #include< ім'я заголовного файла > - передбачена для залучення до тексту програми тексту файлу з каталогу “Заголовних файлів” INCLUDE, які постачаються разом зі стандартними бібліотеками. Кожна бібліотечна функція чи об'єкт С++ має відповідний опис в одному з заголовних файлів (наприклад, iostream.h, stdio.h, conio.h, math.h). Список заголовних файлів визначається стандартом мови. Використання директиви include не під¢єднує відповідну стандартну бібліотеку, а лише дозволяє долучити до тексту програми описи із зазначеного заголовного файлу. В нашому випадку препроцесор обробляє директиву #include <iostream.h> і під’єднує до вихідного тексту програми засоби для обміну з дисплеєм. Далі файл передається на компіляцію, у ньому виявляються синтаксичні помилки, які потрібно усунути програмістові. Після безпомилкової компіляції текст програми перекладається компілятором на машинну мову, далі отримуємо об’єктний файл з розширенням *.obj. Підключення об'єктних кодів файлів з визначеннями необхідних стандартних функцій і об'єктів з бібліотеки відбувається на етапі компоновки, тобто після компіляції. У об'єктному коді створюваної програми ніби замуровуються дірки за допомогою кодів стандартних функцій. Хоча в заголовних файлах містяться всі описи стандартних функцій, до коду програми залучаються лише функції й об'єкти, які використовуються в програмі.
Після компоновки утворюється модуль програми з розширенням *.ехе.
Отже, в нашому випадку, виконавши директиви, препроцесор сформує повний текст програми, компілятор створить об’єктний файл welcome.obj, за замовчуванням обравши для нього зазначене ім’я, а компоновщик (редактор зв’язків Linker) доповить програму бібліотечними функціями, наприклад, для роботи з об’єктом cout і побудує модуль welcome.exe, запустивши, який ми одержуємо на екрані бажану фразу. 

вівторок, 1 березня 2016 р.

Розпочинаємо програмувати на С++

 СТРУКТУРА ПРОГРАМИ 

Розглянемо програму, що виводить на екран монітора фразу “Ласкаво просимо до С++!”:
Приклад 1.
// Welcome.cpp – ім’я файла з програмою
# include <iostream.h>
void main ()
{ cout << ” Ласкаво просимо до С++! \ n”;
}
Результат виконання програми:
Ласкаво просимо до С++!
У першому рядку програми міститься однорядковий коментар, що починається з символу “//”, який вказує, що після цього символу йде однорядковий коментар. Коментарі не викликають ніяких дій комп’ютера і ігноруються компілятором С++, а лише допомагають іншим людям читати і зрозуміти Вашу програму.
У другому рядку розміщено команду (директиву) препроцесору, що забезпечує включення до програми засобів зв’язку зі стандартними потоками вводу і виводу даних. Вказані засоби містяться у файлі під назвою iostream.h (мнемоніка: “і” (input) – ввід; “output” – вивід; “stream” – потік; “head” - заголовний). Рядок, що починається з ”#”, обробляється препроцесором перед компіляцією програми. Файл iostream.h повинен бути залучений для всіх програм, що виводять дані на екран монітора або вводять дані з клавіатури.
Третій рядок є заголовком функції з іменем main. Будь-яка програма на С++ повинна містити лише одну функцію з таким іменем. Саме з неї починається виконання програми. void – специфікатор типу, який вказує, що функція main в даному прикладі не повертає ніякого значення. Круглі дужки після main потрібні в зв’язку з форматом (синтаксисом) заголовка будь-якої функції. В них розміщується список параметрів. У нашому прикладі параметри не потрібні.
Тіло будь-якої функції повинно починатися і закінчуватися фігурними дужками, між якими знаходиться послідовність описів, операторів і визначень. Кожен оператор, визначення чи опис повинні закінчуватися крапкою з комою.
Рядок
cout << ” Ласкаво просимо до С++! \ n”;
є командою комп’ютеру надрукувати на екрані рядок символів, що записаний у лапках. Повний рядок, включаючи cout, операцію ”<<”, рядок ”Ласкаво просимо до С++! \ n” і крапку з комою “;”, називається оператором. Всі вводи і виводи в С++ виконуються над потоками символів. Таким чином потік символів Ласкаво просимо до С++! спрямовується до об’єкта стандартного потоку виводу cout, який пов’язаний з екраном. Вже зараз слід відмітити одну з принципових особливостей мови С++, яку називають перевантаженням або розширенням дії стандартних операцій. Операція ”<<” називається операцією „розмістити у потік” лишень у тому випадку, коли зліва від неї знаходиться ім’я об’єкта cout. Інакше пара символів “<<” означає бінарну операцію зсуву вліво. Символи правого операнда зазвичай виводяться так само, як вони виглядають між лапками.
Слід зазначити, що символи ”\n” не виводяться на екран. Комбінацію символів, що починаються з позначки оберненого Стеша (”\”), називають знаком переходу або escape-символом. Керуюча послідовність ”\n” означає перехід на початок нового рядка. Цей символ в лапках може знаходитися будь-де в рядку, при цьому послідовність символів, що знаходиться за ним, виводитиметься з нового рядка. Тобто результат виконання операції
cout << ” Ласкаво просимо \nдо С++! \ n”;
матиме вигляд:
Ласкаво просимо
до С++!

Задача1. IІ етапу Всеукраїнської учнівської олімпіади
з інформатики 2015-2016 н.р.

Задача 1. «Астролог» (20 балів)

Ім’я вхідного файлу: input.txt
Ім’я вихідного файлу: output.txt
Максимальний час роботи на одному тесті: 1с
Один з астрологів визначає щасливі і нещасливі дні так: він виписує підряд число, номер місяця і рік. В отриманому числі додає всі цифри, в новому отриманому числі знову додає всі цифри і так далі, доки чергова сума цифр не стане однозначним числом. Це число і характеризує щасливість дня.
Формат вхідного файлу.
Дата вводиться в форматі ррррммдд.
Формат вихідного файлу.
Виведіть рядок, який містить одне число, яке визначає щасливість дати.
Приклади файлів
input.txt
output.txt
20000101
4
19990102
4

Дана задача легко розв'язується з застосуванням функцій div, mod, але сума восьми цифр може бути двоцифровим числом, що не перевищує 72(=8*9), отже потрібно використати команди розгалуження. Так як сума двоцифрового числа також може бути двоцифровим числом(наприклад, 1+9=10), то розгалуження слід використати два рази:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var f,g:text; a,b,c,d,e,k,l,m,s:integer;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f); rewrite(g);
  read(f,a);
  s:=0;
  b:=a div 10000000;
  a:=a mod 10000000;
  c:=b div 1000000;
  a:=a mod 1000000;
  d:=a div 100000;
  a:=a mod 100000;
  e:=a div 10000;
  a:=a mod 10000;
  k:=a div 1000;
  a:=a mod 1000;
  l:=a div 100;
  a:=a mod 100;
  m:=a div 10;
  a:=a mod 10;
  s:=a+b+c+d+e+k+l+m;
  if s>9 then begin
  a:=s div 10;b:=s mod 10;s:=a+b
  end;
  if s>9 then begin
  a:=s div 10;b:=s mod 10;s:=a+b
  end;
  write(g,s);
  close(f);
  close(g);
end.

Для спрощення розв’язку задачі можна використати команди циклу, так як маємо повторення команд для визначення цифр числа та перевірки значення їх суми:

program astrolog;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var f,g:text; a,b,s,c:integer;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f); rewrite(g);
  read(f,a);
  while a>=10 do begin
  s:=0; b:=a;
  while b>0 do begin
  c:=b mod 10;
  b:=b div 10;
  s:=s+c;
  end;
  a:=s; end;
  write(g,s);
  close(f);
  close(g);
end.

Можна також використати роботу з рядками:

program  astrolog;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var f,g:text; a,b,c,s,i:integer;r:string;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f); rewrite(g);
  read(f,r);
  s:=0;
  for i:=1 to length(r)do begin
  val(r[i],a,b);
  s:=s+a end;
  while s>9 do begin
  b:=s div 10;
  c:=s mod 10;
  s:=b+c;
  end;
  write(g,s);
  close(f);
  close(g);
end.