суботу, 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.